summaryrefslogtreecommitdiff
path: root/src/via_accel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/via_accel.c')
-rw-r--r--src/via_accel.c181
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))