disp: msm: add support for parsing HDR block in SDE EDID parser
This is needed to replace usage of upstream EDID parser to satisfy GKI requirements. Change-Id: I1e4043bd8e95b2ff71e7e4b05706cbeb9c66b03d Signed-off-by: Abhinav Kumar <abhinavk@codeaurora.org>
This commit is contained in:
@@ -418,6 +418,12 @@ struct sde_connector_dyn_hdr_metadata {
|
||||
* @bl_scale: BL scale value for ABA feature
|
||||
* @bl_scale_sv: BL scale value for sunlight visibility feature
|
||||
* @unset_bl_level: BL level that needs to be set later
|
||||
* @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
|
||||
* @hdr_avg_luminance: desired avg luminance obtained from HDR block
|
||||
* @hdr_min_luminance: desired min luminance obtained from HDR block
|
||||
* @hdr_supported: does the sink support HDR content
|
||||
* @allow_bl_update: Flag to indicate if BL update is allowed currently or not
|
||||
* @qsync_mode: Cached Qsync mode, 0=disabled, 1=continuous mode
|
||||
* @qsync_updated: Qsync settings were updated
|
||||
@@ -471,6 +477,13 @@ struct sde_connector {
|
||||
u32 unset_bl_level;
|
||||
bool allow_bl_update;
|
||||
|
||||
u32 hdr_eotf;
|
||||
bool hdr_metadata_type_one;
|
||||
u32 hdr_max_luminance;
|
||||
u32 hdr_avg_luminance;
|
||||
u32 hdr_min_luminance;
|
||||
bool hdr_supported;
|
||||
|
||||
u8 hdr_plus_app_ver;
|
||||
u32 qsync_mode;
|
||||
bool qsync_updated;
|
||||
|
@@ -496,6 +496,58 @@ static void sde_edid_parse_vsvdb_info(struct drm_connector *connector,
|
||||
SDE_EDID_DEBUG("%s -\n", __func__);
|
||||
}
|
||||
|
||||
static bool sde_edid_is_luminance_value_present(u32 block_length,
|
||||
enum luminance_value value)
|
||||
{
|
||||
return block_length > NO_LUMINANCE_DATA && value <= block_length;
|
||||
}
|
||||
|
||||
/*
|
||||
* sde_edid_parse_hdr_db - Parse the HDR extended block
|
||||
* @connector: connector for the external sink
|
||||
* @db: start of the HDR extended block
|
||||
*
|
||||
* Parses the HDR extended block to extract sink info for @connector.
|
||||
*/
|
||||
static void
|
||||
sde_edid_parse_hdr_db(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
|
||||
u8 len = 0;
|
||||
struct sde_connector *c_conn;
|
||||
|
||||
c_conn = to_sde_connector(connector);
|
||||
|
||||
if (!db)
|
||||
return;
|
||||
|
||||
len = db[0] & 0x1f;
|
||||
/* Byte 3: Electro-Optical Transfer Functions */
|
||||
c_conn->hdr_eotf = db[2] & 0x3F;
|
||||
|
||||
/* Byte 4: Static Metadata Descriptor Type 1 */
|
||||
c_conn->hdr_metadata_type_one = (db[3] & BIT(0));
|
||||
|
||||
/* Byte 5: Desired Content Maximum Luminance */
|
||||
if (sde_edid_is_luminance_value_present(len, MAXIMUM_LUMINANCE))
|
||||
c_conn->hdr_max_luminance = db[MAXIMUM_LUMINANCE];
|
||||
|
||||
/* Byte 6: Desired Content Max Frame-average Luminance */
|
||||
if (sde_edid_is_luminance_value_present(len, FRAME_AVERAGE_LUMINANCE))
|
||||
c_conn->hdr_avg_luminance = db[FRAME_AVERAGE_LUMINANCE];
|
||||
|
||||
/* Byte 7: Desired Content Min Luminance */
|
||||
if (sde_edid_is_luminance_value_present(len, MINIMUM_LUMINANCE))
|
||||
c_conn->hdr_min_luminance = db[MINIMUM_LUMINANCE];
|
||||
|
||||
c_conn->hdr_supported = true;
|
||||
SDE_EDID_DEBUG("HDR electro-optical %d\n", c_conn->hdr_eotf);
|
||||
SDE_EDID_DEBUG("metadata desc 1 %d\n", c_conn->hdr_metadata_type_one);
|
||||
SDE_EDID_DEBUG("max luminance %d\n", c_conn->hdr_max_luminance);
|
||||
SDE_EDID_DEBUG("avg luminance %d\n", c_conn->hdr_avg_luminance);
|
||||
SDE_EDID_DEBUG("min luminance %d\n", c_conn->hdr_min_luminance);
|
||||
}
|
||||
|
||||
/*
|
||||
* sde_edid_parse_extended_blk_info - Parse the HDMI extended tag blocks
|
||||
* @connector: connector corresponding to external sink
|
||||
@@ -526,6 +578,9 @@ sde_edid_parse_extended_blk_info(struct drm_connector *connector,
|
||||
sde_edid_parse_vsvdb_info(connector,
|
||||
db);
|
||||
break;
|
||||
case HDR_STATIC_METADATA_DATA_BLOCK:
|
||||
sde_edid_parse_hdr_db(connector, db);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -29,6 +29,14 @@
|
||||
#define VSVDB_HDR10_PLUS_IEEE_CODE 0x90848b
|
||||
#define VSVDB_HDR10_PLUS_APP_VER_MASK 0x3
|
||||
|
||||
/*Enum storing luminance types for HDR blocks in EDID*/
|
||||
enum luminance_value {
|
||||
NO_LUMINANCE_DATA = 3,
|
||||
MAXIMUM_LUMINANCE = 4,
|
||||
FRAME_AVERAGE_LUMINANCE = 5,
|
||||
MINIMUM_LUMINANCE = 6
|
||||
};
|
||||
|
||||
enum extended_data_block_types {
|
||||
VIDEO_CAPABILITY_DATA_BLOCK = 0x0,
|
||||
VENDOR_SPECIFIC_VIDEO_DATA_BLOCK = 0x01,
|
||||
|
Reference in New Issue
Block a user