diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_gem.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem.c | 52 |
1 files changed, 18 insertions, 34 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c index ebbdf4132e9c..533f6ebec531 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" |
@@ -236,7 +237,7 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj) | |||
236 | * mapping_gfp_mask(mapping) which conflicts w/ GFP_DMA32.. probably | 237 | * mapping_gfp_mask(mapping) which conflicts w/ GFP_DMA32.. probably |
237 | * we actually want CMA memory for it all anyways.. | 238 | * we actually want CMA memory for it all anyways.. |
238 | */ | 239 | */ |
239 | pages = _drm_gem_get_pages(obj, GFP_KERNEL); | 240 | pages = drm_gem_get_pages(obj, GFP_KERNEL); |
240 | if (IS_ERR(pages)) { | 241 | if (IS_ERR(pages)) { |
241 | dev_err(obj->dev->dev, "could not get pages: %ld\n", PTR_ERR(pages)); | 242 | dev_err(obj->dev->dev, "could not get pages: %ld\n", PTR_ERR(pages)); |
242 | return PTR_ERR(pages); | 243 | return PTR_ERR(pages); |
@@ -270,7 +271,7 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj) | |||
270 | return 0; | 271 | return 0; |
271 | 272 | ||
272 | free_pages: | 273 | free_pages: |
273 | _drm_gem_put_pages(obj, pages, true, false); | 274 | drm_gem_put_pages(obj, pages, true, false); |
274 | 275 | ||
275 | return ret; | 276 | return ret; |
276 | } | 277 | } |
@@ -294,7 +295,7 @@ static void omap_gem_detach_pages(struct drm_gem_object *obj) | |||
294 | kfree(omap_obj->addrs); | 295 | kfree(omap_obj->addrs); |
295 | omap_obj->addrs = NULL; | 296 | omap_obj->addrs = NULL; |
296 | 297 | ||
297 | _drm_gem_put_pages(obj, omap_obj->pages, true, false); | 298 | drm_gem_put_pages(obj, omap_obj->pages, true, false); |
298 | omap_obj->pages = NULL; | 299 | omap_obj->pages = NULL; |
299 | } | 300 | } |
300 | 301 | ||
@@ -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) |
@@ -629,21 +629,6 @@ int omap_gem_dumb_create(struct drm_file *file, struct drm_device *dev, | |||
629 | } | 629 | } |
630 | 630 | ||
631 | /** | 631 | /** |
632 | * omap_gem_dumb_destroy - destroy a dumb buffer | ||
633 | * @file: client file | ||
634 | * @dev: our DRM device | ||
635 | * @handle: the object handle | ||
636 | * | ||
637 | * Destroy a handle that was created via omap_gem_dumb_create. | ||
638 | */ | ||
639 | int omap_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev, | ||
640 | uint32_t handle) | ||
641 | { | ||
642 | /* No special work needed, drop the reference and see what falls out */ | ||
643 | return drm_gem_handle_delete(file, handle); | ||
644 | } | ||
645 | |||
646 | /** | ||
647 | * omap_gem_dumb_map - buffer mapping for dumb interface | 632 | * omap_gem_dumb_map - buffer mapping for dumb interface |
648 | * @file: our drm client file | 633 | * @file: our drm client file |
649 | * @dev: drm device | 634 | * @dev: drm device |
@@ -997,12 +982,11 @@ void omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m) | |||
997 | { | 982 | { |
998 | struct drm_device *dev = obj->dev; | 983 | struct drm_device *dev = obj->dev; |
999 | struct omap_gem_object *omap_obj = to_omap_bo(obj); | 984 | struct omap_gem_object *omap_obj = to_omap_bo(obj); |
1000 | uint64_t off = 0; | 985 | uint64_t off; |
1001 | 986 | ||
1002 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | 987 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); |
1003 | 988 | ||
1004 | if (obj->map_list.map) | 989 | off = drm_vma_node_start(&obj->vma_node); |
1005 | off = (uint64_t)obj->map_list.hash.key; | ||
1006 | 990 | ||
1007 | seq_printf(m, "%08x: %2d (%2d) %08llx %08Zx (%2d) %p %4d", | 991 | seq_printf(m, "%08x: %2d (%2d) %08llx %08Zx (%2d) %p %4d", |
1008 | omap_obj->flags, obj->name, obj->refcount.refcount.counter, | 992 | omap_obj->flags, obj->name, obj->refcount.refcount.counter, |
@@ -1309,8 +1293,7 @@ void omap_gem_free_object(struct drm_gem_object *obj) | |||
1309 | 1293 | ||
1310 | list_del(&omap_obj->mm_list); | 1294 | list_del(&omap_obj->mm_list); |
1311 | 1295 | ||
1312 | if (obj->map_list.map) | 1296 | drm_gem_free_mmap_offset(obj); |
1313 | drm_gem_free_mmap_offset(obj); | ||
1314 | 1297 | ||
1315 | /* this means the object is still pinned.. which really should | 1298 | /* this means the object is still pinned.. which really should |
1316 | * not happen. I think.. | 1299 | * not happen. I think.. |
@@ -1427,8 +1410,9 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
1427 | omap_obj->height = gsize.tiled.height; | 1410 | omap_obj->height = gsize.tiled.height; |
1428 | } | 1411 | } |
1429 | 1412 | ||
1413 | ret = 0; | ||
1430 | if (flags & (OMAP_BO_DMA|OMAP_BO_EXT_MEM)) | 1414 | if (flags & (OMAP_BO_DMA|OMAP_BO_EXT_MEM)) |
1431 | ret = drm_gem_private_object_init(dev, obj, size); | 1415 | drm_gem_private_object_init(dev, obj, size); |
1432 | else | 1416 | else |
1433 | ret = drm_gem_object_init(dev, obj, size); | 1417 | ret = drm_gem_object_init(dev, obj, size); |
1434 | 1418 | ||