Implement permanent sarea maps
parent
28e123eb3a
commit
143622a987
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue