Kobayashi, Daisuke wrote: > This proposal aims to add a feature that outputs PCIe device power > consumption information to sysfs. > > Add support for PBEC (Power Budgeting Extended Capability) output > to the PCIe driver. PBEC is defined in the > PCIe specification(PCIe r6.0, sec 7.8.1) and is > a standard method for obtaining device power consumption information. > > PCIe devices can significantly impact the overall power consumption of > a system. However, obtaining PCIe device power consumption information > has traditionally been difficult. > > The PBEC Data register changes depending on the value of the PBEC Data > Select register. To obtain all PBEC Data register values defined in the > device, obtain the value of the PBEC Data register while changing the > value of the PBEC Data Select register. > > Signed-off-by: "Kobayashi,Daisuke" <kobayashi.da-06@xxxxxxxxxxx> > --- > Documentation/ABI/testing/sysfs-bus-pci | 17 +++++++++++++++ > drivers/pci/pci-sysfs.c | 28 > +++++++++++++++++++++++++ > 2 files changed, 45 insertions(+) > > diff --git a/Documentation/ABI/testing/sysfs-bus-pci > b/Documentation/ABI/testing/sysfs-bus-pci > index ecf47559f495..be1911d948ef 100644 > --- a/Documentation/ABI/testing/sysfs-bus-pci > +++ b/Documentation/ABI/testing/sysfs-bus-pci > @@ -500,3 +500,20 @@ Description: > console drivers from the device. Raw users of pci-sysfs > resourceN attributes must be terminated prior to resizing. > Success of the resizing operation is not guaranteed. > + > +What: /sys/bus/pci/devices/.../power_budget > +Date: September 2024 > +Contact: Kobayashi Daisuke <kobayashi.da-06@xxxxxxxxxxx> > +Description: > + This file provides information about the PCIe power budget > + for the device. It is a read-only file that outputs the values > + of the Power Budgeting Data Register for each power state as > a > + series of 32-bit hexadecimal values. Each line represents a > + single Power Budgeting Data register entry, containing the > + power budget for a specific power state. > + > + The specific interpretation of these values depends on the > + device and the PCIe specification. Refer to the PCIe > + specification for detailed information about the Power > + Budgeting Data register, including the encoding of power > + states and the interpretation of Base Power and Data Scale. > diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c > index 2321fdfefd7d..c52814a33597 100644 > --- a/drivers/pci/pci-sysfs.c > +++ b/drivers/pci/pci-sysfs.c > @@ -182,6 +182,33 @@ static ssize_t resource_show(struct device *dev, struct > device_attribute *attr, > } > static DEVICE_ATTR_RO(resource); > > +static ssize_t power_budget_show(struct device *dev, struct > device_attribute *attr, > + char *buf) > +{ > + struct pci_dev *pci_dev = to_pci_dev(dev); > + size_t len = 0; > + int i, pos; > + u32 data; > + > + pos = pci_find_ext_capability(pci_dev, PCI_EXT_CAP_ID_PWR); > + if (!pos) > + return -EINVAL; > + > + for (i = 0; i < 0xff; i++) { > + pci_write_config_byte(pci_dev, pos + PCI_PWR_DSR, (u8)i); > + pci_read_config_dword(pci_dev, pos + PCI_PWR_DATA, > &data); > + if (!data) { > + if (len == 0) > + return -EINVAL; > + break; > + } > + len += sysfs_emit_at(buf, len, "%04x\n", data); > + } > + > + return len; > +} > +static DEVICE_ATTR_RO(power_budget); > + > static ssize_t max_link_speed_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > @@ -629,6 +656,7 @@ static struct attribute *pcie_dev_attrs[] = { > &dev_attr_current_link_width.attr, > &dev_attr_max_link_width.attr, > &dev_attr_max_link_speed.attr, > + &dev_attr_power_budget.attr, > NULL, > }; > > -- > 2.45.0 Dear reviews. Could you please take a look at the patch when you have time? Thank you for your time and consideration.