Package: xserver-xfree86 Version: 4.2.1-3cjh1 Severity: normal Tags: patch Hi, here's the patch I promised on IRC to upgrade the Savage driver to the latest drop from http://www.probo.com/timr/savage40.html. I made this and tested for about 2 weeks on 4.2.1-2 and have run -3 over the last 2 days without problems. Suggested changelog entry: * patch #079: updated savage driver to Tim Roberts's 1.1.25t of 2002-09-11 - Fix xscreensaver blaster, critical hack hangs (Closes: #112703, #140451) - Fix hang at beginning of xine - Support xgamma extension - Fixes for hardware cursor and tiled patterns There are two other reports which are possibly related, but I don't know if it will fix them: #110974 and #115223 The patchfile replaces the previous 079 in the package. Chris
This patch generated from http://www.probo.com/timr/savage40.html, version 1.1.25t (2002-09-11)
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_accel.c xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_accel.c 2001-12-13 19:01:50.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c 2002-09-11 23:22:22.000000000 +0200
@@ -399,9 +399,11 @@
xaaptr->SetClippingRectangle = SavageSetClippingRectangle;
xaaptr->DisableClipping = SavageDisableClipping;
xaaptr->ClippingFlags = 0
+#if 0
| HARDWARE_CLIP_SOLID_FILL
| HARDWARE_CLIP_SOLID_LINE
| HARDWARE_CLIP_DASHED_LINE
+#endif
| HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY
| HARDWARE_CLIP_MONO_8x8_FILL
| HARDWARE_CLIP_COLOR_8x8_FILL
@@ -444,16 +446,31 @@
/* Color 8x8 pattern fills */
+ /*
+ * With the exception of the Savage3D and Savage4, all of the Savage
+ * chips require that bitmap descriptors have a stride that is a
+ * multiple of 16 pixels. This includes any descriptor used for
+ * color pattern fills, which COMPLETELY screws the XAA 8x8 color
+ * pattern support.
+ *
+ * We could double the width ourselves into a reserved frame buffer
+ * section, but since I went 18 months with only ONE report of this
+ * error, it seems hardly worth the trouble.
+ */
+
#if 1
- xaaptr->SetupForColor8x8PatternFill =
- SavageSetupForColor8x8PatternFill;
- xaaptr->SubsequentColor8x8PatternFillRect =
- SavageSubsequentColor8x8PatternFillRect;
- xaaptr->Color8x8PatternFillFlags = 0
- | NO_TRANSPARENCY
- | HARDWARE_PATTERN_PROGRAMMED_BITS
- | HARDWARE_PATTERN_PROGRAMMED_ORIGIN
- ;
+ if( (psav->Chipset == S3_SAVAGE3D) || (psav->Chipset == S3_SAVAGE4) )
+ {
+ xaaptr->SetupForColor8x8PatternFill =
+ SavageSetupForColor8x8PatternFill;
+ xaaptr->SubsequentColor8x8PatternFillRect =
+ SavageSubsequentColor8x8PatternFillRect;
+ xaaptr->Color8x8PatternFillFlags = 0
+ | NO_TRANSPARENCY
+ | HARDWARE_PATTERN_PROGRAMMED_BITS
+ | HARDWARE_PATTERN_PROGRAMMED_ORIGIN
+ ;
+ }
#endif
/* Solid lines */
@@ -467,7 +484,7 @@
xaaptr->SubsequentSolidFillTrap = SavageSubsequentSolidFillTrap;
#endif
- xaaptr->SolidBresenhamLineErrorTermBits = 16;
+ xaaptr->SolidBresenhamLineErrorTermBits = 14;
#endif
/* ImageWrite */
@@ -988,9 +1005,9 @@
pat_offset = (int) (patternx * psav->Bpp + patterny * psav->Bpl);
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
- | BCI_CMD_DEST_GBD | BCI_CMD_PAT_SBD_COLOR_NEW;
+ | BCI_CMD_DEST_GBD | BCI_CMD_PAT_PBD_COLOR_NEW;
- mix = SavageHelpSolidROP( pScrn, &trans_col, planemask, &rop );
+ mix = XAAHelpSolidROP( pScrn, &trans_col, planemask, &rop );
BCI_CMD_SET_ROP(cmd, rop);
bd = BCI_BD_BW_DISABLE;
@@ -1020,10 +1037,11 @@
if( !w || !h )
return;
- psav->WaitQueue(psav,5);
+ psav->WaitQueue(psav,6);
BCI_SEND(psav->SavedBciCmd);
BCI_SEND(psav->SavedSbdOffset);
BCI_SEND(psav->SavedSbd);
+ BCI_SEND(BCI_X_Y(patternx,patterny));
BCI_SEND(BCI_X_Y(x, y));
BCI_SEND(BCI_W_H(w, h));
}
@@ -1048,8 +1066,8 @@
cmd |= BCI_CMD_LINE_LAST_PIXEL;
#ifdef DEBUG_EXTRA
- ErrorF("BresenhamLine, (%4d,%4d), len %4d, oct %d, err %4d,%4d, clr %08x\n",
- x1, y1, length, octant, e2, e1, psav->SavedFgColor );
+ ErrorF("BresenhamLine, (%4d,%4d), len %4d, oct %d, err %4d,%4d,%4d clr %08x\n",
+ x1, y1, length, octant, e1, e2, err, psav->SavedFgColor );
#endif
psav->WaitQueue(psav, 5 );
@@ -1059,7 +1077,7 @@
BCI_SEND(BCI_LINE_X_Y(x1, y1));
BCI_SEND(BCI_LINE_STEPS(e2-e1, e2));
BCI_SEND(BCI_LINE_MISC(length,
- !!(octant & YMAJOR),
+ (octant & YMAJOR),
!(octant & XDECREASING),
!(octant & YDECREASING),
e2+err));
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_bci.h xc/programs/Xserver/hw/xfree86/drivers/savage/savage_bci.h
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_bci.h 2001-10-01 15:44:09.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_bci.h 2002-09-11 01:49:20.000000000 +0200
@@ -87,9 +87,11 @@
#define BCI_LINE_X_Y(x, y) (((y) << 16) | ((x) & 0xFFFF))
#define BCI_LINE_STEPS(diag, axi) (((axi) << 16) | ((diag) & 0xFFFF))
#define BCI_LINE_MISC(maj, ym, xp, yp, err) \
-(((maj) & 0xFFF) | (((ym) & 1) << 13) | \
-(((xp) & 1) << 14) | (((yp) & 1) << 15) | \
-((err) << 16))
+ (((maj) & 0x1FFF) | \
+ ((ym) ? 1<<13 : 0) | \
+ ((xp) ? 1<<14 : 0) | \
+ ((yp) ? 1<<15 : 0) | \
+ ((err) << 16))
#endif /* _S3BCI_H_ */
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_cursor.c xc/programs/Xserver/hw/xfree86/drivers/savage/savage_cursor.c
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_cursor.c 2001-11-02 17:24:51.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_cursor.c 2002-09-11 19:55:12.000000000 +0200
@@ -22,6 +22,8 @@
#define inCRReg(reg) (VGAHWPTR(pScrn))->readCrtc( VGAHWPTR(pScrn), reg )
#define outCRReg(reg, val) (VGAHWPTR(pScrn))->writeCrtc( VGAHWPTR(pScrn), reg, val )
+#define inSRReg(reg) (VGAHWPTR(pScrn))->readSeq( VGAHWPTR(pScrn), reg )
+#define outSRReg(reg, val) (VGAHWPTR(pScrn))->writeSeq( VGAHWPTR(pScrn), reg, val )
#define inStatus1() (VGAHWPTR(pScrn))->readST01( VGAHWPTR(pScrn) )
/*
@@ -67,7 +69,7 @@
if(
((psav->Chipset != S3_SAVAGE4)
- && (inCRReg(0x18) & 0x80) && (inCRReg(0x15) & 0x50) )
+ && (inSRReg(0x18) & 0x80) && (inSRReg(0x15) & 0x50) )
||
S3_SAVAGE_MOBILE_SERIES(psav->Chipset)
)
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_dga.c xc/programs/Xserver/hw/xfree86/drivers/savage/savage_dga.c
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_dga.c 2001-05-19 01:35:32.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_dga.c 2002-03-08 19:23:04.000000000 +0100
@@ -155,7 +155,8 @@
);
if(oneMore) { /* first one is narrow width */
- mode->bytesPerScanline = ((pMode->HDisplay * Bpp) + 3) & ~3L;
+ /* Force stride to multiple of 16 pixels. */
+ mode->bytesPerScanline = ((pMode->HDisplay + 15) & ~15) * Bpp;
mode->imageWidth = pMode->HDisplay;
mode->imageHeight = pMode->VDisplay;
mode->pixmapWidth = mode->imageWidth;
@@ -172,7 +173,7 @@
goto SECOND_PASS;
} else {
- mode->bytesPerScanline = ((pScrn->displayWidth * Bpp) + 3) & ~3L;
+ mode->bytesPerScanline = ((pScrn->displayWidth + 15) & ~15) * Bpp;
mode->imageWidth = pScrn->displayWidth;
mode->imageHeight = psav->videoRambytes / mode->bytesPerScanline;
mode->pixmapWidth = mode->imageWidth;
@@ -260,6 +261,7 @@
static int OldDisplayWidth[MAXSCREENS];
static int OldBitsPerPixel[MAXSCREENS];
static int OldDepth[MAXSCREENS];
+ static DisplayModePtr OldMode[MAXSCREENS];
int index = pScrn->pScreen->myNum;
SavagePtr psav = SAVPTR(pScrn);
@@ -269,6 +271,7 @@
pScrn->displayWidth = OldDisplayWidth[index];
pScrn->bitsPerPixel = OldBitsPerPixel[index];
pScrn->depth = OldDepth[index];
+ pScrn->currentMode = OldMode[index];
SavageSwitchMode(index, pScrn->currentMode, 0);
if( psav->hwcursor )
@@ -293,6 +296,7 @@
OldDisplayWidth[index] = pScrn->displayWidth;
OldBitsPerPixel[index] = pScrn->bitsPerPixel;
OldDepth[index] = pScrn->depth;
+ OldMode[index] = pScrn->currentMode;
psav->DGAactive = TRUE;
}
@@ -302,7 +306,7 @@
pScrn->displayWidth = pMode->bytesPerScanline /
(pMode->bitsPerPixel >> 3);
- psav->UseBIOS = FALSE;
+/* psav->UseBIOS = FALSE; */
SavageSwitchMode(index, pMode->mode, 0);
psav->UseBIOS = holdBIOS;
}
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_driver.c xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_driver.c 2001-11-02 17:24:51.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c 2002-09-11 23:59:57.000000000 +0200
@@ -74,16 +74,18 @@
static Bool SavageDDC1(int scrnIndex);
static unsigned int SavageDDC1Read(ScrnInfoPtr pScrn);
static void SavageProbeDDC(ScrnInfoPtr pScrn, int index);
+static void SavageGetTvMaxSize(SavagePtr psav);
+static Bool SavagePanningCheck(ScrnInfoPtr pScrn);
extern ScrnInfoPtr gpScrn;
#define iabs(a) ((int)(a)>0?(a):(-(a)))
#define DRIVER_NAME "savage"
-#define DRIVER_VERSION "1.1.20"
+#define DRIVER_VERSION "1.1.25t"
#define VERSION_MAJOR 1
#define VERSION_MINOR 1
-#define PATCHLEVEL 20
+#define PATCHLEVEL 25
#define SAVAGE_VERSION ((VERSION_MAJOR << 24) | \
(VERSION_MINOR << 16) | \
PATCHLEVEL)
@@ -132,6 +134,8 @@
{ PCI_CHIP_SUPSAV_IX64DDR, "SuperSavage/IX 64" },
{ PCI_CHIP_SUPSAV_IXCSDR, "SuperSavage/IXC 64" },
{ PCI_CHIP_SUPSAV_IXCDDR, "SuperSavage/IXC 64" },
+ { PCI_CHIP_PROSAVAGE_DDR, "ProSavage DDR" },
+ { PCI_CHIP_PROSAVAGE_DDRK, "ProSavage DDR-K" },
{ -1, NULL }
};
@@ -160,6 +164,8 @@
{ S3_PROSAVAGE, PCI_CHIP_PROSAVAGE_KM, RES_SHARED_VGA },
{ S3_PROSAVAGE, PCI_CHIP_S3TWISTER_P, RES_SHARED_VGA },
{ S3_PROSAVAGE, PCI_CHIP_S3TWISTER_K, RES_SHARED_VGA },
+ { S3_PROSAVAGE, PCI_CHIP_PROSAVAGE_DDR, RES_SHARED_VGA },
+ { S3_PROSAVAGE, PCI_CHIP_PROSAVAGE_DDRK, RES_SHARED_VGA },
{ S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_MX128, RES_SHARED_VGA },
{ S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_MX64, RES_SHARED_VGA },
{ S3_SUPERSAVAGE, PCI_CHIP_SUPSAV_MX64C, RES_SHARED_VGA },
@@ -187,7 +193,10 @@
OPTION_ROTATE,
OPTION_USEBIOS,
OPTION_SHADOW_STATUS,
- OPTION_VIDEORAM
+ OPTION_VIDEORAM,
+ OPTION_CRT_ONLY,
+ OPTION_TV_ON,
+ OPTION_TV_PAL
} SavageOpts;
@@ -202,6 +211,9 @@
{ 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_TV_PAL, "PAL", OPTV_BOOLEAN, {0}, FALSE },
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -719,6 +731,7 @@
return FALSE;
else {
int requiredBpp;
+ int altBpp = 0;
switch (pScrn->depth) {
case 8:
@@ -730,6 +743,7 @@
break;
case 24:
requiredBpp = 32;
+ altBpp = 24;
break;
default:
@@ -739,7 +753,10 @@
return FALSE;
}
- if( pScrn->bitsPerPixel != requiredBpp ) {
+ if(
+ (pScrn->bitsPerPixel != requiredBpp) &&
+ (pScrn->bitsPerPixel != altBpp)
+ ) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Depth %d must specify %d bpp; %d was given\n",
pScrn->depth, requiredBpp, pScrn->bitsPerPixel );
@@ -839,6 +856,13 @@
psav->NoAccel = TRUE;
}
+ if (pScrn->bitsPerPixel == 24 && !psav->NoAccel) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "HW acceleration not possible with depth 32 and bpp 24.\n");
+ psav->NoAccel = TRUE;
+ }
+
+
/*
* The SWCursor setting takes priority over HWCursor. The default
* if neither is specified is HW, unless ShadowFB is specified,
@@ -880,6 +904,25 @@
"Option: ShadowStatus enabled\n" );
+ if( xf86GetOptValBool( psav->Options, OPTION_CRT_ONLY, &psav->CrtOnly))
+ xf86DrvMsg( pScrn->scrnIndex, X_CONFIG,
+ "Option: CrtOnly enabled\n" );
+
+ if( xf86GetOptValBool( psav->Options, OPTION_TV_ON, &psav->TvOn)) {
+ psav->PAL = FALSE;
+ SavageGetTvMaxSize(psav);
+ }
+
+ if( xf86GetOptValBool( psav->Options, OPTION_TV_PAL, &psav->PAL)) {
+ SavageGetTvMaxSize(psav);
+ psav->TvOn = TRUE;
+ }
+
+ if( psav->TvOn )
+ xf86DrvMsg( pScrn->scrnIndex, X_CONFIG,
+ "TV enabled in %s format\n",
+ psav->PAL ? "PAL" : "NTSC" );
+
/* Add more options here. */
if (pScrn->numEntities > 1) {
@@ -1004,7 +1047,7 @@
psav->MemOffScreen = 0;
- if( psav->pVbe )
+ if( !pScrn->videoRam && psav->pVbe )
{
/* If VBE is available, it is the best judge of onboard memory. */
@@ -1108,10 +1151,15 @@
}
else
{
- /* We use 128kB for the COB on all chips. */
+ /* We use 128kB for the COB on all chips. */
- psav->cobIndex = 7;
- psav->cobSize = 0x400 << psav->cobIndex;
+ psav->cobSize = 1 << 17;
+ if (psav->Chipset == S3_SUPERSAVAGE) {
+ psav->cobIndex = 2;
+ }
+ else {
+ psav->cobIndex = 7;
+ }
psav->cobOffset = psav->videoRambytes - psav->cobSize;
}
@@ -1182,11 +1230,13 @@
if ( xf86LoadSubModule(pScrn, "i2c") ) {
xf86LoaderReqSymLists(i2cSymbols,NULL);
if (SavageI2CInit(pScrn)) {
- CARD32 temp = (INREG(DDC_REG));
- OUTREG(DDC_REG,(temp | 0x13));
+ unsigned char tmp;
+
+ InI2CREG(tmp);
+ OutI2CREG(tmp | 0x13);
xf86SetDDCproperties(pScrn,xf86PrintEDID(
xf86DoEDID_DDC2(pScrn->scrnIndex,psav->I2C)));
- OUTREG(DDC_REG,temp);
+ OutI2CREG(tmp);
}
}
}
@@ -1240,7 +1290,7 @@
/* Check LCD panel information */
- if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) )
+ if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) && !psav->CrtOnly )
{
unsigned char cr6b = hwp->readCrtc( hwp, 0x6b );
@@ -1422,7 +1472,7 @@
xf86LoaderReqSymLists(shadowSymbols, NULL);
}
vbeFree(psav->pVbe);
-
+
return TRUE;
}
@@ -1589,6 +1639,8 @@
save->SR30 = VGAIN8(0x3c5);
VGAOUT8(0x3c4, 0x18);
save->SR18 = VGAIN8(0x3c5);
+ VGAOUT8(0x3c4, 0x1b);
+ save->SR1B = VGAIN8(0x3c5);
/* Save flat panel expansion regsters. */
@@ -1650,7 +1702,7 @@
TRACE(("SavageWriteMode(%x)\n", restore->mode));
- if( Entering )
+ if( Entering && !S3_SAVAGE_MOBILE_SERIES(psav->Chipset) )
SavageInitialize2DEngine(pScrn);
/*
@@ -1697,6 +1749,14 @@
VGAOUT8(vgaCRIndex, 0x67);
VGAOUT8(vgaCRReg, restore->CR67);
+ /* Enable gamma correction. */
+
+ VGAOUT8(0x3c4, 0x1b);
+ if( pScrn->bitsPerPixel == 32 )
+ VGAOUT8(0x3c5, VGAIN8(0x3c5) | 0x28 );
+ else
+ VGAOUT8(0x3c5, VGAIN8(0x3c5) & ~0x28 );
+
/* We may need TV/panel fixups here. See s3bios.c line 2904. */
/* Set FIFO fetch delay. */
@@ -1968,6 +2028,8 @@
VGAOUT8(0x3c4, 0x18);
VGAOUT8(0x3c5, restore->SR18);
+ VGAOUT8(0x3c4, 0x1b);
+ VGAOUT8(0x3c5, restore->SR1B);
/* load new m, n pll values for dclk & mclk */
VGAOUT8(0x3c4, 0x15);
@@ -2203,7 +2265,7 @@
miClearVisualTypes();
- if (pScrn->bitsPerPixel > 8) {
+ if (pScrn->bitsPerPixel == 16) {
if (!miSetVisualTypes(pScrn->depth, TrueColorMask,
pScrn->rgbBits, pScrn->defaultVisual))
return FALSE;
@@ -2284,11 +2346,16 @@
if (psav->Chipset == S3_SAVAGE4) {
if (!xf86HandleColormaps(pScreen, 256, 6, SavageLoadPaletteSavage4,
- NULL, CMAP_RELOAD_ON_MODE_SWITCH))
+ NULL,
+ CMAP_RELOAD_ON_MODE_SWITCH
+ | CMAP_PALETTED_TRUECOLOR
+ ))
return FALSE;
} else {
if (!xf86HandleColormaps(pScreen, 256, 6, SavageLoadPalette, NULL,
- CMAP_RELOAD_ON_MODE_SWITCH))
+ CMAP_RELOAD_ON_MODE_SWITCH
+ | CMAP_PALETTED_TRUECOLOR
+ ))
return FALSE;
}
@@ -2302,7 +2369,7 @@
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "DPMS initialization failed\n");
#ifdef XvExtension
- if( !psav->NoAccel )
+ if( !psav->NoAccel && !SavagePanningCheck(pScrn) )
SavageInitVideo( pScreen );
#endif
@@ -2366,8 +2433,18 @@
/* We prohibit modes bigger than the LCD panel. */
/* TODO We should do this only if the panel is active. */
+ if( psav->TvOn )
+ {
+ if( pMode->HDisplay > psav->TVSizeX )
+ return MODE_VIRTUAL_X;
+
+ if( pMode->VDisplay > psav->TVSizeY )
+ return MODE_VIRTUAL_Y;
+
+ }
if(
- (psav->PanelX) &&
+ !psav->CrtOnly &&
+ psav->PanelX &&
(
(pMode->HDisplay > psav->PanelX) ||
(pMode->VDisplay > psav->PanelY)
@@ -2470,7 +2547,10 @@
new->CR67 = 0x40; /* 16bpp, 1 pixels/clock */
break;
case 24:
- new->CR67 = 0xd0;
+ if (pScrn->bitsPerPixel == 24 )
+ new->CR67 = 0x70;
+ else
+ new->CR67 = 0xd0;
break;
}
@@ -2565,6 +2645,12 @@
new->SR15 = 0x03 | 0x80;
new->SR18 = 0x00;
+
+ VGAOUT8(0x3c4, 0x1b);
+ new->SR1B = VGAIN8(0x3c5);
+ if( pScrn->depth == 24 )
+ new->SR1B |= 0x28;
+
new->CR43 = new->CR45 = new->CR65 = 0x00;
VGAOUT8(vgaCRIndex, 0x40);
@@ -3116,13 +3202,21 @@
SavageDDC1Read(ScrnInfoPtr pScrn)
{
register vgaHWPtr hwp = VGAHWPTR(pScrn);
- register CARD32 tmp;
+ register unsigned char tmp;
SavagePtr psav = SAVPTR(pScrn);
+ int vgaCRIndex, vgaCRReg, vgaIOBase;
+
+ vgaHWGetIOBase(hwp);
+ vgaIOBase = hwp->IOBase;
+ vgaCRIndex = vgaIOBase + 4;
+ vgaCRReg = vgaIOBase + 5;
+
+ VerticalRetraceWait();
+ InI2CREG(tmp);
while (hwp->readST01(hwp)&0x8) {};
while (!(hwp->readST01(hwp)&0x8)) {};
- tmp = (INREG(DDC_REG));
return ((unsigned int) (tmp & 0x08));
}
@@ -3130,14 +3224,18 @@
SavageDDC1(int scrnIndex)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ vgaHWPtr hwp = VGAHWPTR(pScrn);
SavagePtr psav = SAVPTR(pScrn);
- CARD32 tmp;
+ unsigned char tmp;
Bool success = FALSE;
xf86MonPtr pMon;
+ int vgaIOBase;
/* initialize chipset */
- tmp = INREG(DDC_REG);
- OUTREG(DDC_REG,(tmp | 0x12));
+ vgaHWGetIOBase(hwp);
+ vgaIOBase = hwp->IOBase;
+ InI2CREG(tmp);
+ OutI2CREG(tmp | 0x12);
if ((pMon = xf86PrintEDID(
xf86DoEDID_DDC1(scrnIndex,vgaHWddc1SetSpeed,SavageDDC1Read))) != NULL)
@@ -3145,7 +3243,7 @@
xf86SetDDCproperties(pScrn,pMon);
/* undo initialization */
- OUTREG(DDC_REG,(tmp));
+ OutI2CREG(tmp);
return success;
}
@@ -3161,3 +3259,34 @@
}
}
+
+static void
+SavageGetTvMaxSize(SavagePtr psav)
+{
+ if( psav->PAL ) {
+ psav->TVSizeX = 800;
+ psav->TVSizeY = 600;
+ }
+ else {
+ psav->TVSizeX = 640;
+ psav->TVSizeY = 480;
+ }
+}
+
+
+static Bool
+SavagePanningCheck(ScrnInfoPtr pScrn)
+{
+ SavagePtr psav = SAVPTR(pScrn);
+ DisplayModePtr pMode;
+
+ pMode = pScrn->currentMode;
+ psav->iResX = pMode->CrtcHDisplay;
+ psav->iResY = pMode->CrtcVDisplay;
+ if( psav->iResX < pScrn->virtualX || psav->iResY < pScrn->virtualY )
+ return TRUE;
+ else
+ return FALSE;
+}
+
+
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_driver.h xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_driver.h 2001-08-09 21:14:13.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h 2002-09-11 20:24:58.000000000 +0200
@@ -35,6 +35,9 @@
#define INREG16(addr) MMIO_IN16(psav->MapBase, addr)
#define OUTREG16(addr,val) MMIO_OUT16(psav->MapBase, addr, val)
+#define SAVAGE_CRT_ON 1
+#define SAVAGE_LCD_ON 2
+#define SAVAGE_TV_ON 4
typedef struct _S3VMODEENTRY {
unsigned short Width;
@@ -54,7 +57,7 @@
typedef struct {
unsigned int mode, refresh;
unsigned char SR08, SR0E, SR0F;
- unsigned char SR10, SR11, SR12, SR13, SR15, SR18, SR29, SR30;
+ unsigned char SR10, SR11, SR12, SR13, SR15, SR18, SR1B, SR29, SR30;
unsigned char SR54[8];
unsigned char Clock;
unsigned char CR31, CR32, CR33, CR34, CR36, CR3A, CR3B, CR3C;
@@ -121,8 +124,29 @@
int rotate;
double LCDClock;
Bool ShadowStatus;
- int PanelX;
- int PanelY;
+ Bool CrtOnly;
+ Bool TvOn;
+ Bool PAL;
+ int iDevInfo;
+ int iDevInfoPrim;
+
+ int PanelX; /* panel width */
+ int PanelY; /* panel height */
+ int iResX; /* crtc X display */
+ int iResY; /* crtc Y display */
+ int XFactor; /* overlay X factor */
+ int YFactor; /* overlay Y factor */
+ int displayXoffset; /* overlay X offset */
+ int displayYoffset; /* overlay Y offset */
+ int XExpansion; /* expansion factor in x */
+ int XExp1;
+ int XExp2;
+ int YExpansion; /* expansion factor in x */
+ int YExp1;
+ int YExp2;
+ int cxScreen;
+ int TVSizeX;
+ int TVSizeY;
CloseScreenProcPtr CloseScreen;
pciVideoPtr PciInfo;
@@ -176,6 +200,7 @@
XF86VideoAdaptorPtr adaptor;
int VideoZoomMax;
int dwBCIWait2DIdle;
+ XF86OffscreenImagePtr offscreenImages;
} SavageRec, *SavagePtr;
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_i2c.c xc/programs/Xserver/hw/xfree86/drivers/savage/savage_i2c.c
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_i2c.c 2001-02-13 22:15:19.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_i2c.c 2001-12-05 01:43:48.000000000 +0100
@@ -41,23 +41,37 @@
static void
SavageI2CPutBits(I2CBusPtr b, int clock, int data)
{
- SavagePtr psav = SAVPTR(xf86Screens[b->scrnIndex]);
- unsigned int reg = 0x10;
+ ScrnInfoPtr pScrn = (ScrnInfoPtr)(xf86Screens[b->scrnIndex]);
+ SavagePtr psav = SAVPTR(pScrn);
+ vgaHWPtr hwp;
+ int vgaIOBase;
+ unsigned char reg = 0x10;
+
+ hwp = VGAHWPTR(pScrn);
+ vgaHWGetIOBase(hwp);
+ vgaIOBase = hwp->IOBase;
if(clock) reg |= 0x1;
if(data) reg |= 0x2;
- OUTREG(DDC_REG,reg);
+ OutI2CREG(reg);
/*ErrorF("SavageI2CPutBits: %d %d\n", clock, data); */
}
static void
SavageI2CGetBits(I2CBusPtr b, int *clock, int *data)
{
- SavagePtr psav = SAVPTR(xf86Screens[b->scrnIndex]);
- unsigned int reg;
+ ScrnInfoPtr pScrn = (ScrnInfoPtr)(xf86Screens[b->scrnIndex]);
+ SavagePtr psav = SAVPTR(pScrn);
+ vgaHWPtr hwp;
+ int vgaIOBase;
+ unsigned char reg = 0x10;
- reg = (INREG(DDC_REG));
+ hwp = VGAHWPTR(pScrn);
+ vgaHWGetIOBase(hwp);
+ vgaIOBase = hwp->IOBase;
+
+ InI2CREG(reg);
*clock = reg & 0x4;
*data = reg & 0x8;
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_regs.h xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_regs.h 2001-11-04 23:17:48.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h 2002-03-08 19:01:06.000000000 +0100
@@ -22,6 +22,10 @@
#define PCI_CHIP_SUPSAV_IXCSDR 0x8c2e
#define PCI_CHIP_SUPSAV_IXCDDR 0x8c2f
#endif
+#ifndef PCI_CHIP_PROSAVAGE_DDR
+#define PCI_CHIP_PROSAVAGE_DDR 0x8d03
+#define PCI_CHIP_PROSAVAGE_DDRK 0x8d04
+#endif
#define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX))
@@ -164,9 +168,6 @@
#define MONO_PAT_0 0xa4e8
#define MONO_PAT_1 0xa4ec
-#define DDC_REG 0xff20
-
-
/* Constants for CR69. */
#define CRT_ACTIVE 0x01
@@ -202,4 +203,20 @@
} \
}
+#define I2C_REG 0xa0
+#define InI2CREG(a) \
+{ \
+ VGAOUT8(vgaIOBase + 4, I2C_REG); \
+ a = VGAIN8(vgaIOBase + 5); \
+}
+
+#define OutI2CREG(a) \
+{ \
+ VGAOUT8(vgaIOBase + 4, I2C_REG); \
+ VGAOUT8(vgaIOBase + 5, a); \
+}
+
+#define HZEXP_FACTOR_IGA1 0x59
+#define VTEXP_FACTOR_IGA1 0x5b
+
#endif /* _SAVAGE_REGS_H */
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_vbe.c xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_vbe.c 2001-05-19 04:05:55.000000000 +0200
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_vbe.c 2001-12-06 00:02:32.000000000 +0100
@@ -14,6 +14,8 @@
#define L_ADD(x) (B_O32(x) & 0xffff) + ((B_O32(x) >> 12) & 0xffff00)
Bool vbeModeInit( vbeInfoPtr, int );
+static int SavageGetDevice( SavagePtr psav );
+/*static int SavageGetTVType( SavagePtr psav );*/
static void
SavageClearVM86Regs( xf86Int10InfoPtr pInt )
@@ -31,6 +33,15 @@
void
SavageSetTextMode( SavagePtr psav )
{
+ /* Restore display device if changed. */
+ if( psav->iDevInfo != psav->iDevInfoPrim ) {
+ SavageClearVM86Regs( psav->pInt10 );
+ psav->pInt10->ax = 0x4f14;
+ psav->pInt10->bx = 0x0003;
+ psav->pInt10->cx = psav->iDevInfoPrim;
+ xf86ExecX86int10( psav->pInt10 );
+ }
+
SavageClearVM86Regs( psav->pInt10 );
psav->pInt10->ax = 0x83;
@@ -42,16 +53,55 @@
void
SavageSetVESAMode( SavagePtr psav, int n, int Refresh )
{
- /* First, establish the refresh rate for this mode. */
+ int iDevInfo;
+ static int iCount = 0;
+
+ /* Get current display device status. */
+
+ iDevInfo = SavageGetDevice(psav);
+ psav->iDevInfo = iDevInfo;
+ if( !iCount++ )
+ psav->iDevInfoPrim = psav->iDevInfo;
+ if( psav->CrtOnly )
+ psav->iDevInfo = CRT_ACTIVE;
+ if( psav->TvOn )
+ psav->iDevInfo = TV_ACTIVE;
+
+ /* Establish the refresh rate for this mode. */
SavageClearVM86Regs( psav->pInt10 );
psav->pInt10->ax = 0x4f14; /* S3 extensions */
psav->pInt10->bx = 0x0001; /* Set default refresh rate */
psav->pInt10->cx = n;
- psav->pInt10->di = Refresh;
+ psav->pInt10->di = Refresh & 0xffff;
xf86ExecX86int10( psav->pInt10 );
+ /* Set TV type if TV is on. */
+ if( psav->TvOn ) {
+ SavageClearVM86Regs( psav->pInt10 );
+ psav->pInt10->ax = 0x4f14; /* S3 extensions */
+ psav->pInt10->bx = 0x0007; /* TV extensions */
+ psav->pInt10->cx = psav->PAL ? 0x08 : 0x04;
+ psav->pInt10->dx = 0x0c;
+ xf86ExecX86int10( psav->pInt10 );
+ }
+
+ /* Manipulate output device set. */
+ if( psav->iDevInfo != iDevInfo ) {
+ SavageClearVM86Regs( psav->pInt10 );
+ psav->pInt10->ax = 0x4f14; /* S3 extensions */
+ psav->pInt10->bx = 0x0003; /* set active devices */
+ psav->pInt10->cx = psav->PAL ? 0x08 : 0x04;
+ xf86ExecX86int10( psav->pInt10 );
+
+ /* Re-fetch actual device set. */
+ psav->iDevInfo = SavageGetDevice( psav );
+ iDevInfo = psav->iDevInfo;
+ psav->CrtOnly = (iDevInfo == 1);
+ psav->TvOn = !!(iDevInfo & 4);
+ }
+
/* Now, make this mode current. */
if( xf86LoaderCheckSymbol( "VBESetVBEMode" ) )
@@ -73,6 +123,20 @@
}
+/* Function to get supported device list. */
+
+static int SavageGetDevice( SavagePtr psav )
+{
+ SavageClearVM86Regs( psav->pInt10 );
+ psav->pInt10->ax = 0x4f14; /* S3 extensions */
+ psav->pInt10->bx = 0x0103; /* get active devices */
+
+ xf86ExecX86int10( psav->pInt10 );
+
+ return ((psav->pInt10->cx) & 0xf);
+}
+
+
void
SavageFreeBIOSModeTable( SavagePtr psav, SavageModeTablePtr* ppTable )
{
@@ -128,6 +192,11 @@
vbe = (vbeControllerInfoPtr) psav->pVbe->memory;
vbeLinear = xf86Int10AllocPages( psav->pInt10, 1, &vbeReal );
+ if( !vbeLinear )
+ {
+ ErrorF( "Cannot allocate scratch page in real mode memory." );
+ return 0;
+ }
vmib = (struct vbe_mode_info_block *) vbeLinear;
for (
diff -Nurd xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_video.c xc/programs/Xserver/hw/xfree86/drivers/savage/savage_video.c
--- xc/programs/Xserver/hw/xfree86/drivers/savage~/savage_video.c 2001-11-21 23:43:01.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/drivers/savage/savage_video.c 2002-09-11 20:26:03.000000000 +0200
@@ -78,6 +78,9 @@
short drw_w, short drw_h
) = NULL;
+static void OverlayParamInit(ScrnInfoPtr pScrn);
+static void InitStreamsForExpansion(SavagePtr psav);
+
/*static void SavageBlockHandler(int, pointer, pointer, pointer);*/
#define XVTRACE 4
@@ -226,6 +229,13 @@
/* CR67[3] = 1 : Mem-mapped regs */
#define USE_MM_FOR_PRI_STREAM 0x08
+#define HDM_SHIFT 16
+#define HDSCALE_4 (2 << HDM_SHIFT)
+#define HDSCALE_8 (3 << HDM_SHIFT)
+#define HDSCALE_16 (4 << HDM_SHIFT)
+#define HDSCALE_32 (5 << HDM_SHIFT)
+#define HDSCALE_64 (6 << HDM_SHIFT)
+
/* Old Streams */
#define ENABLE_STREAMS_OLD 0x0c
@@ -264,6 +274,7 @@
#define PSTREAM_WINDOW_SIZE_REG 0x81F4
#define SSTREAM_WINDOW_START_REG 0x81F8
#define SSTREAM_WINDOW_SIZE_REG 0x81FC
+#define FIFO_CONTROL 0x8200
#define PSTREAM_FBSIZE_REG 0x8300
#define SSTREAM_FBSIZE_REG 0x8304
#define SSTREAM_FBADDR2_REG 0x8308
@@ -363,6 +374,14 @@
xf86ErrorFVerb(XVTRACE, "SavageInitStreams\n" );
+ if(
+ S3_SAVAGE_MOBILE_SERIES(psav->Chipset) &&
+ !psav->CrtOnly &&
+ !psav->TvOn
+ ) {
+ OverlayParamInit( pScrn );
+ }
+
/* Primary stream reflects the frame buffer. */
jDelta = pScrn->displayWidth * pScrn->bitsPerPixel / 8;
@@ -419,7 +438,7 @@
VGAOUT8( vgaCRIndex, EXT_MISC_CTRL2 );
- if( (psav->Chipset == S3_SAVAGE_MX) ||
+ if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ||
(psav->Chipset == S3_SUPERSAVAGE) ||
(psav->Chipset == S3_SAVAGE2000) )
{
@@ -495,7 +514,7 @@
VGAOUT16(0x3c4, 0x0608);
VGAOUT8( vgaCRIndex, EXT_MISC_CTRL2 );
- if( (psav->Chipset == S3_SAVAGE_MX) ||
+ if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ||
(psav->Chipset == S3_SUPERSAVAGE) ||
(psav->Chipset == S3_SAVAGE2000) )
jStreamsControl = VGAIN8( vgaCRReg ) & NO_STREAMS;
@@ -528,8 +547,8 @@
xf86ErrorFVerb(XVTRACE,"SavageInitVideo\n");
if(
- (psav->Chipset == S3_SAVAGE_MX) ||
- (psav->Chipset == S3_SUPERSAVAGE) ||
+ S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ||
+ (psav->Chipset == S3_SUPERSAVAGE) ||
(psav->Chipset == S3_SAVAGE2000)
)
{
@@ -846,6 +865,15 @@
pPriv->brightness = 0;
pPriv->contrast = 128;
pPriv->saturation = 128;
+#if 0
+ /*
+ * The S3 driver has these values for some of the chips. I have yet
+ * to find any Savage where these make sense.
+ */
+ pPriv->brightness = 64;
+ pPriv->contrast = 16;
+ pPriv->saturation = 128;
+#endif
pPriv->hue = 0;
pPriv->lastKnownPitch = 0;
@@ -1002,36 +1030,41 @@
pointer data
){
SavagePortPrivPtr pPriv = (SavagePortPrivPtr)data;
- /*SavagePtr psav = SAVPTR(pScrn);*/
+ SavagePtr psav = SAVPTR(pScrn);
if(attribute == xvColorKey) {
pPriv->colorKey = value;
- SavageSetColorKey( pScrn );
+ if( psav->videoFlags & VF_STREAMS_ON)
+ SavageSetColorKey( pScrn );
REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
}
else if( attribute == xvBrightness) {
if((value < -128) || (value > 127))
return BadValue;
pPriv->brightness = value;
- SavageSetColor( pScrn );
+ if( psav->videoFlags & VF_STREAMS_ON)
+ SavageSetColor( pScrn );
}
else if( attribute == xvContrast) {
if((value < 0) || (value > 255))
return BadValue;
pPriv->contrast = value;
- SavageSetColor( pScrn );
+ if( psav->videoFlags & VF_STREAMS_ON)
+ SavageSetColor( pScrn );
}
else if( attribute == xvSaturation) {
if((value < 0) || (value > 255))
return BadValue;
pPriv->saturation = value;
- SavageSetColor( pScrn );
+ if( psav->videoFlags & VF_STREAMS_ON)
+ SavageSetColor( pScrn );
}
else if( attribute == xvHue) {
if((value < -180) || (value > 180))
return BadValue;
pPriv->hue = value;
- SavageSetColor( pScrn );
+ if( psav->videoFlags & VF_STREAMS_ON)
+ SavageSetColor( pScrn );
}
else
return BadMatch;
@@ -1163,6 +1196,7 @@
pScreen = screenInfo.screens[pScrn->scrnIndex];
+ xf86PurgeUnlockedOffscreenAreas(pScreen);
new_area = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth,
numlines, 0, NULL, NULL, NULL);
@@ -1200,6 +1234,7 @@
SavagePortPrivPtr pPriv = psav->adaptor->pPortPrivates[0].ptr;
/*DisplayModePtr mode = pScrn->currentMode;*/
int vgaCRIndex, vgaCRReg, vgaIOBase;
+ unsigned int ssControl;
vgaIOBase = hwp->IOBase;
@@ -1222,22 +1257,45 @@
/* Calculate horizontal scale factor. */
- OUTREG(SSTREAM_STRETCH_REG, 32768 * src_w / drw_w );
+ OUTREG(SSTREAM_STRETCH_REG, (src_w << 15) / drw_w );
/* Calculate vertical scale factor. */
OUTREG(SSTREAM_LINES_REG, src_h );
OUTREG(SSTREAM_VINITIAL_REG, 0 );
- OUTREG(SSTREAM_VSCALE_REG, 32768 * src_h / drw_h );
+ OUTREG(SSTREAM_VSCALE_REG, (src_h << 15) / drw_h );
/* Set surface location and stride. */
OUTREG(SSTREAM_FBADDR0_REG, (offset + (x1>>15)) & 0x3ffff0 );
+ OUTREG(SSTREAM_FBADDR1_REG, 0 );
+
OUTREG(SSTREAM_STRIDE_REG, pitch & 0xfff );
OUTREG(SSTREAM_WINDOW_START_REG, OS_XY(dstBox->x1, dstBox->y1) );
OUTREG(SSTREAM_WINDOW_SIZE_REG, OS_WH(drw_w, drw_h) );
+ ssControl = 0;
+
+ if( src_w > (drw_w << 1) )
+ {
+ /* BUGBUG shouldn't this be >=? */
+ if( src_w <= (drw_w << 2) )
+ ssControl |= HDSCALE_4;
+ else if( src_w > (drw_w << 3) )
+ ssControl |= HDSCALE_8;
+ else if( src_w > (drw_w << 4) )
+ ssControl |= HDSCALE_16;
+ else if( src_w > (drw_w << 5) )
+ ssControl |= HDSCALE_32;
+ else if( src_w > (drw_w << 6) )
+ ssControl |= HDSCALE_64;
+ }
+
+ ssControl |= src_w;
+ ssControl |= (1 << 24);
+ OUTREG(SSTREAM_CONTROL_REG, ssControl);
+
/* Set color key on primary. */
SavageSetColorKey( pScrn );
@@ -1308,6 +1366,19 @@
}
else
{
+ if(
+ S3_SAVAGE_MOBILE_SERIES(psav->Chipset) &&
+ !psav->CrtOnly &&
+ !psav->TvOn
+ ) {
+ drw_w = (float)(drw_w * psav->XExp1)/(float)psav->XExp2 + 1;
+ drw_h = (float)(drw_h * psav->YExp1)/(float)psav->YExp2 + 1;
+ dstBox->x1 = (float)(dstBox->x1 * psav->XExp1)/(float)psav->XExp2;
+ dstBox->y1 = (float)(dstBox->y1 * psav->YExp1)/(float)psav->YExp2;
+ dstBox->x1 += psav->displayXoffset;
+ dstBox->y1 += psav->displayYoffset;
+ }
+
OUTREG(SEC_STREAM_HSCALING,
((src_w&0xfff)<<20) | ((65536 * src_w / drw_w) & 0x1FFFF ));
/* BUGBUG need to add 00040000 if src stride > 2048 */
@@ -1383,6 +1454,11 @@
SavageClipVideo(&dstBox, &x1, &x2, &y1, &y2,
REGION_EXTENTS(pScreen, clipBoxes), width, height);
+ drw_w = dstBox.x2 - dstBox.x1;
+ drw_h = dstBox.y2 - dstBox.y1;
+ src_w = ( x2 - x1 ) >> 16;
+ src_h = ( y2 - y1 ) >> 16;
+
if((x1 >= x2) || (y1 >= y2))
return Success;
@@ -1740,10 +1816,16 @@
SavageInitOffscreenImages(ScreenPtr pScreen)
{
XF86OffscreenImagePtr offscreenImages;
+ SavagePtr psav = SAVPTR(xf86Screens[pScreen->myNum]);
/* need to free this someplace */
- if(!(offscreenImages = xalloc(sizeof(XF86OffscreenImageRec))))
- return;
+ if (!psav->offscreenImages) {
+ if(!(offscreenImages = xalloc(sizeof(XF86OffscreenImageRec))))
+ return;
+ psav->offscreenImages = offscreenImages;
+ } else {
+ offscreenImages = psav->offscreenImages;
+ }
offscreenImages[0].image = &Images[0];
offscreenImages[0].flags = VIDEO_OVERLAID_IMAGES |
@@ -1762,4 +1844,152 @@
xf86XVRegisterOffscreenImages(pScreen, offscreenImages, 1);
}
-#endif /* !XvExtension */
+/* Function to get lcd factor, display offset for overlay use
+ * Input: pScrn; Output: x,yfactor, displayoffset in pScrn
+ */
+static void OverlayParamInit(ScrnInfoPtr pScrn)
+{
+ SavagePtr psav = SAVPTR(pScrn);
+
+ psav = SAVPTR(pScrn);
+ psav->cxScreen = psav->iResX;
+ InitStreamsForExpansion(psav);
+}
+
+/* Function to calculate lcd expansion x,yfactor and offset for overlay
+ */
+static void InitStreamsForExpansion(SavagePtr psav)
+{
+ int PanelSizeX,PanelSizeY;
+ int ViewPortWidth,ViewPortHeight;
+ int XFactor, YFactor;
+
+ PanelSizeX = psav->PanelX;
+ PanelSizeY = psav->PanelY;
+ ViewPortWidth = psav->iResX;
+ ViewPortHeight = psav->iResY;
+ if( PanelSizeX == 1408 )
+ PanelSizeX = 1400;
+ psav->XExpansion = 0x00010001;
+ psav->YExpansion = 0x00010001;
+ psav->displayXoffset = 0;
+ psav->displayYoffset = 0;
+
+ VGAOUT8(0x3C4, HZEXP_FACTOR_IGA1);
+ XFactor = VGAIN8(0x3C5) >> 4;
+ VGAOUT8(0x3C4, VTEXP_FACTOR_IGA1);
+ YFactor = VGAIN8(0x3C5) >> 4;
+
+ switch( XFactor )
+ {
+ case 1:
+ psav->XExpansion = 0x00010001;
+ psav->displayXoffset =
+ (((PanelSizeX - ViewPortWidth) / 2) + 0x7) & 0xFFF8;
+ break;
+
+ case 3:
+ psav->XExpansion = 0x00090008;
+ psav->displayXoffset =
+ (((PanelSizeX - ((9 * ViewPortWidth)/8)) / 2) + 0x7) & 0xFFF8;
+ break;
+
+ case 4:
+ psav->XExpansion = 0x00050004;
+
+ if ((psav->cxScreen == 800) && (PanelSizeX !=1400))
+ {
+ psav->displayXoffset =
+ (((PanelSizeX - ((5 * ViewPortWidth)/4)) / 2) ) & 0xFFF8;
+ }
+ else
+ {
+ psav->displayXoffset =
+ (((PanelSizeX - ((5 * ViewPortWidth)/4)) / 2) +0x7) & 0xFFF8;
+ }
+ break;
+
+ case 6:
+ psav->XExpansion = 0x00030002;
+ psav->displayXoffset =
+ (((PanelSizeX - ((3 * ViewPortWidth)/2)) / 2) + 0x7) & 0xFFF8;
+ break;
+
+ case 7:
+ psav->XExpansion = 0x00020001;
+ psav->displayXoffset =
+ (((PanelSizeX - (2 * ViewPortWidth)) / 2) + 0x7) & 0xFFF8;
+ break;
+ }
+
+ switch( YFactor )
+ {
+ case 0:
+ psav->YExpansion = 0x00010001;
+ psav->displayYoffset = (PanelSizeY - ViewPortHeight) / 2;
+ break;
+ case 1:
+ psav->YExpansion = 0x00010001;
+ psav->displayYoffset = (PanelSizeY - ViewPortHeight) / 2;
+ break;
+ case 2:
+ psav->YExpansion = 0x00040003;
+ psav->displayYoffset = (PanelSizeY - ((4 * ViewPortHeight)/3)) / 2;
+ break;
+ case 4:
+ psav->YExpansion = 0x00050004;
+ psav->displayYoffset = (PanelSizeY - ((5 * ViewPortHeight)/4)) / 2;
+ break;
+ case 5:
+ psav->YExpansion = 0x00040003;
+
+ if((psav->cxScreen == 1024)&&(PanelSizeX ==1400))
+ {
+ psav->displayYoffset =
+ ((PanelSizeY - ((4 * ViewPortHeight)/3)) / 2) - 0x1 ;
+ }
+ else
+ {
+ psav->displayYoffset = (PanelSizeY - ((4 * ViewPortHeight)/3)) / 2;
+ }
+ break;
+ case 6:
+ psav->YExpansion = 0x00050004;
+ psav->displayYoffset = (PanelSizeY - ((5 * ViewPortHeight)/4)) / 2;
+ break;
+ case 7:
+ psav->YExpansion = 0x00030002;
+ psav->displayYoffset = (PanelSizeY - ((3 * ViewPortHeight)/2)) / 2;
+ break;
+ case 8:
+ psav->YExpansion = 0x00020001;
+ psav->displayYoffset = (PanelSizeY - (2 * ViewPortHeight)) /2;
+ break;
+ case 9:
+ psav->YExpansion = 0x00090004;
+ psav->displayYoffset = (PanelSizeY - ((9 * ViewPortHeight)/4)) /2;
+ break;
+ case 11:
+ psav->YExpansion = 0x00110005;
+ psav->displayYoffset = (PanelSizeY - ((11 * ViewPortHeight)/5)) /2;
+ break;
+ case 12:
+ psav->YExpansion = 0x00070003;
+ psav->displayYoffset = (PanelSizeY - ((7 * ViewPortHeight)/3)) /2;
+ break;
+ case 14:
+ psav->YExpansion = 0x00050002;
+ psav->displayYoffset = (PanelSizeY - ((5 * ViewPortHeight)/2)) /2;
+ break;
+ case 15:
+ psav->YExpansion = 0x00040001;
+ psav->displayYoffset = (PanelSizeY - (4 * ViewPortHeight)) /2;
+ break;
+ }
+ psav->XExp1 = psav->XExpansion >> 16;
+ psav->XExp2 = psav->XExpansion & 0xFFFF;
+ psav->YExp1 = psav->YExpansion >> 16;
+ psav->YExp2 = psav->YExpansion & 0xFFFF;
+} /* InitStreamsForExpansionPM */
+
+#endif /* XvExtension */
Attachment:
pgpeJLIj7aNzT.pgp
Description: PGP signature