summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgbert Eich <eich@freedesktop.org>2009-10-29 11:44:37 +0100
committerEgbert Eich <eich@freedesktop.org>2009-10-29 11:44:37 +0100
commit5cd4cca8c00db39f6fcfae27d142451eb5de0ebb (patch)
treeb57db465bef686173627302044ff120cea3f9f18
parent5092f1539e75596373de13472c9ceb5d32c58b6a (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.c37
-rw-r--r--src/rhd_modes.h1
-rw-r--r--src/rhd_monitor.c17
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;