[igt-dev] [PATCH i-g-t 5/7] tests/kms_hdr: Add function to check HDR panel

Kunal Joshi kunal1.joshi at intel.com
Fri Jan 31 03:58:13 UTC 2020


On 2020-01-29 at 12:20:16 +0530, Swati Sharma wrote:
> 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]
> 
> 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 c48e43e9..5615ac35 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 = 0,
> @@ -268,6 +281,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
>
Reviewed-by: Kunal Joshi <kunal1.joshi at intel.com>


More information about the igt-dev mailing list