summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoragd5f <agd5f>2004-01-09 23:03:58 +0000
committeragd5f <agd5f>2004-01-09 23:03:58 +0000
commite248fb394dca622f6fa5a387820a147928dbcd93 (patch)
tree37dcbf21df506d76c59ad523094410f794873aa4
parent774e6414e647d9dbf90f9270b4cd1e58403748a5 (diff)
Add support for Savage4 chips. This fixes the 2D corruption
and provides a small speed boost.
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_dri.c74
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c67
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h1
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c3
4 files changed, 105 insertions, 40 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_dri.c
index 4dea1ed5e..5fd8b5586 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_dri.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_dri.c
@@ -1305,7 +1305,7 @@ Bool SAVAGEDRIFinishScreenInit( ScreenPtr pScreen )
pSAVAGEDRI->frontbuffer = psav->FrameBufferBase +
pSAVAGEDRI->frontOffset;
pSAVAGEDRI->frontPitch = pSAVAGEDRIServer->frontPitch;
- pSAVAGEDRI->IsfrontTiled = 0;
+ pSAVAGEDRI->IsfrontTiled = psav->bTiled; /* AGD: was 0 */
if(pSAVAGEDRI->IsfrontTiled)
{
@@ -1313,19 +1313,29 @@ Bool SAVAGEDRIFinishScreenInit( ScreenPtr pScreen )
TileStride = (pSAVAGEDRI->width+63)&(~63);
else
TileStride = (pSAVAGEDRI->width+31)&(~31);
-
- pSAVAGEDRI->frontBitmapDesc = 0x10000000 |
- ((pSAVAGEDRI->cpp==2)?
- BCI_BD_TILE_16:BCI_BD_TILE_32) |
- (pScrn->bitsPerPixel<<16) |
- TileStride;
- pSAVAGEDRI->frontPitch = TileStride;
+
+ if ((psav->Chipset == S3_TWISTER)
+ || (psav->Chipset == S3_PROSAVAGE)
+ || (psav->Chipset == S3_PROSAVAGEDDR))
+ {
+ pSAVAGEDRI->backBitmapDesc = 0x10000000 |
+ (1<<24) |
+ (pScrn->bitsPerPixel<<16) |
+ TileStride;
+ } else {
+ pSAVAGEDRI->frontBitmapDesc = 0x10000000 | /* block write disabled */
+ ((pSAVAGEDRI->cpp==2)?
+ BCI_BD_TILE_16:BCI_BD_TILE_32) |
+ (pScrn->bitsPerPixel<<16) |
+ TileStride;
+ pSAVAGEDRI->frontPitch = TileStride;
+ }
}
else
{
- pSAVAGEDRI->frontBitmapDesc = 0x00000000 |
+ pSAVAGEDRI->frontBitmapDesc = 0x10000000 | /* AGD: block write should be disabled: was 0x00000000 */
pScrn->bitsPerPixel<<16 |
- pSAVAGEDRI->width ;
+ pSAVAGEDRI->width;
}
pSAVAGEDRI->backOffset = pSAVAGEDRIServer->backOffset;
@@ -1339,11 +1349,22 @@ Bool SAVAGEDRIFinishScreenInit( ScreenPtr pScreen )
TileStride = (pSAVAGEDRI->width+63)&(~63);
else
TileStride = (pSAVAGEDRI->width+31)&(~31);
-
- pSAVAGEDRI->backBitmapDesc = 0x10000000 |
- (1<<24) |
- (pScrn->bitsPerPixel<<16) |
- TileStride;
+
+ if ((psav->Chipset == S3_TWISTER)
+ || (psav->Chipset == S3_PROSAVAGE)
+ || (psav->Chipset == S3_PROSAVAGEDDR))
+ {
+ pSAVAGEDRI->backBitmapDesc = 0x10000000 |
+ (1<<24) |
+ (pScrn->bitsPerPixel<<16) |
+ TileStride;
+ } else {
+ pSAVAGEDRI->backBitmapDesc = 0x10000000 |
+ ((pSAVAGEDRI->cpp==2)?
+ BCI_BD_TILE_16:BCI_BD_TILE_32) |
+ (pScrn->bitsPerPixel<<16) |
+ TileStride;
+ }
}
pSAVAGEDRI->depthOffset = pSAVAGEDRIServer->depthOffset;
@@ -1357,11 +1378,22 @@ Bool SAVAGEDRIFinishScreenInit( ScreenPtr pScreen )
TileStride = (pSAVAGEDRI->width+63)&(~63);
else
TileStride = (pSAVAGEDRI->width+31)&(~31);
-
- pSAVAGEDRI->depthBitmapDesc = 0x10000000 |
- (1<<24) |
- (pScrn->bitsPerPixel<<16) |
- TileStride;
+
+ if ((psav->Chipset == S3_TWISTER)
+ || (psav->Chipset == S3_PROSAVAGE)
+ || (psav->Chipset == S3_PROSAVAGEDDR))
+ {
+ pSAVAGEDRI->depthBitmapDesc = 0x10000000 |
+ (1<<24) |
+ (pScrn->bitsPerPixel<<16) |
+ TileStride;
+ } else {
+ pSAVAGEDRI->depthBitmapDesc = 0x10000000 |
+ ((pSAVAGEDRI->zpp==2)?
+ BCI_BD_TILE_16:BCI_BD_TILE_32) |
+ (pScrn->bitsPerPixel<<16) |
+ TileStride;
+ }
}
pSAVAGEDRI->textureOffset = pSAVAGEDRIServer->textureOffset;
@@ -1420,7 +1452,7 @@ Bool SAVAGEDRIFinishScreenInit( ScreenPtr pScreen )
value |= (((pSAVAGEDRI->width + 0x1F) & 0xFFE0) >> 5) << 20;
value |= 3<<30;
}
-
+
OUTREG(0x48C40, value|(pSAVAGEDRI->frontOffset >> 5) ); /* front */
OUTREG(0x48C44, value|(pSAVAGEDRI->backOffset >> 5) ); /* back */
OUTREG(0x48C48, value|(pSAVAGEDRI->depthOffset >> 5) ); /* depth */
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 7bc23ea99..96cb74110 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c
@@ -111,15 +111,15 @@ static PciChipsets SavagePciChipsets[] = {
{ S3_TWISTER, PCI_CHIP_S3TWISTER_P, RES_SHARED_VGA },
{ S3_TWISTER, PCI_CHIP_S3TWISTER_K, RES_SHARED_VGA },
{ S3_PROSAVAGEDDR, PCI_CHIP_S3PROSAVAGEDDR, RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM128,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM64,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM64C,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM128IX_SDR,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM128IX_DDR,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM64IX_SDR,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM64IX_DDR,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM64IXC_SDR,RES_SHARED_VGA },
- { S3_SUPERSAVAGE, PCI_CHIP_PM64IXC_DDR,RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM128, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM64, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM64C, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM128IX_SDR, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM128IX_DDR, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM64IX_SDR, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM64IX_DDR, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM64IXC_SDR, RES_SHARED_VGA },
+ { S3_SUPERSAVAGE, PCI_CHIP_PM64IXC_DDR, RES_SHARED_VGA },
{ -1, -1, RES_UNDEFINED }
};
@@ -160,6 +160,7 @@ static OptionInfoRec SavageOptions[] = {
{ OPTION_LCDCLOCK, "LCDClock", OPTV_FREQ, {0}, FALSE },
{ OPTION_SHADOW_STATUS, "ShadowStatus", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_VIDEORAM, "VideoRAM", OPTV_INTEGER, {0}, FALSE },
+ { OPTION_CRT_ONLY, "CrtOnly", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_TV_ON, "TvOn", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_SAA7111, "SAA7111", OPTV_BOOLEAN, {0}, FALSE },
/* add by peterzhu*/
@@ -772,6 +773,8 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen,
#ifdef XF86DRI
if ((psav->Chipset == S3_TWISTER)
|| (psav->Chipset == S3_PROSAVAGE)
+ || (psav->Chipset == S3_SAVAGE4)
+ || (psav->Chipset == S3_SAVAGE_MX)
|| (psav->Chipset == S3_PROSAVAGEDDR)) {
/* Setup DRI after visuals have been established */
psav->directRenderingEnabled = SAVAGEDRIScreenInit(pScreen);
@@ -1096,10 +1099,11 @@ static ModeStatus SavageValidMode(int index, DisplayModePtr pMode,
return MODE_BAD;
}
- if ((psav->DisplayOutsActive & UT_DEVICE_LCD)
+ if (((psav->DisplayOutsActive & UT_DEVICE_LCD)
&& psav->PanelX
&& ((pMode->HDisplay > psav->PanelX)
- ||(pMode->VDisplay > psav->PanelY))) {
+ ||(pMode->VDisplay > psav->PanelY)))
+ && (!psav->CrtOnly)) {
return MODE_PANEL;
}
@@ -1251,6 +1255,11 @@ void SavageProcessConfig(ScrnInfoPtr pScrn)
if (psav->shadowFB) {
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: shadow FB enabled\n");
}
+
+ psav->CrtOnly = FALSE;
+ if( xf86GetOptValBool(SavageOptions, OPTION_CRT_ONLY, &psav->CrtOnly))
+ xf86DrvMsg( pScrn->scrnIndex, X_CONFIG,
+ "Option: CrtOnly enabled\n" );
if ((s = xf86GetOptValString(SavageOptions, OPTION_ROTATE))) {
if(!xf86NameCmp(s, "CW")) {
@@ -1374,10 +1383,12 @@ void SavageProcessConfig(ScrnInfoPtr pScrn)
}
/* we can use Option "DisableTile TRUE" to disable tile mode */
- psav->bDisableTile = FALSE;
+ psav->bDisableTile = TRUE; /* AGD: was FALSE; however, I gain about 30 fps
+ defaulting to linear mode, and it seems to render
+ the same either way */
if (xf86GetOptValBool(SavageOptions, OPTION_DISABLE_TILE,&psav->bDisableTile)) {
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Option: %s Tile Mode and Programe it \n",(psav->bDisableTile?"Disable":"Enable"));
+ "Option: %s Tile Mode and Program it \n",(psav->bDisableTile?"Disable":"Enable"));
}
}
@@ -1670,9 +1681,10 @@ Bool SavageInitHardware(ScrnInfoPtr pScrn)
pScrn->virtualY = pScrn->display->virtualY;
/* Check LCD panel information */
- if ((psav->DisplayOutsActive & UT_DEVICE_LCD)
+ if (((psav->DisplayOutsActive & UT_DEVICE_LCD)
&& (S3_SAVAGE_MOBILE_SERIES(psav->Chipset)
|| S3_MOBILE_TWISTER_SERIES(psav->Chipset))
+ && (!psav->CrtOnly))
) {
unsigned char cr6b = hwp->readCrtc( hwp, 0x6b );
@@ -2032,6 +2044,7 @@ void SavageEnableMode_Twister(ScrnInfoPtr pScrn,BOOL bEnable)
OUTREG32(0x48C10, 0x0e440f04L);
OUTREG32(0x48C0C, 0);
OUTREG32(0x48C18, INREG32(0x48C18) | 0x0C);
+
/* MM81C0 and 81C4 are used to control primary stream. */
OUTREG32(PRI_STREAM_FBUF_ADDR0,0x00000000);
@@ -2223,6 +2236,12 @@ void SavageEnableMode_M7(ScrnInfoPtr pScrn,BOOL bEnable)
ulTmp = INREG32(S3_OVERFLOW_BUFFER_PTR) & (~(ENABLE_BCI | ENABLE_COMMAND_OVERFLOW_BUF));
+#if 0
+ if (psav->Chipset == S3_SAVAGE4)
+ /* AGD: Enable BCI, disable Command buffer. coherency problems on savage4? */
+ OUTREG32(0x48C18, INREG32(0x48C18) | 0x08);
+ else
+#endif
/* Enable BCI, Enable Command buffer. */
OUTREG32(S3_OVERFLOW_BUFFER_PTR,
(ulTmp | (ENABLE_BCI | ENABLE_COMMAND_OVERFLOW_BUF)));
@@ -2396,12 +2415,15 @@ void SavageEnableMode_M7(ScrnInfoPtr pScrn,BOOL bEnable)
/* 8: bci enable */
OUTREG32(S3_GLB_BD_HIGH,(psav->GlobalBD.bd2.HiPart
| 8 | S3_LITTLE_ENDIAN | S3_BD64));
-
+
+ /* AGD: DRI seems to use PBD for front/back/depth buffers,
+ but writing to them here doesn't seem to hurt anything so... */
OUTREG32(S3_PRI_BD_LOW,psav->GlobalBD.bd2.LoPart);
OUTREG32(S3_PRI_BD_HIGH,psav->GlobalBD.bd2.HiPart);
OUTREG32(S3_SEC_BD_LOW,psav->GlobalBD.bd2.LoPart);
OUTREG32(S3_SEC_BD_HIGH,psav->GlobalBD.bd2.HiPart);
-
+
+
/* turn on screen */
OUTREG8(SEQ_ADDRESS_REG,0x01);
byte = INREG8(SEQ_DATA_REG) & ~0X20;
@@ -2548,7 +2570,7 @@ void SavageEnableMode_PM(ScrnInfoPtr pScrn,BOOL bEnable)
OUTREG32(0x8128, 0xFFFFFFFFL);
OUTREG32(0x812C, 0xFFFFFFFFL);
- /* bit 28:block write disalbe */
+ /* bit 28:block write disable */
OUTREG32(S3_GLB_BD_HIGH,BCI_ENABLE | S3_BD64 | 0x10000000);
if (psav->bTiled) {
@@ -2618,9 +2640,10 @@ void SavageEnableMode(ScrnInfoPtr pScrn,BOOL bEnable)
switch (psav->Chipset) {
case S3_SAVAGE3D:
case S3_SAVAGE_MX:
+ case S3_SAVAGE4:
SavageEnableMode_M7(pScrn,FALSE);
break;
- case S3_SAVAGE4:
+/* case S3_SAVAGE4: */
case S3_TWISTER:
case S3_PROSAVAGE:
case S3_PROSAVAGEDDR:
@@ -2706,9 +2729,10 @@ void SavageEnableMode(ScrnInfoPtr pScrn,BOOL bEnable)
switch (psav->Chipset) {
case S3_SAVAGE3D:
case S3_SAVAGE_MX:
+ case S3_SAVAGE4:
SavageEnableMode_M7(pScrn,TRUE);
break;
- case S3_SAVAGE4:
+/* case S3_SAVAGE4: */
case S3_TWISTER:
case S3_PROSAVAGE:
case S3_PROSAVAGEDDR:
@@ -3091,6 +3115,11 @@ SavagePanningCheck(ScrnInfoPtr pScrn)
psav->FPExpansion = TRUE;
else
psav->FPExpansion = FALSE;
+
+ if (psav->CrtOnly) {
+ psav->FPExpansion = FALSE;
+ psav->Panning = 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 343dd5088..dc3369515 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h
+++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h
@@ -260,6 +260,7 @@ typedef struct _Savage {
int rotate;
double LCDClock;
Bool ShadowStatus;
+ Bool CrtOnly;
Bool LcdOn;
Bool TvOn;
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 e8126b078..c72fdae5f 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c
@@ -198,6 +198,9 @@ Bool SavageGetConnectionStatus(SavagePtr psav)
psav->DisplayOutsConnected = connection;
+ if (psav->CrtOnly)
+ psav->DisplayOutsConnected = UT_DEVICE_CRT1;
+
return TRUE;
}