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 76182FF885A for ; Tue, 28 Apr 2026 04:49:53 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2197E10E2C4; Tue, 28 Apr 2026 04:49:53 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="U90ZimiR"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.19]) by gabe.freedesktop.org (Postfix) with ESMTPS id B29D610E0EB for ; Tue, 28 Apr 2026 04:47:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1777351630; x=1808887630; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PMKA9c6Bm9JEqGbU6oAEnwxORkHwvZaGfw2WwwS5Tu4=; b=U90ZimiRBMh9WxYm3k281lhFCS//4FkCn4y1wnlImW3zw2JVZha8Wh9R GCgZXtj2GxM52grfowPUWqwDiGn493W+/75BSSkuXOqtqVpjSzC2uF2bN yV3OyLf7/qjCxPP5LpUDd1IkoidD4eyZGnx9LPKZTba2IsXASIugf5rkC LT+R3k2TJDyqmxQEA3hq3kvtmMXd7VTRc3511Uc6oCFgir4jLBQcBs7lb lkxImpZxtpW1RLrD6qyuCqY1GfshOnKbfY6kg1L6K3JEsEn5ptAwvOi6M BOH5Rdr80ZZESxYkSmBtT0iJASHFPj5Pgv7gbsvQpgf49LAMwEvUQwD4f A==; X-CSE-ConnectionGUID: DaTvvfErSuKMwNEI6FOqfw== X-CSE-MsgGUID: ChbVEQhVQ6mxIRua86ihKQ== X-IronPort-AV: E=McAfee;i="6800,10657,11769"; a="78167797" X-IronPort-AV: E=Sophos;i="6.23,203,1770624000"; d="scan'208";a="78167797" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by orvoesa111.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Apr 2026 21:47:10 -0700 X-CSE-ConnectionGUID: c+vKMsY0TZurywFow28ULA== X-CSE-MsgGUID: np4Wn5goSoGtgldGNer1tw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,203,1770624000"; d="scan'208";a="233706593" Received: from bilal-nuc7i7bnh.iind.intel.com ([10.190.239.45]) by orviesa008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Apr 2026 21:47:09 -0700 From: Mohammed Bilal To: igt-dev@lists.freedesktop.org Cc: kunal1.joshi@intel.com, Louis Chauvet , Luca Ceresoli , Kory Maincent Subject: [PATCH i-g-t v1 06/25] lib/monitor_edids: Add helper functions for using monitor_edid objects Date: Tue, 28 Apr 2026 10:16:15 +0530 Message-ID: <20260428044644.257001-7-mohammed.bilal@intel.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20260428044644.257001-1-mohammed.bilal@intel.com> References: <20260428044644.257001-1-mohammed.bilal@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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" From: Louis Chauvet 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 144907558..077933812 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 f6cfe82ff..398424177 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 1cbf1c22f..6043e7a08 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. + */ +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 05679f089..e50698686 100644 --- a/lib/monitor_edids/monitor_edids_helper.h +++ b/lib/monitor_edids/monitor_edids_helper.h @@ -12,6 +12,8 @@ #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); +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.48.1