Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3236a11 authored by Dave Airlie's avatar Dave Airlie
Browse files

drm: add _DRM_DRIVER flag, and re-order unload.



Allow drivers to addmaps that won't be removed by lastclose or unload.
The unload needs to be re-ordered to avoid removing the hashs before
the driver has removed the final maps.

Signed-off-by: default avatarDave Airlie <airlied@linux.ie>
parent 77e27e9f
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -202,7 +202,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 {
+7 −6
Original line number Diff line number Diff line
@@ -200,9 +200,11 @@ int drm_lastclose(struct drm_device * dev)
	}

	list_for_each_entry_safe(r_list, list_t, &dev->maplist, head) {
		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) {
		for (i = 0; i < dev->queue_count; i++) {
@@ -291,10 +293,6 @@ static void drm_cleanup(struct drm_device * dev)

	drm_lastclose(dev);

	drm_ht_remove(&dev->map_hash);

	drm_ctxbitmap_cleanup(dev);

	if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
	    dev->agp && dev->agp->agp_mtrr >= 0) {
		int retval;
@@ -312,6 +310,9 @@ static void drm_cleanup(struct drm_device * dev)
	if (dev->driver->unload)
		dev->driver->unload(dev);

	drm_ht_remove(&dev->map_hash);
	drm_ctxbitmap_cleanup(dev);

	drm_put_head(&dev->primary);
	if (drm_put_dev(dev))
		DRM_ERROR("Cannot unload module\n");
+2 −1
Original line number Diff line number Diff line
@@ -778,7 +778,8 @@ 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,
	ret = drm_addmap(dev, base, size, _DRM_REGISTERS,
			 _DRM_KERNEL | _DRM_DRIVER,
			 &dev_priv->mmio_map);
	return ret;
}