ddc: Port some paranoia from drm_edid.c
Avoid adding a "standard" mode timing if we've already got a matching detailed timing. To help with that, parse CEA blocks for detailed timings before doing standard or established timings. Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
652913cd94
commit
4ed8d5c946
|
@ -462,21 +462,38 @@ FindDMTMode(int hsize, int vsize, int refresh, Bool rb)
|
||||||
* for modes in this section, but does say that CVT is preferred.
|
* for modes in this section, but does say that CVT is preferred.
|
||||||
*/
|
*/
|
||||||
static DisplayModePtr
|
static DisplayModePtr
|
||||||
DDCModesFromStandardTiming(struct std_timings *timing, ddc_quirk_t quirks,
|
DDCModesFromStandardTiming(DisplayModePtr pool, struct std_timings *timing,
|
||||||
|
ddc_quirk_t quirks,
|
||||||
int timing_level, Bool rb)
|
int timing_level, Bool rb)
|
||||||
{
|
{
|
||||||
DisplayModePtr Modes = NULL, Mode = NULL;
|
DisplayModePtr Modes = NULL, Mode = NULL;
|
||||||
int i, hsize, vsize, refresh;
|
int i, hsize, vsize, refresh;
|
||||||
|
|
||||||
for (i = 0; i < STD_TIMINGS; i++) {
|
for (i = 0; i < STD_TIMINGS; i++) {
|
||||||
|
DisplayModePtr p = NULL;
|
||||||
hsize = timing[i].hsize;
|
hsize = timing[i].hsize;
|
||||||
vsize = timing[i].vsize;
|
vsize = timing[i].vsize;
|
||||||
refresh = timing[i].refresh;
|
refresh = timing[i].refresh;
|
||||||
|
|
||||||
/* HDTV hack, because you can't say 1366 */
|
/* HDTV hack, part one */
|
||||||
if (refresh == 60 &&
|
if (refresh == 60 &&
|
||||||
((hsize == 1360 && vsize == 765) ||
|
((hsize == 1360 && vsize == 765) ||
|
||||||
(hsize == 1368 && vsize == 769))) {
|
(hsize == 1368 && vsize == 769))) {
|
||||||
|
hsize = 1366;
|
||||||
|
vsize = 768;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we already have a detailed timing for this size, don't add more */
|
||||||
|
for (p = pool; p; p = p->next) {
|
||||||
|
if (p->HDisplay == hsize && p->VDisplay == vsize &&
|
||||||
|
refresh == round(xf86ModeVRefresh(p)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (p)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* HDTV hack, because you can't say 1366 */
|
||||||
|
if (refresh == 60 && hsize == 1366 && vsize == 768) {
|
||||||
Mode = xf86CVTMode(1366, 768, 60, FALSE, FALSE);
|
Mode = xf86CVTMode(1366, 768, 60, FALSE, FALSE);
|
||||||
Mode->HDisplay = 1366;
|
Mode->HDisplay = 1366;
|
||||||
Mode->HSyncStart--;
|
Mode->HSyncStart--;
|
||||||
|
@ -1013,7 +1030,8 @@ handle_detailed_modes(struct detailed_monitor_section *det_mon, void *data)
|
||||||
p->Modes = xf86ModesAdd(p->Modes, Mode);
|
p->Modes = xf86ModesAdd(p->Modes, Mode);
|
||||||
break;
|
break;
|
||||||
case DS_STD_TIMINGS:
|
case DS_STD_TIMINGS:
|
||||||
Mode = DDCModesFromStandardTiming(det_mon->section.std_t,
|
Mode = DDCModesFromStandardTiming(p->Modes,
|
||||||
|
det_mon->section.std_t,
|
||||||
p->quirks, p->timing_level, p->rb);
|
p->quirks, p->timing_level, p->rb);
|
||||||
p->Modes = xf86ModesAdd(p->Modes, Mode);
|
p->Modes = xf86ModesAdd(p->Modes, Mode);
|
||||||
break;
|
break;
|
||||||
|
@ -1065,16 +1083,17 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
|
||||||
xf86ForEachDetailedBlock(DDC, handle_detailed_modes, &p);
|
xf86ForEachDetailedBlock(DDC, handle_detailed_modes, &p);
|
||||||
Modes = p.Modes;
|
Modes = p.Modes;
|
||||||
|
|
||||||
|
/* Add cea-extension mode timings */
|
||||||
|
Mode = DDCModesFromCEAExtension(scrnIndex, DDC);
|
||||||
|
Modes = xf86ModesAdd(Modes, Mode);
|
||||||
|
|
||||||
/* Add established timings */
|
/* Add established timings */
|
||||||
Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1, quirks);
|
Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1, quirks);
|
||||||
Modes = xf86ModesAdd(Modes, Mode);
|
Modes = xf86ModesAdd(Modes, Mode);
|
||||||
|
|
||||||
/* Add standard timings */
|
/* Add standard timings */
|
||||||
Mode = DDCModesFromStandardTiming(DDC->timings2, quirks, timing_level, rb);
|
Mode = DDCModesFromStandardTiming(Modes, DDC->timings2, quirks,
|
||||||
Modes = xf86ModesAdd(Modes, Mode);
|
timing_level, rb);
|
||||||
|
|
||||||
/* Add cea-extension mode timings */
|
|
||||||
Mode = DDCModesFromCEAExtension(scrnIndex, DDC);
|
|
||||||
Modes = xf86ModesAdd(Modes, Mode);
|
Modes = xf86ModesAdd(Modes, Mode);
|
||||||
|
|
||||||
if (quirks & DDC_QUIRK_PREFER_LARGE_60)
|
if (quirks & DDC_QUIRK_PREFER_LARGE_60)
|
||||||
|
|
Loading…
Reference in New Issue