Panel values should be stored instead of read and applied in one go.
This allows us to use the mode_fixup hook for laptop LCDs as well.

Signed-off-by: Connor Behan <[email protected]>
---
 src/r128_driver.c | 64 ++++++++++++++++++++++---------------------------------
 1 file changed, 26 insertions(+), 38 deletions(-)

diff --git a/src/r128_driver.c b/src/r128_driver.c
index 2cbfc81..974e24d 100644
--- a/src/r128_driver.c
+++ b/src/r128_driver.c
@@ -477,7 +477,7 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output)
     R128InfoPtr info  = R128PTR(pScrn);
     R128OutputPrivatePtr r128_output = output->driver_private;
     int FPHeader = 0;
-    int i;
+    int i, j;
 
     if (!info->VBIOS) return;
     info->FPBIOSstart = 0;
@@ -503,7 +503,7 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output)
     if (!FPHeader) return;
 
     /* Assume that only one panel is attached and supported */
-    for (i = FPHeader+20; i < FPHeader+84; i += 2) {
+    for (i = FPHeader + 20; i < FPHeader + 84; i += 2) {
         if (R128_BIOS16(i) != 0) {
             info->FPBIOSstart = R128_BIOS16(i);
             break;
@@ -521,10 +521,32 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output)
     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel size: %dx%d\n",
                r128_output->PanelXRes, r128_output->PanelYRes);
 
+    for (i = info->FPBIOSstart + 64; R128_BIOS16(i) != 0; i += 2) {
+           j = R128_BIOS16(i);
+            if (R128_BIOS16(j)     != r128_output->PanelXRes) continue;
+            if (R128_BIOS16(j + 2) != r128_output->PanelYRes) continue;
+
+            /* Assume we are using expanded mode */
+            if (R128_BIOS16(j + 5)) j  = R128_BIOS16(j + 5);
+            else                    j += 9;
+
+            r128_output->HBlank     = ((R128_BIOS16(j + 8)  & 0x01ff)  - 
(R128_BIOS16(j + 10) & 0x01ff)) * 8;
+            r128_output->HOverPlus  = ((R128_BIOS16(j + 12) & 0x01ff)  - 
(R128_BIOS16(j + 10) & 0x01ff)) * 8;
+            r128_output->HSyncWidth =   R128_BIOS8 (j + 14) & 0x1f;
+
+            r128_output->VBlank     = (R128_BIOS16(j + 15) & 0x07ff) - 
(R128_BIOS16(j + 17) & 0x07ff);
+            r128_output->VOverPlus  = (R128_BIOS16(j + 19) & 0x07ff) - 
(R128_BIOS16(j + 17) & 0x07ff);
+            r128_output->VSyncWidth = (R128_BIOS16(j + 19) >> 11) & 0x1f;
+
+            r128_output->DotClock = R128_BIOS16(j) * 10;
+            r128_output->Flags = 0;
+    }
+
     r128_output->PanelPwrDly = R128_BIOS8(info->FPBIOSstart + 56);
 
     if (!r128_output->PanelXRes || !r128_output->PanelYRes) {
         info->HasPanelRegs = FALSE;
+        r128_output->DotClock = 0;
         xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                   "Can't determine panel dimensions, and none specified.\n"
                   "\tDisabling programming of FP registers.\n");
@@ -3431,48 +3453,14 @@ ModeStatus R128DoValidMode(xf86OutputPtr output, 
DisplayModePtr mode, int flags)
        if (mode->Flags & V_DBLSCAN)   return MODE_NO_DBLESCAN;
     }
 
-    if (r128_output->MonType == MT_LCD && info->VBIOS) {
+    if (r128_output->MonType == MT_LCD && info->VBIOS && (flags & 
MODECHECK_FINAL)) {
        int i;
        for (i = info->FPBIOSstart + 64; R128_BIOS16(i) != 0; i += 2) {
            int j = R128_BIOS16(i);
 
            if (mode->CrtcHDisplay == R128_BIOS16(j) &&
-               mode->CrtcVDisplay == R128_BIOS16(j + 2)) {
-               if ((flags & MODECHECK_FINAL) == MODECHECK_FINAL) {
-                   xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-                              "Modifying mode according to VBIOS: %ix%i [pclk 
%.1f MHz] for FP to: ",
-                              mode->CrtcHDisplay, mode->CrtcVDisplay,
-                              (float)mode->Clock / 1000);
-
-                   /* Assume we are using expanded mode */
-                   if (R128_BIOS16(j+5)) j  = R128_BIOS16(j+5);
-                   else                  j += 9;
-
-                   mode->Clock = (uint32_t)R128_BIOS16(j) * 10;
-
-                   mode->HDisplay   = mode->CrtcHDisplay   =
-                       ((R128_BIOS16(j + 10) & 0x01ff) + 1) * 8;
-                   mode->HSyncStart = mode->CrtcHSyncStart =
-                       ((R128_BIOS16(j + 12) & 0x01ff) + 1) * 8;
-                   mode->HSyncEnd   = mode->CrtcHSyncEnd   =
-                       mode->CrtcHSyncStart + (R128_BIOS8(j + 14) & 0x1f);
-                   mode->HTotal     = mode->CrtcHTotal     =
-                       ((R128_BIOS16(j + 8)  & 0x01ff) + 1) * 8;
-
-                   mode->VDisplay   = mode->CrtcVDisplay   =
-                       (R128_BIOS16(j + 17) & 0x07ff) + 1;
-                   mode->VSyncStart = mode->CrtcVSyncStart =
-                       (R128_BIOS16(j + 19) & 0x07ff) + 1;
-                   mode->VSyncEnd   = mode->CrtcVSyncEnd   =
-                       mode->CrtcVSyncStart + ((R128_BIOS16(j + 19) >> 11) & 
0x1f);
-                   mode->VTotal     = mode->CrtcVTotal     =
-                       (R128_BIOS16(j + 15) & 0x07ff) + 1;
-                   xf86ErrorF("%ix%i [pclk %.1f MHz]\n",
-                              mode->CrtcHDisplay,mode->CrtcVDisplay,
-                              (float)mode->Clock/ 1000);
-               }
+               mode->CrtcVDisplay == R128_BIOS16(j + 2))
                return MODE_OK;
-           }
        }
        xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5,
                       "Mode rejected for FP %ix%i [pclk: %.1f] "
-- 
2.0.2

_______________________________________________
xorg-driver-ati mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to