summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellström <thomas@tungstengraphics.com>2006-07-21 15:59:21 +0200
committerThomas Hellström <thomas@tungstengraphics.com>2006-07-21 15:59:21 +0200
commit1ee80048ffdf16980a24b0b954a8525ab7622b67 (patch)
tree894de6420ebea4b81364fe623b31f2bbbd72f04a
parentb11bcf15368465c02300657393a563e9dd7b7b37 (diff)
Openchrome Changesets 189-192, 194.
Important memory management bugfix. DRM compatibility check.
-rw-r--r--src/via_dri.c33
-rw-r--r--src/via_driver.h3
-rw-r--r--src/via_memory.c17
-rw-r--r--src/via_swov.c4
-rw-r--r--src/via_xvmc.c7
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;