Browse Source

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 <[email protected]>
Abhinav Kumar 5 năm trước cách đây
mục cha
commit
5367cc8373
3 tập tin đã thay đổi với 76 bổ sung0 xóa
  1. 13 0
      msm/sde/sde_connector.h
  2. 55 0
      msm/sde_edid_parser.c
  3. 8 0
      msm/sde_edid_parser.h

+ 13 - 0
msm/sde/sde_connector.h

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

+ 55 - 0
msm/sde_edid_parser.c

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

+ 8 - 0
msm/sde_edid_parser.h

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