diff options
author | Egbert Eich <eich@freedesktop.org> | 2009-10-29 11:44:37 +0100 |
---|---|---|
committer | Egbert Eich <eich@freedesktop.org> | 2009-10-29 11:44:37 +0100 |
commit | 5cd4cca8c00db39f6fcfae27d142451eb5de0ebb (patch) | |
tree | b57db465bef686173627302044ff120cea3f9f18 | |
parent | 5092f1539e75596373de13472c9ceb5d32c58b6a (diff) |
Monitor/Panel: Move mode line sanitization code.
Mode line sanitization may change the HSync and VRefresh values.
Therefore it needs to be done before the Panel H/V ranges are
determined.
Also report if a mode had to be sanitized.
-rw-r--r-- | src/rhd_modes.c | 37 | ||||
-rw-r--r-- | src/rhd_modes.h | 1 | ||||
-rw-r--r-- | src/rhd_monitor.c | 17 |
3 files changed, 40 insertions, 15 deletions
diff --git a/src/rhd_modes.c b/src/rhd_modes.c index 922f6c5..e7b4c7e 100644 --- a/src/rhd_modes.c +++ b/src/rhd_modes.c @@ -1844,3 +1844,40 @@ RHDSynthModes(int scrnIndex, DisplayModePtr Mode) RHDModesAdd(Mode, Tmp); } } + +/* + * This function may be used to sanitize bogus PANEL modes reported by AtomBIOS. + */ +void +RHDSanitizeModes(int scrnIndex, DisplayModePtr Modes, char *ReportedBy) +{ + while (Modes) { + Bool sanitized = FALSE; + + /* do a little sanitization as some BIOSes seem to report bogus modes */ + if (Modes->HTotal <= Modes->HSyncEnd) { + Modes->HTotal = Modes->CrtcHTotal = Modes->HSyncEnd + 1; + sanitized = TRUE; + } + if (Modes->VTotal <= Modes->VSyncEnd) { + Modes->VTotal = Modes->CrtcVTotal = Modes->VSyncEnd + 1; + sanitized = TRUE; + } + if (Modes->CrtcHBlankEnd <= Modes->CrtcHSyncEnd) { + Modes->CrtcHBlankEnd = Modes->CrtcHSyncEnd + 1; + sanitized = TRUE; + } + if (Modes->CrtcVBlankEnd <= Modes->CrtcVSyncEnd) { + Modes->CrtcVBlankEnd = Modes->CrtcVSyncEnd + 1; + sanitized = TRUE; + } + if (sanitized) { + xf86DrvMsg(scrnIndex, X_WARNING, "Mode %s reported by %s sanitized!\n", + Modes->name ? Modes->name : "unnamed",ReportedBy); + Modes->HSync = ((float) Modes->Clock) / ((float)Modes->HTotal); + Modes->VRefresh = (1000.0 * ((float) Modes->Clock)) + / ((float)(((float)Modes->HTotal) * ((float)Modes->VTotal))); + } + Modes = Modes->next; + } +} diff --git a/src/rhd_modes.h b/src/rhd_modes.h index be8aaa4..18a288f 100644 --- a/src/rhd_modes.h +++ b/src/rhd_modes.h @@ -81,5 +81,6 @@ int RHDRRModeFixup(ScrnInfoPtr pScrn, DisplayModePtr Mode, struct rhdCrtc *Crtc, int RHDValidateScaledToMode(struct rhdCrtc *Crtc, DisplayModePtr Mode); int RHDRRValidateScaledToMode(struct rhdOutput *Output, DisplayModePtr Mode); void RHDSynthModes(int scrnIndex, DisplayModePtr Mode); +void RHDSanitizeModes(int scrnIndex, DisplayModePtr Modes, char *ReportedBy); #endif /* _RHD_MODES_H */ diff --git a/src/rhd_monitor.c b/src/rhd_monitor.c index 069ebd7..74455ba 100644 --- a/src/rhd_monitor.c +++ b/src/rhd_monitor.c @@ -355,6 +355,7 @@ rhdMonitorPanel(struct rhdConnector *Connector) if (Mode) { Monitor->Name = xstrdup("LVDS Panel"); Monitor->Modes = RHDModesAdd(Monitor->Modes, Mode); + RHDSanitizeModes(Monitor->scrnIndex, Monitor->Modes,"AtomBIOS Panel Mode"); Monitor->NativeMode = Mode; Monitor->numHSync = 1; Monitor->HSync[0].lo = Mode->HSync; @@ -374,6 +375,7 @@ rhdMonitorPanel(struct rhdConnector *Connector) } } else if (EDID) { RHDMonitorEDIDSet(Monitor, EDID); + RHDSanitizeModes(Monitor->scrnIndex, Monitor->Modes, "AtomBIOS Panel EDID block"); rhdPanelEDIDModesFilter(Monitor); } else { xf86DrvMsg(Connector->scrnIndex, X_ERROR, @@ -382,21 +384,6 @@ rhdMonitorPanel(struct rhdConnector *Connector) return NULL; } - /* Fixup some broken modes - if we can do so, otherwise we might have no - * chance of driving the panel at all */ - if (Monitor->NativeMode) { - - /* Some Panels have H or VSyncEnd values greater than H or VTotal. */ - if (Monitor->NativeMode->HTotal <= Monitor->NativeMode->HSyncEnd) - Monitor->NativeMode->HTotal = Monitor->NativeMode->CrtcHTotal = Monitor->NativeMode->HSyncEnd + 1; - if (Monitor->NativeMode->VTotal <= Monitor->NativeMode->VSyncEnd) - Monitor->NativeMode->VTotal = Monitor->NativeMode->CrtcVTotal = Monitor->NativeMode->VSyncEnd + 1; - if (Monitor->NativeMode->CrtcHBlankEnd <= Monitor->NativeMode->CrtcHSyncEnd) - Monitor->NativeMode->CrtcHBlankEnd = Monitor->NativeMode->CrtcHSyncEnd + 1; - if (Monitor->NativeMode->CrtcVBlankEnd <= Monitor->NativeMode->CrtcVSyncEnd) - Monitor->NativeMode->CrtcVBlankEnd = Monitor->NativeMode->CrtcVSyncEnd + 1; - } - /* panel should be driven at native resolution only. */ Monitor->UseFixedModes = TRUE; Monitor->ReducedAllowed = TRUE; |