summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoragd5f <agd5f>2004-02-17 20:38:03 +0000
committeragd5f <agd5f>2004-02-17 20:38:03 +0000
commit1634ce3bd7f0c06b7ce2b7c8deaababf23179576 (patch)
tree669334067c42a2ffd2e0adaacd1f2cb195c238db
parent29de7161088818d31d9bfda630b18ff5f65bf6df (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.
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c23
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h10
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c82
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.h23
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;