summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorJernej Skrabec <jernej.skrabec@siol.net>2017-04-29 14:43:36 +0200
committerAnatolij Gustschin <agust@denx.de>2017-05-15 20:32:12 +0200
commit43c6bdd0209ca31be84d572278485ed604582730 (patch)
tree36079aa166a2ef266c016b38fcb8e4f14109968f /common
parentdc8cae4df3c016cbcb6eb8a841a7a94ff36b9e0b (diff)
downloadu-boot-43c6bdd0209ca31be84d572278485ed604582730.tar.gz
u-boot-43c6bdd0209ca31be84d572278485ed604582730.tar.bz2
u-boot-43c6bdd0209ca31be84d572278485ed604582730.zip
edid: Add HDMI flag to timing info
Some DVI monitors don't show anything in HDMI mode since audio stream confuses them. To solve this situation, this commit adds HDMI flag in timing data and sets it accordingly during edid parsing. First existence of extension block is checked. If it exists and it is CEA861 extension, then data blocks are checked for presence of HDMI vendor specific data block. If it is present, HDMI flag is set. Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/edid.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/common/edid.c b/common/edid.c
index ab7069fdcd..19410aa4fc 100644
--- a/common/edid.c
+++ b/common/edid.c
@@ -136,6 +136,39 @@ static void decode_timing(u8 *buf, struct display_timing *timing)
va + vbl, vborder);
}
+/**
+ * Check if HDMI vendor specific data block is present in CEA block
+ * @param info CEA extension block
+ * @return true if block is found
+ */
+static bool cea_is_hdmi_vsdb_present(struct edid_cea861_info *info)
+{
+ u8 end, i = 0;
+
+ /* check for end of data block */
+ end = info->dtd_offset;
+ if (end == 0)
+ end = 127;
+ if (end < 4 || end > 127)
+ return false;
+ end -= 4;
+
+ while (i < end) {
+ /* Look for vendor specific data block of appropriate size */
+ if ((EDID_CEA861_DB_TYPE(*info, i) == EDID_CEA861_DB_VENDOR) &&
+ (EDID_CEA861_DB_LEN(*info, i) >= 5)) {
+ u8 *db = &info->data[i + 1];
+ u32 oui = db[0] | (db[1] << 8) | (db[2] << 16);
+
+ if (oui == HDMI_IEEE_OUI)
+ return true;
+ }
+ i += EDID_CEA861_DB_LEN(*info, i) + 1;
+ }
+
+ return false;
+}
+
int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing,
int *panel_bits_per_colourp)
{
@@ -181,6 +214,15 @@ int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing,
((edid->video_input_definition & 0x70) >> 3) + 4;
}
+ timing->hdmi_monitor = false;
+ if (edid->extension_flag && (buf_size >= EDID_EXT_SIZE)) {
+ struct edid_cea861_info *info =
+ (struct edid_cea861_info *)(buf + sizeof(*edid));
+
+ if (info->extension_tag == EDID_CEA861_EXTENSION_TAG)
+ timing->hdmi_monitor = cea_is_hdmi_vsdb_present(info);
+ }
+
return 0;
}