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_ */