Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: Add pci_find_dvsec_capability to find designated VSEC

Add pci_find_dvsec_capability to locate a Designated Vendor-Specific
Extended Capability with the specified Vendor ID and Capability ID.

The Designated Vendor-Specific Extended Capability (DVSEC) allows one or
more "vendor" specific capabilities that are not tied to the Vendor ID
of the PCI component. Where the DVSEC Vendor may be a standards body
like CXL.

Cc: David E. Box <david.e.box@linux.intel.com>
Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: linux-pci@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: Andrew Donnellan <ajd@linux.ibm.com>
Cc: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Frederic Barrat <fbarrat@linux.ibm.com>
Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/163379787943.692348.6814373487017444007.stgit@dwillia2-desk3.amr.corp.intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>

authored by

Ben Widawsky and committed by
Dan Williams
ee122037 85afc317

+33
+32
drivers/pci/pci.c
··· 733 733 EXPORT_SYMBOL_GPL(pci_find_vsec_capability); 734 734 735 735 /** 736 + * pci_find_dvsec_capability - Find DVSEC for vendor 737 + * @dev: PCI device to query 738 + * @vendor: Vendor ID to match for the DVSEC 739 + * @dvsec: Designated Vendor-specific capability ID 740 + * 741 + * If DVSEC has Vendor ID @vendor and DVSEC ID @dvsec return the capability 742 + * offset in config space; otherwise return 0. 743 + */ 744 + u16 pci_find_dvsec_capability(struct pci_dev *dev, u16 vendor, u16 dvsec) 745 + { 746 + int pos; 747 + 748 + pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DVSEC); 749 + if (!pos) 750 + return 0; 751 + 752 + while (pos) { 753 + u16 v, id; 754 + 755 + pci_read_config_word(dev, pos + PCI_DVSEC_HEADER1, &v); 756 + pci_read_config_word(dev, pos + PCI_DVSEC_HEADER2, &id); 757 + if (vendor == v && dvsec == id) 758 + return pos; 759 + 760 + pos = pci_find_next_ext_capability(dev, pos, PCI_EXT_CAP_ID_DVSEC); 761 + } 762 + 763 + return 0; 764 + } 765 + EXPORT_SYMBOL_GPL(pci_find_dvsec_capability); 766 + 767 + /** 736 768 * pci_find_parent_resource - return resource region of parent bus of given 737 769 * region 738 770 * @dev: PCI device structure contains resources to be searched
+1
include/linux/pci.h
··· 1130 1130 u16 pci_find_next_ext_capability(struct pci_dev *dev, u16 pos, int cap); 1131 1131 struct pci_bus *pci_find_next_bus(const struct pci_bus *from); 1132 1132 u16 pci_find_vsec_capability(struct pci_dev *dev, u16 vendor, int cap); 1133 + u16 pci_find_dvsec_capability(struct pci_dev *dev, u16 vendor, u16 dvsec); 1133 1134 1134 1135 u64 pci_get_dsn(struct pci_dev *dev); 1135 1136