[PATCH i-g-t v10 2/5] lib/igt_device_scan: Enable finding all matched IGT devices
Soham Purkait
soham.purkait at intel.com
Wed Apr 30 07:08:21 UTC 2025
Use filter to find all the available
GPUs or few among them by driver name
and card type or card number.
v2 : Fix for refactoring GPUTOP into a
vendor-agnostic tool. (Lucas)
v3 : Separate commit for lib. (Kamil)
v4 : Refactor to use composition strategy
for driver and device type filtering.
Refactor code to improve memory
allocation and error handling. (Lucas)
v5 : Introduce device card match function
to return collection of matching
devices using device filter.
v6 : Separate commit for device card match
function. (Zbigniew)
Function description modification for device
card match function. (Zbigniew)
v7 : Single return for card match function.
(Krzysztof)
v8 : Removed 'drivers' array as card match
function parameter. (Zbigniew)
v9 : Fixed allocation in card match instead of
multiple realloc. (Zbigniew)
Signed-off-by: Soham Purkait <soham.purkait at intel.com>
---
lib/igt_device_scan.c | 48 +++++++++++++++++++++++++++++++++++++++++++
lib/igt_device_scan.h | 1 +
2 files changed, 49 insertions(+)
diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
index 3c36ca3f2..949fff461 100644
--- a/lib/igt_device_scan.c
+++ b/lib/igt_device_scan.c
@@ -2142,6 +2142,54 @@ bool igt_device_card_match_pci(const char *filter,
return __igt_device_card_match(filter, card, true);
}
+/**
+ * igt_device_card_match_all
+ * @filter: filter string.
+ * @card: double pointer to igt_device_card structure, containing
+ * an array of igt_device_card structures upon successful return.
+ *
+ * Function applies filter to match device from device array.
+ *
+ * Returns: the number of cards found.
+ *
+ * Note: The caller is responsible for freeing the memory which is
+ * dynamically allocated for the array of igt_device_card structures
+ * upon successful return.
+ */
+int igt_device_card_match_all(const char *filter, struct igt_device_card **card)
+{
+ struct igt_device *dev = NULL;
+ struct igt_device_card *crd = NULL;
+ int count = 0;
+
+ igt_devices_scan();
+
+ if (igt_device_filter_apply(filter) == false)
+ return 0;
+
+ if (igt_list_empty(&igt_devs.filtered))
+ return 0;
+
+ igt_list_for_each_entry(dev, &igt_devs.filtered, link) {
+ count++;
+ }
+
+ crd = calloc(count, sizeof(struct igt_device_card));
+ if (!crd)
+ return 0;
+
+ count = 0;
+
+ igt_list_for_each_entry(dev, &igt_devs.filtered, link) {
+ __copy_dev_to_card(dev, crd + count++);
+ }
+
+ if (count)
+ *card = crd;
+
+ return count;
+}
+
/**
* igt_device_get_pretty_name
* @card: pointer to igt_device_card struct
diff --git a/lib/igt_device_scan.h b/lib/igt_device_scan.h
index f1cd3b1e9..e6e31e799 100644
--- a/lib/igt_device_scan.h
+++ b/lib/igt_device_scan.h
@@ -89,6 +89,7 @@ int igt_device_filter_pci(void);
bool igt_device_card_match(const char *filter, struct igt_device_card *card);
bool igt_device_card_match_pci(const char *filter,
struct igt_device_card *card);
+int igt_device_card_match_all(const char *filter, struct igt_device_card **card);
bool igt_device_find_first_i915_discrete_card(struct igt_device_card *card);
bool igt_device_find_integrated_card(struct igt_device_card *card);
bool igt_device_find_first_xe_discrete_card(struct igt_device_card *card);
--
2.34.1
More information about the igt-dev
mailing list