Regression : drm modes detection
Since the introduction of commit 6a79a737 (xfree86: add drm modes on non-GTF panels), some panels have lost all of their alternative modes.
With thoses panels, before the commit, GTF_SUPPORTED was FALSE so drm modes was added by drmmode_output_add_gtf_modes. But now, gtf_supported is TRUE. That means the EDID version is 1.4 and has at least one 'display range timing' with the DR_DEFAULT_GTF or DR_SECONFARY_GTF flag.
This is a dump of the EDID of one of thoses panels :
00000000 00 ff ff ff ff ff ff 00 4a 8b 36 21 21 04 15 20 |........J.6!!.. |
00000010 12 19 01 04 a5 2b 18 78 e2 54 60 ab 52 38 ab 25 |.....+.x.T`.R8.%|
00000020 13 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 |.PT.............|
00000030 01 01 01 01 01 01 30 2a 40 c8 60 84 64 30 18 50 |......0*@.`.d0.P|
00000040 13 00 b0 ef 10 00 00 1e 00 00 00 10 00 50 4b 35 |.............PK5|
00000050 37 33 37 41 47 35 37 35 55 0a 00 00 00 fc 00 41 |737AG575U......A|
00000060 49 4f 20 50 43 0a 20 20 20 20 20 20 00 00 00 fd |IO PC. ....|
00000070 00 3b 3d 32 3c 0a 00 0a 20 20 20 20 20 20 00 5a |.;=2<... .Z|
00000080
Interesting bits :
- Byte 0x13 = 04 >> EDID version is 1.4
- Byte 0x18 = e2 >> bit 0 is not set, display is non-continuous frequency
- Byte 0x6f = fd >> this is the tag number for 'Display Range Limits Descriptor'
- Byte 0x76 = 00 >> this is the 'Video Timing Support Falgs' and means that default GTF is supported
So now, here's my explaination and a possible solution :
From the VESA Enhanced EDID Standard ( https://glenwing.github.io/docs/VESA-EEDID-A2.pdf ), page 39 and 40 :
Video Timing Support Flag (in Byte 10) = 00h and bit 0 of the Feature Support Byte at address 18h set to 1 (indicating a continuous frequency display) indicates that this display supports GTF generated video timing modes using the default GTFparameters. If Byte 10 = 00h, then bit 0 of the Feature Support Byte at address 18h shall not be set to 0 (indicating a non-continuous frequency multi-mode display). All GTF compliant displays are continuous frequency.
I conclude that this panel doesn't support GTF because bit 0 of the Feature Support Byte at address 18h is set to 0. And the code matching this logic should be something like this (in function gtf_supported
inside hw/xfree86/ddc/interpret_edid.c
) :
if (det_timing_des && (det_timing_des->type == DS_RANGES) && (mon->features.msc & 0x1) &&
(det_timing_des->section.ranges.display_range_timing_flags == DR_DEFAULT_GTF
|| det_timing_des->section.ranges.display_range_timing_flags == DR_SECONDARY_GTF))
return TRUE;