[igt-dev] [PATCH i-g-t v2 1/3] lib/igt_device_scan: add multigpu filtering view
Kamil Konieczny
kamil.konieczny at linux.intel.com
Fri Nov 3 16:01:45 UTC 2023
Created multiGPU filtering for GPU cards. When used with
--device or IGT_DEVICE, this will just count cards found with
given filtering options, otherwise will count them with the
help of vendor filtering.
Filtering is not restricted and will allow to re-open
already opened card, if user gives something like:
IGT_DEVICE=pci:vendor=intel,device=discrete,card=0\;pci:vendor=intel,device=discrete,card=0
or
IGT_DEVICE=pci:vendor=intel,card=0\;pci:vendor=intel,card=0
For discrete cards one can use:
IGT_DEVICE=pci:vendor=intel,device=discrete,card=all
v2: move filtering into igt_device_scan.c (Zbigniew)
filter all GPUs, not only discrete (Zbigniew)
simplify checks for unsupported drivers like vgem (Kamil)
Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
---
lib/igt_device_scan.c | 62 +++++++++++++++++++++++++++++++++++++++++++
lib/igt_device_scan.h | 3 +++
2 files changed, 65 insertions(+)
diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
index f4f95fef3..fbf3fa482 100644
--- a/lib/igt_device_scan.c
+++ b/lib/igt_device_scan.c
@@ -2065,3 +2065,65 @@ int igt_open_render(struct igt_device_card *card)
return open(card->render, O_RDWR);
}
+
+/**
+ * igt_device_prepare_filtered_view:
+ * @vendor: name for GPUs vendor to search, eg. "intel"
+ *
+ * Filter GPU devices for given vendor or with supplied --device
+ * option or IGT_DEVICE environment variable.
+ *
+ * Returns:
+ * Number of filtered GPUs for a vendor or number of filters.
+ */
+int igt_device_prepare_filtered_view(const char *vendor)
+{
+ int gpu_count;
+
+ gpu_count = igt_device_filter_count();
+ if (!gpu_count) {
+ char gpu_filter[256];
+
+ igt_assert(vendor);
+ if (!strcmp(vendor, "vgem") || !strcmp(vendor, "other")) {
+ igt_debug("Unsupported vendor: %s\n", vendor);
+ return 0;
+ }
+
+ if (!strcmp(vendor, "any")) {
+ igt_debug("Chipset DRIVER_ANY unsupported without --device filters\n");
+ return 0;
+ }
+
+ igt_assert(snprintf(gpu_filter, sizeof(gpu_filter), "pci:vendor=%s,card=all",
+ vendor) < sizeof(gpu_filter));
+
+ igt_device_filter_add(gpu_filter); // fill-in filters for all GPUs
+ gpu_count = igt_device_filter_count();
+ igt_debug("Found %d GPUs for vendor: %s\n", gpu_count, vendor);
+ } else {
+ struct igt_device_card card;
+ bool found;
+ int count = 0;
+
+ for (int i = 0; i < gpu_count; i++) {
+ const char *filter;
+
+ filter = igt_device_filter_get(i);
+ found = igt_device_card_match(filter, &card);
+ if (found && strlen(card.card)) {
+ igt_debug("Found GPU%d card %s\n", i, card.card);
+ ++count;
+ }
+ }
+
+ if (count < gpu_count) {
+ igt_debug("Counted GPUs %d lower than number of filters %d\n", count, gpu_count);
+ gpu_count = count;
+ } else {
+ igt_debug("Found %d GPUs\n", gpu_count);
+ }
+ }
+
+ return gpu_count;
+}
diff --git a/lib/igt_device_scan.h b/lib/igt_device_scan.h
index b8f6a843d..48690e236 100644
--- a/lib/igt_device_scan.h
+++ b/lib/igt_device_scan.h
@@ -93,4 +93,7 @@ char *igt_device_get_pretty_name(struct igt_device_card *card, bool numeric);
int igt_open_card(struct igt_device_card *card);
int igt_open_render(struct igt_device_card *card);
+/* Add or use filters to match multiGPU devices */
+int igt_device_prepare_filtered_view(const char *vendor);
+
#endif /* __IGT_DEVICE_SCAN_H__ */
--
2.42.0
More information about the igt-dev
mailing list