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 2103E10F92E3 for ; Tue, 31 Mar 2026 17:15:47 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D29A510ED43; Tue, 31 Mar 2026 17:15:46 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=bootlin.com header.i=@bootlin.com header.b="sG5NSxqm"; dkim-atps=neutral Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) by gabe.freedesktop.org (Postfix) with ESMTPS id B694B10EC39 for ; Tue, 31 Mar 2026 17:11:04 +0000 (UTC) Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id A00204E4288B; Tue, 31 Mar 2026 17:11:03 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7839C6029D; Tue, 31 Mar 2026 17:11:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5435C104504AB; Tue, 31 Mar 2026 19:11:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1774977062; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=IP54tGWBfJWSwQteSSq/W6cKFgu90tNkG9KDhzliags=; b=sG5NSxqmP3S+7LK5EK/fLlVpCLg35b6PqqfoaEBlhpFZleX5ZaGlHchK2Qo6B2IjaahebC wx3k2gfqmsZsgRqEGOF9Ntg16A6J9AGzvpCJ9H3OaVzq9ZtwVzO8cRv4dxIvVSsGQ6fdcA KKJ1NcDh7gD7KoRbvyKuTfhSAow7D6Df6xMz881s414kwCAaPwFQlrOBc/zwl8c3Mxd6aF cGD/kc+xvo7JGc38yCwotoLYZFxoxH9H4pxgbZRc5u2HeHSh+eCqY0wLt57bA1RTBhnE9Q L5XC7cyxgd8ibQFiLeBVsqM12O3DtOjuCM864WPX5DbxFdBOC0IWkCDqnpMzxQ== From: Louis Chauvet Date: Tue, 31 Mar 2026 19:11:32 +0200 Subject: [PATCH i-g-t v10 15/49] lib/monitor_edids: Add helper functions for using monitor_edid objects MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260331-unigraf-integration-v10-15-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=5636; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=HSOXiu5QSDdLkTBy5H4O4XNj9yl12A0Vu1lNt2mi7CM=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpzAA95ApNlJ3vhEJyO37M1Ra/zwvwExN8Mu7Nt H1M834ZFWWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCacwAPRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJAxw//egtTmTjQW6VGexTd4ItWn/yQBiVqBez mZz5x0d10btuTVYk5UdksqPWL+t0aE8v/ksdgyBERgOyIV+RyB4vRGIxzTODocvVz1WZjHjaokD Ya/lOr8w6BxoA1YH4jExi4sQYkbRDCY8kvuiTDk3VQCSNO9s3E6yc0wCbFnE+BCfepKOPMN2+mI WMR4YW/WFd/tX5VFNkx3tXq50w+x1mqwviSGC3W9TRKzXky/+Kmc5H/Dc0t9+NfTwGLxco1TT1D hvX2mVJOeBKappiNwj+myP2ZhqSdqqOqOOvRL7UEK6Muc1bCKoRt+hPuhoPYU1QA/luPyc9Tunb cIRbxTeOWOceTYuQlwswZxr9RxI+eUkTypEgbuZ3J7ZWNL0YodtcCAAa0QnR0YtOr7gEKu5knpD yb738MhXVRWf6Qiy99rsgqnPlY5ygPT4hYdsCN3kB6KuscMtZRWJnACQIO58oARSvQxziENqJKv q2a4ch3+hdOLU7QBGuMLI6ZIUdS9n2KXOwirrrQyF8M6r/7ziSorKluG4V3xjfd6/5sGLNmqZW4 wzn+u2bk/5LSEh4t8aq5O1CHFj1NiaaUpi07tJDTMgw6nZbCdsdTm7o0GUlufbcucV/zxOv7qZK qcvT31cTOrMIhGlVuCt9JR46aC9NqvYhOhvRRaD8stCaBBeV1Rv4= 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" Introduce the functions edid_from_monitor_edid() and get_edids_for_connector_type(). The former converts a monitor_edid object to a struct edid, which can then be utilized by igt_kms helpers. The latter returns a list of monitor_edid objects for a specific connector with certain characteristics Signed-off-by: Louis Chauvet Reviewed-by: Luca Ceresoli Reviewed-by: Kory Maincent --- lib/monitor_edids/dp_edids.h | 3 ++ lib/monitor_edids/hdmi_edids.h | 3 ++ lib/monitor_edids/monitor_edids_helper.c | 80 ++++++++++++++++++++++++++++++++ lib/monitor_edids/monitor_edids_helper.h | 7 ++- 4 files changed, 92 insertions(+), 1 deletion(-) diff --git a/lib/monitor_edids/dp_edids.h b/lib/monitor_edids/dp_edids.h index 144907558be1..07793381257e 100644 --- a/lib/monitor_edids/dp_edids.h +++ b/lib/monitor_edids/dp_edids.h @@ -194,4 +194,7 @@ monitor_edid DP_EDIDS_NON_4K[] = { }; +#define DP_EDIDS_4K_COUNT ARRAY_SIZE(DP_EDIDS_4K) +#define DP_EDIDS_NON_4K_COUNT ARRAY_SIZE(DP_EDIDS_NON_4K) + #endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_DP_EDIDS_H_ */ diff --git a/lib/monitor_edids/hdmi_edids.h b/lib/monitor_edids/hdmi_edids.h index f6cfe82ff6e1..3984241775c3 100644 --- a/lib/monitor_edids/hdmi_edids.h +++ b/lib/monitor_edids/hdmi_edids.h @@ -604,4 +604,7 @@ monitor_edid HDMI_EDIDS_NON_4K[] = { "1620582c2500baac4200009e0000006b" }, }; +#define HDMI_EDIDS_4K_COUNT ARRAY_SIZE(HDMI_EDIDS_4K) +#define HDMI_EDIDS_NON_4K_COUNT ARRAY_SIZE(HDMI_EDIDS_NON_4K) + #endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_HDMI_EDIDS_H_ */ diff --git a/lib/monitor_edids/monitor_edids_helper.c b/lib/monitor_edids/monitor_edids_helper.c index 1cbf1c22f0bb..9cb9c7e1a665 100644 --- a/lib/monitor_edids/monitor_edids_helper.c +++ b/lib/monitor_edids/monitor_edids_helper.c @@ -15,6 +15,10 @@ #include #include "igt_core.h" +#include "igt_edid.h" +#include "dp_edids.h" +#include "drmtest.h" +#include "hdmi_edids.h" static uint8_t convert_hex_char_to_byte(char c) { @@ -90,3 +94,79 @@ void free_chamelium_edid_from_monitor_edid(struct chamelium_edid *edid) free(edid); edid = NULL; } + +/** + * edid_from_monitor_edid: + * @mon_edid: Monitor EDID to convert + * + * Get a struct edid from a monitor_edid. This returns a pointer to a newly allocated struct edid. + * The caller is in charge to free this pointer when required. + */ +struct edid *edid_from_monitor_edid(const monitor_edid *mon_edid) +{ + uint8_t *raw_edid; + size_t edid_size; + int i; + + edid_size = strlen(mon_edid->edid) / 2; /* each ascii is a nibble. */ + raw_edid = malloc(edid_size); + igt_assert(raw_edid); + + for (i = 0; i < edid_size; i++) { + raw_edid[i] = convert_hex_char_to_byte(mon_edid->edid[i * 2]) << 4 | + convert_hex_char_to_byte(mon_edid->edid[i * 2 + 1]); + } + + if (edid_get_size((struct edid *)raw_edid) > edid_size) { + uint8_t *new_edid; + + igt_debug("The edid size stored in the raw edid is longer than the edid stored in the table."); + new_edid = realloc(raw_edid, edid_get_size((struct edid *)raw_edid)); + igt_assert(new_edid); + raw_edid = new_edid; + } + + return (struct edid *)raw_edid; +} + +/** + * get_edids_for_connector_type: + * @type: The connector type to get the EDIDs from + * @count: Used to store the number of EDIDs in the returned list + * @four_k: Use true to fetch 4k EDIDs, false to fetch non-4k EDIDs + * + * Get the list of EDIDS for a specific connector type. This returns a pointer to a static list, + * so no need to free the pointer. + */ +const struct monitor_edid *get_edids_for_connector_type(uint32_t type, size_t *count, bool four_k) +{ + if (four_k) { + switch (type) { + case DRM_MODE_CONNECTOR_DisplayPort: + *count = DP_EDIDS_4K_COUNT; + return DP_EDIDS_4K; + case DRM_MODE_CONNECTOR_HDMIA: + *count = HDMI_EDIDS_4K_COUNT; + return HDMI_EDIDS_4K; + default: + *count = 0; + igt_debug("No 4k EDID for the connector %s\n", + kmstest_connector_type_str(type)); + return NULL; + } + } else { + switch (type) { + case DRM_MODE_CONNECTOR_DisplayPort: + *count = DP_EDIDS_NON_4K_COUNT; + return DP_EDIDS_NON_4K; + case DRM_MODE_CONNECTOR_HDMIA: + *count = HDMI_EDIDS_NON_4K_COUNT; + return HDMI_EDIDS_NON_4K; + default: + *count = 0; + igt_debug("No EDID for the connector %s\n", + kmstest_connector_type_str(type)); + return NULL; + } + } +} diff --git a/lib/monitor_edids/monitor_edids_helper.h b/lib/monitor_edids/monitor_edids_helper.h index 05679f0897f3..f5f6f6824411 100644 --- a/lib/monitor_edids/monitor_edids_helper.h +++ b/lib/monitor_edids/monitor_edids_helper.h @@ -11,6 +11,8 @@ #ifndef TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ #define TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ +#include +#include #include #include "igt_chamelium.h" @@ -30,4 +32,7 @@ get_chameleon_edid_from_monitor_edid(struct chamelium *chamelium, const monitor_edid *edid); void free_chamelium_edid_from_monitor_edid(struct chamelium_edid *edid); -#endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ */ \ No newline at end of file +struct edid *edid_from_monitor_edid(const monitor_edid *monitor_edid); +const struct monitor_edid *get_edids_for_connector_type(uint32_t type, size_t *count, bool four_k); + +#endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ */ -- 2.52.0