Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0152f0b2 authored by Uma Shankar's avatar Uma Shankar Committed by Alistair Delva
Browse files

ANDROID: drm: Parse Colorimetry data block from EDID

CEA 861.3 spec adds colorimetry data block for HDMI.
Parsing the block to get the colorimetry data from
panel.

This was posted by Uma Shankar at
https://patchwork.kernel.org/patch/10861327/



Modified by Abhinav Kumar:
- Use macros to distinguish the bit fields for clarity

Changes in v2:
- Use the drm_edid.h macros in drm_edid.c (Stephen Boyd)

Signed-off-by: default avatarUma Shankar <uma.shankar@intel.com>
Signed-off-by: default avatarAbhinav Kumar <abhinavk@codeaurora.org>
[adelva: rebased on earlier non-upstream changes]
Bug: 139653858
Link: https://patchwork.kernel.org/patch/11349269/


Change-Id: I2f5f23ba22e13745a0dd7daf7b8cde6eb3d7803b
Signed-off-by: default avatarAlistair Delva <adelva@google.com>
parent 6471b765
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -3945,6 +3945,48 @@ static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
	mode->clock = clock;
}

static bool cea_db_is_hdmi_colorimetry_data_block(const u8 *db)
{
	if (cea_db_tag(db) != USE_EXTENDED_TAG)
		return false;

	if (db[1] != COLORIMETRY_EXTENDED_DATA_BLOCK)
		return false;

	if (cea_db_payload_len(db) < 2)
		return false;

	return true;
}

static void
drm_parse_colorimetry_data_block(struct drm_connector *connector, const u8 *db)
{
	struct drm_hdmi_info *info = &connector->display_info.hdmi;

	if (db[2] & DRM_EDID_CLRMETRY_xvYCC_601)
		info->colorimetry |= DRM_EDID_CLRMETRY_xvYCC_601;
	if (db[2] & DRM_EDID_CLRMETRY_xvYCC_709)
		info->colorimetry |= DRM_EDID_CLRMETRY_xvYCC_709;
	if (db[2] & DRM_EDID_CLRMETRY_sYCC_601)
		info->colorimetry |= DRM_EDID_CLRMETRY_sYCC_601;
	if (db[2] & DRM_EDID_CLRMETRY_ADBYCC_601)
		info->colorimetry |= DRM_EDID_CLRMETRY_ADBYCC_601;
	if (db[2] & DRM_EDID_CLRMETRY_ADB_RGB)
		info->colorimetry |= DRM_EDID_CLRMETRY_ADB_RGB;
	if (db[2] & DRM_EDID_CLRMETRY_BT2020_CYCC)
		info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_CYCC;
	if (db[2] & DRM_EDID_CLRMETRY_BT2020_YCC)
		info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_YCC;
	if (db[2] & DRM_EDID_CLRMETRY_BT2020_RGB)
		info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_RGB;
	/* Byte 4 Bit 7: DCI-P3 */
	if (db[3] & BIT(7))
		info->colorimetry |= DRM_EDID_CLRMETRY_DCI_P3;

	DRM_DEBUG_KMS("Supported Colorimetry 0x%x\n", info->colorimetry);
}

static bool cea_db_is_hdmi_hdr_metadata_block(const u8 *db)
{
	if (cea_db_tag(db) != USE_EXTENDED_TAG)
@@ -4852,6 +4894,8 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
			drm_parse_vcdb(connector, db);
		if (cea_db_is_hdmi_hdr_metadata_block(db))
			drm_parse_hdr_metadata_block(connector, db);
		if (cea_db_is_hdmi_colorimetry_data_block(db))
			drm_parse_colorimetry_data_block(connector, db);
	}
}

+3 −0
Original line number Diff line number Diff line
@@ -208,6 +208,9 @@ struct drm_hdmi_info {

	/** @y420_dc_modes: bitmap of deep color support index */
	u8 y420_dc_modes;

	/* @colorimetry: bitmap of supported colorimetry modes */
	u16 colorimetry;
};

/**