Message ID | 20250306075211.1855177-3-alistair@alistair23.me (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | [v17,1/4] PCI/DOE: Rename DOE protocol to feature | expand |
Hi Alistair, kernel test robot noticed the following build errors: [auto build test ERROR on pci/next] [also build test ERROR on pci/for-linus linus/master v6.14-rc5 next-20250306] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Alistair-Francis/PCI-DOE-Rename-Discovery-Response-Data-Object-Contents-to-type/20250306-155550 base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next patch link: https://lore.kernel.org/r/20250306075211.1855177-3-alistair%40alistair23.me patch subject: [PATCH v17 3/4] PCI/DOE: Expose the DOE features via sysfs config: powerpc-icon_defconfig (https://download.01.org/0day-ci/archive/20250307/202503071950.vvsA3SXV-lkp@intel.com/config) compiler: powerpc-linux-gcc (GCC) 14.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250307/202503071950.vvsA3SXV-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202503071950.vvsA3SXV-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from arch/powerpc/kernel/pci-common.c:44: arch/powerpc/kernel/../../../drivers/pci/pci.h: In function 'pci_doe_sysfs_init': >> arch/powerpc/kernel/../../../drivers/pci/pci.h:488:70: error: 'return' with a value, in function returning void [-Wreturn-mismatch] 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^ arch/powerpc/kernel/../../../drivers/pci/pci.h:488:20: note: declared here 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^~~~~~~~~~~~~~~~~~ vim +/return +488 arch/powerpc/kernel/../../../drivers/pci/pci.h 483 484 #if defined(CONFIG_PCI_DOE) && defined(CONFIG_SYSFS) 485 void pci_doe_sysfs_init(struct pci_dev *pci_dev); 486 void pci_doe_sysfs_teardown(struct pci_dev *pdev); 487 #else > 488 static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } 489 static inline void pci_doe_sysfs_teardown(struct pci_dev *pdev) { } 490 #endif 491
Hi Alistair, kernel test robot noticed the following build warnings: [auto build test WARNING on pci/next] [also build test WARNING on pci/for-linus linus/master v6.14-rc5 next-20250307] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Alistair-Francis/PCI-DOE-Rename-Discovery-Response-Data-Object-Contents-to-type/20250306-155550 base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next patch link: https://lore.kernel.org/r/20250306075211.1855177-3-alistair%40alistair23.me patch subject: [PATCH v17 3/4] PCI/DOE: Expose the DOE features via sysfs config: microblaze-randconfig-r111-20250307 (https://download.01.org/0day-ci/archive/20250307/202503072119.bmT7zRPN-lkp@intel.com/config) compiler: microblaze-linux-gcc (GCC) 14.2.0 reproduce: (https://download.01.org/0day-ci/archive/20250307/202503072119.bmT7zRPN-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202503072119.bmT7zRPN-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/pci/doe.c:109:1: sparse: sparse: symbol 'dev_attr_doe_discovery' was not declared. Should it be static? vim +/dev_attr_doe_discovery +109 drivers/pci/doe.c 101 102 #ifdef CONFIG_SYSFS 103 static ssize_t doe_discovery_show(struct device *dev, 104 struct device_attribute *attr, 105 char *buf) 106 { 107 return sysfs_emit(buf, "0001:00\n"); 108 } > 109 DEVICE_ATTR_RO(doe_discovery); 110
Hi Alistair, kernel test robot noticed the following build errors: [auto build test ERROR on pci/next] [also build test ERROR on pci/for-linus linus/master v6.14-rc5 next-20250307] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Alistair-Francis/PCI-DOE-Rename-Discovery-Response-Data-Object-Contents-to-type/20250306-155550 base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next patch link: https://lore.kernel.org/r/20250306075211.1855177-3-alistair%40alistair23.me patch subject: [PATCH v17 3/4] PCI/DOE: Expose the DOE features via sysfs config: powerpc64-randconfig-003-20250307 (https://download.01.org/0day-ci/archive/20250307/202503072251.DHy2O6b1-lkp@intel.com/config) compiler: powerpc64-linux-gcc (GCC) 14.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250307/202503072251.DHy2O6b1-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202503072251.DHy2O6b1-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from arch/powerpc/platforms/powernv/pci-ioda.c:46: arch/powerpc/platforms/powernv/../../../../drivers/pci/pci.h: In function 'pci_doe_sysfs_init': >> arch/powerpc/platforms/powernv/../../../../drivers/pci/pci.h:488:70: error: 'return' with a value, in function returning void [-Wreturn-mismatch] 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^ arch/powerpc/platforms/powernv/../../../../drivers/pci/pci.h:488:20: note: declared here 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^~~~~~~~~~~~~~~~~~ vim +/return +488 arch/powerpc/platforms/powernv/../../../../drivers/pci/pci.h 483 484 #if defined(CONFIG_PCI_DOE) && defined(CONFIG_SYSFS) 485 void pci_doe_sysfs_init(struct pci_dev *pci_dev); 486 void pci_doe_sysfs_teardown(struct pci_dev *pdev); 487 #else > 488 static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } 489 static inline void pci_doe_sysfs_teardown(struct pci_dev *pdev) { } 490 #endif 491
Hi Alistair, kernel test robot noticed the following build warnings: [auto build test WARNING on pci/next] [also build test WARNING on pci/for-linus linus/master v6.14-rc5 next-20250307] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Alistair-Francis/PCI-DOE-Rename-Discovery-Response-Data-Object-Contents-to-type/20250306-155550 base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next patch link: https://lore.kernel.org/r/20250306075211.1855177-3-alistair%40alistair23.me patch subject: [PATCH v17 3/4] PCI/DOE: Expose the DOE features via sysfs config: um-randconfig-r063-20250307 (https://download.01.org/0day-ci/archive/20250307/202503072302.i9H71Jqv-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250307/202503072302.i9H71Jqv-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202503072302.i9H71Jqv-lkp@intel.com/ All warnings (new ones prefixed by >>): In file included from drivers/pci/msi/pcidev_msi.c:5: drivers/pci/msi/../pci.h: In function 'pci_doe_sysfs_init': >> drivers/pci/msi/../pci.h:488:70: warning: 'return' with a value, in function returning void [-Wreturn-type] 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^ drivers/pci/msi/../pci.h:488:20: note: declared here 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^~~~~~~~~~~~~~~~~~ -- In file included from drivers/pci/pcie/aspm.c:27: drivers/pci/pcie/../pci.h: In function 'pci_doe_sysfs_init': >> drivers/pci/pcie/../pci.h:488:70: warning: 'return' with a value, in function returning void [-Wreturn-type] 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^ drivers/pci/pcie/../pci.h:488:20: note: declared here 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^~~~~~~~~~~~~~~~~~ -- In file included from drivers/pci/hotplug/pci_hotplug_core.c:32: drivers/pci/hotplug/../pci.h: In function 'pci_doe_sysfs_init': >> drivers/pci/hotplug/../pci.h:488:70: warning: 'return' with a value, in function returning void [-Wreturn-type] 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^ drivers/pci/hotplug/../pci.h:488:20: note: declared here 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^~~~~~~~~~~~~~~~~~ -- In file included from drivers/pci/controller/dwc/pcie-designware.c:24: drivers/pci/controller/dwc/../../pci.h: In function 'pci_doe_sysfs_init': >> drivers/pci/controller/dwc/../../pci.h:488:70: warning: 'return' with a value, in function returning void [-Wreturn-type] 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^ drivers/pci/controller/dwc/../../pci.h:488:20: note: declared here 488 | static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } | ^~~~~~~~~~~~~~~~~~ vim +/return +488 drivers/pci/msi/../pci.h 483 484 #if defined(CONFIG_PCI_DOE) && defined(CONFIG_SYSFS) 485 void pci_doe_sysfs_init(struct pci_dev *pci_dev); 486 void pci_doe_sysfs_teardown(struct pci_dev *pdev); 487 #else > 488 static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } 489 static inline void pci_doe_sysfs_teardown(struct pci_dev *pdev) { } 490 #endif 491
diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci index 5da6a14dc326..874de7325d2b 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci +++ b/Documentation/ABI/testing/sysfs-bus-pci @@ -583,3 +583,31 @@ Description: enclosure-specific indications "specific0" to "specific7", hence the corresponding led class devices are unavailable if the DSM interface is used. + +What: /sys/bus/pci/devices/.../doe_features +Date: March 2025 +Contact: Linux PCI developers <linux-pci@vger.kernel.org> +Description: + This directory contains a list of the supported + Data Object Exchange (DOE) features. The features are + the file name. The contents of each file is the raw vendor id and + data object feature values. + + The value comes from the device and specifies the vendor and + data object type supported. The lower (RHS of the colon) is + the data object type in hex. The upper (LHS of the colon) + is the vendor ID. + + As all DOE devices must support the DOE discovery feature, if + DOE is supported you will at least see the doe_discovery file, with + this contents + + # cat doe_features/doe_discovery + 0001:00 + + If the device supports other features you will see other files + as well. For example is CMA/SPDM and secure CMA/SPDM are supported + the doe_features directory will look like this + + # ls doe_features + 0001:01 0001:02 doe_discovery diff --git a/drivers/pci/doe.c b/drivers/pci/doe.c index f4508d75ce69..5e55eb40160c 100644 --- a/drivers/pci/doe.c +++ b/drivers/pci/doe.c @@ -14,10 +14,12 @@ #include <linux/bitfield.h> #include <linux/delay.h> +#include <linux/device.h> #include <linux/jiffies.h> #include <linux/mutex.h> #include <linux/pci.h> #include <linux/pci-doe.h> +#include <linux/sysfs.h> #include <linux/workqueue.h> #include "pci.h" @@ -47,6 +49,7 @@ * @wq: Wait queue for work item * @work_queue: Queue of pci_doe_work items * @flags: Bit array of PCI_DOE_FLAG_* flags + * @sysfs_attrs: Array of sysfs device attributes */ struct pci_doe_mb { struct pci_dev *pdev; @@ -56,6 +59,10 @@ struct pci_doe_mb { wait_queue_head_t wq; struct workqueue_struct *work_queue; unsigned long flags; + +#ifdef CONFIG_SYSFS + struct device_attribute *sysfs_attrs; +#endif }; struct pci_doe_feature { @@ -92,6 +99,147 @@ struct pci_doe_task { struct pci_doe_mb *doe_mb; }; +#ifdef CONFIG_SYSFS +static ssize_t doe_discovery_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "0001:00\n"); +} +DEVICE_ATTR_RO(doe_discovery); + +static struct attribute *pci_doe_sysfs_feature_attrs[] = { + &dev_attr_doe_discovery.attr, + NULL +}; + +static bool pci_doe_features_sysfs_group_visible(struct kobject *kobj) +{ + struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj)); + + return !xa_empty(&pdev->doe_mbs); +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(pci_doe_features_sysfs) + +const struct attribute_group pci_doe_sysfs_group = { + .name = "doe_features", + .attrs = pci_doe_sysfs_feature_attrs, + .is_visible = SYSFS_GROUP_VISIBLE(pci_doe_features_sysfs), +}; + +static ssize_t pci_doe_sysfs_feature_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%s\n", attr->attr.name); +} + +static void pci_doe_sysfs_feature_remove(struct pci_dev *pdev, + struct pci_doe_mb *doe_mb) +{ + struct device_attribute *attrs = doe_mb->sysfs_attrs; + struct device *dev = &pdev->dev; + unsigned long i; + void *entry; + + if (!attrs) + return; + + doe_mb->sysfs_attrs = NULL; + xa_for_each(&doe_mb->feats, i, entry) { + if (attrs[i].show) + sysfs_remove_file_from_group(&dev->kobj, &attrs[i].attr, + pci_doe_sysfs_group.name); + kfree(attrs[i].attr.name); + } + kfree(attrs); +} + +static int pci_doe_sysfs_feature_populate(struct pci_dev *pdev, + struct pci_doe_mb *doe_mb) +{ + struct device *dev = &pdev->dev; + struct device_attribute *attrs; + unsigned long num_features = 0; + unsigned long vid, type; + unsigned long i; + void *entry; + int ret; + + xa_for_each(&doe_mb->feats, i, entry) + num_features++; + + attrs = kcalloc(num_features, sizeof(*attrs), GFP_KERNEL); + if (!attrs) { + pci_warn(pdev, "Failed allocating the device_attribute array\n"); + return -ENOMEM; + } + + doe_mb->sysfs_attrs = attrs; + xa_for_each(&doe_mb->feats, i, entry) { + sysfs_attr_init(&attrs[i].attr); + vid = xa_to_value(entry) >> 8; + type = xa_to_value(entry) & 0xFF; + + if (vid == PCI_VENDOR_ID_PCI_SIG && type == PCI_DOE_FEATURE_DISCOVERY) { + /* DOE Discovery, manually displayed by `dev_attr_doe_discovery` */ + continue; + } + + attrs[i].attr.name = kasprintf(GFP_KERNEL, + "%04lx:%02lx", vid, type); + if (!attrs[i].attr.name) { + ret = -ENOMEM; + pci_warn(pdev, "Failed allocating the attribute name\n"); + goto fail; + } + + attrs[i].attr.mode = 0444; + attrs[i].show = pci_doe_sysfs_feature_show; + + ret = sysfs_add_file_to_group(&dev->kobj, &attrs[i].attr, + pci_doe_sysfs_group.name); + if (ret) { + attrs[i].show = NULL; + if (ret != -EEXIST) { + pci_warn(pdev, "Failed adding %s to sysfs group\n", + attrs[i].attr.name); + goto fail; + } else + kfree(attrs[i].attr.name); + } + } + + return 0; + +fail: + pci_doe_sysfs_feature_remove(pdev, doe_mb); + return ret; +} + +void pci_doe_sysfs_teardown(struct pci_dev *pdev) +{ + struct pci_doe_mb *doe_mb; + unsigned long index; + + xa_for_each(&pdev->doe_mbs, index, doe_mb) + pci_doe_sysfs_feature_remove(pdev, doe_mb); +} + +void pci_doe_sysfs_init(struct pci_dev *pdev) +{ + struct pci_doe_mb *doe_mb; + unsigned long index; + int ret; + + xa_for_each(&pdev->doe_mbs, index, doe_mb) { + ret = pci_doe_sysfs_feature_populate(pdev, doe_mb); + if (ret) + return; + } +} +#endif + static int pci_doe_wait(struct pci_doe_mb *doe_mb, unsigned long timeout) { if (wait_event_timeout(doe_mb->wq, diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index b46ce1a2c554..5e3874eaa3c1 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -1804,6 +1804,9 @@ const struct attribute_group *pci_dev_attr_groups[] = { #endif #ifdef CONFIG_PCIEASPM &aspm_ctrl_attr_group, +#endif +#ifdef CONFIG_PCI_DOE + &pci_doe_sysfs_group, #endif NULL, }; diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 01e51db8d285..476d33c82058 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -253,6 +253,7 @@ extern const struct attribute_group *pci_dev_groups[]; extern const struct attribute_group *pci_dev_attr_groups[]; extern const struct attribute_group *pcibus_groups[]; extern const struct attribute_group *pci_bus_groups[]; +extern const struct attribute_group pci_doe_sysfs_group; #else static inline int pci_create_sysfs_dev_files(struct pci_dev *pdev) { return 0; } static inline void pci_remove_sysfs_dev_files(struct pci_dev *pdev) { } @@ -456,6 +457,14 @@ static inline void pci_npem_create(struct pci_dev *dev) { } static inline void pci_npem_remove(struct pci_dev *dev) { } #endif +#if defined(CONFIG_PCI_DOE) && defined(CONFIG_SYSFS) +void pci_doe_sysfs_init(struct pci_dev *pci_dev); +void pci_doe_sysfs_teardown(struct pci_dev *pdev); +#else +static inline void pci_doe_sysfs_init(struct pci_dev *pdev) { return 0; } +static inline void pci_doe_sysfs_teardown(struct pci_dev *pdev) { } +#endif + /** * pci_dev_set_io_state - Set the new error state if possible. * diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 246744d8d268..9b21e9379dae 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -2662,6 +2662,8 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) WARN_ON(ret < 0); pci_npem_create(dev); + + pci_doe_sysfs_init(dev); } struct pci_dev *pci_scan_single_device(struct pci_bus *bus, int devfn) diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index efc37fcb73e2..5813726214e6 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -53,6 +53,7 @@ static void pci_destroy_dev(struct pci_dev *dev) if (pci_dev_test_and_set_removed(dev)) return; + pci_doe_sysfs_teardown(dev); pci_npem_remove(dev); device_del(&dev->dev);