Commit b1c615c4 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Bjorn Helgaas

PCI/VPD: Move VPD sysfs code to vpd.c

Move the VPD-related sysfs code from pci-sysfs.c to vpd.c.  This follows
the pattern of pcie_aspm_create_sysfs_dev_files().  The goal is to
encapsulate all the VPD code and structures in vpd.c.

No functional change intended.
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent f0eb77ae
...@@ -982,38 +982,6 @@ static ssize_t pci_write_config(struct file *filp, struct kobject *kobj, ...@@ -982,38 +982,6 @@ static ssize_t pci_write_config(struct file *filp, struct kobject *kobj,
return count; return count;
} }
static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, char *buf,
loff_t off, size_t count)
{
struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
if (bin_attr->size > 0) {
if (off > bin_attr->size)
count = 0;
else if (count > bin_attr->size - off)
count = bin_attr->size - off;
}
return pci_read_vpd(dev, off, count, buf);
}
static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, char *buf,
loff_t off, size_t count)
{
struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
if (bin_attr->size > 0) {
if (off > bin_attr->size)
count = 0;
else if (count > bin_attr->size - off)
count = bin_attr->size - off;
}
return pci_write_vpd(dev, off, count, buf);
}
#ifdef HAVE_PCI_LEGACY #ifdef HAVE_PCI_LEGACY
/** /**
* pci_read_legacy_io - read byte(s) from legacy I/O port space * pci_read_legacy_io - read byte(s) from legacy I/O port space
...@@ -1517,29 +1485,8 @@ static struct device_attribute reset_attr = __ATTR(reset, 0200, NULL, reset_stor ...@@ -1517,29 +1485,8 @@ static struct device_attribute reset_attr = __ATTR(reset, 0200, NULL, reset_stor
static int pci_create_capabilities_sysfs(struct pci_dev *dev) static int pci_create_capabilities_sysfs(struct pci_dev *dev)
{ {
int retval; int retval;
struct bin_attribute *attr;
/* If the device has VPD, try to expose it in sysfs. */
if (dev->vpd) {
attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
if (!attr)
return -ENOMEM;
sysfs_bin_attr_init(attr); pcie_vpd_create_sysfs_dev_files(dev);
attr->size = 0;
attr->attr.name = "vpd";
attr->attr.mode = S_IRUSR | S_IWUSR;
attr->read = read_vpd_attr;
attr->write = write_vpd_attr;
retval = sysfs_create_bin_file(&dev->dev.kobj, attr);
if (retval) {
kfree(attr);
return retval;
}
dev->vpd->attr = attr;
}
/* Active State Power Management */
pcie_aspm_create_sysfs_dev_files(dev); pcie_aspm_create_sysfs_dev_files(dev);
if (!pci_probe_reset_function(dev)) { if (!pci_probe_reset_function(dev)) {
...@@ -1552,11 +1499,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev) ...@@ -1552,11 +1499,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev)
error: error:
pcie_aspm_remove_sysfs_dev_files(dev); pcie_aspm_remove_sysfs_dev_files(dev);
if (dev->vpd && dev->vpd->attr) { pcie_vpd_remove_sysfs_dev_files(dev);
sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
kfree(dev->vpd->attr);
}
return retval; return retval;
} }
...@@ -1630,11 +1573,7 @@ int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev) ...@@ -1630,11 +1573,7 @@ int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev)
static void pci_remove_capabilities_sysfs(struct pci_dev *dev) static void pci_remove_capabilities_sysfs(struct pci_dev *dev)
{ {
if (dev->vpd && dev->vpd->attr) { pcie_vpd_remove_sysfs_dev_files(dev);
sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
kfree(dev->vpd->attr);
}
pcie_aspm_remove_sysfs_dev_files(dev); pcie_aspm_remove_sysfs_dev_files(dev);
if (dev->reset_fn) { if (dev->reset_fn) {
device_remove_file(&dev->dev, &reset_attr); device_remove_file(&dev->dev, &reset_attr);
......
...@@ -123,6 +123,8 @@ struct pci_vpd { ...@@ -123,6 +123,8 @@ struct pci_vpd {
int pci_vpd_init(struct pci_dev *dev); int pci_vpd_init(struct pci_dev *dev);
void pci_vpd_release(struct pci_dev *dev); void pci_vpd_release(struct pci_dev *dev);
void pcie_vpd_create_sysfs_dev_files(struct pci_dev *dev);
void pcie_vpd_remove_sysfs_dev_files(struct pci_dev *dev);
/* PCI /proc functions */ /* PCI /proc functions */
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
......
...@@ -378,6 +378,73 @@ void pci_vpd_release(struct pci_dev *dev) ...@@ -378,6 +378,73 @@ void pci_vpd_release(struct pci_dev *dev)
kfree(dev->vpd); kfree(dev->vpd);
} }
static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, char *buf,
loff_t off, size_t count)
{
struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
if (bin_attr->size > 0) {
if (off > bin_attr->size)
count = 0;
else if (count > bin_attr->size - off)
count = bin_attr->size - off;
}
return pci_read_vpd(dev, off, count, buf);
}
static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, char *buf,
loff_t off, size_t count)
{
struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
if (bin_attr->size > 0) {
if (off > bin_attr->size)
count = 0;
else if (count > bin_attr->size - off)
count = bin_attr->size - off;
}
return pci_write_vpd(dev, off, count, buf);
}
void pcie_vpd_create_sysfs_dev_files(struct pci_dev *dev)
{
int retval;
struct bin_attribute *attr;
if (!dev->vpd)
return;
attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
if (!attr)
return;
sysfs_bin_attr_init(attr);
attr->size = 0;
attr->attr.name = "vpd";
attr->attr.mode = S_IRUSR | S_IWUSR;
attr->read = read_vpd_attr;
attr->write = write_vpd_attr;
retval = sysfs_create_bin_file(&dev->dev.kobj, attr);
if (retval) {
kfree(attr);
return;
}
dev->vpd->attr = attr;
}
void pcie_vpd_remove_sysfs_dev_files(struct pci_dev *dev)
{
if (dev->vpd && dev->vpd->attr) {
sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
kfree(dev->vpd->attr);
}
}
int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt) int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt)
{ {
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment