Due to faulty assumptions made by commit 2072d9a, many RAGE 128 Pro
VGA display will be detected as DVI, and causes out of range display
error with the attached monitor. While this commit is less than
perfect and only works on x86 platform, it avoids causing out of
range display error. With this fix, there is no longer the need to
specify the supported frequency range of the monitor inside xorg.conf.
The code was tested on RAGE 128 Pro Ultra 16 MB AGP.

Signed-off-by: Kevin Brace <kevinbr...@gmx.com>
---
 src/r128_output.c | 60 ++++++++++++++++++++++++++++++-------------------------
 1 file changed, 33 insertions(+), 27 deletions(-)

diff --git a/src/r128_output.c b/src/r128_output.c
index f11acde..1d98fb9 100644
--- a/src/r128_output.c
+++ b/src/r128_output.c
@@ -413,40 +413,47 @@ static Bool R128I2CInit(xf86OutputPtr output, I2CBusPtr 
*bus_ptr, char *name)
     return TRUE;
 }
 
-void R128SetupGenericConnectors(ScrnInfoPtr pScrn, R128OutputType *otypes)
-{
-    R128InfoPtr info    = R128PTR(pScrn);
-    R128EntPtr pR128Ent = R128EntPriv(pScrn);
-
-    if (!pR128Ent->HasCRTC2 && !info->isDFP) {
-        otypes[0] = OUTPUT_VGA;
-        otypes[1] = OUTPUT_NONE;
-        return;
-    } else if (!pR128Ent->HasCRTC2) {
-        otypes[0] = OUTPUT_DVI;
-        otypes[1] = OUTPUT_NONE;
-        return;
-    }
-
-    otypes[0] = OUTPUT_LVDS;
-    otypes[1] = OUTPUT_VGA;
-}
-
 void R128GetConnectorInfoFromBIOS(ScrnInfoPtr pScrn, R128OutputType *otypes)
 {
     R128InfoPtr info = R128PTR(pScrn);
-    uint16_t bios_header;
-    int offset;
+    uint16_t bios_header, offset;
+    uint32_t i;
+
+    for (i = 0; i < R128_MAX_BIOS_CONNECTOR; i++) {
+        otypes[i] = OUTPUT_NONE;
+    }
 
-    /* XXX: Currently, this function only finds VGA ports misidentified as 
DVI. */
-    if (!info->VBIOS || otypes[0] != OUTPUT_DVI) return;
+    /* non-x86 platform */
+    if (!info->VBIOS) {
+        otypes[0] = OUTPUT_VGA;
+    }
 
     bios_header = R128_BIOS16(0x48);
-    offset = R128_BIOS16(bios_header + 0x60);
+    offset = R128_BIOS16(bios_header + 0x40);
+    if (offset) {
+        otypes[0] = OUTPUT_LVDS;
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "Found FP table, assuming FP connector.\n");
+    } else {
+        bios_header = R128_BIOS16(0x48);
+        offset = R128_BIOS16(bios_header + 0x34);
+        if (offset) {
+            otypes[0] = OUTPUT_DVI;
+            xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Found DVI table, assuming DVI connector.\n");
+        }
+    }
 
+    offset = R128_BIOS16(bios_header + 0x2e);
     if (offset) {
-        otypes[0] = OUTPUT_VGA;
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Found CRT table, assuming VGA 
connector\n");
+        if (otypes[0] == OUTPUT_NONE) {
+            otypes[0] = OUTPUT_VGA;
+        } else {
+            otypes[1] = OUTPUT_VGA;
+        }
+
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "Found CRT table, assuming VGA connector.\n");
     }
 }
 
@@ -461,7 +468,6 @@ Bool R128SetupConnectors(ScrnInfoPtr pScrn)
     int num_dvi = 0;
     int i;
 
-    R128SetupGenericConnectors(pScrn, otypes);
     R128GetConnectorInfoFromBIOS(pScrn, otypes);
 
     for (i = 0; i < R128_MAX_BIOS_CONNECTOR; i++) {
-- 
2.7.4

_______________________________________________
xorg-driver-ati mailing list
xorg-driver-ati@lists.x.org
https://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to