From 4b2235d2e089a512b26ecd66ae42ea279fbb1df2 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 8 Nov 2005 06:11:55 +0000 Subject: Correct a LOR related to the PCI resource allocations by simply moving the uninit to unload time rather than lastclose. --- bsd-core/drm_bufs.c | 2 +- bsd-core/drm_drv.c | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'bsd-core') diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c index f088703c..93bcc812 100644 --- a/bsd-core/drm_bufs.c +++ b/bsd-core/drm_bufs.c @@ -53,7 +53,7 @@ int drm_order(unsigned long size) /* Allocation of PCI memory resources (framebuffer, registers, etc.) for * drm_get_resource_*. Note that they are not RF_ACTIVE, so there's no virtual - * address for accessing them. Cleaned up at lastclose. + * address for accessing them. Cleaned up at unload. */ static int drm_alloc_resource(drm_device_t *dev, int resource) { diff --git a/bsd-core/drm_drv.c b/bsd-core/drm_drv.c index 648fbf3d..6766195b 100644 --- a/bsd-core/drm_drv.c +++ b/bsd-core/drm_drv.c @@ -474,13 +474,7 @@ static int drm_lastclose(drm_device_t *dev) TAILQ_FOREACH_SAFE(map, &dev->maplist, link, mapsave) { drm_rmmap(dev, map); } - for (i = 0; i < DRM_MAX_PCI_RESOURCE; i++) { - if (dev->pcir[i] == NULL) - continue; - bus_release_resource(dev->device, SYS_RES_MEMORY, - dev->pcirid[i], dev->pcir[i]); - dev->pcir[i] = NULL; - } + drm_dma_takedown(dev); if ( dev->lock.hw_lock ) { @@ -568,6 +562,8 @@ error: static void drm_unload(drm_device_t *dev) { + int i; + DRM_DEBUG( "\n" ); #ifdef __FreeBSD__ @@ -589,6 +585,19 @@ static void drm_unload(drm_device_t *dev) drm_lastclose(dev); DRM_UNLOCK(); + /* Clean up PCI resources allocated by drm_bufs.c. We're not really + * worried about resource consumption while the DRM is inactive (between + * lastclose and firstopen or unload) because these aren't actually + * taking up KVA, just keeping the PCI resource allocated. + */ + for (i = 0; i < DRM_MAX_PCI_RESOURCE; i++) { + if (dev->pcir[i] == NULL) + continue; + bus_release_resource(dev->device, SYS_RES_MEMORY, + dev->pcirid[i], dev->pcir[i]); + dev->pcir[i] = NULL; + } + if ( dev->agp ) { free(dev->agp, M_DRM); dev->agp = NULL; -- cgit v1.2.3