* [PATCH 5/7] PCI: Add pci_find_dvsec_capability to find designated VSEC [not found] <20210921220459.2437386-1-ben.widawsky@intel.com> @ 2021-09-21 22:04 ` Ben Widawsky 2021-09-22 9:33 ` Frederic Barrat 2021-09-21 22:04 ` [PATCH 7/7] ocxl: Use pci core's DVSEC functionality Ben Widawsky 1 sibling, 1 reply; 5+ messages in thread From: Ben Widawsky @ 2021-09-21 22:04 UTC (permalink / raw) To: linux-cxl, linux-pci Cc: Vishal Verma, Alison Schofield, Ben Widawsky, Andrew Donnellan, Ira Weiny, Frederic Barrat, David E . Box, Jonathan Cameron, Bjorn Helgaas, Dan Williams, linuxppc-dev Add pci_find_dvsec_capability to locate a Designated Vendor-Specific Extended Capability with the specified DVSEC ID. The Designated Vendor-Specific Extended Capability (DVSEC) allows one or more vendor specific capabilities that aren't tied to the vendor ID of the PCI component. DVSEC is critical for both the Compute Express Link (CXL) driver as well as the driver for OpenCAPI coherent accelerator (OCXL). 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: Frederic Barrat <fbarrat@linux.ibm.com> Cc: Andrew Donnellan <ajd@linux.ibm.com> Signed-off-by: Ben Widawsky <ben.widawsky@intel.com> --- drivers/pci/pci.c | 32 ++++++++++++++++++++++++++++++++ include/linux/pci.h | 1 + 2 files changed, 33 insertions(+) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index ce2ab62b64cf..94ac86ff28b0 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -732,6 +732,38 @@ u16 pci_find_vsec_capability(struct pci_dev *dev, u16 vendor, int cap) } EXPORT_SYMBOL_GPL(pci_find_vsec_capability); +/** + * pci_find_dvsec_capability - Find DVSEC for vendor + * @dev: PCI device to query + * @vendor: Vendor ID to match for the DVSEC + * @dvsec: Designated Vendor-specific capability ID + * + * If DVSEC has Vendor ID @vendor and DVSEC ID @dvsec return the capability + * offset in config space; otherwise return 0. + */ +u16 pci_find_dvsec_capability(struct pci_dev *dev, u16 vendor, u16 dvsec) +{ + int pos; + + pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DVSEC); + if (!pos) + return 0; + + while (pos) { + u16 v, id; + + pci_read_config_word(dev, pos + PCI_DVSEC_HEADER1, &v); + pci_read_config_word(dev, pos + PCI_DVSEC_HEADER2, &id); + if (vendor == v && dvsec == id) + return pos; + + pos = pci_find_next_ext_capability(dev, pos, PCI_EXT_CAP_ID_DVSEC); + } + + return 0; +} +EXPORT_SYMBOL_GPL(pci_find_dvsec_capability); + /** * pci_find_parent_resource - return resource region of parent bus of given * region diff --git a/include/linux/pci.h b/include/linux/pci.h index cd8aa6fce204..c93ccfa4571b 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1130,6 +1130,7 @@ u16 pci_find_ext_capability(struct pci_dev *dev, int cap); u16 pci_find_next_ext_capability(struct pci_dev *dev, u16 pos, int cap); struct pci_bus *pci_find_next_bus(const struct pci_bus *from); u16 pci_find_vsec_capability(struct pci_dev *dev, u16 vendor, int cap); +u16 pci_find_dvsec_capability(struct pci_dev *dev, u16 vendor, u16 dvsec); u64 pci_get_dsn(struct pci_dev *dev); -- 2.33.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 5/7] PCI: Add pci_find_dvsec_capability to find designated VSEC 2021-09-21 22:04 ` [PATCH 5/7] PCI: Add pci_find_dvsec_capability to find designated VSEC Ben Widawsky @ 2021-09-22 9:33 ` Frederic Barrat 0 siblings, 0 replies; 5+ messages in thread From: Frederic Barrat @ 2021-09-22 9:33 UTC (permalink / raw) To: Ben Widawsky, linux-cxl, linux-pci Cc: Alison Schofield, Andrew Donnellan, Ira Weiny, Vishal Verma, David E . Box, Jonathan Cameron, Bjorn Helgaas, Dan Williams, linuxppc-dev On 22/09/2021 00:04, Ben Widawsky wrote: > Add pci_find_dvsec_capability to locate a Designated Vendor-Specific > Extended Capability with the specified DVSEC ID. > > The Designated Vendor-Specific Extended Capability (DVSEC) allows one or > more vendor specific capabilities that aren't tied to the vendor ID of > the PCI component. > > DVSEC is critical for both the Compute Express Link (CXL) driver as well > as the driver for OpenCAPI coherent accelerator (OCXL). > > 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: Frederic Barrat <fbarrat@linux.ibm.com> > Cc: Andrew Donnellan <ajd@linux.ibm.com> > Signed-off-by: Ben Widawsky <ben.widawsky@intel.com> > --- LGTM Reviewed-by: Frederic Barrat <fbarrat@linux.ibm.com> > drivers/pci/pci.c | 32 ++++++++++++++++++++++++++++++++ > include/linux/pci.h | 1 + > 2 files changed, 33 insertions(+) > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index ce2ab62b64cf..94ac86ff28b0 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -732,6 +732,38 @@ u16 pci_find_vsec_capability(struct pci_dev *dev, u16 vendor, int cap) > } > EXPORT_SYMBOL_GPL(pci_find_vsec_capability); > > +/** > + * pci_find_dvsec_capability - Find DVSEC for vendor > + * @dev: PCI device to query > + * @vendor: Vendor ID to match for the DVSEC > + * @dvsec: Designated Vendor-specific capability ID > + * > + * If DVSEC has Vendor ID @vendor and DVSEC ID @dvsec return the capability > + * offset in config space; otherwise return 0. > + */ > +u16 pci_find_dvsec_capability(struct pci_dev *dev, u16 vendor, u16 dvsec) > +{ > + int pos; > + > + pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DVSEC); > + if (!pos) > + return 0; > + > + while (pos) { > + u16 v, id; > + > + pci_read_config_word(dev, pos + PCI_DVSEC_HEADER1, &v); > + pci_read_config_word(dev, pos + PCI_DVSEC_HEADER2, &id); > + if (vendor == v && dvsec == id) > + return pos; > + > + pos = pci_find_next_ext_capability(dev, pos, PCI_EXT_CAP_ID_DVSEC); > + } > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(pci_find_dvsec_capability); > + > /** > * pci_find_parent_resource - return resource region of parent bus of given > * region > diff --git a/include/linux/pci.h b/include/linux/pci.h > index cd8aa6fce204..c93ccfa4571b 100644 > --- a/include/linux/pci.h > +++ b/include/linux/pci.h > @@ -1130,6 +1130,7 @@ u16 pci_find_ext_capability(struct pci_dev *dev, int cap); > u16 pci_find_next_ext_capability(struct pci_dev *dev, u16 pos, int cap); > struct pci_bus *pci_find_next_bus(const struct pci_bus *from); > u16 pci_find_vsec_capability(struct pci_dev *dev, u16 vendor, int cap); > +u16 pci_find_dvsec_capability(struct pci_dev *dev, u16 vendor, u16 dvsec); > > u64 pci_get_dsn(struct pci_dev *dev); > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 7/7] ocxl: Use pci core's DVSEC functionality [not found] <20210921220459.2437386-1-ben.widawsky@intel.com> 2021-09-21 22:04 ` [PATCH 5/7] PCI: Add pci_find_dvsec_capability to find designated VSEC Ben Widawsky @ 2021-09-21 22:04 ` Ben Widawsky 2021-09-22 0:44 ` Dan Williams 1 sibling, 1 reply; 5+ messages in thread From: Ben Widawsky @ 2021-09-21 22:04 UTC (permalink / raw) To: linux-cxl, linux-pci Cc: Alison Schofield, Ben Widawsky, Andrew Donnellan, Ira Weiny, Vishal Verma, Jonathan Cameron, Frederic Barrat, Dan Williams, linuxppc-dev Reduce maintenance burden of DVSEC query implementation by using the centralized PCI core implementation. Cc: linuxppc-dev@lists.ozlabs.org Cc: Frederic Barrat <fbarrat@linux.ibm.com> Cc: Andrew Donnellan <ajd@linux.ibm.com> Signed-off-by: Ben Widawsky <ben.widawsky@intel.com> --- drivers/misc/ocxl/config.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/drivers/misc/ocxl/config.c b/drivers/misc/ocxl/config.c index a68738f38252..e401a51596b9 100644 --- a/drivers/misc/ocxl/config.c +++ b/drivers/misc/ocxl/config.c @@ -33,18 +33,7 @@ static int find_dvsec(struct pci_dev *dev, int dvsec_id) { - int vsec = 0; - u16 vendor, id; - - while ((vsec = pci_find_next_ext_capability(dev, vsec, - OCXL_EXT_CAP_ID_DVSEC))) { - pci_read_config_word(dev, vsec + OCXL_DVSEC_VENDOR_OFFSET, - &vendor); - pci_read_config_word(dev, vsec + OCXL_DVSEC_ID_OFFSET, &id); - if (vendor == PCI_VENDOR_ID_IBM && id == dvsec_id) - return vsec; - } - return 0; + return pci_find_dvsec_capability(dev, PCI_VENDOR_ID_IBM, dvsec_id); } static int find_dvsec_afu_ctrl(struct pci_dev *dev, u8 afu_idx) -- 2.33.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 7/7] ocxl: Use pci core's DVSEC functionality 2021-09-21 22:04 ` [PATCH 7/7] ocxl: Use pci core's DVSEC functionality Ben Widawsky @ 2021-09-22 0:44 ` Dan Williams 2021-09-22 9:38 ` Frederic Barrat 0 siblings, 1 reply; 5+ messages in thread From: Dan Williams @ 2021-09-22 0:44 UTC (permalink / raw) To: Ben Widawsky Cc: Alison Schofield, Andrew Donnellan, Ira Weiny, Linux PCI, linux-cxl, Vishal Verma, Jonathan Cameron, Frederic Barrat, linuxppc-dev On Tue, Sep 21, 2021 at 3:05 PM Ben Widawsky <ben.widawsky@intel.com> wrote: > > Reduce maintenance burden of DVSEC query implementation by using the > centralized PCI core implementation. > > Cc: linuxppc-dev@lists.ozlabs.org > Cc: Frederic Barrat <fbarrat@linux.ibm.com> > Cc: Andrew Donnellan <ajd@linux.ibm.com> > Signed-off-by: Ben Widawsky <ben.widawsky@intel.com> > --- > drivers/misc/ocxl/config.c | 13 +------------ > 1 file changed, 1 insertion(+), 12 deletions(-) > > diff --git a/drivers/misc/ocxl/config.c b/drivers/misc/ocxl/config.c > index a68738f38252..e401a51596b9 100644 > --- a/drivers/misc/ocxl/config.c > +++ b/drivers/misc/ocxl/config.c > @@ -33,18 +33,7 @@ > > static int find_dvsec(struct pci_dev *dev, int dvsec_id) > { > - int vsec = 0; > - u16 vendor, id; > - > - while ((vsec = pci_find_next_ext_capability(dev, vsec, > - OCXL_EXT_CAP_ID_DVSEC))) { > - pci_read_config_word(dev, vsec + OCXL_DVSEC_VENDOR_OFFSET, > - &vendor); > - pci_read_config_word(dev, vsec + OCXL_DVSEC_ID_OFFSET, &id); > - if (vendor == PCI_VENDOR_ID_IBM && id == dvsec_id) > - return vsec; > - } > - return 0; > + return pci_find_dvsec_capability(dev, PCI_VENDOR_ID_IBM, dvsec_id); > } What about: arch/powerpc/platforms/powernv/ocxl.c::find_dvsec_from_pos() ...? With that converted the redundant definitions below: OCXL_EXT_CAP_ID_DVSEC OCXL_DVSEC_VENDOR_OFFSET OCXL_DVSEC_ID_OFFSET ...can be cleaned up in favor of the core definitions. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 7/7] ocxl: Use pci core's DVSEC functionality 2021-09-22 0:44 ` Dan Williams @ 2021-09-22 9:38 ` Frederic Barrat 0 siblings, 0 replies; 5+ messages in thread From: Frederic Barrat @ 2021-09-22 9:38 UTC (permalink / raw) To: Dan Williams, Ben Widawsky Cc: Alison Schofield, Andrew Donnellan, Linux PCI, linuxppc-dev, linux-cxl, Vishal Verma, Jonathan Cameron, Ira Weiny On 22/09/2021 02:44, Dan Williams wrote: > On Tue, Sep 21, 2021 at 3:05 PM Ben Widawsky <ben.widawsky@intel.com> wrote: >> >> Reduce maintenance burden of DVSEC query implementation by using the >> centralized PCI core implementation. >> >> Cc: linuxppc-dev@lists.ozlabs.org >> Cc: Frederic Barrat <fbarrat@linux.ibm.com> >> Cc: Andrew Donnellan <ajd@linux.ibm.com> >> Signed-off-by: Ben Widawsky <ben.widawsky@intel.com> >> --- >> drivers/misc/ocxl/config.c | 13 +------------ >> 1 file changed, 1 insertion(+), 12 deletions(-) >> >> diff --git a/drivers/misc/ocxl/config.c b/drivers/misc/ocxl/config.c >> index a68738f38252..e401a51596b9 100644 >> --- a/drivers/misc/ocxl/config.c >> +++ b/drivers/misc/ocxl/config.c >> @@ -33,18 +33,7 @@ >> >> static int find_dvsec(struct pci_dev *dev, int dvsec_id) >> { >> - int vsec = 0; >> - u16 vendor, id; >> - >> - while ((vsec = pci_find_next_ext_capability(dev, vsec, >> - OCXL_EXT_CAP_ID_DVSEC))) { >> - pci_read_config_word(dev, vsec + OCXL_DVSEC_VENDOR_OFFSET, >> - &vendor); >> - pci_read_config_word(dev, vsec + OCXL_DVSEC_ID_OFFSET, &id); >> - if (vendor == PCI_VENDOR_ID_IBM && id == dvsec_id) >> - return vsec; >> - } >> - return 0; >> + return pci_find_dvsec_capability(dev, PCI_VENDOR_ID_IBM, dvsec_id); >> } That looks fine, thanks for spotting it. You can add this for the next revision: Acked-by: Frederic Barrat <fbarrat@linux.ibm.com> > > What about: > > arch/powerpc/platforms/powernv/ocxl.c::find_dvsec_from_pos() > > ...? With that converted the redundant definitions below: > > OCXL_EXT_CAP_ID_DVSEC > OCXL_DVSEC_VENDOR_OFFSET > OCXL_DVSEC_ID_OFFSET > > ...can be cleaned up in favor of the core definitions. That would be great. Are you guys willing to do it? If not, I could have a follow-on patch, if I don't forget :-) Thanks, Fred ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-09-22 9:39 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20210921220459.2437386-1-ben.widawsky@intel.com>
2021-09-21 22:04 ` [PATCH 5/7] PCI: Add pci_find_dvsec_capability to find designated VSEC Ben Widawsky
2021-09-22 9:33 ` Frederic Barrat
2021-09-21 22:04 ` [PATCH 7/7] ocxl: Use pci core's DVSEC functionality Ben Widawsky
2021-09-22 0:44 ` Dan Williams
2021-09-22 9:38 ` Frederic Barrat
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).