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

Commit 61dac464 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/edid: add colorimetry block parsing support"

parents de64b554 ae1a4ed1
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -2716,6 +2716,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
@@ -3594,6 +3595,50 @@ 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_clrmetry_db(struct drm_connector *connector, const u8 *db)
{

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

	/* Bit 0: xvYCC_601 */
	if (db[2] & BIT(0))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_xvYCC_601;
	/* Bit 0: xvYCC_709 */
	if (db[2] & BIT(1))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_xvYCC_709;
	/* Bit 0: sYCC_601 */
	if (db[2] & BIT(2))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_sYCC_601;
	/* Bit 0: ADBYCC_601 */
	if (db[2] & BIT(3))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_ADBYCC_601;
	/* Bit 0: ADB_RGB */
	if (db[2] & BIT(4))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_ADB_RGB;
	/* Bit 0: BT2020_CYCC */
	if (db[2] & BIT(5))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_CYCC;
	/* Bit 0: BT2020_YCC */
	if (db[2] & BIT(6))
		connector->color_enc_fmt |= DRM_EDID_COLORIMETRY_BT2020_YCC;
	/* Bit 0: BT2020_RGB */
	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
@@ -3626,6 +3671,9 @@ struct edid *edid)
				case HDR_STATIC_METADATA_EXTENDED_DATA_BLOCK:
					drm_extract_hdr_db(connector, db);
					break;
				case COLORIMETRY_EXTENDED_DATA_BLOCK:
					drm_extract_clrmetry_db(connector, db);
					break;
				default:
					break;
				}
+2 −0
Original line number Diff line number Diff line
@@ -652,6 +652,7 @@ struct drm_encoder {
 * @pt_scan_info: PT scan info obtained from the VCDB of EDID
 * @it_scan_info: IT scan info obtained from the VCDB of EDID
 * @ce_scan_info: CE scan info obtained from the VCDB of EDID
 * @color_enc_fmt: Colorimetry encoding formats of sink
 * @hdr_eotf: Electro optical transfer function obtained from HDR block
 * @hdr_metadata_type_one: Metadata type one obtained from HDR block
 * @hdr_max_luminance: desired max luminance obtained from HDR block
@@ -742,6 +743,7 @@ struct drm_connector {
	u8 pt_scan_info;
	u8 it_scan_info;
	u8 ce_scan_info;
	u8 color_enc_fmt;
	u32 hdr_eotf;
	bool hdr_metadata_type_one;
	u32 hdr_max_luminance;
+9 −0
Original line number Diff line number Diff line
@@ -214,6 +214,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