summaryrefslogtreecommitdiffstats
path: root/common/edid.c
diff options
context:
space:
mode:
authorJernej Skrabec <jernej.skrabec@siol.net>2021-04-22 01:14:29 +0100
committerAnatolij Gustschin <agust@denx.de>2021-04-24 13:44:47 +0200
commita327feeef44108000c171ea2d74f4ab33c09bad7 (patch)
tree4d60d4907f9e34d24fd42805954b651f4289a2b4 /common/edid.c
parent3daea8632cabeb2f9c850743e4920472f898c6f8 (diff)
downloadu-boot-a327feeef44108000c171ea2d74f4ab33c09bad7.tar.gz
u-boot-a327feeef44108000c171ea2d74f4ab33c09bad7.tar.xz
u-boot-a327feeef44108000c171ea2d74f4ab33c09bad7.zip
common: edid: Search for valid timing in extension block
One of my monitors have only 4k@60 timing in base EDID block which is out of range for devices with HDMI 1.4. It turns out that it has additional detailed timings in CTA-861 Extension Block and two of them are appropriate for HDMI 1.4. Add additional search for valid detailed timing in extension block. Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net> Acked-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Diffstat (limited to 'common/edid.c')
-rw-r--r--common/edid.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/common/edid.c b/common/edid.c
index a6c875d9c8..fa85bcd6a1 100644
--- a/common/edid.c
+++ b/common/edid.c
@@ -220,6 +220,24 @@ int edid_get_timing_validate(u8 *buf, int buf_size,
/* Look for detailed timing in base EDID */
found = edid_find_valid_timing(edid->monitor_details.descriptor, 4,
timing, mode_valid, mode_valid_priv);
+
+ /* Look for detailed timing in CTA-861 Extension Block */
+ if (!found && 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) {
+ int count = EDID_CEA861_DTD_COUNT(*info);
+ int offset = info->dtd_offset;
+ int size = count * sizeof(struct edid_detailed_timing);
+
+ if (offset >= 4 && offset + size < EDID_SIZE)
+ found = edid_find_valid_timing(
+ (u8 *)info + offset, count, timing,
+ mode_valid, mode_valid_priv);
+ }
+ }
+
if (!found)
return -EINVAL;