diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/drm_bufs.c | 16 | ||||
| -rw-r--r-- | linux-core/drm_fops.c | 12 | 
2 files changed, 25 insertions, 3 deletions
diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index c508c392..b343a99a 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -56,7 +56,8 @@ static drm_local_map_t *drm_find_matching_map(drm_device_t *dev,  	list_for_each(list, &dev->maplist->head) {  		drm_map_list_t *entry = list_entry(list, drm_map_list_t, head);  		if (entry->map && map->type == entry->map->type && -		    entry->map->offset == map->offset) { +		    ((entry->map->offset == map->offset) || +		     (map->type == _DRM_SHM))) {  			return entry->map;  		}  	} @@ -163,6 +164,19 @@ int drm_addmap(drm_device_t * dev, unsigned int offset,  			map->handle = drm_ioremap(map->offset, map->size, dev);  		break;  	case _DRM_SHM: +		found_map = drm_find_matching_map(dev, map); +		if (found_map != NULL) { +			if (found_map->size != map->size) { +				DRM_DEBUG("Matching maps of type %d with " +				   "mismatched sizes, (%ld vs %ld)\n", +				    map->type, map->size, found_map->size); +				found_map->size = map->size; +			} + +			drm_free(map, sizeof(*map), DRM_MEM_MAPS); +			*map_ptr = found_map; +			return 0; +		}  		map->handle = vmalloc_32(map->size);  		DRM_DEBUG("%lu %d %p\n",  			  map->size, drm_order(map->size), map->handle); diff --git a/linux-core/drm_fops.c b/linux-core/drm_fops.c index 4e6cd8b4..ca70c2c8 100644 --- a/linux-core/drm_fops.c +++ b/linux-core/drm_fops.c @@ -34,18 +34,26 @@   * OTHER DEALINGS IN THE SOFTWARE.   */ -#include "drmP.h"  #include <linux/poll.h> +#include "drmP.h" +#include "drm_sarea.h" +  static int drm_open_helper(struct inode *inode, struct file *filp, drm_device_t * dev);  static int drm_setup(drm_device_t * dev)  { +	drm_local_map_t *map;  	int i;  	if (dev->driver->presetup)  		dev->driver->presetup(dev); +	/* prebuild the SAREA */ +	i = drm_addmap(dev, 0, SAREA_MAX, _DRM_SHM, _DRM_CONTAINS_LOCK, &map); +	if (i != 0) +		return i; +  	atomic_set(&dev->ioctl_count, 0);  	atomic_set(&dev->vma_count, 0);  	dev->buf_use = 0; @@ -72,7 +80,7 @@ static int drm_setup(drm_device_t * dev)  	INIT_LIST_HEAD(&dev->ctxlist->head);  	dev->vmalist = NULL; -	dev->sigdata.lock = dev->lock.hw_lock = NULL; +	dev->sigdata.lock = NULL;  	init_waitqueue_head(&dev->lock.lock_queue);  	dev->queue_count = 0;  	dev->queue_reserved = 0;  | 
