diff options
-rw-r--r-- | drivers/gpu/drm/drm_gem.c | 89 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_gem_cma_helper.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/gem.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem_helpers.c | 49 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_gem.c | 13 | ||||
-rw-r--r-- | drivers/gpu/host1x/drm/gem.c | 5 | ||||
-rw-r--r-- | include/drm/drmP.h | 7 | ||||
-rw-r--r-- | include/uapi/drm/drm.h | 2 |
11 files changed, 62 insertions, 186 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 1ad9e7ec0119..3613b50b5c26 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/shmem_fs.h> | 37 | #include <linux/shmem_fs.h> |
38 | #include <linux/dma-buf.h> | 38 | #include <linux/dma-buf.h> |
39 | #include <drm/drmP.h> | 39 | #include <drm/drmP.h> |
40 | #include <drm/drm_vma_manager.h> | ||
40 | 41 | ||
41 | /** @file drm_gem.c | 42 | /** @file drm_gem.c |
42 | * | 43 | * |
@@ -102,14 +103,9 @@ drm_gem_init(struct drm_device *dev) | |||
102 | } | 103 | } |
103 | 104 | ||
104 | dev->mm_private = mm; | 105 | dev->mm_private = mm; |
105 | 106 | drm_vma_offset_manager_init(&mm->vma_manager, | |
106 | if (drm_ht_create(&mm->offset_hash, 12)) { | 107 | DRM_FILE_PAGE_OFFSET_START, |
107 | kfree(mm); | 108 | DRM_FILE_PAGE_OFFSET_SIZE); |
108 | return -ENOMEM; | ||
109 | } | ||
110 | |||
111 | drm_mm_init(&mm->offset_manager, DRM_FILE_PAGE_OFFSET_START, | ||
112 | DRM_FILE_PAGE_OFFSET_SIZE); | ||
113 | 109 | ||
114 | return 0; | 110 | return 0; |
115 | } | 111 | } |
@@ -119,8 +115,7 @@ drm_gem_destroy(struct drm_device *dev) | |||
119 | { | 115 | { |
120 | struct drm_gem_mm *mm = dev->mm_private; | 116 | struct drm_gem_mm *mm = dev->mm_private; |
121 | 117 | ||
122 | drm_mm_takedown(&mm->offset_manager); | 118 | drm_vma_offset_manager_destroy(&mm->vma_manager); |
123 | drm_ht_remove(&mm->offset_hash); | ||
124 | kfree(mm); | 119 | kfree(mm); |
125 | dev->mm_private = NULL; | 120 | dev->mm_private = NULL; |
126 | } | 121 | } |
@@ -302,12 +297,8 @@ drm_gem_free_mmap_offset(struct drm_gem_object *obj) | |||
302 | { | 297 | { |
303 | struct drm_device *dev = obj->dev; | 298 | struct drm_device *dev = obj->dev; |
304 | struct drm_gem_mm *mm = dev->mm_private; | 299 | struct drm_gem_mm *mm = dev->mm_private; |
305 | struct drm_map_list *list = &obj->map_list; | ||
306 | 300 | ||
307 | drm_ht_remove_item(&mm->offset_hash, &list->hash); | 301 | drm_vma_offset_remove(&mm->vma_manager, &obj->vma_node); |
308 | drm_mm_put_block(list->file_offset_node); | ||
309 | kfree(list->map); | ||
310 | list->map = NULL; | ||
311 | } | 302 | } |
312 | EXPORT_SYMBOL(drm_gem_free_mmap_offset); | 303 | EXPORT_SYMBOL(drm_gem_free_mmap_offset); |
313 | 304 | ||
@@ -327,54 +318,9 @@ drm_gem_create_mmap_offset(struct drm_gem_object *obj) | |||
327 | { | 318 | { |
328 | struct drm_device *dev = obj->dev; | 319 | struct drm_device *dev = obj->dev; |
329 | struct drm_gem_mm *mm = dev->mm_private; | 320 | struct drm_gem_mm *mm = dev->mm_private; |
330 | struct drm_map_list *list; | ||
331 | struct drm_local_map *map; | ||
332 | int ret; | ||
333 | |||
334 | /* Set the object up for mmap'ing */ | ||
335 | list = &obj->map_list; | ||
336 | list->map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL); | ||
337 | if (!list->map) | ||
338 | return -ENOMEM; | ||
339 | |||
340 | map = list->map; | ||
341 | map->type = _DRM_GEM; | ||
342 | map->size = obj->size; | ||
343 | map->handle = obj; | ||
344 | |||
345 | /* Get a DRM GEM mmap offset allocated... */ | ||
346 | list->file_offset_node = drm_mm_search_free(&mm->offset_manager, | ||
347 | obj->size / PAGE_SIZE, 0, false); | ||
348 | |||
349 | if (!list->file_offset_node) { | ||
350 | DRM_ERROR("failed to allocate offset for bo %d\n", obj->name); | ||
351 | ret = -ENOSPC; | ||
352 | goto out_free_list; | ||
353 | } | ||
354 | 321 | ||
355 | list->file_offset_node = drm_mm_get_block(list->file_offset_node, | 322 | return drm_vma_offset_add(&mm->vma_manager, &obj->vma_node, |
356 | obj->size / PAGE_SIZE, 0); | 323 | obj->size / PAGE_SIZE); |
357 | if (!list->file_offset_node) { | ||
358 | ret = -ENOMEM; | ||
359 | goto out_free_list; | ||
360 | } | ||
361 | |||
362 | list->hash.key = list->file_offset_node->start; | ||
363 | ret = drm_ht_insert_item(&mm->offset_hash, &list->hash); | ||
364 | if (ret) { | ||
365 | DRM_ERROR("failed to add to map hash\n"); | ||
366 | goto out_free_mm; | ||
367 | } | ||
368 | |||
369 | return 0; | ||
370 | |||
371 | out_free_mm: | ||
372 | drm_mm_put_block(list->file_offset_node); | ||
373 | out_free_list: | ||
374 | kfree(list->map); | ||
375 | list->map = NULL; | ||
376 | |||
377 | return ret; | ||
378 | } | 324 | } |
379 | EXPORT_SYMBOL(drm_gem_create_mmap_offset); | 325 | EXPORT_SYMBOL(drm_gem_create_mmap_offset); |
380 | 326 | ||
@@ -703,8 +649,8 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) | |||
703 | struct drm_file *priv = filp->private_data; | 649 | struct drm_file *priv = filp->private_data; |
704 | struct drm_device *dev = priv->minor->dev; | 650 | struct drm_device *dev = priv->minor->dev; |
705 | struct drm_gem_mm *mm = dev->mm_private; | 651 | struct drm_gem_mm *mm = dev->mm_private; |
706 | struct drm_local_map *map = NULL; | 652 | struct drm_gem_object *obj; |
707 | struct drm_hash_item *hash; | 653 | struct drm_vma_offset_node *node; |
708 | int ret = 0; | 654 | int ret = 0; |
709 | 655 | ||
710 | if (drm_device_is_unplugged(dev)) | 656 | if (drm_device_is_unplugged(dev)) |
@@ -712,21 +658,16 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) | |||
712 | 658 | ||
713 | mutex_lock(&dev->struct_mutex); | 659 | mutex_lock(&dev->struct_mutex); |
714 | 660 | ||
715 | if (drm_ht_find_item(&mm->offset_hash, vma->vm_pgoff, &hash)) { | 661 | node = drm_vma_offset_exact_lookup(&mm->vma_manager, vma->vm_pgoff, |
662 | vma_pages(vma)); | ||
663 | if (!node) { | ||
716 | mutex_unlock(&dev->struct_mutex); | 664 | mutex_unlock(&dev->struct_mutex); |
717 | return drm_mmap(filp, vma); | 665 | return drm_mmap(filp, vma); |
718 | } | 666 | } |
719 | 667 | ||
720 | map = drm_hash_entry(hash, struct drm_map_list, hash)->map; | 668 | obj = container_of(node, struct drm_gem_object, vma_node); |
721 | if (!map || | 669 | ret = drm_gem_mmap_obj(obj, drm_vma_node_size(node), vma); |
722 | ((map->flags & _DRM_RESTRICTED) && !capable(CAP_SYS_ADMIN))) { | ||
723 | ret = -EPERM; | ||
724 | goto out_unlock; | ||
725 | } | ||
726 | |||
727 | ret = drm_gem_mmap_obj(map->handle, map->size, vma); | ||
728 | 670 | ||
729 | out_unlock: | ||
730 | mutex_unlock(&dev->struct_mutex); | 671 | mutex_unlock(&dev->struct_mutex); |
731 | 672 | ||
732 | return ret; | 673 | return ret; |
diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c index ece72a8ac245..847f09117666 100644 --- a/drivers/gpu/drm/drm_gem_cma_helper.c +++ b/drivers/gpu/drm/drm_gem_cma_helper.c | |||
@@ -27,11 +27,7 @@ | |||
27 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
28 | #include <drm/drm.h> | 28 | #include <drm/drm.h> |
29 | #include <drm/drm_gem_cma_helper.h> | 29 | #include <drm/drm_gem_cma_helper.h> |
30 | 30 | #include <drm/drm_vma_manager.h> | |
31 | static unsigned int get_gem_mmap_offset(struct drm_gem_object *obj) | ||
32 | { | ||
33 | return (unsigned int)obj->map_list.hash.key << PAGE_SHIFT; | ||
34 | } | ||
35 | 31 | ||
36 | /* | 32 | /* |
37 | * __drm_gem_cma_create - Create a GEM CMA object without allocating memory | 33 | * __drm_gem_cma_create - Create a GEM CMA object without allocating memory |
@@ -172,8 +168,7 @@ void drm_gem_cma_free_object(struct drm_gem_object *gem_obj) | |||
172 | { | 168 | { |
173 | struct drm_gem_cma_object *cma_obj; | 169 | struct drm_gem_cma_object *cma_obj; |
174 | 170 | ||
175 | if (gem_obj->map_list.map) | 171 | drm_gem_free_mmap_offset(gem_obj); |
176 | drm_gem_free_mmap_offset(gem_obj); | ||
177 | 172 | ||
178 | cma_obj = to_drm_gem_cma_obj(gem_obj); | 173 | cma_obj = to_drm_gem_cma_obj(gem_obj); |
179 | 174 | ||
@@ -237,7 +232,7 @@ int drm_gem_cma_dumb_map_offset(struct drm_file *file_priv, | |||
237 | return -EINVAL; | 232 | return -EINVAL; |
238 | } | 233 | } |
239 | 234 | ||
240 | *offset = get_gem_mmap_offset(gem_obj); | 235 | *offset = drm_vma_node_offset_addr(&gem_obj->vma_node); |
241 | 236 | ||
242 | drm_gem_object_unreference(gem_obj); | 237 | drm_gem_object_unreference(gem_obj); |
243 | 238 | ||
@@ -301,12 +296,11 @@ void drm_gem_cma_describe(struct drm_gem_cma_object *cma_obj, struct seq_file *m | |||
301 | { | 296 | { |
302 | struct drm_gem_object *obj = &cma_obj->base; | 297 | struct drm_gem_object *obj = &cma_obj->base; |
303 | struct drm_device *dev = obj->dev; | 298 | struct drm_device *dev = obj->dev; |
304 | uint64_t off = 0; | 299 | uint64_t off; |
305 | 300 | ||
306 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | 301 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); |
307 | 302 | ||
308 | if (obj->map_list.map) | 303 | off = drm_vma_node_start(&obj->vma_node); |
309 | off = (uint64_t)obj->map_list.hash.key; | ||
310 | 304 | ||
311 | seq_printf(m, "%2d (%2d) %08llx %08Zx %p %d", | 305 | seq_printf(m, "%2d (%2d) %08llx %08Zx %p %d", |
312 | obj->name, obj->refcount.refcount.counter, | 306 | obj->name, obj->refcount.refcount.counter, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 24c22a8c3364..be32db1ab290 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
@@ -10,6 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <drm/drmP.h> | 12 | #include <drm/drmP.h> |
13 | #include <drm/drm_vma_manager.h> | ||
13 | 14 | ||
14 | #include <linux/shmem_fs.h> | 15 | #include <linux/shmem_fs.h> |
15 | #include <drm/exynos_drm.h> | 16 | #include <drm/exynos_drm.h> |
@@ -152,8 +153,7 @@ out: | |||
152 | exynos_drm_fini_buf(obj->dev, buf); | 153 | exynos_drm_fini_buf(obj->dev, buf); |
153 | exynos_gem_obj->buffer = NULL; | 154 | exynos_gem_obj->buffer = NULL; |
154 | 155 | ||
155 | if (obj->map_list.map) | 156 | drm_gem_free_mmap_offset(obj); |
156 | drm_gem_free_mmap_offset(obj); | ||
157 | 157 | ||
158 | /* release file pointer to gem object. */ | 158 | /* release file pointer to gem object. */ |
159 | drm_gem_object_release(obj); | 159 | drm_gem_object_release(obj); |
@@ -703,13 +703,11 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, | |||
703 | goto unlock; | 703 | goto unlock; |
704 | } | 704 | } |
705 | 705 | ||
706 | if (!obj->map_list.map) { | 706 | ret = drm_gem_create_mmap_offset(obj); |
707 | ret = drm_gem_create_mmap_offset(obj); | 707 | if (ret) |
708 | if (ret) | 708 | goto out; |
709 | goto out; | ||
710 | } | ||
711 | 709 | ||
712 | *offset = (u64)obj->map_list.hash.key << PAGE_SHIFT; | 710 | *offset = drm_vma_node_offset_addr(&obj->vma_node); |
713 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); | 711 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); |
714 | 712 | ||
715 | out: | 713 | out: |
diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c index fe1d3320ce6a..2f77bea30b11 100644 --- a/drivers/gpu/drm/gma500/gem.c +++ b/drivers/gpu/drm/gma500/gem.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <drm/drmP.h> | 26 | #include <drm/drmP.h> |
27 | #include <drm/drm.h> | 27 | #include <drm/drm.h> |
28 | #include <drm/gma_drm.h> | 28 | #include <drm/gma_drm.h> |
29 | #include <drm/drm_vma_manager.h> | ||
29 | #include "psb_drv.h" | 30 | #include "psb_drv.h" |
30 | 31 | ||
31 | int psb_gem_init_object(struct drm_gem_object *obj) | 32 | int psb_gem_init_object(struct drm_gem_object *obj) |
@@ -38,8 +39,7 @@ void psb_gem_free_object(struct drm_gem_object *obj) | |||
38 | struct gtt_range *gtt = container_of(obj, struct gtt_range, gem); | 39 | struct gtt_range *gtt = container_of(obj, struct gtt_range, gem); |
39 | 40 | ||
40 | /* Remove the list map if one is present */ | 41 | /* Remove the list map if one is present */ |
41 | if (obj->map_list.map) | 42 | drm_gem_free_mmap_offset(obj); |
42 | drm_gem_free_mmap_offset(obj); | ||
43 | drm_gem_object_release(obj); | 43 | drm_gem_object_release(obj); |
44 | 44 | ||
45 | /* This must occur last as it frees up the memory of the GEM object */ | 45 | /* This must occur last as it frees up the memory of the GEM object */ |
@@ -81,13 +81,10 @@ int psb_gem_dumb_map_gtt(struct drm_file *file, struct drm_device *dev, | |||
81 | /* What validation is needed here ? */ | 81 | /* What validation is needed here ? */ |
82 | 82 | ||
83 | /* Make it mmapable */ | 83 | /* Make it mmapable */ |
84 | if (!obj->map_list.map) { | 84 | ret = drm_gem_create_mmap_offset(obj); |
85 | ret = drm_gem_create_mmap_offset(obj); | 85 | if (ret) |
86 | if (ret) | 86 | goto out; |
87 | goto out; | 87 | *offset = drm_vma_node_offset_addr(&obj->vma_node); |
88 | } | ||
89 | /* GEM should really work out the hash offsets for us */ | ||
90 | *offset = (u64)obj->map_list.hash.key << PAGE_SHIFT; | ||
91 | out: | 88 | out: |
92 | drm_gem_object_unreference(obj); | 89 | drm_gem_object_unreference(obj); |
93 | unlock: | 90 | unlock: |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 46bf7e3887d4..53f81b3b3424 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | #include <drm/drmP.h> | 28 | #include <drm/drmP.h> |
29 | #include <drm/drm_vma_manager.h> | ||
29 | #include <drm/i915_drm.h> | 30 | #include <drm/i915_drm.h> |
30 | #include "i915_drv.h" | 31 | #include "i915_drv.h" |
31 | #include "i915_trace.h" | 32 | #include "i915_trace.h" |
@@ -1428,7 +1429,7 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj) | |||
1428 | 1429 | ||
1429 | if (obj->base.dev->dev_mapping) | 1430 | if (obj->base.dev->dev_mapping) |
1430 | unmap_mapping_range(obj->base.dev->dev_mapping, | 1431 | unmap_mapping_range(obj->base.dev->dev_mapping, |
1431 | (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT, | 1432 | (loff_t)drm_vma_node_offset_addr(&obj->base.vma_node), |
1432 | obj->base.size, 1); | 1433 | obj->base.size, 1); |
1433 | 1434 | ||
1434 | obj->fault_mappable = false; | 1435 | obj->fault_mappable = false; |
@@ -1486,7 +1487,7 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj) | |||
1486 | struct drm_i915_private *dev_priv = obj->base.dev->dev_private; | 1487 | struct drm_i915_private *dev_priv = obj->base.dev->dev_private; |
1487 | int ret; | 1488 | int ret; |
1488 | 1489 | ||
1489 | if (obj->base.map_list.map) | 1490 | if (drm_vma_node_has_offset(&obj->base.vma_node)) |
1490 | return 0; | 1491 | return 0; |
1491 | 1492 | ||
1492 | dev_priv->mm.shrinker_no_lock_stealing = true; | 1493 | dev_priv->mm.shrinker_no_lock_stealing = true; |
@@ -1517,9 +1518,6 @@ out: | |||
1517 | 1518 | ||
1518 | static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj) | 1519 | static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj) |
1519 | { | 1520 | { |
1520 | if (!obj->base.map_list.map) | ||
1521 | return; | ||
1522 | |||
1523 | drm_gem_free_mmap_offset(&obj->base); | 1521 | drm_gem_free_mmap_offset(&obj->base); |
1524 | } | 1522 | } |
1525 | 1523 | ||
@@ -1558,7 +1556,7 @@ i915_gem_mmap_gtt(struct drm_file *file, | |||
1558 | if (ret) | 1556 | if (ret) |
1559 | goto out; | 1557 | goto out; |
1560 | 1558 | ||
1561 | *offset = (u64)obj->base.map_list.hash.key << PAGE_SHIFT; | 1559 | *offset = drm_vma_node_offset_addr(&obj->base.vma_node); |
1562 | 1560 | ||
1563 | out: | 1561 | out: |
1564 | drm_gem_object_unreference(&obj->base); | 1562 | drm_gem_object_unreference(&obj->base); |
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c index cbcd71e6ed83..f90531fc00c9 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #include <linux/spinlock.h> | 21 | #include <linux/spinlock.h> |
22 | #include <linux/shmem_fs.h> | 22 | #include <linux/shmem_fs.h> |
23 | #include <drm/drm_vma_manager.h> | ||
23 | 24 | ||
24 | #include "omap_drv.h" | 25 | #include "omap_drv.h" |
25 | #include "omap_dmm_tiler.h" | 26 | #include "omap_dmm_tiler.h" |
@@ -308,21 +309,20 @@ uint32_t omap_gem_flags(struct drm_gem_object *obj) | |||
308 | static uint64_t mmap_offset(struct drm_gem_object *obj) | 309 | static uint64_t mmap_offset(struct drm_gem_object *obj) |
309 | { | 310 | { |
310 | struct drm_device *dev = obj->dev; | 311 | struct drm_device *dev = obj->dev; |
312 | int ret; | ||
313 | size_t size; | ||
311 | 314 | ||
312 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | 315 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); |
313 | 316 | ||
314 | if (!obj->map_list.map) { | 317 | /* Make it mmapable */ |
315 | /* Make it mmapable */ | 318 | size = omap_gem_mmap_size(obj); |
316 | size_t size = omap_gem_mmap_size(obj); | 319 | ret = _drm_gem_create_mmap_offset_size(obj, size); |
317 | int ret = _drm_gem_create_mmap_offset_size(obj, size); | 320 | if (ret) { |
318 | 321 | dev_err(dev->dev, "could not allocate mmap offset\n"); | |
319 | if (ret) { | 322 | return 0; |
320 | dev_err(dev->dev, "could not allocate mmap offset\n"); | ||
321 | return 0; | ||
322 | } | ||
323 | } | 323 | } |
324 | 324 | ||
325 | return (uint64_t)obj->map_list.hash.key << PAGE_SHIFT; | 325 | return drm_vma_node_offset_addr(&obj->vma_node); |
326 | } | 326 | } |
327 | 327 | ||
328 | uint64_t omap_gem_mmap_offset(struct drm_gem_object *obj) | 328 | uint64_t omap_gem_mmap_offset(struct drm_gem_object *obj) |
@@ -997,12 +997,11 @@ void omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m) | |||
997 | { | 997 | { |
998 | struct drm_device *dev = obj->dev; | 998 | struct drm_device *dev = obj->dev; |
999 | struct omap_gem_object *omap_obj = to_omap_bo(obj); | 999 | struct omap_gem_object *omap_obj = to_omap_bo(obj); |
1000 | uint64_t off = 0; | 1000 | uint64_t off; |
1001 | 1001 | ||
1002 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | 1002 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); |
1003 | 1003 | ||
1004 | if (obj->map_list.map) | 1004 | off = drm_vma_node_start(&obj->vma_node); |
1005 | off = (uint64_t)obj->map_list.hash.key; | ||
1006 | 1005 | ||
1007 | seq_printf(m, "%08x: %2d (%2d) %08llx %08Zx (%2d) %p %4d", | 1006 | seq_printf(m, "%08x: %2d (%2d) %08llx %08Zx (%2d) %p %4d", |
1008 | omap_obj->flags, obj->name, obj->refcount.refcount.counter, | 1007 | omap_obj->flags, obj->name, obj->refcount.refcount.counter, |
@@ -1309,8 +1308,7 @@ void omap_gem_free_object(struct drm_gem_object *obj) | |||
1309 | 1308 | ||
1310 | list_del(&omap_obj->mm_list); | 1309 | list_del(&omap_obj->mm_list); |
1311 | 1310 | ||
1312 | if (obj->map_list.map) | 1311 | drm_gem_free_mmap_offset(obj); |
1313 | drm_gem_free_mmap_offset(obj); | ||
1314 | 1312 | ||
1315 | /* this means the object is still pinned.. which really should | 1313 | /* this means the object is still pinned.. which really should |
1316 | * not happen. I think.. | 1314 | * not happen. I think.. |
diff --git a/drivers/gpu/drm/omapdrm/omap_gem_helpers.c b/drivers/gpu/drm/omapdrm/omap_gem_helpers.c index f9eb679eb79b..dbb157542f8f 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem_helpers.c +++ b/drivers/gpu/drm/omapdrm/omap_gem_helpers.c | |||
@@ -118,52 +118,7 @@ _drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size) | |||
118 | { | 118 | { |
119 | struct drm_device *dev = obj->dev; | 119 | struct drm_device *dev = obj->dev; |
120 | struct drm_gem_mm *mm = dev->mm_private; | 120 | struct drm_gem_mm *mm = dev->mm_private; |
121 | struct drm_map_list *list; | ||
122 | struct drm_local_map *map; | ||
123 | int ret = 0; | ||
124 | |||
125 | /* Set the object up for mmap'ing */ | ||
126 | list = &obj->map_list; | ||
127 | list->map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL); | ||
128 | if (!list->map) | ||
129 | return -ENOMEM; | ||
130 | |||
131 | map = list->map; | ||
132 | map->type = _DRM_GEM; | ||
133 | map->size = size; | ||
134 | map->handle = obj; | ||
135 | |||
136 | /* Get a DRM GEM mmap offset allocated... */ | ||
137 | list->file_offset_node = drm_mm_search_free(&mm->offset_manager, | ||
138 | size / PAGE_SIZE, 0, 0); | ||
139 | |||
140 | if (!list->file_offset_node) { | ||
141 | DRM_ERROR("failed to allocate offset for bo %d\n", obj->name); | ||
142 | ret = -ENOSPC; | ||
143 | goto out_free_list; | ||
144 | } | ||
145 | |||
146 | list->file_offset_node = drm_mm_get_block(list->file_offset_node, | ||
147 | size / PAGE_SIZE, 0); | ||
148 | if (!list->file_offset_node) { | ||
149 | ret = -ENOMEM; | ||
150 | goto out_free_list; | ||
151 | } | ||
152 | |||
153 | list->hash.key = list->file_offset_node->start; | ||
154 | ret = drm_ht_insert_item(&mm->offset_hash, &list->hash); | ||
155 | if (ret) { | ||
156 | DRM_ERROR("failed to add to map hash\n"); | ||
157 | goto out_free_mm; | ||
158 | } | ||
159 | |||
160 | return 0; | ||
161 | |||
162 | out_free_mm: | ||
163 | drm_mm_put_block(list->file_offset_node); | ||
164 | out_free_list: | ||
165 | kfree(list->map); | ||
166 | list->map = NULL; | ||
167 | 121 | ||
168 | return ret; | 122 | return drm_vma_offset_add(&mm->vma_manager, &obj->vma_node, |
123 | size / PAGE_SIZE); | ||
169 | } | 124 | } |
diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c index ef034fa3e6f5..2a4cb2f83b36 100644 --- a/drivers/gpu/drm/udl/udl_gem.c +++ b/drivers/gpu/drm/udl/udl_gem.c | |||
@@ -223,8 +223,7 @@ void udl_gem_free_object(struct drm_gem_object *gem_obj) | |||
223 | if (obj->pages) | 223 | if (obj->pages) |
224 | udl_gem_put_pages(obj); | 224 | udl_gem_put_pages(obj); |
225 | 225 | ||
226 | if (gem_obj->map_list.map) | 226 | drm_gem_free_mmap_offset(gem_obj); |
227 | drm_gem_free_mmap_offset(gem_obj); | ||
228 | } | 227 | } |
229 | 228 | ||
230 | /* the dumb interface doesn't work with the GEM straight MMAP | 229 | /* the dumb interface doesn't work with the GEM straight MMAP |
@@ -247,13 +246,11 @@ int udl_gem_mmap(struct drm_file *file, struct drm_device *dev, | |||
247 | ret = udl_gem_get_pages(gobj, GFP_KERNEL); | 246 | ret = udl_gem_get_pages(gobj, GFP_KERNEL); |
248 | if (ret) | 247 | if (ret) |
249 | goto out; | 248 | goto out; |
250 | if (!gobj->base.map_list.map) { | 249 | ret = drm_gem_create_mmap_offset(obj); |
251 | ret = drm_gem_create_mmap_offset(obj); | 250 | if (ret) |
252 | if (ret) | 251 | goto out; |
253 | goto out; | ||
254 | } | ||
255 | 252 | ||
256 | *offset = (u64)gobj->base.map_list.hash.key << PAGE_SHIFT; | 253 | *offset = drm_vma_node_offset_addr(&gobj->base.vma_node); |
257 | 254 | ||
258 | out: | 255 | out: |
259 | drm_gem_object_unreference(&gobj->base); | 256 | drm_gem_object_unreference(&gobj->base); |
diff --git a/drivers/gpu/host1x/drm/gem.c b/drivers/gpu/host1x/drm/gem.c index c5e9a9b494c2..bc323b3dbe4d 100644 --- a/drivers/gpu/host1x/drm/gem.c +++ b/drivers/gpu/host1x/drm/gem.c | |||
@@ -108,7 +108,7 @@ static void tegra_bo_destroy(struct drm_device *drm, struct tegra_bo *bo) | |||
108 | 108 | ||
109 | unsigned int tegra_bo_get_mmap_offset(struct tegra_bo *bo) | 109 | unsigned int tegra_bo_get_mmap_offset(struct tegra_bo *bo) |
110 | { | 110 | { |
111 | return (unsigned int)bo->gem.map_list.hash.key << PAGE_SHIFT; | 111 | return (unsigned int)drm_vma_node_offset_addr(&bo->gem.vma_node); |
112 | } | 112 | } |
113 | 113 | ||
114 | struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size) | 114 | struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size) |
@@ -182,8 +182,7 @@ void tegra_bo_free_object(struct drm_gem_object *gem) | |||
182 | { | 182 | { |
183 | struct tegra_bo *bo = to_tegra_bo(gem); | 183 | struct tegra_bo *bo = to_tegra_bo(gem); |
184 | 184 | ||
185 | if (gem->map_list.map) | 185 | drm_gem_free_mmap_offset(gem); |
186 | drm_gem_free_mmap_offset(gem); | ||
187 | 186 | ||
188 | drm_gem_object_release(gem); | 187 | drm_gem_object_release(gem); |
189 | tegra_bo_destroy(gem->dev, bo); | 188 | tegra_bo_destroy(gem->dev, bo); |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 0ab6a090a15c..4b518e05d293 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -71,6 +71,7 @@ | |||
71 | #include <asm/pgalloc.h> | 71 | #include <asm/pgalloc.h> |
72 | #include <drm/drm.h> | 72 | #include <drm/drm.h> |
73 | #include <drm/drm_sarea.h> | 73 | #include <drm/drm_sarea.h> |
74 | #include <drm/drm_vma_manager.h> | ||
74 | 75 | ||
75 | #include <linux/idr.h> | 76 | #include <linux/idr.h> |
76 | 77 | ||
@@ -587,7 +588,6 @@ struct drm_map_list { | |||
587 | struct drm_local_map *map; /**< mapping */ | 588 | struct drm_local_map *map; /**< mapping */ |
588 | uint64_t user_token; | 589 | uint64_t user_token; |
589 | struct drm_master *master; | 590 | struct drm_master *master; |
590 | struct drm_mm_node *file_offset_node; /**< fake offset */ | ||
591 | }; | 591 | }; |
592 | 592 | ||
593 | /** | 593 | /** |
@@ -622,8 +622,7 @@ struct drm_ati_pcigart_info { | |||
622 | * GEM specific mm private for tracking GEM objects | 622 | * GEM specific mm private for tracking GEM objects |
623 | */ | 623 | */ |
624 | struct drm_gem_mm { | 624 | struct drm_gem_mm { |
625 | struct drm_mm offset_manager; /**< Offset mgmt for buffer objects */ | 625 | struct drm_vma_offset_manager vma_manager; |
626 | struct drm_open_hash offset_hash; /**< User token hash table for maps */ | ||
627 | }; | 626 | }; |
628 | 627 | ||
629 | /** | 628 | /** |
@@ -644,7 +643,7 @@ struct drm_gem_object { | |||
644 | struct file *filp; | 643 | struct file *filp; |
645 | 644 | ||
646 | /* Mapping info for this object */ | 645 | /* Mapping info for this object */ |
647 | struct drm_map_list map_list; | 646 | struct drm_vma_offset_node vma_node; |
648 | 647 | ||
649 | /** | 648 | /** |
650 | * Size of the object, in bytes. Immutable over the object's | 649 | * Size of the object, in bytes. Immutable over the object's |
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index 238a166b9fe6..272580ca320f 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h | |||
@@ -181,7 +181,7 @@ enum drm_map_type { | |||
181 | _DRM_AGP = 3, /**< AGP/GART */ | 181 | _DRM_AGP = 3, /**< AGP/GART */ |
182 | _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ | 182 | _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ |
183 | _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ | 183 | _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ |
184 | _DRM_GEM = 6, /**< GEM object */ | 184 | _DRM_GEM = 6, /**< GEM object (obsolete) */ |
185 | }; | 185 | }; |
186 | 186 | ||
187 | /** | 187 | /** |