diff options
author | Thomas Hellström <thomas@tungstengraphics.com> | 2006-07-21 15:59:21 +0200 |
---|---|---|
committer | Thomas Hellström <thomas@tungstengraphics.com> | 2006-07-21 15:59:21 +0200 |
commit | 1ee80048ffdf16980a24b0b954a8525ab7622b67 (patch) | |
tree | 894de6420ebea4b81364fe623b31f2bbbd72f04a | |
parent | b11bcf15368465c02300657393a563e9dd7b7b37 (diff) |
Openchrome Changesets 189-192, 194.
Important memory management bugfix.
DRM compatibility check.
-rw-r--r-- | src/via_dri.c | 33 | ||||
-rw-r--r-- | src/via_driver.h | 3 | ||||
-rw-r--r-- | src/via_memory.c | 17 | ||||
-rw-r--r-- | src/via_swov.c | 4 | ||||
-rw-r--r-- | src/via_xvmc.c | 7 |
5 files changed, 45 insertions, 19 deletions
diff --git a/src/via_dri.c b/src/via_dri.c index c0c2e2a..98956bc 100644 --- a/src/via_dri.c +++ b/src/via_dri.c @@ -66,8 +66,17 @@ extern void GlxSetVisualConfigs( void **configprivs ); +typedef struct { + int major; + int minor; + int patchlevel; +} ViaDRMVersion; + static char VIAKernelDriverName[] = "via"; static char VIAClientDriverName[] = "unichrome"; +static const ViaDRMVersion drmExpected = {1, 3, 0}; +static const ViaDRMVersion drmCompat = {2, 0, 0}; + int test_alloc_FB(ScreenPtr pScreen, VIAPtr pVia, int Size); int test_alloc_AGP(ScreenPtr pScreen, VIAPtr pVia, int Size); static Bool VIAInitVisualConfigs(ScreenPtr pScreen); @@ -161,7 +170,7 @@ VIADRIRingBufferInit(ScrnInfoPtr pScrn) if (pVia->agpEnable) { drm_via_dma_init_t ringBufInit; - if (((pVia->drmVerMajor <= 1) && (pVia->drmVerMinor <= 3))) { + if (((pVia->drmVerMajor == 1) && (pVia->drmVerMinor <= 3))) { return FALSE; } @@ -352,7 +361,7 @@ static Bool VIADRIFBInit(ScreenPtr pScreen, VIAPtr pVia) } pVia->driOffScreenMem.pool = 0; - if (Success != VIAAllocLinear(&pVia->driOffScreenMem, pScrn, FBSize)) { + if (Success != viaOffScreenLinear(&pVia->driOffScreenMem, pScrn, FBSize)) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] failed to allocate offscreen frame buffer area\n"); return FALSE; @@ -727,6 +736,26 @@ Bool VIADRIScreenInit(ScreenPtr pScreen) pVia->drmVerMajor = drmVer->version_major; pVia->drmVerMinor = drmVer->version_minor; pVia->drmVerPL = drmVer->version_patchlevel; + + if ((drmVer->version_major < drmExpected.major) || + (drmVer->version_major > drmCompat.major) || + ((drmVer->version_major == drmExpected.major ) && + (drmVer->version_minor < drmExpected.minor))) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "[dri] Kernel drm is not compatible with this driver.\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "[dri] Kernel drm version: %d.%d.%d " + "and I can work with versions %d.%d.x - %d.x.x\n", + drmVer->version_major,drmVer->version_minor, + drmVer->version_patchlevel, drmExpected.major, + drmExpected.minor, drmCompat.major); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "[dri] Please update either this 2D driver or your kernel DRM. " + "Disabling DRI.\n"); + drmFreeVersion(drmVer); + VIADRICloseScreen(pScreen); + return FALSE; + } drmFreeVersion(drmVer); diff --git a/src/via_driver.h b/src/via_driver.h index 6ad5b9c..c9f612c 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -408,7 +408,8 @@ void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y); /* In via_memory.c */ void VIAFreeLinear(VIAMemPtr); -unsigned long VIAAllocLinear(VIAMemPtr, ScrnInfoPtr, unsigned long); +int VIAAllocLinear(VIAMemPtr, ScrnInfoPtr, unsigned long); +int viaOffscreenLinear(VIAMemPtr, ScrnInfoPtr, unsigned long); void VIAInitLinear(ScreenPtr pScreen); /* In via_xwmc.c */ diff --git a/src/via_memory.c b/src/via_memory.c index c735f74..e6b470d 100644 --- a/src/via_memory.c +++ b/src/via_memory.c @@ -84,8 +84,9 @@ void VIAFreeLinear(VIAMemPtr mem) } } -static unsigned long offScreenLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, - unsigned long size) { +int +viaOffScreenLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, + unsigned long size) { int depth = pScrn->bitsPerPixel >> 3; @@ -100,6 +101,7 @@ static unsigned long offScreenLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, return BadAlloc; mem->base = mem->exa->offset; mem->pool = 1; + mem->pScrn = pScrn; return Success; } #endif @@ -111,12 +113,14 @@ static unsigned long offScreenLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, return BadAlloc; mem->base = mem->linear->offset * depth; mem->pool = 1; + mem->pScrn = pScrn; return Success; } -unsigned long VIAAllocLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, unsigned long size) +int +VIAAllocLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, unsigned long size) { #ifdef XF86DRI VIAPtr pVia = VIAPTR(pScrn); @@ -136,10 +140,10 @@ unsigned long VIAAllocLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, unsigned long siz if (ret || (size != mem->drm.size)) { /* - * Try X Offsceen fallback before failing. + * Try X Offsceen fallback before failing. */ - if (Success == offScreenLinear(mem, pScrn, size)) + if (Success == viaOffScreenLinear(mem, pScrn, size)) return Success; ErrorF("DRM memory allocation failed\n"); return BadAlloc; @@ -152,8 +156,7 @@ unsigned long VIAAllocLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, unsigned long siz } #endif { - mem->pScrn = pScrn; - if (Success == offScreenLinear(mem, pScrn, size)) + if (Success == viaOffScreenLinear(mem, pScrn, size)) return Success; ErrorF("Linear memory allocation failed\n"); return BadAlloc; diff --git a/src/via_swov.c b/src/via_swov.c index 3770518..a3dcb6f 100644 --- a/src/via_swov.c +++ b/src/via_swov.c @@ -71,10 +71,10 @@ viaWaitVideoCommandFire(VIAPtr pVia) { /* * Assume uncached PCI reading throughputs about 9MB/s. 8Bytes / loop means - * Appox 1Mloops / second. We want to time out after 25 ms which means 25000 loops. + * Appox 1Mloops / second. We want to time out after 50 ms which means 50000 loops. */ - unsigned count = 25000; + unsigned count = 50000; CARD32 volatile *pdwState = (CARD32 volatile *)(pVia->VidMapBase + V_COMPOSE_MODE); diff --git a/src/via_xvmc.c b/src/via_xvmc.c index 3ae58e8..ebc3fcf 100644 --- a/src/via_xvmc.c +++ b/src/via_xvmc.c @@ -349,13 +349,6 @@ ViaInitXVMC(ScreenPtr pScreen) "[XvMC] Please update. Disabling XvMC.\n"); return; } - if ((pVia->drmVerMajor >= 3)) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "[XvMC] XvMC X driver may not be compatible " - "with kernel drm.\n"); - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "[XvMC] Continuing, but strange things may happen.\n"); - } vXvMC->mmioBase = pVia->registerHandle; |