Adjust permanent mapping code to account for more than one framebuffer map
parent
b0c73b7fcb
commit
3bf785c912
|
@ -59,6 +59,7 @@ int DRM(order)( unsigned long size )
|
|||
return order;
|
||||
}
|
||||
|
||||
static int permanent_maps = 0;
|
||||
/**
|
||||
* Adjusts the memory offset to its absolute value according to the mapping
|
||||
* type. Adds the map to the map list drm_device::maplist. Adds MTRR's where
|
||||
|
@ -117,6 +118,7 @@ int DRM(initmap)( drm_device_t *dev, unsigned int offset, unsigned int size, int
|
|||
list_add(&list->head, &dev->maplist->head);
|
||||
up(&dev->struct_sem);
|
||||
|
||||
permanent_maps = 1;
|
||||
DRM_DEBUG("finished\n");
|
||||
|
||||
return 0;
|
||||
|
@ -178,10 +180,13 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
|
|||
/* after all the drivers switch to permanent mapping this should just return an error */
|
||||
struct list_head *_list;
|
||||
|
||||
/* if map already exists, return the existing one instead of creating a new one */
|
||||
/* If permanent maps are implemented, maps must match */
|
||||
if (permanent_maps) {
|
||||
list_for_each( _list, &dev->maplist->head ) {
|
||||
drm_map_list_t *_entry = list_entry( _list, drm_map_list_t, head );
|
||||
if ( _entry->map && _entry->map->type == map->type ) {
|
||||
if ( _entry->map && _entry->map->type == map->type &&
|
||||
_entry->map->offset == map->offset &&
|
||||
_entry->map->size == map->size ) {
|
||||
DRM(free)( map, sizeof(*map), DRM_MEM_MAPS );
|
||||
map = _entry->map;
|
||||
DRM_DEBUG( "Found existing: offset = 0x%08lx, size = 0x%08lx, type = %d\n",
|
||||
|
@ -189,6 +194,9 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
|
|||
goto found_it;
|
||||
}
|
||||
}
|
||||
/* addmap didn't match an existing permanent map, that's an error */
|
||||
return -EINVAL;
|
||||
}
|
||||
#if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__)
|
||||
if ( map->offset + map->size < map->offset ||
|
||||
map->offset < virt_to_phys(high_memory) ) {
|
||||
|
|
|
@ -59,6 +59,7 @@ int DRM(order)( unsigned long size )
|
|||
return order;
|
||||
}
|
||||
|
||||
static int permanent_maps = 0;
|
||||
/**
|
||||
* Adjusts the memory offset to its absolute value according to the mapping
|
||||
* type. Adds the map to the map list drm_device::maplist. Adds MTRR's where
|
||||
|
@ -117,6 +118,7 @@ int DRM(initmap)( drm_device_t *dev, unsigned int offset, unsigned int size, int
|
|||
list_add(&list->head, &dev->maplist->head);
|
||||
up(&dev->struct_sem);
|
||||
|
||||
permanent_maps = 1;
|
||||
DRM_DEBUG("finished\n");
|
||||
|
||||
return 0;
|
||||
|
@ -178,10 +180,13 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
|
|||
/* after all the drivers switch to permanent mapping this should just return an error */
|
||||
struct list_head *_list;
|
||||
|
||||
/* if map already exists, return the existing one instead of creating a new one */
|
||||
/* If permanent maps are implemented, maps must match */
|
||||
if (permanent_maps) {
|
||||
list_for_each( _list, &dev->maplist->head ) {
|
||||
drm_map_list_t *_entry = list_entry( _list, drm_map_list_t, head );
|
||||
if ( _entry->map && _entry->map->type == map->type ) {
|
||||
if ( _entry->map && _entry->map->type == map->type &&
|
||||
_entry->map->offset == map->offset &&
|
||||
_entry->map->size == map->size ) {
|
||||
DRM(free)( map, sizeof(*map), DRM_MEM_MAPS );
|
||||
map = _entry->map;
|
||||
DRM_DEBUG( "Found existing: offset = 0x%08lx, size = 0x%08lx, type = %d\n",
|
||||
|
@ -189,6 +194,9 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
|
|||
goto found_it;
|
||||
}
|
||||
}
|
||||
/* addmap didn't match an existing permanent map, that's an error */
|
||||
return -EINVAL;
|
||||
}
|
||||
#if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__)
|
||||
if ( map->offset + map->size < map->offset ||
|
||||
map->offset < virt_to_phys(high_memory) ) {
|
||||
|
|
Loading…
Reference in New Issue