summaryrefslogtreecommitdiff
path: root/src/via_dri.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/via_dri.c')
-rw-r--r--src/via_dri.c47
1 files changed, 33 insertions, 14 deletions
diff --git a/src/via_dri.c b/src/via_dri.c
index ce5dade..0ea0eb7 100644
--- a/src/via_dri.c
+++ b/src/via_dri.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c,v 1.4 2003/09/24 02:43:30 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c,v 1.9 2004/02/08 17:57:10 tsi Exp $ */
/*
* Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
* Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -82,7 +82,7 @@ static void VIADRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg,
static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia)
{
unsigned long agp_phys;
- unsigned int agpaddr;
+ drmAddress agpaddr;
VIADRIPtr pVIADRI;
DRIInfoPtr pDRIInfo;
pDRIInfo = pVia->pDRIInfo;
@@ -129,11 +129,14 @@ static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia)
xf86DrvMsg(pScreen->myNum, X_ERROR,
"[drm] Failed to map public agp area\n");
pVIADRI->agp.size = 0;
- return FALSE;
+ drmAgpUnbind(pVia->drmFD, pVia->agpHandle);
+ drmAgpFree(pVia->drmFD, pVia->agpHandle);
+ drmAgpRelease(pVia->drmFD);
+ return FALSE;
}
/* Map AGP from kernel to Xserver - Not really needed */
- drmMap(pVia->drmFD, pVIADRI->agp.handle,pVIADRI->agp.size,
- (drmAddressPtr)&agpaddr);
+ drmMap(pVia->drmFD, pVIADRI->agp.handle, pVIADRI->agp.size, &agpaddr);
+ pVia->agpMappedAddr = agpaddr;
xf86DrvMsg(pScreen->myNum, X_INFO,
"[drm] agpBase = %p\n", pVia->agpBase);
@@ -149,8 +152,14 @@ static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia)
agp.offset = 0;
agp.size = AGP_SIZE;
if (drmCommandWrite(pVia->drmFD, DRM_VIA_AGP_INIT, &agp,
- sizeof(drmViaAgp)) < 0)
+ sizeof(drmViaAgp)) < 0) {
+ drmUnmap(agpaddr,pVia->agpSize);
+ drmRmMap(pVia->drmFD,pVIADRI->agp.handle);
+ drmAgpUnbind(pVia->drmFD, pVia->agpHandle);
+ drmAgpFree(pVia->drmFD, pVia->agpHandle);
+ drmAgpRelease(pVia->drmFD);
return FALSE;
+ }
}
return TRUE;
@@ -462,8 +471,18 @@ VIADRICloseScreen(ScreenPtr pScreen)
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
VIAPtr pVia = VIAPTR(pScrn);
- DRICloseScreen(pScreen);
+ if (pVia->agpSize) {
+ drmUnmap(pVia->agpMappedAddr,pVia->agpSize);
+ drmRmMap(pVia->drmFD,pVia->agpHandle);
+ drmAgpUnbind(pVia->drmFD, pVia->agpHandle);
+ xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n");
+ drmAgpFree(pVia->drmFD, pVia->agpHandle);
+ xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n");
+ drmAgpRelease(pVia->drmFD);
+ }
+ DRICloseScreen(pScreen);
+
if (pVia->pDRIInfo) {
if (pVia->pDRIInfo->devPrivate) {
xfree(pVia->pDRIInfo->devPrivate);
@@ -473,13 +492,13 @@ VIADRICloseScreen(ScreenPtr pScreen)
pVia->pDRIInfo=0;
}
- if (pVia->pVisualConfigs) xfree(pVia->pVisualConfigs);
- if (pVia->pVisualConfigsPriv) xfree(pVia->pVisualConfigsPriv);
- if (pVia->agpSize) {
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n");
- drmAgpFree(pVia->drmFD, pVia->agpHandle);
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n");
- drmAgpRelease(pVia->drmFD);
+ if (pVia->pVisualConfigs) {
+ xfree(pVia->pVisualConfigs);
+ pVia->pVisualConfigs = NULL;
+ }
+ if (pVia->pVisualConfigsPriv) {
+ xfree(pVia->pVisualConfigsPriv);
+ pVia->pVisualConfigsPriv = NULL;
}
}