The pci_dev_resource_attr() macro will be used to declare and define each of the PCI resource sysfs objects statically while also reducing unnecessary code repetition. Internally this macro relies on the pci_dev_resource_attr_is_visible() helper which should correctly handle different types of PCI BAR address space while also providing support for creating either normal and/or write-combine attributes as required. Signed-off-by: Krzysztof Wilczyński <kw@xxxxxxxxx> --- drivers/pci/pci-sysfs.c | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index c94ab9830932..6eba5c0887df 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -1277,6 +1277,53 @@ static umode_t pci_dev_resource_attr_is_visible(struct kobject *kobj, return attr->attr.mode; } + +#define pci_dev_resource_attr(_bar) \ +static struct bin_attribute \ +pci_dev_resource##_bar##_attr = __BIN_ATTR(resource##_bar, \ + 0600, NULL, NULL, 0); \ + \ +static struct bin_attribute *pci_dev_resource##_bar##_attrs[] = { \ + &pci_dev_resource##_bar##_attr, \ + NULL, \ +}; \ + \ +static umode_t \ +pci_dev_resource##_bar##_attr_is_visible(struct kobject *kobj, \ + struct bin_attribute *a, \ + int n) \ +{ \ + return pci_dev_resource_attr_is_visible(kobj, a, _bar, false); \ +}; \ + \ +static const struct \ +attribute_group pci_dev_resource##_bar##_attr_group = { \ + .bin_attrs = pci_dev_resource##_bar##_attrs, \ + .is_bin_visible = pci_dev_resource##_bar##_attr_is_visible, \ +}; \ + \ +static struct bin_attribute \ +pci_dev_resource##_bar##_wc_attr = __BIN_ATTR(resource##_bar##_wc, \ + 0600, NULL, NULL, 0); \ + \ +static struct bin_attribute *pci_dev_resource##_bar##_wc_attrs[] = { \ + &pci_dev_resource##_bar##_wc_attr, \ + NULL, \ +}; \ + \ +static umode_t \ +pci_dev_resource##_bar##_wc_attr_is_visible(struct kobject *kobj, \ + struct bin_attribute *a, \ + int n) \ +{ \ + return pci_dev_resource_attr_is_visible(kobj, a, _bar, true); \ +}; \ + \ +static const struct \ +attribute_group pci_dev_resource##_bar##_wc_attr_group = { \ + .bin_attrs = pci_dev_resource##_bar##_wc_attrs, \ + .is_bin_visible = pci_dev_resource##_bar##_wc_attr_is_visible, \ +} #else /* !(defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE)) */ int __weak pci_create_resource_files(struct pci_dev *dev) { return 0; } void __weak pci_remove_resource_files(struct pci_dev *dev) { return; } -- 2.32.0