From 4b4121955fe91c07ce905cab01598ec3b86e5df3 Mon Sep 17 00:00:00 2001 From: Thomas Winischhofer Date: Tue, 5 Jul 2005 13:43:28 +0000 Subject: [PATCH] SiS driver: Fix for mode-restoring if more than one cards are used. (Don't read/write BIOS scratch area of non-primary cards) --- src/sis_driver.c | 60 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/src/sis_driver.c b/src/sis_driver.c index 88ed8b0..f814991 100644 --- a/src/sis_driver.c +++ b/src/sis_driver.c @@ -2879,7 +2879,7 @@ SiS_MapVGAMem(ScrnInfoPtr pScrn) /* Map 64k VGA window for saving/restoring CGA fonts */ pSiS->VGAMapSize = 0x10000; - pSiS->VGAMapPhys = 0; /* Default */ + pSiS->VGAMapPhys = 0; /* Default */ if(!pSiS->Primary) { /* If secondary, set Phys to beginning of our video RAM */ pSiS->VGAMapPhys = pSiS->PciInfo->memBase[0]; @@ -8228,7 +8228,7 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) * byte won't be touched (which is why we set this manually * then). */ - UChar myoldmode = SiS_GetSetModeID(pScrn,0xFF); + UChar myoldmode = SiS_GetSetModeID(pScrn, 0xFF); UChar cr30, cr31; /* Read CR34 which the BIOS sets to the current mode number for CRT2 @@ -13316,37 +13316,61 @@ SISWaitVBRetrace(ScrnInfoPtr pScrn) #define MODEID_OFF 0x449 -UChar -SiS_GetSetModeID(ScrnInfoPtr pScrn, UChar id) -{ - return(SiS_GetSetBIOSScratch(pScrn, MODEID_OFF, id)); -} - UChar SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, UShort offset, UChar value) { UChar ret = 0; #ifdef SIS_USE_BIOS_SCRATCH UChar *base; +#endif - base = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_MMIO, 0, 0x2000); - if(!base) { - SISErrorLog(pScrn, "(Could not map BIOS scratch area)\n"); - return 0; + /* For some reasons (like detecting the current display mode), + * we need to read (or write-back) values from the BIOS + * scratch area. This area is only valid for the primary + * graphics card. For the secondary, we just return some + * defaults and ignore requests to write data. As regards + * the display mode: If sisfb is loaded for the secondary + * card, it very probably has set a mode, but in any case + * informed us via its info packet. So this here will not be + * called for mode detection in this case. + */ + + switch(offset) { + case 0x489: + ret = 0x11; /* Default VGA Info */ + break; + case MODEID_OFF: + ret = 0x03; /* Default current display mode */ + break; } - ret = *(base + offset); +#ifdef SIS_USE_BIOS_SCRATCH + if(SISPTR(pScrn)->Primary) { + base = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_MMIO, 0, 0x2000); + if(!base) { + SISErrorLog(pScrn, "(Could not map BIOS scratch area)\n"); + return ret; + } - /* value != 0xff means: set register */ - if(value != 0xff) { - *(base + offset) = value; + ret = *(base + offset); + + /* value != 0xff means: set register */ + if(value != 0xff) { + *(base + offset) = value; + } + + xf86UnMapVidMem(pScrn->scrnIndex, base, 0x2000); } - - xf86UnMapVidMem(pScrn->scrnIndex, base, 0x2000); #endif return ret; } +UChar +SiS_GetSetModeID(ScrnInfoPtr pScrn, UChar id) +{ + return(SiS_GetSetBIOSScratch(pScrn, MODEID_OFF, id)); +} + void SiSMemCopyToVideoRam(SISPtr pSiS, UChar *to, UChar *from, int size) {