diff options
author | Tvrtko Ursulin <tvrtko.ursulin@intel.com> | 2020-11-16 17:26:49 +0000 |
---|---|---|
committer | Tvrtko Ursulin <tvrtko.ursulin@intel.com> | 2020-11-17 09:30:03 +0000 |
commit | 5cd33b20e1df8aaca23328290b5f1e678af2b834 (patch) | |
tree | ffa309ae7a03944383091ebfeb603734a79d85fb /lib/igt_device_scan.c | |
parent | 5155c2bd05e03fec86fb9c97d65a4f69b44c3678 (diff) |
intel_gpu_top: User friendly device listing
Adding a new device selection print type suitable for user-facing
use cases like intel_gpu_top -L and later lsgpu.
Instead of:
sys:/sys/devices/pci0000:00/0000:00:02.0/drm/card0
subsystem : drm
drm card : /dev/dri/card0
parent : sys:/sys/devices/pci0000:00/0000:00:02.0
sys:/sys/devices/pci0000:00/0000:00:02.0/drm/renderD128
subsystem : drm
drm render : /dev/dri/renderD128
parent : sys:/sys/devices/pci0000:00/0000:00:02.0
sys:/sys/devices/pci0000:00/0000:00:02.0
subsystem : pci
drm card : /dev/dri/card0
drm render : /dev/dri/renderD128
vendor : 8086
device : 193B
New format looks like:
card0 8086:193B drm:/dev/dri/card0
└─renderD128 drm:/dev/dri/renderD128
Advantages are more compact, more readable, one entry per GPU, shorter
string to copy and paste to intel_gpu_top -d, or respective usage.
v2:
* Increase stack filter size. (Zbigniew)
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Petri Latvala <petri.latvala@intel.com>
Cc: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Diffstat (limited to 'lib/igt_device_scan.c')
-rw-r--r-- | lib/igt_device_scan.c | 109 |
1 files changed, 98 insertions, 11 deletions
diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c index c581a31a..c0cd6757 100644 --- a/lib/igt_device_scan.c +++ b/lib/igt_device_scan.c @@ -735,18 +735,26 @@ static inline void _pr_simple2(const char *k, const char *v1, const char *v2) printf(" %-16s: %s:%s\n", k, v1, v2); } -static void igt_devs_print_simple(struct igt_list_head *view) +static bool __check_empty(struct igt_list_head *view) { - struct igt_device *dev; - if (!view) - return; + return true; if (igt_list_empty(view)) { printf("No GPU devices found\n"); - return; + return true; } + return false; +} + +static void igt_devs_print_simple(struct igt_list_head *view) +{ + struct igt_device *dev; + + if (__check_empty(view)) + return; + igt_list_for_each_entry(dev, view, link) { printf("sys:%s\n", dev->syspath); if (dev->subsystem) @@ -768,6 +776,89 @@ static void igt_devs_print_simple(struct igt_list_head *view) } } +static struct igt_device * +__find_pci(struct igt_list_head *view, const char *drm) +{ + struct igt_device *dev; + + igt_list_for_each_entry(dev, view, link) { + if (!is_pci_subsystem(dev) || !dev->drm_card) + continue; + + if (!strcmp(dev->drm_card, drm)) + return dev; + } + + return NULL; +} + +static void igt_devs_print_user(struct igt_list_head *view) +{ + struct igt_device *dev; + + if (__check_empty(view)) + return; + + igt_list_for_each_entry(dev, view, link) { + unsigned int i, num_children; + struct igt_device *pci_dev; + struct igt_device *dev2; + char filter[256]; + char *drm_name; + int ret; + + if (!is_drm_subsystem(dev)) + continue; + if (!dev->drm_card || dev->drm_render) + continue; + + drm_name = rindex(dev->drm_card, '/'); + if (!drm_name || !*++drm_name) + continue; + + ret = snprintf(filter, sizeof(filter), "drm:%s", dev->drm_card); + igt_assert(ret < sizeof(filter)); + + pci_dev = __find_pci(view, dev->drm_card); + if (pci_dev) + printf("%-24s%4s:%4s %s\n", + drm_name, pci_dev->vendor, pci_dev->device, + filter); + else + printf("%-24s %s\n", drm_name, filter); + + num_children = 0; + igt_list_for_each_entry(dev2, view, link) { + if (!is_drm_subsystem(dev2) || !dev2->drm_render) + continue; + if (strcmp(dev2->parent->syspath, dev->parent->syspath)) + continue; + + num_children++; + } + + i = 0; + igt_list_for_each_entry(dev2, view, link) { + if (!is_drm_subsystem(dev2) || !dev2->drm_render) + continue; + if (strcmp(dev2->parent->syspath, dev->parent->syspath)) + continue; + + drm_name = rindex(dev2->drm_render, '/'); + if (!drm_name || !*++drm_name) + continue; + + ret = snprintf(filter, sizeof(filter), "drm:%s", + dev2->drm_render); + igt_assert(ret < sizeof(filter)); + + printf("%s%-22s %s\n", + (++i == num_children) ? "└─" : "├─", + drm_name, filter); + } + } +} + static inline void _print_key_value(const char* k, const char *v) { printf("%-32s: %s\n", k, v); @@ -792,14 +883,9 @@ static void igt_devs_print_detail(struct igt_list_head *view) { struct igt_device *dev; - if (!view) + if (__check_empty(view)) return; - if (igt_list_empty(view)) { - printf("No GPU devices found\n"); - return; - } - igt_list_for_each_entry(dev, view, link) { printf("========== %s:%s ==========\n", dev->subsystem, dev->syspath); @@ -821,6 +907,7 @@ static struct print_func { } print_functions[] = { [IGT_PRINT_SIMPLE] = { .prn = igt_devs_print_simple }, [IGT_PRINT_DETAIL] = { .prn = igt_devs_print_detail }, + [IGT_PRINT_USER] = { .prn = igt_devs_print_user }, }; /** |