From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7DD3210F92E0 for ; Tue, 31 Mar 2026 17:14:31 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 318B110E258; Tue, 31 Mar 2026 17:14:31 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=bootlin.com header.i=@bootlin.com header.b="Q7CJziSO"; dkim-atps=neutral Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2A59510EC43 for ; Tue, 31 Mar 2026 17:11:18 +0000 (UTC) Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id A63AEC59955; Tue, 31 Mar 2026 17:11:47 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 013D76029D; Tue, 31 Mar 2026 17:11:17 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0BDD9104505A3; Tue, 31 Mar 2026 19:11:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1774977076; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=FlJfsA2itZLBf3BFTx8+Fv58QD7p7/LytpVgN4EKscs=; b=Q7CJziSOpe9NpH2fo7CRgLbpYW4uF2UUvBhnM7prBSOSXdiRMI74ZknGnjVOjTBxL9OQ9n RP+tkeRHcwxu0G3PvSrDeyl3e4pxlOmcPn18TP1XQIBC4VmAO2vmn3qZcHR/RL4lELhN1j ITSbEq6yvmHwQ65E7EAK3Km99mue9irxYQ9UDpdmLsHk4qADF3IXLU8D3njvZ6uKhS2pXO kfkYCJJxvuty1vIvX8kfFjIAmNkuwQtFnRyj1nvN3kfRWaGppw/0dSq0L8r7X31Z/OIZG4 bNrM/P70OyS2eOUVi4LdE7asmPdf0dlBGFnbXv8lCc3l/eaDM0txI1V+YptC9w== From: Louis Chauvet Date: Tue, 31 Mar 2026 19:11:47 +0200 Subject: [PATCH i-g-t v10 30/49] lib/unigraf: Add connector and EDID configuration MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260331-unigraf-integration-v10-30-12266c34cc1d@bootlin.com> References: <20260331-unigraf-integration-v10-0-12266c34cc1d@bootlin.com> In-Reply-To: <20260331-unigraf-integration-v10-0-12266c34cc1d@bootlin.com> To: igt-dev@lists.freedesktop.org Cc: thomas.petazzoni@bootlin.com, luca.ceresoli@bootlin.com, kory.maincent@bootlin.com, markyacoub@google.com, khaled.almahallawy@intel.com, Louis Chauvet X-Mailer: b4 0.16-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=7288; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=836idoQpbkbM6uHrkc9okgsBdphxefG8KlX/JM+/vRA=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpzAA/S1bCQ/7IK7hMfCL7qg2Yk9FIoq29D7skF o4d+YdJ83CJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCacwAPxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJMdg//WKtfNNbMLPbq7JieQAFA3PTdp4gUqiN niY3/Z58MAkc066epdeDbD3kB2vGeHQrbGB4uacV1p6l1oLqSlrnGpi+Tpa6+LdRI/VdVraVirx holhGwt2rSZ2Q3xBQm3aG1pgU2K4O4mGtivw9KT2okqCRO3UCFHHP1/O34FROi5vxYC+Rn/af0J W1f2NiFXY9S2dObMMfQ3rWvAVt7IFBXSyEeZz2HrHV2YA5zqAhB62AzC3sZw9xQWxkcWYauwgbE ZOQoHGYSQcOOjipzVjXTR4WgoGSXW04K2DAzkhLS7m2BOm8eIR3kwkSzQEcX72TXp/AN9VCX9X9 TjKxDWcpQwSkSww6jUD7ecxClWJJsi/T6J5B3+SvnSdqEewGqibdVOcpgWXgKpXKUOeYFmCB6at HaN1iFw30aPMkT3B3N43LNqbU8unQrt1SQSsOGbkIg3N0GxvxWWNUDS3FZY50q8nF1Cua3AJAB5 Mf56FhkmnwSjpulqHworqiRrSCuYufVdHydlWzICG7xwWEXRxxTzT9ZD8Ysm05n1eIlC14jty1r f+/zdKObEix9C4sbBfFGds2Kola/gx9SImNAE90pjDc+zkNgOWbuPbtqaA8/vqsxT7TYU9SaYWc IS1TvLqoyw3nDUlPynBFoezxMVkBen9ehwFSTrcSGU3+yvfpQxhw= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 X-BeenThere: igt-dev@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development mailing list for IGT GPU Tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" As multiple connectors can be present on the DUT, add a configuration to tell which connector is used by the Unigraf and which EDID to use on the Unigraf. Complete list of EDID name supported can be found in lib/monitor_edids/{dp,hdmi}_edids.h The configuration will look like: [Unigraf] Device=UCD-500 [2434C620] Role=DisplayPort Source and Sink Input=DP RX Connector=DP-4 EDID=DEL_16543_DELL_P2314T_DP Reviewed-by: Kory Maincent Signed-off-by: Louis Chauvet --- lib/vendor/unigraf/unigraf.c | 126 ++++++++++++++++++++++++++++++++++++++++++- lib/vendor/unigraf/unigraf.h | 3 ++ 2 files changed, 127 insertions(+), 2 deletions(-) diff --git a/lib/vendor/unigraf/unigraf.c b/lib/vendor/unigraf/unigraf.c index 68c322a0302b..6a866bbb3765 100644 --- a/lib/vendor/unigraf/unigraf.c +++ b/lib/vendor/unigraf/unigraf.c @@ -15,7 +15,10 @@ #include "TSI.h" #include "TSI_types.h" #include "igt_aux.h" +#include "igt_edid.h" +#include "igt_kms.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__) @@ -48,6 +51,16 @@ static char *unigraf_connector_name; */ #define UNIGRAF_CONFIG_INPUT_NAME "Input" +/** + * UNIGRAF_CONFIG_CONNECTOR_NAME - Key of the connector name in the configuration file + */ +#define UNIGRAF_CONFIG_CONNECTOR_NAME "Connector" + +/** + * UNIGRAF_CONFIG_EDID_NAME - Key of the EDID name in the configuration file + */ +#define UNIGRAF_CONFIG_EDID_NAME "EDID" + /** * UNIGRAF_DEFAULT_ROLE_NAME - Default role name to search on the unigraf device */ @@ -206,6 +219,83 @@ static int unigraf_find_input(const char *request) return -ENODEV; } +static void unigraf_load_default_edid(void) +{ + struct edid *edid = get_edid_by_name(unigraf_default_edid); + + if (!edid) { + igt_warn("Impossible to find an edid named \"%s\"", unigraf_default_edid); + list_edid_names(IGT_LOG_WARN); + return; + } + + for (int i = unigraf_get_mst_stream_max_count(); i > 0; i--) + unigraf_write_edid(i - 1, edid, edid_get_size(edid)); +} + +static void unigraf_autodetect_connector(int drm_fd) +{ + int newly_connected_count, already_connected_count, diff_len; + uint32_t *newly_connected = NULL, *already_connected = NULL; + drmModeConnectorPtr connector; + uint32_t *diff = NULL; + + igt_assert_fd(drm_fd); + unigraf_set_sst(); + unigraf_hpd_deassert(); + + /* + * Hard sleep is required here as we don't know how long it will take for the device under + * test to properly detect the port disconnection. + */ + sleep(igt_default_display_detect_timeout()); + + already_connected_count = igt_get_connected_connectors(drm_fd, &already_connected); + + unigraf_hpd_assert(); + + newly_connected_count = kms_wait_for_new_connectors(&newly_connected, + already_connected, + already_connected_count, + drm_fd); + + diff_len = get_array_diff(newly_connected, newly_connected_count, + already_connected, already_connected_count, &diff); + + if (!diff_len) { + unigraf_debug("No newly connected connector, assuming that the unigraf is not connected.\n"); + } else if (diff_len > 1) { + unigraf_debug("More than one new connectors connected, this is not supported by autodetection.\n"); + } else { + unigraf_debug("Found one connector (%d) connected to the Unigraf\n", diff[0]); + connector = drmModeGetConnector(drm_fd, diff[0]); + igt_assert(connector); + igt_assert(asprintf(&unigraf_connector_name, "%s-%u", + kmstest_connector_type_str(connector->connector_type), + connector->connector_type_id) != -1); + drmModeFreeConnector(connector); + } + + free(already_connected); + free(newly_connected); + free(diff); +} + +/** + * unigraf_get_connector() - Get a DRM connector for the Unigraf device + * @drm_fd: DRM file descriptor + * + * Returns: A pointer to the drmModeConnector connected to the unigraf device, + * or NULL if the operation failed. The caller is responsible for freeing this + * pointer with drmModeFreeConnector(). + */ +drmModeConnectorPtr unigraf_get_connector(int drm_fd) +{ + if (!unigraf_connector_name) + unigraf_autodetect_connector(drm_fd); + return igt_get_connector_from_name(drm_fd, unigraf_connector_name); +} + /** * unigraf_open_device() - Search and open a device. * @drm_fd: File descriptor of the currently used drm device @@ -224,6 +314,7 @@ bool unigraf_open_device(int drm_fd) char *cfg_device = NULL; char *cfg_role = NULL; char *cfg_input = NULL; + char *cfg_edid_name = NULL; int device_count; int chosen_device = 0; int chosen_role; @@ -232,7 +323,7 @@ bool unigraf_open_device(int drm_fd) assert(igt_can_fail()); if (unigraf_device) - return true; + return unigraf_connector_name != NULL; unigraf_init(); @@ -259,6 +350,23 @@ bool unigraf_open_device(int drm_fd) unigraf_debug("No input name configured.\n"); cfg_input = NULL; } + + cfg_error = NULL; + unigraf_connector_name = g_key_file_get_string(igt_key_file, UNIGRAF_CONFIG_GROUP, + UNIGRAF_CONFIG_CONNECTOR_NAME, + &cfg_error); + if (cfg_error) { + unigraf_debug("No connector name configured, will autodetect.\n"); + unigraf_connector_name = NULL; + } + + cfg_error = NULL; + cfg_edid_name = g_key_file_get_string(igt_key_file, UNIGRAF_CONFIG_GROUP, + UNIGRAF_CONFIG_EDID_NAME, &cfg_error); + if (cfg_error) { + unigraf_debug("No default EDID set, use IGT default.\n"); + cfg_edid_name = NULL; + } } unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0)); @@ -323,9 +431,21 @@ bool unigraf_open_device(int drm_fd) unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input)); unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input)); + if (!cfg_edid_name) + cfg_edid_name = strdup("DEL_16543_DELL_P2314T_DP"); + + unigraf_default_edid = cfg_edid_name; + + if (!unigraf_connector_name) { + unigraf_hpd_deassert(); + unigraf_set_sst(); + unigraf_hpd_assert(); + unigraf_autodetect_connector(drm_fd); + } + unigraf_reset(); - return true; + return unigraf_connector_name != NULL; } /** @@ -351,6 +471,8 @@ void unigraf_reset(void) unigraf_plug(); unigraf_set_mst_stream_count(1); unigraf_set_sst(); + unigraf_load_default_edid(); + unigraf_hpd_assert(); } /** diff --git a/lib/vendor/unigraf/unigraf.h b/lib/vendor/unigraf/unigraf.h index 40f706ebd483..fdc4441740fa 100644 --- a/lib/vendor/unigraf/unigraf.h +++ b/lib/vendor/unigraf/unigraf.h @@ -11,6 +11,7 @@ #include #include +#include /** * unigraf_assert: Helper macro to assert a TSI return value and retrieve a detailed error message. @@ -42,6 +43,8 @@ void unigraf_require_device(int drm_fd); void unigraf_reset(void); +drmModeConnectorPtr unigraf_get_connector(int drm_fd); + struct edid *unigraf_read_edid(uint32_t stream, uint32_t *edid_size); void unigraf_write_edid(uint32_t stream, const struct edid *edid, uint32_t edid_size); -- 2.52.0