diff options
Diffstat (limited to 'src/via_accel.c')
-rw-r--r-- | src/via_accel.c | 181 |
1 files changed, 126 insertions, 55 deletions
diff --git a/src/via_accel.c b/src/via_accel.c index e4cf82e52021..90a485d1df26 100644 --- a/src/via_accel.c +++ b/src/via_accel.c @@ -108,11 +108,14 @@ viaFlushPCI(ViaCommandBuffer * buf) * for an unacceptable amount of time in VIASETREG while * other high priority interrupts may be pending. */ - while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) - && (loop++ < MAXLOOP)) ; - while ((VIAGETREG(VIA_REG_STATUS) & (VIA_CMD_RGTR_BUSY | - VIA_2D_ENG_BUSY)) - && (loop++ < MAXLOOP)) ; + if (pVia->Chipset != VIA_P4M890 && pVia->Chipset != VIA_K8M890 && + pVia->Chipset != VIA_P4M900) { + while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) + && (loop++ < MAXLOOP)) ; + } + while ((VIAGETREG(VIA_REG_STATUS) & + (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY)) && + (loop++ < MAXLOOP)) ; } offset = (*bp++ & 0x0FFFFFFF) << 2; value = *bp++; @@ -224,6 +227,13 @@ viaTearDownCBuffer(ViaCommandBuffer * buf) /* * Leftover from VIA's code. */ +static void +viaInitPCIe(VIAPtr pVia) +{ + VIASETREG(0x41c, 0x00100000); + VIASETREG(0x420, 0x680A0000); + VIASETREG(0x420, 0x02000000); +} static void viaInitAgp(VIAPtr pVia) @@ -250,38 +260,60 @@ viaInitAgp(VIAPtr pVia) */ static void -viaEnableVQ(VIAPtr pVia) -{ - CARD32 - vqStartAddr = pVia->VQStart, - vqEndAddr = pVia->VQEnd, - vqStartL = 0x50000000 | (vqStartAddr & 0xFFFFFF), - vqEndL = 0x51000000 | (vqEndAddr & 0xFFFFFF), - vqStartEndH = 0x52000000 | ((vqStartAddr & 0xFF000000) >> 24) | - ((vqEndAddr & 0xFF000000) >> 16), - vqLen = 0x53000000 | (VIA_VQ_SIZE >> 3); - - VIASETREG(VIA_REG_TRANSET, 0x00fe0000); - VIASETREG(VIA_REG_TRANSPACE, 0x080003fe); - VIASETREG(VIA_REG_TRANSPACE, 0x0a00027c); - VIASETREG(VIA_REG_TRANSPACE, 0x0b000260); - VIASETREG(VIA_REG_TRANSPACE, 0x0c000274); - VIASETREG(VIA_REG_TRANSPACE, 0x0d000264); - VIASETREG(VIA_REG_TRANSPACE, 0x0e000000); - VIASETREG(VIA_REG_TRANSPACE, 0x0f000020); - VIASETREG(VIA_REG_TRANSPACE, 0x1000027e); - VIASETREG(VIA_REG_TRANSPACE, 0x110002fe); - VIASETREG(VIA_REG_TRANSPACE, 0x200f0060); - - VIASETREG(VIA_REG_TRANSPACE, 0x00000006); - VIASETREG(VIA_REG_TRANSPACE, 0x40008c0f); - VIASETREG(VIA_REG_TRANSPACE, 0x44000000); - VIASETREG(VIA_REG_TRANSPACE, 0x45080c04); - VIASETREG(VIA_REG_TRANSPACE, 0x46800408); - VIASETREG(VIA_REG_TRANSPACE, vqStartEndH); - VIASETREG(VIA_REG_TRANSPACE, vqStartL); - VIASETREG(VIA_REG_TRANSPACE, vqEndL); - VIASETREG(VIA_REG_TRANSPACE, vqLen); +viaEnableAgpVQ(VIAPtr pVia) +{ + CARD32 + vqStartAddr = pVia->VQStart, + vqEndAddr = pVia->VQEnd, + vqStartL = 0x50000000 | (vqStartAddr & 0xFFFFFF), + vqEndL = 0x51000000 | (vqEndAddr & 0xFFFFFF), + vqStartEndH = 0x52000000 | ((vqStartAddr & 0xFF000000) >> 24) | + ((vqEndAddr & 0xFF000000) >> 16), + vqLen = 0x53000000 | (VIA_VQ_SIZE >> 3); + + + VIASETREG(VIA_REG_TRANSET, 0x00fe0000); + VIASETREG(VIA_REG_TRANSPACE, 0x080003fe); + VIASETREG(VIA_REG_TRANSPACE, 0x0a00027c); + VIASETREG(VIA_REG_TRANSPACE, 0x0b000260); + VIASETREG(VIA_REG_TRANSPACE, 0x0c000274); + VIASETREG(VIA_REG_TRANSPACE, 0x0d000264); + VIASETREG(VIA_REG_TRANSPACE, 0x0e000000); + VIASETREG(VIA_REG_TRANSPACE, 0x0f000020); + VIASETREG(VIA_REG_TRANSPACE, 0x1000027e); + VIASETREG(VIA_REG_TRANSPACE, 0x110002fe); + VIASETREG(VIA_REG_TRANSPACE, 0x200f0060); + VIASETREG(VIA_REG_TRANSPACE, 0x00000006); + VIASETREG(VIA_REG_TRANSPACE, 0x40008c0f); + VIASETREG(VIA_REG_TRANSPACE, 0x44000000); + VIASETREG(VIA_REG_TRANSPACE, 0x45080c04); + VIASETREG(VIA_REG_TRANSPACE, 0x46800408); + + VIASETREG(VIA_REG_TRANSPACE, vqStartEndH); + VIASETREG(VIA_REG_TRANSPACE, vqStartL); + VIASETREG(VIA_REG_TRANSPACE, vqEndL); + VIASETREG(VIA_REG_TRANSPACE, vqLen); +} + +static void +viaEnablePCIeVQ(VIAPtr pVia) +{ + CARD32 + vqStartAddr = pVia->VQStart, + vqEndAddr = pVia->VQEnd, + vqStartL = 0x70000000 | (vqStartAddr & 0xFFFFFF), + vqEndL = 0x71000000 | (vqEndAddr & 0xFFFFFF), + vqStartEndH = 0x72000000 | ((vqStartAddr & 0xFF000000) >> 24) | + ((vqEndAddr & 0xFF000000) >> 16), + vqLen = 0x73000000 | (VIA_VQ_SIZE >> 3); + + VIASETREG(0x41c, 0x00100000); + VIASETREG(0x420, vqStartEndH); + VIASETREG(0x420, vqStartL); + VIASETREG(0x420, vqEndL); + VIASETREG(0x420, vqLen); + VIASETREG(0x420, 0x74301001); + VIASETREG(0x420, 0x00000000); } /* @@ -293,12 +325,22 @@ viaDisableVQ(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); - VIASETREG(VIA_REG_TRANSET, 0x00fe0000); - VIASETREG(VIA_REG_TRANSPACE, 0x00000004); - VIASETREG(VIA_REG_TRANSPACE, 0x40008c0f); - VIASETREG(VIA_REG_TRANSPACE, 0x44000000); - VIASETREG(VIA_REG_TRANSPACE, 0x45080c04); - VIASETREG(VIA_REG_TRANSPACE, 0x46800408); + switch ( pVia->Chipset ) + { + case VIA_P4M890: + case VIA_K8M890: + VIASETREG(0x41c, 0x00100000); + VIASETREG(0x420, 0x74301000); + break; + default: + VIASETREG(VIA_REG_TRANSET, 0x00fe0000); + VIASETREG(VIA_REG_TRANSPACE, 0x00000004); + VIASETREG(VIA_REG_TRANSPACE, 0x40008c0f); + VIASETREG(VIA_REG_TRANSPACE, 0x44000000); + VIASETREG(VIA_REG_TRANSPACE, 0x45080c04); + VIASETREG(VIA_REG_TRANSPACE, 0x46800408); + break; + } } /* @@ -347,10 +389,24 @@ viaInitialize2DEngine(ScrnInfoPtr pScrn) VIASETREG(i, 0x0); } - viaInitAgp(pVia); + switch( pVia->Chipset ) { + case VIA_K8M890: + viaInitPCIe(pVia); + break; + default: + viaInitAgp(pVia); + break; + } if (pVia->VQStart != 0) { - viaEnableVQ(pVia); + switch( pVia->Chipset ) { + case VIA_K8M890: + viaEnablePCIeVQ(pVia); + break; + default: + viaEnableAgpVQ(pVia); + break; + } } else { viaDisableVQ(pScrn); } @@ -370,12 +426,23 @@ viaAccelSync(ScrnInfoPtr pScrn) mem_barrier(); - while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) - && (loop++ < MAXLOOP)) ; + switch (pVia->Chipset) { + case VIA_P4M890: + case VIA_K8M890: + case VIA_P4M900: + while ((VIAGETREG(VIA_REG_STATUS) & + (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY)) && + (loop++ < MAXLOOP)) ; + break; + default: + while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) + && (loop++ < MAXLOOP)) ; - while ((VIAGETREG(VIA_REG_STATUS) & - (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && - (loop++ < MAXLOOP)) ; + while ((VIAGETREG(VIA_REG_STATUS) & + (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && + (loop++ < MAXLOOP)) ; + break; + } } /* @@ -1106,7 +1173,7 @@ viaInitXAA(ScreenPtr pScreen) * test with x11perf -shmput500! */ - if (pVia->Chipset != VIA_K8M800) + if (pVia->Chipset != VIA_K8M800 && pVia->Chipset != VIA_K8M890 && pVia->Chipset != VIA_P4M900) xaaptr->ImageWriteFlags |= NO_GXCOPY; xaaptr->SetupForImageWrite = viaSetupForImageWrite; @@ -2129,8 +2196,8 @@ viaInitExa(ScreenPtr pScreen) pExa->offScreenBase = pScrn->virtualY * pVia->Bpl; pExa->pixmapOffsetAlign = 32; pExa->pixmapPitchAlign = 16; - pExa->flags = EXA_OFFSCREEN_PIXMAPS | - (pVia->nPOT[1] ? 0 : EXA_OFFSCREEN_ALIGN_POT); + /* This needs to be fixed upstream for now it just causes hangs*/ + pExa->flags = EXA_OFFSCREEN_PIXMAPS | EXA_OFFSCREEN_ALIGN_POT; pExa->maxX = 2047; pExa->maxY = 2047; pExa->WaitMarker = viaAccelWaitMarker; @@ -2174,6 +2241,7 @@ viaInitExa(ScreenPtr pScreen) "[EXA] Disabling EXA accelerated composite.\n"); } + if (!exaDriverInit(pScreen, pExa)) { xfree(pExa); return NULL; @@ -2279,13 +2347,13 @@ viaInitAccel(ScreenPtr pScreen) pVia->FBFreeEnd -= VIA_VQ_SIZE; } - viaInitialize2DEngine(pScrn); - if (pVia->hwcursor) { pVia->FBFreeEnd -= VIA_CURSOR_SIZE; pVia->CursorStart = pVia->FBFreeEnd; } + viaInitialize2DEngine(pScrn); + /* * Sync marker space. */ @@ -2332,6 +2400,9 @@ viaInitAccel(ScreenPtr pScreen) return FALSE; } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[EXA] Trying to enable EXA acceleration.\n"); + pVia->driSize = (pVia->FBFreeEnd - pVia->FBFreeStart) / 2; if ((pVia->driSize > (pVia->maxDriSize * 1024)) |