summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/savage_cursor.c22
-rw-r--r--src/savage_driver.c29
2 files changed, 34 insertions, 17 deletions
diff --git a/src/savage_cursor.c b/src/savage_cursor.c
index a6acdad..ff0136f 100644
--- a/src/savage_cursor.c
+++ b/src/savage_cursor.c
@@ -120,11 +120,6 @@ SavageHWCursorInit(ScreenPtr pScreen)
return xf86InitCursor(pScreen, infoPtr);
}
-/*
- * Supposedly bit 2 of CR45 enables cursor two (rest of the cursor regs are shadowed via SR26),
- * but I can't seem to enable it. For now it's disabled. - AGD
- */
-
void
SavageShowCursor(ScrnInfoPtr pScrn)
{
@@ -132,7 +127,9 @@ SavageShowCursor(ScrnInfoPtr pScrn)
/* Turn cursor on. */
if (psav->IsSecondary) {
- outCRReg( 0x45, inCRReg(0x45) | 0x04 ); /* cursor2 bit 2*/
+ SelectIGA2();
+ outCRReg( 0x45, inCRReg(0x45) | 0x01 );
+ SelectIGA1();
} else {
outCRReg( 0x45, inCRReg(0x45) | 0x01 );
}
@@ -152,7 +149,9 @@ SavageHideCursor(ScrnInfoPtr pScrn)
waitHSync(5);
}
if (psav->IsSecondary) {
- outCRReg( 0x45, inCRReg(0x45) & 0xfb ); /* cursor2 */
+ SelectIGA2();
+ outCRReg( 0x45, inCRReg(0x45) & 0xfe ); /* cursor2 */
+ SelectIGA1();
} else {
outCRReg( 0x45, inCRReg(0x45) & 0xfe );
}
@@ -198,7 +197,7 @@ SavageSetCursorPosition(
int y)
{
SavagePtr psav = SAVPTR(pScrn);
- unsigned char xoff, yoff;
+ unsigned char xoff, yoff, byte;
if( S3_SAVAGE4_SERIES( SAVPTR(pScrn)->Chipset ) )
{
@@ -251,6 +250,11 @@ SavageSetCursorPosition(
outCRReg( 0x4f, yoff );
outCRReg( 0x48, (y & 0xff00)>>8 );
}
+
+ /* fix for HW cursor on crtc2 */
+ byte = inCRReg( 0x46 );
+ outCRReg( 0x46, byte );
+
}
@@ -281,8 +285,8 @@ SavageSetCursorColors(
if (psav->IsSecondary) {
/* cursor 2 */
/* Reset the cursor color stack pointer */
- inCRReg(0x45);
SelectIGA2();
+ inCRReg(0x45);
/* Write low, mid, high bytes - foreground */
outCRReg(0x4a, fg);
outCRReg(0x4a, fg >> 8);
diff --git a/src/savage_driver.c b/src/savage_driver.c
index cdcd097..a76bb26 100644
--- a/src/savage_driver.c
+++ b/src/savage_driver.c
@@ -1419,12 +1419,6 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags)
psav->HasCRTC2 = FALSE;
}
- /* until I figure out why cursor2 doesn't work, disable it for crtc2. -- AGD */
- if (psav->IsSecondary) {
- psav->hwcursor = FALSE;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "HWCursor currently disabled for crtc2.\n");
- }
-
if ((psav->IsSecondary || psav->IsPrimary) && !psav->UseBIOS)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "BIOS currently required for Dualhead mode setting.\n");
@@ -1806,8 +1800,8 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags)
i = xf86ValidateModes(pScrn, pScrn->monitor->Modes,
pScrn->display->modes, clockRanges, NULL,
- 256, 4095, 16 * pScrn->bitsPerPixel,
- 128, 4095,
+ 256, 2048, 16 * pScrn->bitsPerPixel,
+ 128, 2048,
pScrn->virtualX, pScrn->virtualY,
psav->videoRambytes, LOOKUP_BEST_REFRESH);
@@ -3767,6 +3761,18 @@ void SavageLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies,
SavagePtr psav = SAVPTR(pScrn);
int i, index;
int updateKey = -1;
+ unsigned char byte;
+
+ /* choose CLUT */
+ if (psav->IsPrimary) {
+ VGAOUT8(0x3c4, 0x47);
+ byte = VGAIN8(0x3c5);
+ VGAOUT8(0x3c5, (byte & ~0x03) | 0x01); /* CLUT 1 */
+ } else if (psav->IsSecondary) {
+ VGAOUT8(0x3c4, 0x47);
+ byte = VGAIN8(0x3c5);
+ VGAOUT8(0x3c5, (byte & ~0x03) | 0x02); /* CLUT 2 */
+ }
for (i=0; i<numColors; i++) {
index = indicies[i];
@@ -3776,6 +3782,13 @@ void SavageLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies,
VGAOUT8(0x3c9, colors[index].green);
VGAOUT8(0x3c9, colors[index].blue);
}
+
+ /* restore saved CLUT index value */
+ if (psav->IsPrimary || psav->IsSecondary) {
+ VGAOUT8(0x3c4, 0x47);
+ VGAOUT8(0x3c5, byte);
+ }
+
if (updateKey != -1)
SavageUpdateKey(pScrn, colors[updateKey].red, colors[updateKey].green,
colors[updateKey].blue);