Changes to via_drv.o solving problems of hardwired devices.

damian gruszka <[email protected]>
Newsgroups gmane.comp.xfree86.devel
Message-ID <[email protected]>
Hello,
to support "hardwired" TV and LVDS devices, which doesn't apear on I2O 
bus I suggest following changes.
The Option ConnectedDevice set the correesponding field in 
VIABIOSInfo.Since my routine and the the "switch" for ActiveDevice
are quite similar, I also risked to replace  this code  by  new  
visually shorter  code.

via.patch  - contains combined changes done to  .c and .h files.
via_driver.c.patch, via_bios.h.patch and via_bios.c.patch - patches in 
separate files.

Pls. comment this changes.

Best Regards
Damian
via_driver.c.patch (text/plain, 7.7 KB)
--- via_driver.c	2005-05-09 13:53:06.854268208 +0200
+++ ../via/via_driver.c	2005-05-09 14:09:47.974074864 +0200
@@ -152,7 +152,8 @@
     OPTION_CAP0_DEINTERLACE,
     OPTION_CAP1_DEINTERLACE,
     OPTION_CAP0_FIELDSWAP,
-    OPTION_DRIXINERAMA
+    OPTION_DRIXINERAMA,
+    OPTION_CONNECTED_DEVICE
 } VIAOpts;
 
 
@@ -184,9 +185,31 @@
     {OPTION_CAP1_DEINTERLACE, "Cap1Deinterlace",    OPTV_ANYSTR,  {0}, FALSE},
     {OPTION_CAP0_FIELDSWAP, "Cap0FieldSwap",    OPTV_BOOLEAN,  {0}, FALSE},
     {OPTION_DRIXINERAMA,  "DRIXINERAMA",    OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_CONNECTED_DEVICE,"ConnectedDevice",OPTV_ANYSTR,{0},FALSE},
     {-1,                NULL,           OPTV_NONE,    {0}, FALSE}
 };
 
+struct OutputDesc { char *Name;unsigned char Mask;};
+const static  struct OutputDesc Values[]=
+{
+	{"NONE",0} ,
+	{"BIOS",0xFF} ,
+	{"CRT",VIA_DEVICE_CRT1} ,
+	{"CRT ONLY",VIA_DEVICE_CRT1} ,
+        {"TV", VIA_DEVICE_TV},
+        {"TV ONLY", VIA_DEVICE_TV},
+        {"LCD",VIA_DEVICE_LCD},
+        {"LCD ONLY",VIA_DEVICE_LCD} ,
+	{"DVI",VIA_DEVICE_DFP},
+	{"DVI ONLY",VIA_DEVICE_DFP},
+	{"DFP",VIA_DEVICE_DFP},
+	{"DFP ONLY",VIA_DEVICE_DFP},
+	{"CRT2",VIA_DEVICE_CRT2}
+};
+static char *DevMask2Str[5]=
+{
+	"CRT","LCD","TV","DFP","CRT2"
+};
 
 static const char *vgaHWSymbols[] = {
     "vgaHWGetHWRec",
@@ -346,7 +369,8 @@
 XF86ModuleData viaModuleData = {&VIAVersRec, VIASetup, NULL};
 
 
-static pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
+/* static */ 
+pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
 {
     static Bool setupDone = FALSE;
 
@@ -673,8 +697,67 @@
         ConfiguredMonitor = vbeDoEDID(pVbe, NULL);
     }
 }
+/***********************************************************
+ Purpose: sets connectedDevice map according to user requirements
 
+ Input:   string passed to driver via ConnectedDevice option
 
+ output:  mask of connected devices
+
+ Remarks: the option BIOS sets the value according to register SR32
+          ~ char negates the value;
+
+************************************************************/ 
+static unsigned char ParseDeviceMask(
+	ScrnInfoPtr  pScrn, 
+	VIAPtr  pVia,
+	const char *opt_value,
+	const char *opt_name,
+	const int  start)
+{
+        VIABIOSInfoPtr  pBIOSInfo;
+	unsigned char val=0;
+    	pBIOSInfo = pVia->pBIOSInfo;
+	do {
+		char str[5],neg=0;
+		unsigned char pv=0;
+		int  n;
+		int  err = 1;
+		const char *p=strchr(opt_value,',');
+		if(!p)
+			p = opt_value + strlen(opt_value);
+		if(*opt_value == '~') {
+			++opt_value;
+			neg=1;
+		}
+		if((n=p - opt_value) <= sizeof(str)) {
+			memcpy(str,opt_value,n*sizeof(str[0]));
+			str[n]='\0';
+			for(n=start;n<sizeof(Values)/sizeof(Values[0]);++n)
+        			if (!xf86NameCmp(str,Values[n].Name))
+					break;
+			if( n < (sizeof(Values)/sizeof(Values[0]))) {
+				pv=Values[n].Mask;
+				if(pv == 0xFF)
+					pv = VIAGetBIOSConnectedDevice(pBIOSInfo);
+				if(neg) 
+					val &= ~pv;
+				else
+					val |= pv;
+				err = 0;
+			}
+		}
+		if(err) {
+        		xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 
+			    "Option %s, value %s is unknown in this context.\n",
+				opt_name, opt_value);
+			
+		}
+		opt_value = p+ ((*p) ? 1:0);
+	} while(*opt_value);
+	return val;
+}
+/*****************************************************************/
 static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
 {
     EntityInfoPtr   pEnt;
@@ -984,53 +1067,22 @@
     /* ActiveDevice Option for device selection */
     pBIOSInfo->ActiveDevice = 0x00;
     if ((s = xf86GetOptValString(VIAOptions, OPTION_ACTIVEDEVICE))) {
-        if (!xf86NameCmp(s, "CRT,TV") || !xf86NameCmp(s, "TV,CRT")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_TV;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and TV.\n");
-        }
-        else if(!xf86NameCmp(s, "CRT,LCD") || !xf86NameCmp(s, "LCD,CRT")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_LCD;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and LCD.\n");
-        }
-        else if(!xf86NameCmp(s, "CRT,DFP") || !xf86NameCmp(s, "DFP,CRT")
-                || !xf86NameCmp(s, "CRT,DVI") || !xf86NameCmp(s, "DVI,CRT")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_DFP;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and DFP.\n");
-        }
-        else if(!xf86NameCmp(s, "TV,DFP") || !xf86NameCmp(s, "DFP,TV")
-                || !xf86NameCmp(s, "TV,DVI") || !xf86NameCmp(s, "DVI,TV")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_TV | VIA_DEVICE_DFP;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is TV and DFP.\n");
-        }
-#if 0
-        else if(!xf86NameCmp(s, "DFP,LCD") || !xf86NameCmp(s, "LCD,DFP")
-                || !xf86NameCmp(s, "LCD,DVI") || !xf86NameCmp(s, "DVI,LCD")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_DFP | VIA_DEVICE_LCD;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is DFP and LCD.\n");
-        }
-#endif
-        else if(!xf86NameCmp(s, "CRT") || !xf86NameCmp(s, "CRT ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT Only.\n");
-        }
-        else if(!xf86NameCmp(s, "LCD") || !xf86NameCmp(s, "LCD ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_LCD;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is LCD Only.\n");
-        }
-        else if(!xf86NameCmp(s, "TV") || !xf86NameCmp(s, "TV ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_TV;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is TV Only.\n");
-        }
-        else if(!xf86NameCmp(s, "DFP") || !xf86NameCmp(s, "DFP ONLY")
-                || !xf86NameCmp(s, "DVI") || !xf86NameCmp(s, "DVI ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_DFP;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is DFP Only.\n");
-        }
-        else {
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option \"%s\" can't recognize!, Active Device by default.\n", s);
-        }
+	char ActDevStr[128];
+	int k;
+    	pBIOSInfo->ActiveDevice = ParseDeviceMask(pScrn,pVia,s,"ActiveDevice",2);
+	ActDevStr[0]='\0';
+	for(k=0;k<5;++k) {
+		if( pBIOSInfo->ActiveDevice & (1<<k)) {
+			strcat(ActDevStr,DevMask2Str[k]);
+			strcat(ActDevStr,",");
+		}
+	}
+	k = strlen(ActDevStr);
+	if(k)
+		ActDevStr[k-1]='\0'; /* remove last , */
+        xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active device is %s.\n",
+		ActDevStr);
     }
-
     /* LCDDualEdge Option */
     pBIOSInfo->LCDDualEdge = FALSE;
     if (xf86ReturnOptValBool(VIAOptions, OPTION_LCDDUALEDGE, FALSE)) {
@@ -1039,7 +1091,9 @@
          "Option: Using Dual Edge mode to set LCD\n");
     }
     else {
-        pBIOSInfo->LCDDualEdge = FALSE;
+	if((pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD)
+	  && (pBIOSInfo->ActiveDevice & (~VIA_DEVICE_LCD)))
+        	pBIOSInfo->LCDDualEdge = TRUE;
     }
 
     /* Digital Output Bus Width Option */
@@ -1306,6 +1360,12 @@
         vbeFree(pVia->pVbe);
         return FALSE;
     }
+    /* now we can check what devices are connected */
+    pBIOSInfo->ConnectedDevice=0;
+    if ((s = xf86GetOptValString(VIAOptions, OPTION_CONNECTED_DEVICE))) {
+    	pBIOSInfo->ConnectedDevice = 
+		ParseDeviceMask(pScrn,pVia,s,"ConnectedDevice",0);
+    }
 
     /* Get BIOS ver. From BIOS Call Function */
     tmp = VIABIOS_GetBIOSVersion(pScrn);
@@ -1492,7 +1552,8 @@
     /* Detect TMDS/LVDS Encoder */
     VIAPostDVI(pBIOSInfo);
 	/*VIAGetPanelInfo(pBIOSInfo);*/
-    pBIOSInfo->ConnectedDevice = VIAGetDeviceDetect(pBIOSInfo);
+    if(!pBIOSInfo->ConnectedDevice)
+    	pBIOSInfo->ConnectedDevice = VIAGetDeviceDetect(pBIOSInfo);
 
     xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V);
     pScrn->currentMode = pScrn->modes;
via.patch (text/plain, 9 KB)
diff -u -r ./via_bios.c ../via/via_bios.c
--- ./via_bios.c	2005-05-09 13:53:06.846269424 +0200
+++ ../via/via_bios.c	2005-05-09 14:06:54.920383024 +0200
@@ -12556,3 +12556,25 @@
 
     return TRUE;
 }
+/*************************************************
+ Name: VIAGetBIOSConnectedDevice
+ Purpose: Check register SR32 for known devices
+ Input :  Pointer to VIA structure
+ Output:  Connected mask, conform to Int 0x10,ax=140f 
+*************************************************/
+unsigned char  VIAGetBIOSConnectedDevice(VIABIOSInfoPtr ptr)
+{
+    unsigned char v,rv;
+    VIABIOSInfoPtr  pVia;
+    pVia = ptr;
+    VGAOUT8(0x3d4, 0x32);
+    v  = VGAIN8(0x3d5);
+    rv = 0;
+    if((v&0x4) == 0)
+    	rv |= 4;
+    if((v&0x10) == 0)
+	rv |= 2;
+    if((v&0x20) == 0)
+	rv |= 1;
+    return rv;
+}
diff -u -r ./via_bios.h ../via/via_bios.h
--- ./via_bios.h	2005-05-09 13:53:06.847269272 +0200
+++ ../via/via_bios.h	2005-05-09 14:04:38.024194408 +0200
@@ -707,5 +707,5 @@
 void VIAEnabledPrimaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo);
 void VIAEnabledSecondaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo);
 void VIAFillExpireNumber(VIABIOSInfoPtr pBIOSInfo);
-
+unsigned char  VIAGetBIOSConnectedDevice(VIABIOSInfoPtr pBIOSInfo);
 #endif /* _VIA_BIOS_H_ */
diff -u -r ./via_driver.c ../via/via_driver.c
--- ./via_driver.c	2005-05-09 13:53:06.854268208 +0200
+++ ../via/via_driver.c	2005-05-09 14:09:47.974074864 +0200
@@ -152,7 +152,8 @@
     OPTION_CAP0_DEINTERLACE,
     OPTION_CAP1_DEINTERLACE,
     OPTION_CAP0_FIELDSWAP,
-    OPTION_DRIXINERAMA
+    OPTION_DRIXINERAMA,
+    OPTION_CONNECTED_DEVICE
 } VIAOpts;
 
 
@@ -184,9 +185,31 @@
     {OPTION_CAP1_DEINTERLACE, "Cap1Deinterlace",    OPTV_ANYSTR,  {0}, FALSE},
     {OPTION_CAP0_FIELDSWAP, "Cap0FieldSwap",    OPTV_BOOLEAN,  {0}, FALSE},
     {OPTION_DRIXINERAMA,  "DRIXINERAMA",    OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_CONNECTED_DEVICE,"ConnectedDevice",OPTV_ANYSTR,{0},FALSE},
     {-1,                NULL,           OPTV_NONE,    {0}, FALSE}
 };
 
+struct OutputDesc { char *Name;unsigned char Mask;};
+const static  struct OutputDesc Values[]=
+{
+	{"NONE",0} ,
+	{"BIOS",0xFF} ,
+	{"CRT",VIA_DEVICE_CRT1} ,
+	{"CRT ONLY",VIA_DEVICE_CRT1} ,
+        {"TV", VIA_DEVICE_TV},
+        {"TV ONLY", VIA_DEVICE_TV},
+        {"LCD",VIA_DEVICE_LCD},
+        {"LCD ONLY",VIA_DEVICE_LCD} ,
+	{"DVI",VIA_DEVICE_DFP},
+	{"DVI ONLY",VIA_DEVICE_DFP},
+	{"DFP",VIA_DEVICE_DFP},
+	{"DFP ONLY",VIA_DEVICE_DFP},
+	{"CRT2",VIA_DEVICE_CRT2}
+};
+static char *DevMask2Str[5]=
+{
+	"CRT","LCD","TV","DFP","CRT2"
+};
 
 static const char *vgaHWSymbols[] = {
     "vgaHWGetHWRec",
@@ -346,7 +369,8 @@
 XF86ModuleData viaModuleData = {&VIAVersRec, VIASetup, NULL};
 
 
-static pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
+/* static */ 
+pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
 {
     static Bool setupDone = FALSE;
 
@@ -673,8 +697,67 @@
         ConfiguredMonitor = vbeDoEDID(pVbe, NULL);
     }
 }
+/***********************************************************
+ Purpose: sets connectedDevice map according to user requirements
 
+ Input:   string passed to driver via ConnectedDevice option
 
+ output:  mask of connected devices
+
+ Remarks: the option BIOS sets the value according to register SR32
+          ~ char negates the value;
+
+************************************************************/ 
+static unsigned char ParseDeviceMask(
+	ScrnInfoPtr  pScrn, 
+	VIAPtr  pVia,
+	const char *opt_value,
+	const char *opt_name,
+	const int  start)
+{
+        VIABIOSInfoPtr  pBIOSInfo;
+	unsigned char val=0;
+    	pBIOSInfo = pVia->pBIOSInfo;
+	do {
+		char str[5],neg=0;
+		unsigned char pv=0;
+		int  n;
+		int  err = 1;
+		const char *p=strchr(opt_value,',');
+		if(!p)
+			p = opt_value + strlen(opt_value);
+		if(*opt_value == '~') {
+			++opt_value;
+			neg=1;
+		}
+		if((n=p - opt_value) <= sizeof(str)) {
+			memcpy(str,opt_value,n*sizeof(str[0]));
+			str[n]='\0';
+			for(n=start;n<sizeof(Values)/sizeof(Values[0]);++n)
+        			if (!xf86NameCmp(str,Values[n].Name))
+					break;
+			if( n < (sizeof(Values)/sizeof(Values[0]))) {
+				pv=Values[n].Mask;
+				if(pv == 0xFF)
+					pv = VIAGetBIOSConnectedDevice(pBIOSInfo);
+				if(neg) 
+					val &= ~pv;
+				else
+					val |= pv;
+				err = 0;
+			}
+		}
+		if(err) {
+        		xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 
+			    "Option %s, value %s is unknown in this context.\n",
+				opt_name, opt_value);
+			
+		}
+		opt_value = p+ ((*p) ? 1:0);
+	} while(*opt_value);
+	return val;
+}
+/*****************************************************************/
 static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
 {
     EntityInfoPtr   pEnt;
@@ -984,53 +1067,22 @@
     /* ActiveDevice Option for device selection */
     pBIOSInfo->ActiveDevice = 0x00;
     if ((s = xf86GetOptValString(VIAOptions, OPTION_ACTIVEDEVICE))) {
-        if (!xf86NameCmp(s, "CRT,TV") || !xf86NameCmp(s, "TV,CRT")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_TV;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and TV.\n");
-        }
-        else if(!xf86NameCmp(s, "CRT,LCD") || !xf86NameCmp(s, "LCD,CRT")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_LCD;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and LCD.\n");
-        }
-        else if(!xf86NameCmp(s, "CRT,DFP") || !xf86NameCmp(s, "DFP,CRT")
-                || !xf86NameCmp(s, "CRT,DVI") || !xf86NameCmp(s, "DVI,CRT")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_DFP;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and DFP.\n");
-        }
-        else if(!xf86NameCmp(s, "TV,DFP") || !xf86NameCmp(s, "DFP,TV")
-                || !xf86NameCmp(s, "TV,DVI") || !xf86NameCmp(s, "DVI,TV")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_TV | VIA_DEVICE_DFP;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is TV and DFP.\n");
-        }
-#if 0
-        else if(!xf86NameCmp(s, "DFP,LCD") || !xf86NameCmp(s, "LCD,DFP")
-                || !xf86NameCmp(s, "LCD,DVI") || !xf86NameCmp(s, "DVI,LCD")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_DFP | VIA_DEVICE_LCD;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is DFP and LCD.\n");
-        }
-#endif
-        else if(!xf86NameCmp(s, "CRT") || !xf86NameCmp(s, "CRT ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT Only.\n");
-        }
-        else if(!xf86NameCmp(s, "LCD") || !xf86NameCmp(s, "LCD ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_LCD;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is LCD Only.\n");
-        }
-        else if(!xf86NameCmp(s, "TV") || !xf86NameCmp(s, "TV ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_TV;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is TV Only.\n");
-        }
-        else if(!xf86NameCmp(s, "DFP") || !xf86NameCmp(s, "DFP ONLY")
-                || !xf86NameCmp(s, "DVI") || !xf86NameCmp(s, "DVI ONLY")) {
-            pBIOSInfo->ActiveDevice = VIA_DEVICE_DFP;
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is DFP Only.\n");
-        }
-        else {
-            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option \"%s\" can't recognize!, Active Device by default.\n", s);
-        }
+	char ActDevStr[128];
+	int k;
+    	pBIOSInfo->ActiveDevice = ParseDeviceMask(pScrn,pVia,s,"ActiveDevice",2);
+	ActDevStr[0]='\0';
+	for(k=0;k<5;++k) {
+		if( pBIOSInfo->ActiveDevice & (1<<k)) {
+			strcat(ActDevStr,DevMask2Str[k]);
+			strcat(ActDevStr,",");
+		}
+	}
+	k = strlen(ActDevStr);
+	if(k)
+		ActDevStr[k-1]='\0'; /* remove last , */
+        xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active device is %s.\n",
+		ActDevStr);
     }
-
     /* LCDDualEdge Option */
     pBIOSInfo->LCDDualEdge = FALSE;
     if (xf86ReturnOptValBool(VIAOptions, OPTION_LCDDUALEDGE, FALSE)) {
@@ -1039,7 +1091,9 @@
          "Option: Using Dual Edge mode to set LCD\n");
     }
     else {
-        pBIOSInfo->LCDDualEdge = FALSE;
+	if((pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD)
+	  && (pBIOSInfo->ActiveDevice & (~VIA_DEVICE_LCD)))
+        	pBIOSInfo->LCDDualEdge = TRUE;
     }
 
     /* Digital Output Bus Width Option */
@@ -1306,6 +1360,12 @@
         vbeFree(pVia->pVbe);
         return FALSE;
     }
+    /* now we can check what devices are connected */
+    pBIOSInfo->ConnectedDevice=0;
+    if ((s = xf86GetOptValString(VIAOptions, OPTION_CONNECTED_DEVICE))) {
+    	pBIOSInfo->ConnectedDevice = 
+		ParseDeviceMask(pScrn,pVia,s,"ConnectedDevice",0);
+    }
 
     /* Get BIOS ver. From BIOS Call Function */
     tmp = VIABIOS_GetBIOSVersion(pScrn);
@@ -1492,7 +1552,8 @@
     /* Detect TMDS/LVDS Encoder */
     VIAPostDVI(pBIOSInfo);
 	/*VIAGetPanelInfo(pBIOSInfo);*/
-    pBIOSInfo->ConnectedDevice = VIAGetDeviceDetect(pBIOSInfo);
+    if(!pBIOSInfo->ConnectedDevice)
+    	pBIOSInfo->ConnectedDevice = VIAGetDeviceDetect(pBIOSInfo);
 
     xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V);
     pScrn->currentMode = pScrn->modes;
via_bios.c.patch (text/plain, 759 B)
--- via_bios.c	2005-05-09 13:53:06.846269424 +0200
+++ ../via/via_bios.c	2005-05-09 14:06:54.920383024 +0200
@@ -12556,3 +12556,25 @@
 
     return TRUE;
 }
+/*************************************************
+ Name: VIAGetBIOSConnectedDevice
+ Purpose: Check register SR32 for known devices
+ Input :  Pointer to VIA structure
+ Output:  Connected mask, conform to Int 0x10,ax=140f 
+*************************************************/
+unsigned char  VIAGetBIOSConnectedDevice(VIABIOSInfoPtr ptr)
+{
+    unsigned char v,rv;
+    VIABIOSInfoPtr  pVia;
+    pVia = ptr;
+    VGAOUT8(0x3d4, 0x32);
+    v  = VGAIN8(0x3d5);
+    rv = 0;
+    if((v&0x4) == 0)
+    	rv |= 4;
+    if((v&0x10) == 0)
+	rv |= 2;
+    if((v&0x20) == 0)
+	rv |= 1;
+    return rv;
+}
via_bios.h.patch (text/plain, 408 B)
--- via_bios.h	2005-05-09 13:53:06.847269272 +0200
+++ ../via/via_bios.h	2005-05-09 14:04:38.024194408 +0200
@@ -707,5 +707,5 @@
 void VIAEnabledPrimaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo);
 void VIAEnabledSecondaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo);
 void VIAFillExpireNumber(VIABIOSInfoPtr pBIOSInfo);
-
+unsigned char  VIAGetBIOSConnectedDevice(VIABIOSInfoPtr pBIOSInfo);
 #endif /* _VIA_BIOS_H_ */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.