From a44a4b3387329bc5d9fa117249c06f9f9a197de1 Mon Sep 17 00:00:00 2001
From: Robert Noland <rnoland@wombat.2hip.net>
Date: Sun, 18 Nov 2007 18:21:42 -0500
Subject: [PATCH] Add _DRM_DRIVER map flag

Add _DRM_DRIVER map flag which allows a driver to create maps which aren't
removed by drm_lastclose.
---
 bsd-core/drm_drv.c     |    3 ++-
 linux-core/drm_drv.c   |    6 ++++--
 shared-core/drm.h      |    3 ++-
 shared-core/i915_dma.c |   11 +++++++++--
 4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/bsd-core/drm_drv.c b/bsd-core/drm_drv.c
index d6868b9..c4337f6 100644
--- a/bsd-core/drm_drv.c
+++ b/bsd-core/drm_drv.c
@@ -495,7 +495,8 @@ static int drm_lastclose(drm_device_t *dev)
 	}
 
 	TAILQ_FOREACH_SAFE(map, &dev->maplist, link, mapsave) {
-		drm_rmmap(dev, map);
+		if !(map->flags & _DRM_DRIVER)
+	    		drm_rmmap(dev, map);
 	}
 
 
diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c
index bba8414..46e3f1a 100644
--- a/linux-core/drm_drv.c
+++ b/linux-core/drm_drv.c
@@ -246,8 +246,10 @@ int drm_lastclose(struct drm_device * dev)
 	}
 
 	list_for_each_entry_safe(r_list, list_t, &dev->maplist, head) {
-		drm_rmmap_locked(dev, r_list->map);
-		r_list = NULL;
+		if !(r_list->map->flags & _DRM_DRIVER) {
+			drm_rmmap_locked(dev, r_list->map);
+			r_list = NULL;
+		}
 	}
 
 	if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) {
diff --git a/shared-core/drm.h b/shared-core/drm.h
index 3941490..504beed 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -249,7 +249,8 @@ enum drm_map_flags {
 	_DRM_KERNEL = 0x08,	     /**< kernel requires access */
 	_DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */
 	_DRM_CONTAINS_LOCK = 0x20,   /**< SHM page that contains lock */
-	_DRM_REMOVABLE = 0x40	     /**< Removable mapping */
+	_DRM_REMOVABLE = 0x40,	     /**< Removable mapping */
+	_DRM_DRIVER = 0x80	     /**< Managed by driver */
 };
 
 struct drm_ctx_priv_map {
diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c
index 4d77dfc..360bc64 100644
--- a/shared-core/i915_dma.c
+++ b/shared-core/i915_dma.c
@@ -1315,12 +1315,15 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
 	base = drm_get_resource_start(dev, mmio_bar);
 	size = drm_get_resource_len(dev, mmio_bar);
 
-	ret = drm_addmap(dev, base, size, _DRM_REGISTERS, _DRM_KERNEL,
-			 &dev_priv->mmio_map);
+	ret = drm_addmap(dev, base, size, _DRM_REGISTERS, 
+		_DRM_KERNEL | _DRM_DRIVER, &dev_priv->mmio_map);
 
+#if defined(__linux__)
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
 	intel_init_chipset_flush_compat(dev);
 #endif
+#endif
+	
 	return ret;
 }
 
@@ -1333,9 +1336,13 @@ int i915_driver_unload(struct drm_device *dev)
 
 	drm_free(dev->dev_private, sizeof(drm_i915_private_t),
 		 DRM_MEM_DRIVER);
+
+#if defined(__linux__)
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
 	intel_fini_chipset_flush_compat(dev);
 #endif
+#endif
+	
 	return 0;
 }
 
-- 
1.5.3.2

