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:
Abhinav Kumar
2020-02-06 18:05:29 -08:00
bovenliggende 849041b3fe
commit 5367cc8373
3 gewijzigde bestanden met toevoegingen van 76 en 0 verwijderingen

Bestand weergeven

@@ -418,6 +418,12 @@ struct sde_connector_dyn_hdr_metadata {
* @bl_scale: BL scale value for ABA feature * @bl_scale: BL scale value for ABA feature
* @bl_scale_sv: BL scale value for sunlight visibility feature * @bl_scale_sv: BL scale value for sunlight visibility feature
* @unset_bl_level: BL level that needs to be set later * @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 * @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_mode: Cached Qsync mode, 0=disabled, 1=continuous mode
* @qsync_updated: Qsync settings were updated * @qsync_updated: Qsync settings were updated
@@ -471,6 +477,13 @@ struct sde_connector {
u32 unset_bl_level; u32 unset_bl_level;
bool allow_bl_update; 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; u8 hdr_plus_app_ver;
u32 qsync_mode; u32 qsync_mode;
bool qsync_updated; bool qsync_updated;

Bestand weergeven

@@ -496,6 +496,58 @@ static void sde_edid_parse_vsvdb_info(struct drm_connector *connector,
SDE_EDID_DEBUG("%s -\n", __func__); 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 * sde_edid_parse_extended_blk_info - Parse the HDMI extended tag blocks
* @connector: connector corresponding to external sink * @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, sde_edid_parse_vsvdb_info(connector,
db); db);
break; break;
case HDR_STATIC_METADATA_DATA_BLOCK:
sde_edid_parse_hdr_db(connector, db);
break;
default: default:
break; break;
} }

Bestand weergeven

@@ -29,6 +29,14 @@
#define VSVDB_HDR10_PLUS_IEEE_CODE 0x90848b #define VSVDB_HDR10_PLUS_IEEE_CODE 0x90848b
#define VSVDB_HDR10_PLUS_APP_VER_MASK 0x3 #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 { enum extended_data_block_types {
VIDEO_CAPABILITY_DATA_BLOCK = 0x0, VIDEO_CAPABILITY_DATA_BLOCK = 0x0,
VENDOR_SPECIFIC_VIDEO_DATA_BLOCK = 0x01, VENDOR_SPECIFIC_VIDEO_DATA_BLOCK = 0x01,