[PATCH i-g-t v2 13/26] lib/unigraf: Introduce device configuration
Louis Chauvet
louis.chauvet at bootlin.com
Thu Jul 17 18:46:33 UTC 2025
As there could be multiple devices detected by libTSI, add a configuration
field to ensure that igt will use the proper unigraf device.
The unigraf integration will search for a [Unigraf] entry containing a
Device=
For example, it can look like:
[Unigraf]
Device=UCD-500 [2434C620]
---
lib/unigraf/unigraf.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 64 insertions(+), 7 deletions(-)
diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index a9f6e94498ef21fbfde3295456aa3bea9fdc7d67..f4b6183dbacf359c5e91ea70bc3b6acb9488839a 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -1,21 +1,16 @@
// SPDX-License-Identifier: MIT
-#include "drmtest.h"
#include "glib.h"
#include "igt_core.h"
-#include "igt_edid.h"
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "unigraf.h"
-#include "TSI.h"
#include "TSI_types.h"
-#include "igt_kms.h"
-#include "igt_pipe_crc.h"
+#include "TSI.h"
#include "igt_rc.h"
-#include "monitor_edids/monitor_edids_helper.h"
#define unigraf_debug(fmt, ...) igt_debug("TSI:%p: " fmt, unigraf_device,##__VA_ARGS__)
@@ -24,6 +19,19 @@ static TSI_HANDLE unigraf_device;
static char *unigraf_default_edid;
static char *unigraf_connector_name;
+/**
+ * UNIGRAF_CONFIG_GROUP - Name of the unigraf group in the configuration file
+ */
+#define UNIGRAF_CONFIG_GROUP "Unigraf"
+/**
+ * UNIGRAF_CONFIG_DEVICE_NAME - Key of the device name in the configuration file
+ */
+#define UNIGRAF_CONFIG_DEVICE_NAME "Device"
+/**
+ * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
+ */
+#define UNIGRAF_NAME_MAX 1024
+
static void unigraf_close_device(void)
{
unigraf_debug("Closing...\n");
@@ -68,11 +76,28 @@ static unsigned int unigraf_device_count(void)
return unigraf_assert(TSIX_DEV_GetDeviceCount());
}
+static int unigraf_find_device(char *request) {
+ int chosen_device = -1;
+ int device_count = unigraf_device_count();
+ for (int i = 0; i < device_count; i++) {
+ char dev_name[UNIGRAF_NAME_MAX];
+ memset(dev_name, 0, UNIGRAF_NAME_MAX);
+ unigraf_assert(TSIX_DEV_GetDeviceName(i, dev_name, UNIGRAF_NAME_MAX));
+ unigraf_debug("Detected unigraf device %d: %s\n", i, dev_name);
+ if(!strncmp(dev_name, request, UNIGRAF_NAME_MAX))
+ chosen_device = i;
+ }
+ return chosen_device;
+}
+
bool unigraf_open_device(void)
{
TSI_RESULT r;
+ char *cfg_group = NULL;
+ GError *cfg_error = NULL;
+ char *cfg_device = NULL;
int device_count;
- int chosen_device = 0;
+ int chosen_device;
int chosen_role = 0;
int chosen_input = 0;
@@ -83,6 +108,28 @@ bool unigraf_open_device(void)
unigraf_init();
+ if (igt_key_file) {
+ char **group_list = g_key_file_get_groups(igt_key_file, NULL);
+ for (int i = 0; group_list[i] != NULL; i++) {
+ if (strcmp(group_list[i], UNIGRAF_CONFIG_GROUP))
+ continue;
+ cfg_group = strdup(group_list[i]);
+ }
+ g_strfreev(group_list);
+ }
+
+ if(cfg_group == NULL) {
+ unigraf_debug("No device configured, will try to find the first available.\n");
+ cfg_device = NULL;
+ unigraf_connector_name = NULL;
+ } else {
+ cfg_device = g_key_file_get_string(igt_key_file, cfg_group, UNIGRAF_CONFIG_DEVICE_NAME, &cfg_error);
+ if (cfg_error) {
+ unigraf_debug("No device name configured, uses first device available.\n");
+ cfg_device = NULL;
+ }
+ }
+
unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
device_count = unigraf_device_count();
@@ -91,6 +138,16 @@ bool unigraf_open_device(void)
return false;
}
+ if (!cfg_device) {
+ chosen_device = 0;
+ } else {
+ chosen_device = unigraf_find_device(cfg_device);
+ if (chosen_device == -1) {
+ igt_warn("The requested unigraf device %s is not found.\n", cfg_device);
+ return false;
+ }
+ }
+
unigraf_device = TSIX_DEV_OpenDevice(chosen_device, &r);
unigraf_assert(r);
igt_assert(unigraf_device);
--
2.50.0
More information about the igt-dev
mailing list