Users of Intel discrete graphics adapters are confused with fake
information on PCIe link bandwidth (speed and size) of their GPU devices
reported by tools like lspci or lsgpu.  That fake information is
unfortunately provided by hardware, Linux PCI subsystem just exposes it
untouched to upper layers, including userspace via sysfs, and userspace
tools just report those fake values.

While we can't do much about the kernel side or general purpose userspace
tools like lspci, we can try to address the issue with our lsgpu utility.

Correct link bandwidth attributes of a discrete GPU card can be obtained
from the kernel by looking not at the PCI device of the GPU itself, only
at a PCIe upstream port of the card's PCI bridge.  For integrity with
content of the sysfs and with output from the other tools, we are not
going to replace the fake information with that from the bridge upstream
port, only show that port and its attributes themselves while listing
devices.

Since the tool uses our udev based igt_device_scan library for identifying
GPU devices and printing their properties and attributes, modifications
that we need apply to that library.

As a first step, exclude the fake data from being printed.

Link: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10753
Signed-off-by: Janusz Krzysztofik <[email protected]>
---
 lib/igt_device_scan.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
index abd8ca209e..7753262a53 100644
--- a/lib/igt_device_scan.c
+++ b/lib/igt_device_scan.c
@@ -613,6 +613,14 @@ static void dump_props_and_attrs(const struct igt_device 
*dev)
 
        printf("\n[attributes]\n");
        igt_map_foreach(dev->attrs_map, entry) {
+               /* omit fake link bandwidth attributes */
+               if (dev->dev_type == DEVTYPE_DISCRETE &&
+                   (!strcmp(entry->key, "max_link_speed") ||
+                    !strcmp(entry->key, "max_link_width") ||
+                    !strcmp(entry->key, "current_link_speed") ||
+                    !strcmp(entry->key, "current_link_width")))
+                       continue;
+
                _print_key_value((char *)entry->key, (char *)entry->data);
        }
        printf("\n");
-- 
2.52.0

Reply via email to