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

Commit 9986aacd authored by Chirag Khurana's avatar Chirag Khurana Committed by Gerrit - the friendly Code Review server
Browse files

drm/edid: add colorimetry block parsing support



Parse the colorimetry data block of EDID to get
information about the supported encoding formats
of the sink.

This information is needed to use the appropriate
color encoding scheme before transmitting the video
stream to the sink.

Change-Id: I133e8f21fa4ad843219dbefed2d072ad2edab197
Signed-off-by: default avatarAbhinav Kumar <abhinavk@codeaurora.org>
Signed-off-by: default avatarAjay Singh Parmar <aparmar@codeaurora.org>
Signed-off-by: default avatarChirag Khurana <ckhurana@codeaurora.org>
parent 19aa7f20
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -2760,6 +2760,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
#define VENDOR_BLOCK    0x03
#define SPEAKER_BLOCK	0x04
#define HDR_STATIC_METADATA_EXTENDED_DATA_BLOCK 0x06
#define COLORIMETRY_EXTENDED_DATA_BLOCK 0x05
#define EXTENDED_TAG  0x07
#define VIDEO_CAPABILITY_BLOCK	0x07
#define Y420_VIDEO_DATA_BLOCK	0x0E
@@ -3663,6 +3664,49 @@ drm_extract_hdr_db(struct drm_connector *connector, const u8 *db)
	DRM_DEBUG_KMS("min luminance %d\n", connector->hdr_min_luminance);
}

/**
 * drm_extract_colorimetry_db - Parse the HDMI colorimetry extended block
 * @connector: connector corresponding to the HDMI sink
 * @db: start of the HDMI colorimetry extended block
 *
 * Parses the HDMI colorimetry block to extract sink info for @connector.
 */
static void
drm_extract_colorimetry_db(struct drm_connector *connector, const u8 *db)
{

	if (!db) {
		DRM_ERROR("invalid db\n");
		return;
	}

	if (db[2] & BIT(0))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_xvYCC_601;

	if (db[2] & BIT(1))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_xvYCC_709;

	if (db[2] & BIT(2))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_sYCC_601;

	if (db[2] & BIT(3))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_ADBYCC_601;

	if (db[2] & BIT(4))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_ADB_RGB;

	if (db[2] & BIT(5))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_CYCC;

	if (db[2] & BIT(6))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_YCC;

	if (db[2] & BIT(7))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_RGB;

	DRM_DEBUG_KMS("colorimetry fmt 0x%x\n", connector->color_enc_fmt);
}

/*
 * drm_hdmi_extract_extended_blk_info - Parse the HDMI extended tag blocks
 * @connector: connector corresponding to the HDMI sink
@@ -3695,6 +3739,10 @@ struct edid *edid)
				case HDR_STATIC_METADATA_EXTENDED_DATA_BLOCK:
					drm_extract_hdr_db(connector, db);
					break;
				case COLORIMETRY_EXTENDED_DATA_BLOCK:
					drm_extract_colorimetry_db(connector,
									db);
					break;
				default:
					break;
				}
+9 −0
Original line number Diff line number Diff line
@@ -217,6 +217,15 @@ struct detailed_timing {
#define DRM_EDID_YCBCR420_DC_36  (1 << 1)
#define DRM_EDID_YCBCR420_DC_30  (1 << 0)

#define DRM_EDID_COLORIMETRY_xvYCC_601	(1 << 0)
#define DRM_EDID_COLORIMETRY_xvYCC_709	(1 << 1)
#define DRM_EDID_COLORIMETRY_sYCC_601	(1 << 2)
#define DRM_EDID_COLORIMETRY_ADBYCC_601	(1 << 3)
#define DRM_EDID_COLORIMETRY_ADB_RGB	(1 << 4)
#define DRM_EDID_COLORIMETRY_BT2020_CYCC	(1 << 5)
#define DRM_EDID_COLORIMETRY_BT2020_YCC	(1 << 6)
#define DRM_EDID_COLORIMETRY_BT2020_RGB	(1 << 7)

/* ELD Header Block */
#define DRM_ELD_HEADER_BLOCK_SIZE	4