drm/edid: add colorimetry block parsing support

Add support for parsing 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: Abhinav Kumar <abhinavk@codeaurora.org>
This commit is contained in:
Abhinav Kumar 2017-07-20 21:40:10 -07:00
parent fc8b7422d9
commit ae1a4ed18e
3 changed files with 59 additions and 0 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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