Skip to content

Commit

Permalink
drm: add _DRM_DRIVER flag, and re-order unload.
Browse files Browse the repository at this point in the history
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: Dave Airlie <airlied@linux.ie>
  • Loading branch information
Dave Airlie committed Feb 7, 2008
1 parent 77e27e9 commit e3236a1
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 8 deletions.
3 changes: 2 additions & 1 deletion drivers/char/drm/drm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
13 changes: 7 additions & 6 deletions drivers/char/drm/drm_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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");
Expand Down
3 changes: 2 additions & 1 deletion drivers/char/drm/i915_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit e3236a1

Please sign in to comment.