From: Jani Nikula <jani.nikula@intel.com>
To: Louis Chauvet <louis.chauvet@bootlin.com>, igt-dev@lists.freedesktop.org
Cc: Petri Latvala <adrinael@adrinael.net>,
Arkadiusz Hiler <arek@hiler.eu>,
Kamil Konieczny <kamil.konieczny@linux.intel.com>,
Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>,
Bhanuprakash Modem <bhanuprakash.modem@intel.com>,
Ashutosh Dixit <ashutosh.dixit@intel.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
nicolejadeyee@google.com, seanpaul@google.com,
jeremie.dautheribes@bootlin.com, markyacoub@google.com,
Louis Chauvet <louis.chauvet@bootlin.com>
Subject: Re: [PATCH i-g-t v3 1/5] lib/monitor_edids: Add helper functions for using monitor_edid objects
Date: Mon, 25 Nov 2024 11:20:35 +0200 [thread overview]
Message-ID: <87wmgry8ik.fsf@intel.com> (raw)
In-Reply-To: <20241122-b4-cv3-02-monitor-edids-v3-1-1798f58167ef@bootlin.com>
On Fri, 22 Nov 2024, Louis Chauvet <louis.chauvet@bootlin.com> wrote:
> 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 <louis.chauvet@bootlin.com>
> ---
> lib/monitor_edids/dp_edids.h | 4 ++
> lib/monitor_edids/hdmi_edids.h | 4 ++
> lib/monitor_edids/monitor_edids_helper.c | 77 ++++++++++++++++++++++++++++++++
> lib/monitor_edids/monitor_edids_helper.h | 7 ++-
> 4 files changed, 91 insertions(+), 1 deletion(-)
>
> diff --git a/lib/monitor_edids/dp_edids.h b/lib/monitor_edids/dp_edids.h
> index 144907558be1faa306b646ce3b47b24c13050968..8192520c89e61d3d38c508ca97a61040cea4ba90 100644
> --- a/lib/monitor_edids/dp_edids.h
> +++ b/lib/monitor_edids/dp_edids.h
> @@ -12,6 +12,7 @@
> #ifndef TESTS_CHAMELIUM_MONITOR_EDIDS_DP_EDIDS_H_
> #define TESTS_CHAMELIUM_MONITOR_EDIDS_DP_EDIDS_H_
>
> +#include "drmtest.h"
> #include "monitor_edids_helper.h"
>
> monitor_edid DP_EDIDS_4K[] = {
> @@ -194,4 +195,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 f6cfe82ff6e1c4419160bcdcc851a5e28eb08726..23ac04d94b6f672572e34b8059ff1b47d0730839 100644
> --- a/lib/monitor_edids/hdmi_edids.h
> +++ b/lib/monitor_edids/hdmi_edids.h
> @@ -12,6 +12,7 @@
> #ifndef TESTS_CHAMELIUM_MONITOR_EDIDS_HDMI_EDIDS_H_
> #define TESTS_CHAMELIUM_MONITOR_EDIDS_HDMI_EDIDS_H_
>
> +#include "drmtest.h"
> #include "monitor_edids_helper.h"
>
> monitor_edid HDMI_EDIDS_4K[] = {
> @@ -604,4 +605,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 1cbf1c22f0bbc5fb4047ce42bde2042ec8170efb..a7a945659f751be99ecd9d55f9b7307df256d543 100644
> --- a/lib/monitor_edids/monitor_edids_helper.c
> +++ b/lib/monitor_edids/monitor_edids_helper.c
> @@ -15,6 +15,9 @@
> #include <assert.h>
>
> #include "igt_core.h"
> +#include "igt_edid.h"
> +#include "dp_edids.h"
> +#include "hdmi_edids.h"
>
> static uint8_t convert_hex_char_to_byte(char c)
> {
> @@ -90,3 +93,77 @@ void free_chamelium_edid_from_monitor_edid(struct chamelium_edid *edid)
> free(edid);
> edid = NULL;
> }
> +
> +/*
> + * edid_from_monitor_edid() - Get a struct edid from a monitor_edid
> + * @mon_edid: Monitor EDId to convert
> + *
> + * The caller must free the returned pointer
> + */
> +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 shorter 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;
> +}
Only partially related to the patch at hand, IGT seems to be completely
unaware of the HF-EEODB extension which can indicate a bigger EDID size
than what edid_get_size() returns.
The above would reduce the allocation below the actual EDID size in such
cases. Luckily I don't think anyone in IGT interprets EDIDs according to
HF-EEODB, so there's no buffer overflow *yet*, but eventually that will
need to be covered, and basically every single EDID usage needs to be
amended.
BR,
Jani.
> +
> +/*
> + * get_edids_for_connector_type() - Get the list of EDIDS for a
> + * specific 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
> + */
> +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 05679f0897f3d0618d656cc071b565b48d31da28..e5069868683d97053d8e66666e83692f1b733db3 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 <stdint.h>
> +#include <stddef.h>
> +#include <stdbool.h>
>
> #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_ */
--
Jani Nikula, Intel
next prev parent reply other threads:[~2024-11-25 9:20 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-22 15:51 [PATCH i-g-t v3 0/5] lib/igt_kms: Helpers for monitor edid managment Louis Chauvet
2024-11-22 15:51 ` [PATCH i-g-t v3 1/5] lib/monitor_edids: Add helper functions for using monitor_edid objects Louis Chauvet
2024-11-25 9:20 ` Jani Nikula [this message]
2024-12-19 20:40 ` Kamil Konieczny
2024-12-20 17:56 ` Kamil Konieczny
2024-11-22 15:51 ` [PATCH i-g-t v3 2/5] lib/monitor_edids: Add helper to get an EDID by its name Louis Chauvet
2024-12-20 17:29 ` Kamil Konieczny
2024-11-22 15:51 ` [PATCH i-g-t v3 3/5] lib/monitor_edids: Add helper to print all available EDID names Louis Chauvet
2024-12-20 17:31 ` Kamil Konieczny
2024-11-22 15:51 ` [PATCH i-g-t v3 4/5] lib/monitor_edids: Fix missing names in some monitor EDID Louis Chauvet
2024-11-22 15:51 ` [PATCH i-g-t v3 5/5] lib/monitor_edids: Add new EDID for HDMI 4k Louis Chauvet
2024-11-22 18:43 ` ✗ GitLab.Pipeline: warning for lib/igt_kms: Helpers for monitor edid managment (rev3) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wmgry8ik.fsf@intel.com \
--to=jani.nikula@intel.com \
--cc=adrinael@adrinael.net \
--cc=arek@hiler.eu \
--cc=ashutosh.dixit@intel.com \
--cc=bhanuprakash.modem@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=jeremie.dautheribes@bootlin.com \
--cc=juhapekka.heikkila@gmail.com \
--cc=kamil.konieczny@linux.intel.com \
--cc=louis.chauvet@bootlin.com \
--cc=markyacoub@google.com \
--cc=nicolejadeyee@google.com \
--cc=seanpaul@google.com \
--cc=thomas.petazzoni@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox