diff options
Diffstat (limited to 'src/via_dri.c')
-rw-r--r-- | src/via_dri.c | 47 |
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; } } |