aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/etnaviv/Kconfig2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_drv.c8
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.c45
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c4
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gpu.c8
6 files changed, 37 insertions, 32 deletions
diff --git a/drivers/gpu/drm/etnaviv/Kconfig b/drivers/gpu/drm/etnaviv/Kconfig
index 71cee4e9fefb..38b477b5fbf9 100644
--- a/drivers/gpu/drm/etnaviv/Kconfig
+++ b/drivers/gpu/drm/etnaviv/Kconfig
@@ -10,6 +10,8 @@ config DRM_ETNAVIV
10 select IOMMU_API 10 select IOMMU_API
11 select IOMMU_SUPPORT 11 select IOMMU_SUPPORT
12 select WANT_DEV_COREDUMP 12 select WANT_DEV_COREDUMP
13 select CMA if HAVE_DMA_CONTIGUOUS
14 select DMA_CMA if HAVE_DMA_CONTIGUOUS
13 help 15 help
14 DRM driver for Vivante GPUs. 16 DRM driver for Vivante GPUs.
15 17
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 91e17aeee1da..2cb4773823c2 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -316,7 +316,7 @@ static int etnaviv_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,
316 316
317 ret = etnaviv_gem_cpu_prep(obj, args->op, &TS(args->timeout)); 317 ret = etnaviv_gem_cpu_prep(obj, args->op, &TS(args->timeout));
318 318
319 drm_gem_object_unreference_unlocked(obj); 319 drm_gem_object_put_unlocked(obj);
320 320
321 return ret; 321 return ret;
322} 322}
@@ -337,7 +337,7 @@ static int etnaviv_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
337 337
338 ret = etnaviv_gem_cpu_fini(obj); 338 ret = etnaviv_gem_cpu_fini(obj);
339 339
340 drm_gem_object_unreference_unlocked(obj); 340 drm_gem_object_put_unlocked(obj);
341 341
342 return ret; 342 return ret;
343} 343}
@@ -357,7 +357,7 @@ static int etnaviv_ioctl_gem_info(struct drm_device *dev, void *data,
357 return -ENOENT; 357 return -ENOENT;
358 358
359 ret = etnaviv_gem_mmap_offset(obj, &args->offset); 359 ret = etnaviv_gem_mmap_offset(obj, &args->offset);
360 drm_gem_object_unreference_unlocked(obj); 360 drm_gem_object_put_unlocked(obj);
361 361
362 return ret; 362 return ret;
363} 363}
@@ -446,7 +446,7 @@ static int etnaviv_ioctl_gem_wait(struct drm_device *dev, void *data,
446 446
447 ret = etnaviv_gem_wait_bo(gpu, obj, timeout); 447 ret = etnaviv_gem_wait_bo(gpu, obj, timeout);
448 448
449 drm_gem_object_unreference_unlocked(obj); 449 drm_gem_object_put_unlocked(obj);
450 450
451 return ret; 451 return ret;
452} 452}
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index 9a3bea738330..5a634594a6ce 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -68,7 +68,7 @@ static int etnaviv_gem_shmem_get_pages(struct etnaviv_gem_object *etnaviv_obj)
68 struct page **p = drm_gem_get_pages(&etnaviv_obj->base); 68 struct page **p = drm_gem_get_pages(&etnaviv_obj->base);
69 69
70 if (IS_ERR(p)) { 70 if (IS_ERR(p)) {
71 dev_err(dev->dev, "could not get pages: %ld\n", PTR_ERR(p)); 71 dev_dbg(dev->dev, "could not get pages: %ld\n", PTR_ERR(p));
72 return PTR_ERR(p); 72 return PTR_ERR(p);
73 } 73 }
74 74
@@ -265,7 +265,7 @@ void etnaviv_gem_mapping_reference(struct etnaviv_vram_mapping *mapping)
265{ 265{
266 struct etnaviv_gem_object *etnaviv_obj = mapping->object; 266 struct etnaviv_gem_object *etnaviv_obj = mapping->object;
267 267
268 drm_gem_object_reference(&etnaviv_obj->base); 268 drm_gem_object_get(&etnaviv_obj->base);
269 269
270 mutex_lock(&etnaviv_obj->lock); 270 mutex_lock(&etnaviv_obj->lock);
271 WARN_ON(mapping->use == 0); 271 WARN_ON(mapping->use == 0);
@@ -282,7 +282,7 @@ void etnaviv_gem_mapping_unreference(struct etnaviv_vram_mapping *mapping)
282 mapping->use -= 1; 282 mapping->use -= 1;
283 mutex_unlock(&etnaviv_obj->lock); 283 mutex_unlock(&etnaviv_obj->lock);
284 284
285 drm_gem_object_unreference_unlocked(&etnaviv_obj->base); 285 drm_gem_object_put_unlocked(&etnaviv_obj->base);
286} 286}
287 287
288struct etnaviv_vram_mapping *etnaviv_gem_mapping_get( 288struct etnaviv_vram_mapping *etnaviv_gem_mapping_get(
@@ -358,7 +358,7 @@ out:
358 return ERR_PTR(ret); 358 return ERR_PTR(ret);
359 359
360 /* Take a reference on the object */ 360 /* Take a reference on the object */
361 drm_gem_object_reference(obj); 361 drm_gem_object_get(obj);
362 return mapping; 362 return mapping;
363} 363}
364 364
@@ -413,6 +413,16 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
413 bool write = !!(op & ETNA_PREP_WRITE); 413 bool write = !!(op & ETNA_PREP_WRITE);
414 int ret; 414 int ret;
415 415
416 if (!etnaviv_obj->sgt) {
417 void *ret;
418
419 mutex_lock(&etnaviv_obj->lock);
420 ret = etnaviv_gem_get_pages(etnaviv_obj);
421 mutex_unlock(&etnaviv_obj->lock);
422 if (IS_ERR(ret))
423 return PTR_ERR(ret);
424 }
425
416 if (op & ETNA_PREP_NOSYNC) { 426 if (op & ETNA_PREP_NOSYNC) {
417 if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv, 427 if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
418 write)) 428 write))
@@ -427,16 +437,6 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
427 } 437 }
428 438
429 if (etnaviv_obj->flags & ETNA_BO_CACHED) { 439 if (etnaviv_obj->flags & ETNA_BO_CACHED) {
430 if (!etnaviv_obj->sgt) {
431 void *ret;
432
433 mutex_lock(&etnaviv_obj->lock);
434 ret = etnaviv_gem_get_pages(etnaviv_obj);
435 mutex_unlock(&etnaviv_obj->lock);
436 if (IS_ERR(ret))
437 return PTR_ERR(ret);
438 }
439
440 dma_sync_sg_for_cpu(dev->dev, etnaviv_obj->sgt->sgl, 440 dma_sync_sg_for_cpu(dev->dev, etnaviv_obj->sgt->sgl,
441 etnaviv_obj->sgt->nents, 441 etnaviv_obj->sgt->nents,
442 etnaviv_op_to_dma_dir(op)); 442 etnaviv_op_to_dma_dir(op));
@@ -662,7 +662,8 @@ static struct drm_gem_object *__etnaviv_gem_new(struct drm_device *dev,
662 * going to pin these pages. 662 * going to pin these pages.
663 */ 663 */
664 mapping = obj->filp->f_mapping; 664 mapping = obj->filp->f_mapping;
665 mapping_set_gfp_mask(mapping, GFP_HIGHUSER); 665 mapping_set_gfp_mask(mapping, GFP_HIGHUSER |
666 __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
666 } 667 }
667 668
668 if (ret) 669 if (ret)
@@ -671,7 +672,7 @@ static struct drm_gem_object *__etnaviv_gem_new(struct drm_device *dev,
671 return obj; 672 return obj;
672 673
673fail: 674fail:
674 drm_gem_object_unreference_unlocked(obj); 675 drm_gem_object_put_unlocked(obj);
675 return ERR_PTR(ret); 676 return ERR_PTR(ret);
676} 677}
677 678
@@ -688,14 +689,14 @@ int etnaviv_gem_new_handle(struct drm_device *dev, struct drm_file *file,
688 689
689 ret = etnaviv_gem_obj_add(dev, obj); 690 ret = etnaviv_gem_obj_add(dev, obj);
690 if (ret < 0) { 691 if (ret < 0) {
691 drm_gem_object_unreference_unlocked(obj); 692 drm_gem_object_put_unlocked(obj);
692 return ret; 693 return ret;
693 } 694 }
694 695
695 ret = drm_gem_handle_create(file, obj, handle); 696 ret = drm_gem_handle_create(file, obj, handle);
696 697
697 /* drop reference from allocate - handle holds it now */ 698 /* drop reference from allocate - handle holds it now */
698 drm_gem_object_unreference_unlocked(obj); 699 drm_gem_object_put_unlocked(obj);
699 700
700 return ret; 701 return ret;
701} 702}
@@ -712,7 +713,7 @@ struct drm_gem_object *etnaviv_gem_new(struct drm_device *dev,
712 713
713 ret = etnaviv_gem_obj_add(dev, obj); 714 ret = etnaviv_gem_obj_add(dev, obj);
714 if (ret < 0) {