[igt-dev] [PATCH i-g-t 2/2] lib/igt_device_scan: add card=all filter selector

Kamil Konieczny kamil.konieczny at linux.intel.com
Tue Oct 18 09:10:01 UTC 2022


Allow to select all discrete cards on system with the help of
card=all or card=* filter, for example:

pci:vendor=intel,device=discrete,card=all

or

pci:vendor=intel,device=discrete,card=*

This will add max of 16 cards filters with card=0..15

Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
---
 lib/igt_device_scan.c | 36 +++++++++++++++++++++++++++++++++---
 1 file changed, 33 insertions(+), 3 deletions(-)

diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
index 6f5b90e6..55840b4f 100644
--- a/lib/igt_device_scan.c
+++ b/lib/igt_device_scan.c
@@ -120,6 +120,13 @@
  *
  *   It selects the second one.
  *
+ *   |[<!-- language="plain" -->
+ *   pci:vendor=8086,device=1234,card=all
+ *   pci:vendor=8086,device=1234,card=*
+ *   ]|
+ *
+ *   This will add 0..15 card selectors.
+ *
  *   We may use device codename or pseudo-codename (integrated/discrete)
  *   instead of pci device id:
  *
@@ -1753,6 +1760,8 @@ static bool is_filter_valid(const char *fstr)
 	return true;
 }
 
+#define MAX_PCI_CARDS 16
+
 /**
  * igt_device_filter_add
  * @filters: filter(s) to be stored in filter array
@@ -1776,14 +1785,35 @@ int igt_device_filter_add(const char *filters)
 	while ((filter = strsep(&dup, ";"))) {
 		bool is_valid = is_filter_valid(filter);
 		struct device_filter *df;
+		char *multi;
+
 		igt_warn_on(!is_valid);
 		if (!is_valid)
 			continue;
 
 		df = malloc(sizeof(*df));
-		strncpy(df->filter, filter, sizeof(df->filter)-1);
-		igt_list_add_tail(&df->link, &device_filters);
-		count++;
+		if (!strncmp(filter, "sriov:", 6)) {
+			multi = NULL;
+		} else {
+			multi = strstr(filter, "card=all");
+			if (!multi)
+				multi = strstr(filter, "card=*");
+		}
+
+		if (!multi) {
+			strncpy(df->filter, filter, sizeof(df->filter)-1);
+			igt_list_add_tail(&df->link, &device_filters);
+			count++;
+		} else {
+			multi[5] = 0;
+			for (int i = 0; i < MAX_PCI_CARDS; ++i) {
+				if (i)
+					df = malloc(sizeof(*df));
+				snprintf(df->filter, sizeof(df->filter)-1, "%s%d", filter, i);
+				igt_list_add_tail(&df->link, &device_filters);
+				count++;
+			}
+		}
 	}
 
 	free(dup_orig);
-- 
2.34.1



More information about the igt-dev mailing list