|
@@ -46,10 +46,11 @@ static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
|
|
|
list_for_each_entry(entry, &dev->maplist, head) {
|
|
|
/*
|
|
|
* Because the kernel-userspace ABI is fixed at a 32-bit offset
|
|
|
- * while PCI resources may live above that, we ignore the map
|
|
|
- * offset for maps of type _DRM_FRAMEBUFFER or _DRM_REGISTERS.
|
|
|
- * It is assumed that each driver will have only one resource of
|
|
|
- * each type.
|
|
|
+ * while PCI resources may live above that, we only compare the
|
|
|
+ * lower 32 bits of the map offset for maps of type
|
|
|
+ * _DRM_FRAMEBUFFER or _DRM_REGISTERS.
|
|
|
+ * It is assumed that if a driver have more than one resource
|
|
|
+ * of each type, the lower 32 bits are different.
|
|
|
*/
|
|
|
if (!entry->map ||
|
|
|
map->type != entry->map->type ||
|
|
@@ -59,9 +60,12 @@ static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
|
|
|
case _DRM_SHM:
|
|
|
if (map->flags != _DRM_CONTAINS_LOCK)
|
|
|
break;
|
|
|
+ return entry;
|
|
|
case _DRM_REGISTERS:
|
|
|
case _DRM_FRAME_BUFFER:
|
|
|
- return entry;
|
|
|
+ if ((entry->map->offset & 0xffffffff) ==
|
|
|
+ (map->offset & 0xffffffff))
|
|
|
+ return entry;
|
|
|
default: /* Make gcc happy */
|
|
|
;
|
|
|
}
|