Index: src/via_cursor.c
===================================================================
--- src/via_cursor.c (wersja 751)
+++ src/via_cursor.c (kopia robocza)
@@ -290,19 +286,36 @@
CARD32 temp;
CARD32 control = pVia->CursorRegControl;
- temp =
- (1 << 30) |
- (1 << 29) |
- (1 << 28) |
- (1 << 26) |
- (1 << 25) |
- (1 << 2) |
- (1 << 0);
+ switch(pVia->Chipset) {
+ case VIA_CX700:
+ case VIA_P4M890:
+ case VIA_P4M900:
+ case VIA_VX800:
+ if (pVia->pBIOSInfo->FirstCRTC->IsActive) {
+ VIASETREG(VIA_REG_HI_CONTROL0, 0x36000005);
+ }
+ if (pVia->pBIOSInfo->SecondCRTC->IsActive) {
+ VIASETREG(VIA_REG_HI_CONTROL1, 0xb6000005);
+ }
+ break;
+
+ default:
+ /* temp = 0x36000005 */
+ temp =
+ (1 << 29) |
+ (1 << 28) |
+ (1 << 26) |
+ (1 << 25) |
+ (1 << 2) |
+ (1 << 0);
- if (pVia->CursorPipe)
- temp |= (1 << 31);
+ temp |= (1 << 30);
- VIASETREG(control, temp);
+ /* Duoview */
+ if (pVia->CursorPipe)
+ temp |= (1 << 31);
+ VIASETREG(control, temp);
+ }
}
void
@@ -313,7 +326,24 @@
CARD32 control = pVia->CursorRegControl;
temp = VIAGETREG(control);
- VIASETREG(control, temp & 0xFFFFFFFE);
+ switch(pVia->Chipset) {
+ case VIA_CX700:
+ case VIA_P4M890:
+ case VIA_P4M900:
+ case VIA_VX800:
+ if (pVia->pBIOSInfo->FirstCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL0);
+ VIASETREG(VIA_REG_HI_CONTROL0, temp & 0xFFFFFFFA);
+ }
+ if (pVia->pBIOSInfo->SecondCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL1);
+ VIASETREG(VIA_REG_HI_CONTROL1, temp & 0xFFFFFFFA);
+ }
+ break;
+
+ default:
+ VIASETREG(control, temp & 0xFFFFFFFA);
+ }
}
static void
@@ -340,13 +370,41 @@
yoff = 0;
}
- temp = VIAGETREG(control);
- VIASETREG(control, temp & 0xFFFFFFFE);
+ switch(pVia->Chipset) {
+ case VIA_CX700:
+ case VIA_P4M890:
+ case VIA_P4M900:
+ case VIA_VX800:
+ if (pVia->pBIOSInfo->FirstCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL0);
+ VIASETREG(VIA_REG_HI_CONTROL0, temp & 0xFFFFFFFE);
+
+ VIASETREG(VIA_REG_HI_POS0, ((x << 16) | (y & 0x07ff)));
+ VIASETREG(VIA_REG_HI_OFFSET0, ((xoff << 16) | (yoff & 0x07ff)));
- VIASETREG(pos, ((x << 16) | (y & 0x07ff)));
- VIASETREG(offset, ((xoff << 16) | (yoff & 0x07ff)));
+ VIASETREG(VIA_REG_HI_CONTROL0, temp);
+ }
+ if (pVia->pBIOSInfo->SecondCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL1);
+ VIASETREG(VIA_REG_HI_CONTROL1, temp & 0xFFFFFFFE);
- VIASETREG(control, temp);
+ VIASETREG(VIA_REG_HI_POS1, ((x << 16) | (y & 0x07ff)));
+ VIASETREG(VIA_REG_HI_OFFSET1, ((xoff << 16) | (yoff & 0x07ff)));
+
+ VIASETREG(VIA_REG_HI_CONTROL1, temp);
+ }
+ break;
+
+ default:
+ temp = VIAGETREG(control);
+ VIASETREG(control, temp & 0xFFFFFFFE);
+
+ VIASETREG(pos, ((x << 16) | (y & 0x07ff)));
+ VIASETREG(offset, ((xoff << 16) | (yoff & 0x07ff)));
+
+ VIASETREG(control, temp);
+ }
+
}
static Bool
@@ -397,18 +455,34 @@
if (pVia->CursorARGBSupported) {
#define ARGB_PER_CHUNK (8 * sizeof (chunk) / 2)
for (i = 0; i < (pVia->CursorMaxWidth * pVia->CursorMaxHeight / ARGB_PER_CHUNK); i++) {
- chunk = *s++;
- for (j = 0; j < ARGB_PER_CHUNK; j++, chunk >>= 2)
+ chunk = *s++;
+ for (j = 0; j < ARGB_PER_CHUNK; j++, chunk >>= 2)
*dst++ = mono_cursor_color[chunk & 3];
}
pVia->CursorFG = mono_cursor_color[3];
pVia->CursorBG = mono_cursor_color[2];
- } else {
- memcpy(dst, src, pVia->CursorSize);
- }
-
- VIASETREG(control, temp);
+ } else {
+ memcpy(dst, src, pVia->CursorSize);
+ }
+ switch(pVia->Chipset) {
+ case VIA_CX700:
+ case VIA_P4M890:
+ case VIA_P4M900:
+ case VIA_VX800:
+ if (pVia->pBIOSInfo->FirstCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL0);
+ VIASETREG(VIA_REG_HI_CONTROL0, temp & 0xFFFFFFFE);
+ }
+ if (pVia->pBIOSInfo->SecondCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL1);
+ VIASETREG(VIA_REG_HI_CONTROL1, temp & 0xFFFFFFFE);
+ }
+ break;
+
+ default:
+ VIASETREG(control, temp);
+ }
}
static void
@@ -441,7 +515,23 @@
pVia->CursorFG = fg;
pVia->CursorBG = bg;
- VIASETREG(control, temp);
+ switch(pVia->Chipset) {
+ case VIA_CX700:
+ case VIA_P4M890:
+ case VIA_P4M900:
+ case VIA_VX800:
+ if (pVia->pBIOSInfo->FirstCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL0);
+ VIASETREG(VIA_REG_HI_CONTROL0, temp & 0xFFFFFFFE);
+ }
+ if (pVia->pBIOSInfo->SecondCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL1);
+ VIASETREG(VIA_REG_HI_CONTROL1, temp & 0xFFFFFFFE);
+ }
+ break;
+ default:
+ VIASETREG(control, temp);
+ }
}
static void
@@ -486,5 +576,22 @@
for (x = 0; x < pVia->CursorMaxWidth; x++)
*dst++ = 0;
- VIASETREG(control, temp);
+ switch(pVia->Chipset) {
+ case VIA_CX700:
+ case VIA_P4M890:
+ case VIA_P4M900:
+ case VIA_VX800:
+ if (pVia->pBIOSInfo->FirstCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL0);
+ VIASETREG(VIA_REG_HI_CONTROL0, temp & 0xFFFFFFFE);
+ }
+ if (pVia->pBIOSInfo->SecondCRTC->IsActive) {
+ temp = VIAGETREG(VIA_REG_HI_CONTROL1);
+ VIASETREG(VIA_REG_HI_CONTROL1, temp & 0xFFFFFFFE);
+ }
+ break;
+
+ default:
+ VIASETREG(control, temp);
+ }
}