diff -u orig/nv/nv_driver.c nv/nv_driver.c --- orig/nv/nv_driver.c 2004-05-11 13:48:34.000000000 +0100 +++ nv/nv_driver.c 2004-05-12 14:11:36.009456976 +0100 @@ -167,6 +167,7 @@ { 0x10DE032C, "0x032C" }, { 0x10DE032D, "0x032D" }, { 0x10DE032F, "0x032F" }, + { 0x10DE02A0,"Geforce3 XBox"}, {-1, NULL} }; @@ -1272,6 +1273,7 @@ case 0x0200: case 0x0250: case 0x0280: + case 0x02A0: case 0x0300: case 0x0310: case 0x0320: @@ -1345,7 +1347,8 @@ clockRanges->maxClock = pNv->MaxClock; clockRanges->clockIndex = -1; /* programmable */ if(((pNv->Chipset & 0x0ff0) <= 0x0100) || - ((pNv->Chipset & 0x0ff0) == 0x0150)) + ((pNv->Chipset & 0x0ff0) == 0x0150) || + ((pNv->Chipset & 0x0ff0) == 0x02A0)) { clockRanges->interlaceAllowed = TRUE; } else /* Chips after NV15 (including NV11) do not support interlaced */ @@ -1584,7 +1587,8 @@ /* Program the registers */ vgaHWProtect(pScrn, TRUE); - (*pNv->Restore)(pScrn, vgaReg, nvReg, FALSE); + if ((pNv->Chipset & 0x0ff0) != 0x02A0) + (*pNv->Restore)(pScrn, vgaReg, nvReg, FALSE); #if X_BYTE_ORDER == X_BIG_ENDIAN /* turn on LFB swapping */ @@ -1628,7 +1632,9 @@ /* Only restore text mode fonts/text for the primary card */ vgaHWProtect(pScrn, TRUE); - (*pNv->Restore)(pScrn, vgaReg, nvReg, pNv->Primary); + if ((pNv->Chipset & 0x0ff0) != 0x02A0) { + (*pNv->Restore)(pScrn, vgaReg, nvReg, pNv->Primary); + } vgaHWProtect(pScrn, FALSE); } @@ -1700,6 +1706,11 @@ if (!NVMapMem(pScrn)) return FALSE; } + if ((pNv->Chipset & 0x0ff0) == 0x02A0) + { + pNv->riva.CURSOR = (U032 *)(pNv->FbStart + pNv->FbUsableSize); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- CURSOR %x\n", pNv->riva.CURSOR)); + } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Mem Mapped\n")); /* Map the VGA memory when the primary video */ Only in orig/nv/: nv_driver.c.orig diff -u orig/nv/nv_setup.c nv/nv_setup.c --- orig/nv/nv_setup.c 2004-05-11 13:48:34.000000000 +0100 +++ nv/nv_setup.c 2004-05-11 14:57:30.000000000 +0100 @@ -449,7 +449,9 @@ #if !defined(__powerpc__) /* Read and print the Monitor DDC info */ - pScrn->monitor->DDC = NVdoDDC(pScrn); + if ((pNv->Chipset & 0x0ff0) != 0x02A0) { + pScrn->monitor->DDC = NVdoDDC(pScrn); + } #endif if(pNv->FlatPanel == -1) { pNv->FlatPanel = 0; @@ -544,6 +546,7 @@ NVPtr pNv = NVPTR(pScrn); CARD32 regBase = pNv->IOAddress; int mmioFlags; + int flags; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NV20Setup\n")); @@ -555,5 +558,12 @@ regBase+0x00600000, 0x00003000); NVCommonSetup(pScrn); + if ((pNv->Chipset & 0x0ff0) == 0x02A0) + { + pNv->riva.PMC[0x200/4] |= 0x10001100; + flags = pNv->riva.PMC[0x200/4]; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EnableFlags: 0x%0x\n",flags)); + } + } diff -u orig/nv/nv_video.c nv/nv_video.c --- orig/nv/nv_video.c 2004-05-11 13:48:34.000000000 +0100 +++ nv/nv_video.c 2004-05-11 13:44:27.000000000 +0100 @@ -421,7 +421,14 @@ xf86XVFillKeyHelper(pScrnInfo->pScreen, pPriv->colorKey, clipBoxes); } - pRiva->PMC[(0x8900/4) + buffer] = offset; + if ((pNv->Chipset & 0x0ff0) == 0x02A0) + { + pRiva->PMC[(0x8900/4) + buffer] = pNv->riva.RamAmountKBytes * 1024 - pNv->FbMapSize + offset; + } + else + { + pRiva->PMC[(0x8900/4) + buffer] = offset; + } pRiva->PMC[(0x8928/4) + buffer] = (height << 16) | width; pRiva->PMC[(0x8930/4) + buffer] = ((y1 << 4) & 0xffff0000) | (x1 >> 12); pRiva->PMC[(0x8938/4) + buffer] = (src_w << 20) / drw_w;