diff mbox series

[11/18] PCI: Export pcie_get_width() using the code from sysfs PCI link width show function

Message ID 167571666013.587790.16270669112177554916.stgit@djiang5-mobl3.local (mailing list archive)
State Handled Elsewhere
Headers show
Series cxl: Add support for QTG ID retrieval for CXL subsystem | expand

Commit Message

Dave Jiang Feb. 6, 2023, 8:51 p.m. UTC
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(-)

Comments

Bjorn Helgaas Feb. 6, 2023, 10:43 p.m. UTC | #1
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 {
> 
>
Dave Jiang Feb. 7, 2023, 8:35 p.m. UTC | #2
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 mbox series

Patch

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 {