[igt-dev] [PATCH 5/7] tests/kms_hdr: Add function to check HDR panel
Shankar, Uma
uma.shankar at intel.com
Wed Jan 29 15:02:06 UTC 2020
> -----Original Message-----
> From: Sharma, Swati2 <swati2.sharma at intel.com>
> Sent: Wednesday, January 29, 2020 7:25 PM
> To: igt-dev at lists.freedesktop.org
> Cc: Mun, Gwan-gyeong <gwan-gyeong.mun at intel.com>;
> ville.syrjala at linux.intel.com; Hiler, Arkadiusz <arkadiusz.hiler at intel.com>; Latvala,
> Petri <petri.latvala at intel.com>; Shankar, Uma <uma.shankar at intel.com>; Sharma,
> Swati2 <swati2.sharma at intel.com>; Joshi, Kunal1 <kunal1.joshi at intel.com>
> Subject: [PATCH 5/7] tests/kms_hdr: Add function to check HDR panel
>
> EDID of connected panel needs to be parsed to detect whether panel can drive hdr
> or not. Added new function is_panel_hdr(), to know about hdr capabilities of panel.
> If panel supports hdr then only tests will get executed else skipped.
>
> v2: continue instead of break [Kunal]
>
Looks good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>
> Signed-off-by: Swati Sharma <swati2.sharma at intel.com>
> Suggested-by: Kunal Joshi <kunal1.joshi at intel.com>
> ---
> tests/kms_hdr.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 87 insertions(+)
>
> diff --git a/tests/kms_hdr.c b/tests/kms_hdr.c index ff21335a..780395ad 100644
> --- a/tests/kms_hdr.c
> +++ b/tests/kms_hdr.c
> @@ -24,9 +24,22 @@
> #include <fcntl.h>
> #include <termios.h>
> #include <unistd.h>
> +#include "igt_edid.h"
>
> IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");
>
> +/* HDR EDID parsing. */
> +#define CTA_EXTENSION_VERSION 0x03
> +#define HDR_STATIC_METADATA_BLOCK 0x06
> +#define USE_EXTENDED_TAG 0x07
> +
> +/* DRM HDR definitions. Not in the UAPI header, unfortunately. */ enum
> +hdmi_eotf {
> + HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
> + HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
> + HDMI_EOTF_SMPTE_ST2084,
> +};
> +
> /* Test flags. */
> enum {
> TEST_NONE = 1 << 0,
> @@ -267,6 +280,80 @@ static void test_bpc_switch(data_t *data, uint32_t flags)
> igt_require_f(valid_tests, "No connector found with MAX BPC connector
> property\n"); }
>
> +static bool cta_block(const char *edid_ext) {
> + /*
> + * Byte 1: 0x07 indicates Extended Tag
> + * Byte 2: 0x06 indicates HDMI Static Metadata Block
> + * Byte 3: bits 0 to 5 identify EOTF functions supported by sink
> + * where ET_0: Traditional Gamma - SDR Luminance Range
> + * ET_1: Traditional Gamma - HDR Luminance Range
> + * ET_2: SMPTE ST 2084
> + * ET_3: Hybrid Log-Gamma (HLG)
> + * ET_4 to ET_5: Reserved for future use
> + */
> +
> + if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
> + (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
> + ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
> + (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
> + return true;
> +
> + return false;
> +}
> +
> +/* Returns true if panel supports HDR. */ static bool
> +is_panel_hdr(data_t *data, igt_output_t *output) {
> + bool ok;
> + int i, j, offset;
> + uint64_t edid_blob_id;
> + drmModePropertyBlobRes *edid_blob;
> + const struct edid_ext *edid_ext;
> + const struct edid *edid;
> + const struct edid_cea *edid_cea;
> + const char *cea_data;
> + bool ret = false;
> +
> + ok = kmstest_get_property(data->fd, output->id,
> + DRM_MODE_OBJECT_CONNECTOR, "EDID",
> + NULL, &edid_blob_id, NULL);
> +
> + if (!ok || !edid_blob_id)
> + return ret;
> +
> + edid_blob = drmModeGetPropertyBlob(data->fd, edid_blob_id);
> + igt_assert(edid_blob);
> +
> + edid = (const struct edid *) edid_blob->data;
> + igt_assert(edid);
> +
> + drmModeFreePropertyBlob(edid_blob);
> +
> + for (i = 0; i < edid->extensions_len; i++) {
> + edid_ext = &edid->extensions[i];
> + edid_cea = &edid_ext->data.cea;
> +
> + /* HDR not defined in CTA Extension Version < 3. */
> + if ((edid_ext->tag != EDID_EXT_CEA) ||
> + (edid_cea->revision != CTA_EXTENSION_VERSION))
> + continue;
> + else {
> + offset = edid_cea->dtd_start;
> + cea_data = edid_cea->data;
> +
> + for (j = 0; j < offset; j += (cea_data[j] & 0x1f) + 1) {
> + ret = cta_block(cea_data + j);
> +
> + if (ret)
> + break;
> + }
> + }
> + }
> +
> + return ret;
> +}
> +
> igt_main
> {
> data_t data = { 0 };
> --
> 2.24.1
More information about the igt-dev
mailing list