Message ID | 167571666013.587790.16270669112177554916.stgit@djiang5-mobl3.local |
---|---|
State | Superseded |
Headers | show |
Series | cxl: Add support for QTG ID retrieval for CXL subsystem | expand |
On Mon, Feb 06, 2023 at 01:51:01PM -0700, Dave Jiang wrote: > Move the logic in current_link_width_show() to a common function and export > that functiuon as pcie_get_width() to allow other drivers to to retrieve > the current negotiated link width. s/a common function and export that functiuon and export that functiuon as// I don't see the module caller of this, so not clear on why it needs to be exported. > Signed-off-by: Dave Jiang <dave.jiang@intel.com> > --- > drivers/pci/pci-sysfs.c | 9 +-------- > drivers/pci/pci.c | 20 ++++++++++++++++++++ > include/linux/pci.h | 1 + > 3 files changed, 22 insertions(+), 8 deletions(-) > > diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c > index 0217bb5ca8fa..139096c39380 100644 > --- a/drivers/pci/pci-sysfs.c > +++ b/drivers/pci/pci-sysfs.c > @@ -215,15 +215,8 @@ static ssize_t current_link_width_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > struct pci_dev *pci_dev = to_pci_dev(dev); > - u16 linkstat; > - int err; > > - err = pcie_capability_read_word(pci_dev, PCI_EXP_LNKSTA, &linkstat); > - if (err) > - return -EINVAL; > - > - return sysfs_emit(buf, "%u\n", > - (linkstat & PCI_EXP_LNKSTA_NLW) >> PCI_EXP_LNKSTA_NLW_SHIFT); > + return sysfs_emit(buf, "%u\n", pcie_get_width(pci_dev)); > } > static DEVICE_ATTR_RO(current_link_width); > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index d0131b5623b1..0858fa2f1c2d 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -6235,6 +6235,26 @@ enum pci_bus_speed pcie_get_speed(struct pci_dev *dev) > } > EXPORT_SYMBOL(pcie_get_speed); > > +/** > + * pcie_get_width - query for the PCI device's current link width > + * @dev: PCI device to query > + * > + * Query the PCI device current negoiated width. > + */ > + > +enum pcie_link_width pcie_get_width(struct pci_dev *dev) > +{ > + u16 linkstat; > + int err; > + > + err = pcie_capability_read_word(dev, PCI_EXP_LNKSTA, &linkstat); > + if (err) > + return PCIE_LNK_WIDTH_UNKNOWN; > + > + return FIELD_GET(PCI_EXP_LNKSTA_NLW, linkstat); > +} > +EXPORT_SYMBOL(pcie_get_width); > + > /** > * pcie_bandwidth_capable - calculate a PCI device's link bandwidth capability > * @dev: PCI device > diff --git a/include/linux/pci.h b/include/linux/pci.h > index 6a065986ff8f..21eca09a98e2 100644 > --- a/include/linux/pci.h > +++ b/include/linux/pci.h > @@ -305,6 +305,7 @@ enum pci_bus_speed { > > enum pci_bus_speed pcie_get_speed(struct pci_dev *dev); > enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev); > +enum pcie_link_width pcie_get_width(struct pci_dev *dev); > enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev); > > struct pci_vpd { > >
On 2/6/23 3:43 PM, Bjorn Helgaas wrote: > On Mon, Feb 06, 2023 at 01:51:01PM -0700, Dave Jiang wrote: >> Move the logic in current_link_width_show() to a common function and export >> that functiuon as pcie_get_width() to allow other drivers to to retrieve >> the current negotiated link width. > > s/a common function and export that functiuon and export that functiuon as// > > I don't see the module caller of this, so not clear on why it needs to > be exported. You are right. I think I was using it before I found pcie_bandwidth_available() call. I will drop. > >> Signed-off-by: Dave Jiang <dave.jiang@intel.com> >> --- >> drivers/pci/pci-sysfs.c | 9 +-------- >> drivers/pci/pci.c | 20 ++++++++++++++++++++ >> include/linux/pci.h | 1 + >> 3 files changed, 22 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c >> index 0217bb5ca8fa..139096c39380 100644 >> --- a/drivers/pci/pci-sysfs.c >> +++ b/drivers/pci/pci-sysfs.c >> @@ -215,15 +215,8 @@ static ssize_t current_link_width_show(struct device *dev, >> struct device_attribute *attr, char *buf) >> { >> struct pci_dev *pci_dev = to_pci_dev(dev); >> - u16 linkstat; >> - int err; >> >> - err = pcie_capability_read_word(pci_dev, PCI_EXP_LNKSTA, &linkstat); >> - if (err) >> - return -EINVAL; >> - >> - return sysfs_emit(buf, "%u\n", >> - (linkstat & PCI_EXP_LNKSTA_NLW) >> PCI_EXP_LNKSTA_NLW_SHIFT); >> + return sysfs_emit(buf, "%u\n", pcie_get_width(pci_dev)); >> } >> static DEVICE_ATTR_RO(current_link_width); >> >> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c >> index d0131b5623b1..0858fa2f1c2d 100644 >> --- a/drivers/pci/pci.c >> +++ b/drivers/pci/pci.c >> @@ -6235,6 +6235,26 @@ enum pci_bus_speed pcie_get_speed(struct pci_dev *dev) >> } >> EXPORT_SYMBOL(pcie_get_speed); >> >> +/** >> + * pcie_get_width - query for the PCI device's current link width >> + * @dev: PCI device to query >> + * >> + * Query the PCI device current negoiated width. >> + */ >> + >> +enum pcie_link_width pcie_get_width(struct pci_dev *dev) >> +{ >> + u16 linkstat; >> + int err; >> + >> + err = pcie_capability_read_word(dev, PCI_EXP_LNKSTA, &linkstat); >> + if (err) >> + return PCIE_LNK_WIDTH_UNKNOWN; >> + >> + return FIELD_GET(PCI_EXP_LNKSTA_NLW, linkstat); >> +} >> +EXPORT_SYMBOL(pcie_get_width); >> + >> /** >> * pcie_bandwidth_capable - calculate a PCI device's link bandwidth capability >> * @dev: PCI device >> diff --git a/include/linux/pci.h b/include/linux/pci.h >> index 6a065986ff8f..21eca09a98e2 100644 >> --- a/include/linux/pci.h >> +++ b/include/linux/pci.h >> @@ -305,6 +305,7 @@ enum pci_bus_speed { >> >> enum pci_bus_speed pcie_get_speed(struct pci_dev *dev); >> enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev); >> +enum pcie_link_width pcie_get_width(struct pci_dev *dev); >> enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev); >> >> struct pci_vpd { >> >>
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 0217bb5ca8fa..139096c39380 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -215,15 +215,8 @@ static ssize_t current_link_width_show(struct device *dev, struct device_attribute *attr, char *buf) { struct pci_dev *pci_dev = to_pci_dev(dev); - u16 linkstat; - int err; - err = pcie_capability_read_word(pci_dev, PCI_EXP_LNKSTA, &linkstat); - if (err) - return -EINVAL; - - return sysfs_emit(buf, "%u\n", - (linkstat & PCI_EXP_LNKSTA_NLW) >> PCI_EXP_LNKSTA_NLW_SHIFT); + return sysfs_emit(buf, "%u\n", pcie_get_width(pci_dev)); } static DEVICE_ATTR_RO(current_link_width); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index d0131b5623b1..0858fa2f1c2d 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -6235,6 +6235,26 @@ enum pci_bus_speed pcie_get_speed(struct pci_dev *dev) } EXPORT_SYMBOL(pcie_get_speed); +/** + * pcie_get_width - query for the PCI device's current link width + * @dev: PCI device to query + * + * Query the PCI device current negoiated width. + */ + +enum pcie_link_width pcie_get_width(struct pci_dev *dev) +{ + u16 linkstat; + int err; + + err = pcie_capability_read_word(dev, PCI_EXP_LNKSTA, &linkstat); + if (err) + return PCIE_LNK_WIDTH_UNKNOWN; + + return FIELD_GET(PCI_EXP_LNKSTA_NLW, linkstat); +} +EXPORT_SYMBOL(pcie_get_width); + /** * pcie_bandwidth_capable - calculate a PCI device's link bandwidth capability * @dev: PCI device diff --git a/include/linux/pci.h b/include/linux/pci.h index 6a065986ff8f..21eca09a98e2 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -305,6 +305,7 @@ enum pci_bus_speed { enum pci_bus_speed pcie_get_speed(struct pci_dev *dev); enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev); +enum pcie_link_width pcie_get_width(struct pci_dev *dev); enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev); struct pci_vpd {
Move the logic in current_link_width_show() to a common function and export that functiuon as pcie_get_width() to allow other drivers to to retrieve the current negotiated link width. Signed-off-by: Dave Jiang <dave.jiang@intel.com> --- drivers/pci/pci-sysfs.c | 9 +-------- drivers/pci/pci.c | 20 ++++++++++++++++++++ include/linux/pci.h | 1 + 3 files changed, 22 insertions(+), 8 deletions(-)