diff options
author | agd5f <agd5f> | 2004-02-17 20:38:03 +0000 |
---|---|---|
committer | agd5f <agd5f> | 2004-02-17 20:38:03 +0000 |
commit | 1634ce3bd7f0c06b7ce2b7c8deaababf23179576 (patch) | |
tree | 669334067c42a2ffd2e0adaacd1f2cb195c238db | |
parent | 29de7161088818d31d9bfda630b18ff5f65bf6df (diff) |
- fix console corruption. rather than just arbitrarily setting a text mode
the driver now uses the bios save/restore routine that S3 used in their
driver. I can't seem to make it work with pure save/restore of regs...
- disable DRI when shadowFB is used
- make sure Initialize2DEngine() is called in the non-bios mode setting path.
4 files changed, 133 insertions, 5 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c index 5c4d3ec94..f6b35de16 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c @@ -1702,8 +1702,10 @@ static void SavageLeaveVT(int scrnIndex, int flags) #endif SavageWriteMode(pScrn, vgaSavePtr, SavageSavePtr, FALSE); - SavageSetTextMode( psav ); + /*SavageSetTextMode( psav );*/ SavageDisableMMIO(pScrn); + /* restore the vt state */ + SavageSaveRestoreConsole(psav,FALSE); } @@ -2312,8 +2314,13 @@ static void SavageWriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, VGAOUT8(vgaCRIndex, 0x3a); VGAOUT8(vgaCRReg, cr3a); - if( Entering ) + if( Entering ) { + SavageInitialize2DEngine(pScrn); + + VGAOUT16(vgaCRIndex, 0x0140); + SavageSetGBD(pScrn); + } vgaHWProtect(pScrn, FALSE); @@ -2471,6 +2478,9 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen, pScrn = xf86Screens[pScreen->myNum]; psav = SAVPTR(pScrn); + /* save current console state */ + SavageSaveRestoreConsole(psav,TRUE); + pEnt = xf86GetEntityInfo(pScrn->entityList[0]); psav->pVbe = VBEInit(NULL, pEnt->index); @@ -2509,13 +2519,14 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen, return FALSE; #ifdef XF86DRI - if ((psav->Chipset == S3_TWISTER) + if (((psav->Chipset == S3_TWISTER) || (psav->Chipset == S3_PROSAVAGE) || (psav->Chipset == S3_SAVAGE4) || (psav->Chipset == S3_SAVAGE_MX) || (psav->Chipset == S3_SAVAGE3D) || (psav->Chipset == S3_SUPERSAVAGE) - || (psav->Chipset == S3_PROSAVAGEDDR)) { + || (psav->Chipset == S3_PROSAVAGEDDR)) + && (!psav->shadowFB)) { /* Setup DRI after visuals have been established */ psav->directRenderingEnabled = SAVAGEDRIScreenInit(pScreen); } else @@ -3112,9 +3123,11 @@ static Bool SavageCloseScreen(int scrnIndex, ScreenPtr pScreen) if (pScrn->vtSema) { SavageWriteMode(pScrn, vgaSavePtr, SavageSavePtr, FALSE); - SavageSetTextMode( psav ); + /*SavageSetTextMode( psav );*/ vgaHWLock(hwp); SavageUnmapMem(pScrn, 0); + /* restore the console state */ + SavageSaveRestoreConsole(psav,FALSE); } pScrn->vtSema = FALSE; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h index 1dadfb271..3c4a3e1f5 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h @@ -151,6 +151,14 @@ typedef union _BMPDESC { BMPDESC2 bd2; } BMPDESC; +typedef struct _StatInfo { + int origMode; + int pageCnt; + pointer statBuf; + int realSeg; + int realOff; +} StatInfoRec,*StatInfoPtr; + typedef struct _Savage { SavageRegRec SavedReg; SavageRegRec ModeReg; @@ -341,6 +349,7 @@ typedef struct _Savage { */ int cxMemory,cyMemory; + StatInfoRec StatInfo; /* save the SVGA state */ } SavageRec, *SavagePtr; @@ -431,6 +440,7 @@ unsigned short SavageGetBIOSModes( SavagePtr psav, int iDepth, SavageModeEntryPtr s3vModeTable ); +Bool SavageSaveRestoreConsole(SavagePtr psav,Bool save); /* In savage_video.c */ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c index e2d85db85..47e6fddcc 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c @@ -16,6 +16,7 @@ Bool vbeModeInit( vbeInfoPtr, int ); static int SavageGetDevice( SavagePtr psav ); /*static int SavageGetTVType( SavagePtr psav );*/ +static Bool SavageX86Int10(xf86Int10InfoPtr pInt10); static void SavageClearVM86Regs( xf86Int10InfoPtr pInt ) @@ -300,3 +301,84 @@ SavageGetBIOSModes( return iModeCount; } + + +Bool SavageSaveRestoreConsole(SavagePtr psav,Bool save) +{ + SavageClearVM86Regs(psav->pInt10); + + if (!psav->StatInfo.statBuf) { + int realOff; + + psav->pInt10->ax = BIOS_SVGA_STATE; + psav->pInt10->dx = S3_GET_SVGA_BUF; + psav->pInt10->cx = 0x0f; + if (!SavageX86Int10(psav->pInt10)) + goto ErrorExit; + /* bx: count of 64k byte block needed */ + psav->StatInfo.pageCnt = (psav->pInt10->bx * 64 + 4095) / 4096; + psav->StatInfo.statBuf = xf86Int10AllocPages(psav->pInt10,psav->StatInfo.pageCnt,&realOff); + if (!psav->StatInfo.statBuf) + goto ErrorExit; + psav->StatInfo.realSeg = SEG_ADDR(realOff); + psav->StatInfo.realOff = SEG_OFF(realOff); + } + + /* save/resotre the original hardware state */ + psav->pInt10->ax = BIOS_SVGA_STATE; + if (save) + psav->pInt10->dx = S3_SAVE_SVGA_STATE; + else + psav->pInt10->dx = S3_RESTORE_SVGA_STATE; + /* + * cx: bit0:save/resotre VGA hardware state + * bit1:save/resotre bios data area + * bit2:save/resotre dac state + * bit3:save/resotre extend SVGA registers + * bit4:save/resotre MMIO registers + */ + psav->pInt10->cx = 0x0f; + psav->pInt10->es = psav->StatInfo.realSeg; + psav->pInt10->bx = psav->StatInfo.realOff; + if (!SavageX86Int10(psav->pInt10)) { + xf86Msg(X_ERROR,"SavageSaveRestoreState:restore original state fail\n"); + goto ErrorExit; + } + +#if 1 + /* save/resotre the original mode */ + if (save) { + psav->pInt10->ax = BIOS_GET_VBE_MODE; + if (!SavageX86Int10(psav->pInt10)) + goto ErrorExit; + psav->StatInfo.origMode = psav->pInt10->bx & 0xfff; + xf86Msg(X_INFO,"original mode = 0x%x(bx=0x%x)\n", + psav->StatInfo.origMode,psav->pInt10->bx); + } else if (psav->StatInfo.origMode < 0x100) { + /* for standard mode */ + psav->pInt10->ax = BIOS_SET_VBE_MODE; + psav->pInt10->bx = psav->StatInfo.origMode; + if (!SavageX86Int10(psav->pInt10)) { + xf86Msg(X_ERROR,"SavageSaveRestoreState:restore original mode fail\n"); + goto ErrorExit; + } + } +#endif + + return TRUE; + +ErrorExit: + xf86Msg(X_ERROR,"SavageSaveRestoreState failed\n"); + return FALSE; +} + +static Bool SavageX86Int10(xf86Int10InfoPtr pInt10) +{ + xf86ExecX86int10(pInt10); + if ((pInt10->ax & 0xffff) == 0x004f) + return TRUE; + else { + xf86Msg(X_ERROR, "xf86ExecX86int10 failed\n"); + return FALSE; + } +} diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.h b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.h index ba777730a..e57f7ae6c 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.h @@ -64,6 +64,29 @@ struct vbe_info_block #define VBE_MODEL_RGB 6 #define VBE_MODEL_YUV 7 +/* + * Common BIOS functions + */ + +#define BIOS_SET_VBE_MODE 0x4F02 +#define BIOS_GET_VBE_MODE 0x4F03 +#define BIOS_SVGA_STATE 0x4F04 +#define BIOS_LOG_SCANLINE 0x4F06 +#define BIOS_VBE_PM_SERVICE 0x4F10 +#define S3_EXTBIOS_INFO 0x4F14 /* S3 Extended BIOS services */ +#define BIOS_VBE_DDC 0x4F15 + +/************************************************************************* + * Defines for BIOS compliant with S3 (Mobile and Desktop) PCI Video + * Bios External Interface Specification, Core Revision 3.02+ + * + * e.g. used by Trio3D, GX-3 + *************************************************************************/ + +#define S3_GET_SVGA_BUF 0x0000 +#define S3_SAVE_SVGA_STATE 0x0001 +#define S3_RESTORE_SVGA_STATE 0x0002 + struct vbe_mode_info_block { unsigned short mode_attributes; |