summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Hourihane <alanh@fairlite.demon.co.uk>2005-01-12 17:14:46 +0000
committerAlan Hourihane <alanh@fairlite.demon.co.uk>2005-01-12 17:14:46 +0000
commitc45015ce852c6e8718fed7b33d5d3990589b7ec0 (patch)
tree7951d4feeafd0983dfeeebf2cd321de71fd0aef0
parentfbe54d6ee7c1e95b98b9cae1a4deaa5605c2c2c1 (diff)
xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.c
xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.h xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.h xc/programs/Xserver/hw/xfree86/drivers/via/via_memcpy.c xc/programs/Xserver/hw/xfree86/drivers/via/via_cursor.c xc/programs/Xserver/hw/xfree86/drivers/via/via_accel.c Import some changes from the Unichrome project. - Fixes 2D acceleration problems - Adds AGP DMA
-rw-r--r--src/via_accel.c131
-rw-r--r--src/via_cursor.c2
-rw-r--r--src/via_dri.c139
-rw-r--r--src/via_dri.h4
-rw-r--r--src/via_driver.c141
-rw-r--r--src/via_driver.h4
-rw-r--r--src/via_memcpy.c4
7 files changed, 220 insertions, 205 deletions
diff --git a/src/via_accel.c b/src/via_accel.c
index 19edb99..6125335 100644
--- a/src/via_accel.c
+++ b/src/via_accel.c
@@ -300,6 +300,7 @@ VIAInitialize2DEngine(ScrnInfoPtr pScrn)
break;
case 32:
dwGEMode |= VIA_GEM_32bpp;
+ break;
default:
dwGEMode |= VIA_GEM_8bpp;
break;
@@ -357,7 +358,6 @@ static void dispatchCBuffer(VIAPtr pVia, ViaCBuffer *buf)
static void dispatchCBufferAGP(VIAPtr pVia, ViaCBuffer *buf)
{
-#ifdef ENABLE_AGP_RINGBUF
#ifdef XF86DRI
DRIInfoPtr pDRIInfo = pVia->pDRIInfo;
VIADRIPtr pVIADRI = pDRIInfo->devPrivate;
@@ -365,20 +365,21 @@ static void dispatchCBufferAGP(VIAPtr pVia, ViaCBuffer *buf)
b.buf = (char *)(buf->buffer);
b.size = buf->curPos*sizeof(CARD32);
-
- if (pVia->directRenderingEnabled && pVIADRI->ringBufActive) {
- if (drmCommandWrite(pVia->drmFD,DRM_VIA_CMDBUFFER,&b,sizeof(b))) {
+
+ if (pVia->agpEnable && pVia->dma2d) {
+ if (pVia->directRenderingEnabled && pVIADRI->ringBufActive) {
+ if (drmCommandWrite(pVia->drmFD,DRM_VIA_CMDBUFFER,&b,sizeof(b))) {
- /*
- * No success using AGP. Try PCI instead.
- */
+ /*
+ * No success using AGP. Try PCI instead.
+ */
- dispatchCBuffer(pVia,buf);
+ dispatchCBuffer(pVia,buf);
+ }
+ return;
}
- return;
}
#endif
-#endif
/*
* No AGP ringbuffer or no DRI.
*/
@@ -469,7 +470,7 @@ VIAInitAccel(ScreenPtr pScreen)
VIASubsequentMono8x8PatternFillRect;
xaaptr->Mono8x8PatternFillFlags = NO_PLANEMASK |
HARDWARE_PATTERN_PROGRAMMED_BITS |
- ROP_NEEDS_SOURCE |
+ HARDWARE_PATTERN_PROGRAMMED_ORIGIN |
BIT_ORDER_IN_BYTE_MSBFIRST |
0;
@@ -480,7 +481,7 @@ VIAInitAccel(ScreenPtr pScreen)
xaaptr->Color8x8PatternFillFlags = NO_PLANEMASK |
NO_TRANSPARENCY |
HARDWARE_PATTERN_PROGRAMMED_BITS |
- ROP_NEEDS_SOURCE |
+ HARDWARE_PATTERN_PROGRAMMED_ORIGIN |
0;
/*=* This function is only used in drawing check box when use RedHat 7.2
@@ -593,15 +594,26 @@ VIAInitAccel(ScreenPtr pScreen)
return XAAInit(pScreen, xaaptr);
}
-
-
-/* The sync function for the GE */
-void VIAAccelSync(ScrnInfoPtr pScrn)
+/*
+ * The sync function for the GE
+ */
+void
+VIAAccelSync(ScrnInfoPtr pScrn)
{
- ViaWaitIdle(pScrn);
+ VIAPtr pVia = VIAPTR(pScrn);
+ int loop = 0;
+
+ mem_barrier();
+
+ 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))
+ ;
}
-
/* These are the ScreenToScreen bitblt functions. We support all ROPs, all
* directions.
*
@@ -644,7 +656,6 @@ VIASetupForScreenToScreenCopy(
}
}
-
static void
VIASubsequentScreenToScreenCopy(
ScrnInfoPtr pScrn,
@@ -658,10 +669,33 @@ VIASubsequentScreenToScreenCopy(
VIAPtr pVia = VIAPTR(pScrn);
ViaCBuffer *buf = &pVia->cBuf;
ViaTwodContext *tdc = &pVia->td;
+ CARD32 srcBase, dstBase;
if (!w || !h)
return;
+ srcBase = y1*pVia->Bpl + x1*pVia->Bpp;
+ dstBase = y2*pVia->Bpl + x2*pVia->Bpp;
+
+ x1 = (srcBase & 31);
+ x2 = (dstBase & 31);
+
+ switch (pScrn->bitsPerPixel) {
+ case 16:
+ x1 >>= 1;
+ x2 >>= 1;
+ break;
+ case 32:
+ x1 >>= 2;
+ x2 >>= 2;
+ break;
+ default:
+ break;
+ }
+
+ y1 = 0;
+ y2 = 0;
+
if (pVia->SavedCmd & VIA_GEC_DECX) {
x1 += (w - 1);
x2 += (w - 1);
@@ -673,14 +707,12 @@ VIASubsequentScreenToScreenCopy(
}
COND_CLEAR_CBUFFER( buf, pVia);
- CBUFFER(buf,VIA_REG_GEMODE, tdc->mode);
+ CBUFFER(buf,VIA_REG_GEMODE, tdc->mode );
/* Set Src and Dst base address and pitch, pitch is qword */
- CBUFFER(buf,VIA_REG_SRCBASE, 0x0);
- CBUFFER(buf,VIA_REG_DSTBASE, 0x0);
+ CBUFFER(buf,VIA_REG_SRCBASE, (srcBase & ~31) >> 3);
+ CBUFFER(buf,VIA_REG_DSTBASE, (dstBase & ~31) >> 3);
CBUFFER(buf,VIA_REG_PITCH, VIA_PITCH_ENABLE |
- ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) |
- (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16));
-
+ (pVia->Bpl >> 3) | ((pVia->Bpl >> 3) << 16));
CBUFFER(buf,VIA_REG_SRCPOS, ((y1 << 16) | x1));
CBUFFER(buf,VIA_REG_DSTPOS, ((y2 << 16) | x2));
CBUFFER(buf,VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1)));
@@ -803,7 +835,7 @@ VIASubsequentMono8x8PatternFillRect(
if (!w || !h)
return;
- dwPatOffset = (((patOffy + y) & 0x7) << 29) | (((patOffx + x) & 0x7) << 26);
+ dwPatOffset = ((patOffy & 0x7) << 29) | ((patOffx & 0x7) << 26);
COND_CLEAR_CBUFFER( buf, pVia);
CBUFFER(buf,VIA_REG_GEMODE, tdc->mode);
@@ -953,7 +985,6 @@ VIASubsequentScanlineCPUToScreenColorExpandFill(
}
-
static void
VIASetupForScreenToScreenColorExpand(
ScrnInfoPtr pScrn,
@@ -965,7 +996,6 @@ VIASetupForScreenToScreenColorExpand(
VIAPtr pVia = VIAPTR(pScrn);
int cmd;
ViaCBuffer *buf = &pVia->cBuf;
- ViaTwodContext *tdc = &pVia->td;
cmd = VIA_GEC_BLT | VIA_GEC_SRC_MONO | (XAAGetCopyROP(rop) << 24);
@@ -979,9 +1009,7 @@ VIASetupForScreenToScreenColorExpand(
/* Disable Transparent Bitblt */
CLEAR_CBUFFER( buf, pVia);
- CBUFFER(buf,VIA_REG_GEMODE, tdc->mode);
CBUFFER(buf,VIA_REG_KEYCONTROL, 0x0);
- dispatchCBufferAGP(pVia, buf);
}
@@ -999,34 +1027,48 @@ VIASubsequentScreenToScreenColorExpand(
VIAPtr pVia = VIAPTR(pScrn);
ViaCBuffer *buf = &pVia->cBuf;
ViaTwodContext *tdc = &pVia->td;
+ CARD32 srcBase,dstBase;
+
+ srcBase = srcy*pVia->Bpl + srcx*pVia->Bpp;
+ dstBase = y*pVia->Bpl + x*pVia->Bpp;
+
+ x = (dstBase & 31);
+ srcx = srcBase & 7;
+
+ switch (pScrn->bitsPerPixel) {
+ case 16:
+ x >>= 1;
+ break;
+ case 32:
+ x >>= 2;
+ break;
+ default:
+ break;
+ }
+
+ srcy = 0;
+ y = 0;
/* Set Src and Dst base address and pitch, pitch is qword */
COND_CLEAR_CBUFFER( buf, pVia);
CBUFFER(buf,VIA_REG_GEMODE, tdc->mode);
- CBUFFER(buf,VIA_REG_SRCBASE, 0x0);
- CBUFFER(buf,VIA_REG_DSTBASE, 0x0);
+ CBUFFER(buf,VIA_REG_KEYCONTROL, 0x0);
+ CBUFFER(buf,VIA_REG_SRCBASE, (srcBase & ~7) >> 3);
+ CBUFFER(buf,VIA_REG_DSTBASE, (dstBase & ~31) >> 3);
CBUFFER(buf,VIA_REG_PITCH, VIA_PITCH_ENABLE |
((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) |
(((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16));
-
- CBUFFER(buf,VIA_REG_SRCBASE, ((((srcy * pScrn->displayWidth) + srcx) *
- (pScrn->bitsPerPixel >> 3)) >> 3));
- srcy = 0;
- srcx = 0;
-
- CBUFFER(buf,VIA_REG_SRCPOS, ((srcy << 16) |
- (srcx * pScrn->bitsPerPixel + offset)));
+ CBUFFER(buf,VIA_REG_SRCPOS, (srcx << 6) | offset);
CBUFFER(buf,VIA_REG_DSTPOS, ((y << 16) | x));
CBUFFER(buf,VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1)));
CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor);
CBUFFER(buf,VIA_REG_BGCOLOR, pVia->SavedBgColor);
CBUFFER(buf,VIA_REG_GECMD, pVia->SavedCmd);
- CBUFFER(buf,VIA_REG_SRCBASE, 0x0);
- dispatchCBuffer(pVia, buf);
-
+ dispatchCBufferAGP(pVia, buf);
}
+
static void
VIASetupForImageWrite(
ScrnInfoPtr pScrn,
@@ -1141,6 +1183,7 @@ VIASubsequentSolidTwoPointLine(
COND_CLEAR_CBUFFER( buf, pVia);
CBUFFER(buf,VIA_REG_GEMODE, tdc->mode);
+ CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor);
cmd = pVia->SavedCmd | VIA_GEC_LINE;
dx = x2 - x1;
@@ -1204,6 +1247,7 @@ VIASubsequentSolidHorVertLine(
/* Set Src and Dst base address and pitch, pitch is qword */
COND_CLEAR_CBUFFER( buf, pVia);
CBUFFER(buf,VIA_REG_GEMODE, tdc->mode);
+ CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor);
CBUFFER(buf,VIA_REG_SRCBASE, 0x0);
CBUFFER(buf,VIA_REG_DSTBASE, 0x0);
CBUFFER(buf,VIA_REG_PITCH, VIA_PITCH_ENABLE |
@@ -1284,6 +1328,7 @@ VIASubsequentDashedTwoPointLine(
COND_CLEAR_CBUFFER( buf, pVia);
CBUFFER(buf,VIA_REG_GEMODE, tdc->mode);
+ CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor);
cmd = pVia->SavedCmd;
dx = x2 - x1;
diff --git a/src/via_cursor.c b/src/via_cursor.c
index f141f6e..a303599 100644
--- a/src/via_cursor.c
+++ b/src/via_cursor.c
@@ -114,7 +114,7 @@ VIALoadCursorImage(ScrnInfoPtr pScrn, unsigned char* src)
VIAPtr pVia = VIAPTR(pScrn);
CARD32 dwCursorMode;
- ViaWaitIdle(pScrn);
+ VIAAccelSync(pScrn);
dwCursorMode = VIAGETREG(VIA_REG_CURSOR_MODE);
diff --git a/src/via_dri.c b/src/via_dri.c
index bbecc0a..f66f63b 100644
--- a/src/via_dri.c
+++ b/src/via_dri.c
@@ -116,76 +116,80 @@ static void VIADRIIrqExit( ScrnInfoPtr pScrn , VIADRIPtr pVIADRI) {
}
}
-#ifdef ENABLE_AGP_RINGBUF
-
-static void VIADRIRingBufferCleanup(ScreenPtr pScreen, VIAPtr pVia)
+void
+VIADRIRingBufferCleanup(ScrnInfoPtr pScrn)
{
- DRIInfoPtr pDRIInfo = pVia->pDRIInfo;
- VIADRIPtr pVIADRI = pDRIInfo->devPrivate;
- drmViaDmaInit ringBufInit;
+ VIAPtr pVia = VIAPTR(pScrn);
+ VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate;
if (pVIADRI->ringBufActive) {
- xf86DrvMsg(pScreen->myNum, X_INFO,
+ drmViaDmaInit ringBufInit;
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"[drm] Cleaning up DMA ring-buffer.\n");
ringBufInit.func = VIA_CLEANUP_DMA;
if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit,
sizeof(ringBufInit))) {
- xf86DrvMsg(pScreen->myNum, X_WARNING,
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"[drm] Failed to clean up DMA ring-buffer: %d\n", errno);
}
pVIADRI->ringBufActive = 0;
}
}
-static Bool VIADRIRingBufferInit(ScreenPtr pScreen, VIAPtr pVia)
+Bool
+VIADRIRingBufferInit(ScrnInfoPtr pScrn)
{
- DRIInfoPtr pDRIInfo = pVia->pDRIInfo;
- VIADRIPtr pVIADRI = pDRIInfo->devPrivate;
- drmViaDmaInit ringBufInit;
- drmVersionPtr drmVer;
+ VIAPtr pVia = VIAPTR(pScrn);
+ VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate;
- pVIADRI->ringBufActive = 0;
+ if (pVIADRI->ringBufActive)
+ return TRUE;
- if (NULL == (drmVer = drmGetVersion(pVia->drmFD))) {
- return FALSE;
- }
+ if (pVia->agpEnable) {
+ drmViaDmaInit ringBufInit;
+ drmVersionPtr drmVer;
- if (((drmVer->version_major <= 1) && (drmVer->version_minor <= 3))) {
- return FALSE;
- }
+ if (NULL == (drmVer = drmGetVersion(pVia->drmFD))) {
+ return FALSE;
+ }
- /*
- * Info frome code-snippet on DRI-DEVEL list; Erdi Chen.
- */
+ if (((drmVer->version_major <= 1) && (drmVer->version_minor <= 3))) {
+ return FALSE;
+ }
- switch (pVia->ChipId) {
- case PCI_CHIP_VT3259:
- pVIADRI->reg_pause_addr = 0x40c;
- break;
- default:
- pVIADRI->reg_pause_addr = 0x418;
- break;
- }
+ /*
+ * Info frome code-snippet on DRI-DEVEL list; Erdi Chen.
+ */
+
+ switch (pVia->ChipId) {
+ case PCI_CHIP_VT3259:
+ pVIADRI->reg_pause_addr = 0x40c;
+ break;
+ default:
+ pVIADRI->reg_pause_addr = 0x418;
+ break;
+ }
- ringBufInit.offset = pVia->agpSize;
- ringBufInit.size = AGP_CMDBUF_SIZE;
- ringBufInit.reg_pause_addr = pVIADRI->reg_pause_addr;
- ringBufInit.func = VIA_INIT_DMA;
- if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit,
- sizeof(ringBufInit))) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[drm] Failed to initialize DMA ring-buffer: %d\n", errno);
- return FALSE;
- }
- xf86DrvMsg(pScreen->myNum, X_INFO,
- "[drm] Initialized AGP ring-buffer, size 0x%lx at AGP offset 0x%lx.\n",
- ringBufInit.size, ringBufInit.offset);
+ ringBufInit.offset = pVia->agpSize;
+ ringBufInit.size = AGP_CMDBUF_SIZE;
+ ringBufInit.reg_pause_addr = pVIADRI->reg_pause_addr;
+ ringBufInit.func = VIA_INIT_DMA;
+ if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit,
+ sizeof(ringBufInit))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] Failed to initialize DMA ring-buffer: %d\n", errno);
+ return FALSE;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "[drm] Initialized AGP ring-buffer, size 0x%lx at AGP offset 0x%lx.\n",
+ ringBufInit.size, ringBufInit.offset);
- pVIADRI->ringBufActive = 1;
+ pVIADRI->ringBufActive = 1;
+ }
return TRUE;
}
-#endif
static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia)
{
@@ -686,10 +690,7 @@ VIADRICloseScreen(ScreenPtr pScreen)
VIAPtr pVia = VIAPTR(pScrn);
VIADRIPtr pVIADRI;
-#ifdef ENABLE_AGP_RINGBUF
- VIADRIRingBufferCleanup(pScreen, pVia);
-#endif
-
+ VIADRIRingBufferCleanup(pScrn);
if (pVia->agpSize) {
drmUnmap(pVia->agpMappedAddr,pVia->agpSize);
drmRmMap(pVia->drmFD,pVia->agpHandle);
@@ -782,9 +783,7 @@ VIADRIFinishScreenInit(ScreenPtr pScreen)
VIADRIIrqInit(pScrn, pVIADRI);
pVIADRI->ringBufActive = 0;
-#ifdef ENABLE_AGP_RINGBUF
- VIADRIRingBufferInit(pScreen,pVia);
-#endif
+ VIADRIRingBufferInit(pScrn);
return TRUE;
}
@@ -856,37 +855,3 @@ static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia)
return TRUE;
}
-
-
-void viaDRIEnterVT(int scrnIndex)
-{
- ScreenPtr pScreen = screenInfo.screens[scrnIndex];
-#ifdef ENABLE_AGP_RINGBUF
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- VIAPtr pVia = VIAPTR(pScrn);
- DRIInfoPtr pDRIInfo = pVia->pDRIInfo;
- VIADRIPtr pVIADRI = pDRIInfo->devPrivate;
-
- if (!pVIADRI->ringBufActive)
- VIADRIRingBufferInit(pScreen, pVia);
-#endif
-
- DRIUnlock( pScreen );
-}
-
-void viaDRILeaveVT(int scrnIndex)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- ScreenPtr pScreen = screenInfo.screens[scrnIndex];
-
- DRILock(pScreen,0);
- VIAAccelSync(pScrn);
-
-#ifdef ENABLE_AGP_RINGBUF
- {
- VIAPtr pVia = VIAPTR(pScrn);
- VIADRIRingBufferCleanup(pScreen, pVia);
- }
-#endif
-
-}
diff --git a/src/via_dri.h b/src/via_dri.h
index d7db1be..8764d9f 100644
--- a/src/via_dri.h
+++ b/src/via_dri.h
@@ -144,8 +144,8 @@ typedef struct {
Bool VIADRIScreenInit(ScreenPtr pScreen);
void VIADRICloseScreen(ScreenPtr pScreen);
Bool VIADRIFinishScreenInit(ScreenPtr pScreen);
-void viaDRILeaveVT(int scrnIndex);
-void viaDRIEnterVT(int scrnIndex);
+void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn);
+Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn);
diff --git a/src/via_driver.c b/src/via_driver.c
index da8da67..a0f4e9e 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -41,9 +41,7 @@
#include "via_driver.h"
#include "via_video.h"
-#include "videodev.h"
-#include "via_capture.h"
#include "via.h"
#ifdef XF86DRI
#include "dri.h"
@@ -152,7 +150,9 @@ typedef enum {
OPTION_CAP0_FIELDSWAP,
OPTION_DRIXINERAMA,
OPTION_DISABLEIRQ,
- OPTION_TVDEFLICKER
+ OPTION_TVDEFLICKER,
+ OPTION_AGP_DMA,
+ OPTION_2D_DMA
} VIAOpts;
@@ -187,6 +187,8 @@ static OptionInfoRec VIAOptions[] =
{OPTION_CAP0_FIELDSWAP, "Cap0FieldSwap", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_DRIXINERAMA, "DRIXINERAMA", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_DISABLEIRQ, "DisableIRQ", OPTV_BOOLEAN, {0}, FALSE},
+ {OPTION_AGP_DMA, "EnableAGPDMA", OPTV_BOOLEAN, {0}, FALSE},
+ {OPTION_2D_DMA, "NoAGPFor2D", OPTV_BOOLEAN, {0}, FALSE},
{-1, NULL, OPTV_NONE, {0}, FALSE}
};
@@ -372,30 +374,6 @@ static pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin)
#endif /* XFree86LOADER */
-
-/*
- * Used to be named WaitIdleCLE266
- * Across CLEXF releases this is used for all unichrome incarnations
- */
-void
-ViaWaitIdle(ScrnInfoPtr pScrn)
-{
- VIAPtr pVia = VIAPTR(pScrn);
- int loop = 0;
-
- mem_barrier();
-
- 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))
- ;
-
-}
-
-
static Bool VIAGetRec(ScrnInfoPtr pScrn)
{
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetRec\n"));
@@ -893,6 +871,25 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
pVia->DRIIrqEnable = TRUE;
}
+ if (xf86ReturnOptValBool(VIAOptions, OPTION_AGP_DMA, FALSE)) {
+ pVia->agpEnable = TRUE;
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Option: EnableAGPDMA - Enabling AGP DMA\n");
+ } else {
+ pVia->agpEnable = FALSE;
+ }
+
+ if (xf86ReturnOptValBool(VIAOptions, OPTION_2D_DMA, FALSE)) {
+ pVia->dma2d = FALSE;
+ if (pVia->agpEnable) {
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Option: NoAGPFor2D - AGP DMA is not used for 2D "
+ "acceleration\n");
+ }
+ } else {
+ pVia->dma2d = TRUE;
+ }
+
/* ActiveDevice Option for device selection */
pBIOSInfo->ActiveDevice = 0x00;
if ((s = xf86GetOptValString(VIAOptions, OPTION_ACTIVEDEVICE))) {
@@ -1349,6 +1346,19 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
* don't exceed the chipset's limit if pScrn->maxHValue and
* pScrn->maxVValue are set. Since our VIAValidMode() already takes
* care of this, we don't worry about setting them here.
+ *
+ * CLE266A:
+ * Max Line Pitch: 4080, (FB corruption when higher, driver problem?)
+ * Max Height: 4096 (and beyond)
+ *
+ * CLE266A: primary AdjustFrame only is able to use 24bits, so we are
+ * limited to 12x11bits; 4080x2048 (~2:1), 3344x2508 (4:3) or 2896x2896
+ * (1:1).
+ * Test CLE266Cx, KM400, KM400A, K8M800, PM800, CN400 please.
+ *
+ * We should be able to limit the memory available for a mode to 32MB,
+ * yet xf86ValidateModes (or miScanLineWidth) fails to catch this properly
+ * (apertureSize).
*/
/* Select valid modes from those available */
@@ -1358,13 +1368,13 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
clockRanges, /* list of clock ranges */
NULL, /* list of line pitches */
256, /* mini line pitch */
- 2048, /* max line pitch */
+ 3344, /* max line pitch */
16 * pScrn->bitsPerPixel, /* pitch inc (bits) */
128, /* min height */
- 2048, /* max height */
+ 2508, /* max height */
pScrn->display->virtualX, /* virtual width */
- pScrn->display->virtualY, /* virutal height */
- pVia->videoRambytes, /* size of video memory */
+ pScrn->display->virtualY, /* virtual height */
+ pVia->videoRambytes, /* apertureSize */
LOOKUP_BEST_REFRESH); /* lookup mode flags */
if (i == -1) {
@@ -1473,7 +1483,6 @@ static Bool VIAEnterVT(int scrnIndex, int flags)
Bool ret;
/* FIXME: Rebind AGP memory here */
- /* FIXME: Unlock DRI here */
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAEnterVT\n"));
VIASave(pScrn);
vgaHWUnlock(hwp);
@@ -1489,13 +1498,10 @@ static Bool VIAEnterVT(int scrnIndex, int flags)
viaRestoreVideo(pScrn);
#ifdef XF86DRI
-
- /*
- * Reinitialize ringbuffer and release the
- * hardware lock.
- */
-
- viaDRIEnterVT(scrnIndex);
+ if (pVia->directRenderingEnabled) {
+ VIADRIRingBufferInit(pScrn);
+ DRIUnlock(screenInfo.screens[scrnIndex]);
+ }
#endif
VIAAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
@@ -1513,14 +1519,15 @@ static void VIALeaveVT(int scrnIndex, int flags)
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIALeaveVT\n"));
#ifdef XF86DRI
+ if (pVia->directRenderingEnabled)
+ DRILock(screenInfo.screens[scrnIndex], 0);
+#endif
- /*
- * Take the hardware lock, flush and disable the ringbuffer.
- */
+ VIAAccelSync(pScrn);
- viaDRILeaveVT(scrnIndex);
-#else
- ViaWaitIdle(pScrn);
+#ifdef XF86DRI
+ if (pVia->directRenderingEnabled)
+ VIADRIRingBufferCleanup(pScrn);
#endif
if (pVia->VQEnable)
@@ -2248,7 +2255,7 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen)
if(pScrn->vtSema)
{
/* Wait Hardware Engine idle to exit graphical mode */
- ViaWaitIdle(pScrn);
+ VIAAccelSync(pScrn);
/* Patch for normal log out and restart X, 3D application will hang */
VIARestore(pScrn);
@@ -2267,9 +2274,8 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen)
ViaVQDisable(pScrn);
}
#ifdef XF86DRI
- if (pVia->directRenderingEnabled) {
+ if (pVia->directRenderingEnabled)
VIADRICloseScreen(pScreen);
- }
#endif
if (pVia->AccelInfoRec) {
XAADestroyInfoRec(pVia->AccelInfoRec);
@@ -2402,34 +2408,31 @@ Bool VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
VIAPtr pVia = VIAPTR(pScrn);
Bool ret;
-
+
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIASwitchMode\n"));
- /* Wait Hardware Engine idle to switch graphicd mode */
-
+
#ifdef XF86DRI
-
- /*
- * Take the hardware lock, flush and disable the ringbuffer.
- */
-
- viaDRILeaveVT(scrnIndex);
-#else
- ViaWaitIdle(pScrn);
+ if (pVia->directRenderingEnabled)
+ DRILock(screenInfo.screens[scrnIndex], 0);
#endif
-
+
+ VIAAccelSync(pScrn);
+
+#ifdef XF86DRI
+ if (pVia->directRenderingEnabled)
+ VIADRIRingBufferCleanup(pScrn);
+#endif
+
if (pVia->VQEnable)
ViaVQDisable(pScrn);
-
- ret = VIAWriteMode(xf86Screens[scrnIndex], mode);
+
+ ret = VIAWriteMode(pScrn, mode);
#ifdef XF86DRI
-
- /*
- * Reinitialize ringbuffer and release the
- * hardware lock.
- */
-
- viaDRIEnterVT(scrnIndex);
+ if (pVia->directRenderingEnabled) {
+ VIADRIRingBufferInit(pScrn);
+ DRIUnlock(screenInfo.screens[scrnIndex]);
+ }
#endif
return ret;
diff --git a/src/via_driver.h b/src/via_driver.h
index 2e1ddb9..0383769 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -304,8 +304,10 @@ typedef struct _VIA {
ViaXvMC xvmc;
#endif
Bool DRIIrqEnable;
+ Bool agpEnable;
+ Bool dma2d;
- unsigned char ActiveDevice; /* if SAMM, non-equal pBIOSInfo->ActiveDevice */
+ CARD8 ActiveDevice; /* Option */
unsigned char *CursorImage;
CARD32 CursorFG;
CARD32 CursorBG;
diff --git a/src/via_memcpy.c b/src/via_memcpy.c
index 23f4909..b2dd39f 100644
--- a/src/via_memcpy.c
+++ b/src/via_memcpy.c
@@ -442,9 +442,9 @@ static unsigned fastrdtsc(void)
{
unsigned eax;
__asm__ volatile ("\t"
- "pushl %%ebx\n\t"
+ "pushl %%ebx\n\t"
"cpuid\n\t"
- "rdtsc\n\t"
+ ".byte 0x0f, 0x31\n\t"
"popl %%ebx\n"
: "=a" (eax)
: "0"(0)