aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2017-03-22 08:00:53 -0400
committerLucas Stach <l.stach@pengutronix.de>2017-03-29 10:19:01 -0400
commit6e2b98cf3b4f81df68a150e1d8737100160e1262 (patch)
tree2f54411b7b9f68c7db2eebaec08f182b2701bb7d
parent9ad59fea162c139f62335f0ca0ce1fdf4f82bd91 (diff)
drm/etnaviv: return GPU fence through the submit structure
The next patch will need the complete dma_fence, instead of just the seqno, to create the sync_file in etnaviv_ioctl_gem_submit, in case an out_fence_fd is requested. The submit needs to hold a reference to the dma_fence, to avoid raceing with the GPU completing the fence. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Tested-by: Philipp Zabel <p.zabel@pengutronix.de> --- New patch in v3.
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.h3
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c3
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gpu.c4
3 files changed, 6 insertions, 4 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
index 120410d67eb5..c4a091e87426 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
@@ -20,6 +20,7 @@
20#include <linux/reservation.h> 20#include <linux/reservation.h>
21#include "etnaviv_drv.h" 21#include "etnaviv_drv.h"
22 22
23struct dma_fence;
23struct etnaviv_gem_ops; 24struct etnaviv_gem_ops;
24struct etnaviv_gem_object; 25struct etnaviv_gem_object;
25 26
@@ -104,7 +105,7 @@ struct etnaviv_gem_submit {
104 struct drm_device *dev; 105 struct drm_device *dev;
105 struct etnaviv_gpu *gpu; 106 struct etnaviv_gpu *gpu;
106 struct ww_acquire_ctx ticket; 107 struct ww_acquire_ctx ticket;
107 u32 fence; 108 struct dma_fence *fence;
108 unsigned int nr_bos; 109 unsigned int nr_bos;
109 struct etnaviv_gem_submit_bo bos[0]; 110 struct etnaviv_gem_submit_bo bos[0];
110 u32 flags; 111 u32 flags;
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index fb8d5befbf4f..1b6f9b843815 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -294,6 +294,7 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
294 } 294 }
295 295
296 ww_acquire_fini(&submit->ticket); 296 ww_acquire_fini(&submit->ticket);
297 dma_fence_put(submit->fence);
297 kfree(submit); 298 kfree(submit);
298} 299}
299 300
@@ -435,7 +436,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
435 if (ret == 0) 436 if (ret == 0)
436 cmdbuf = NULL; 437 cmdbuf = NULL;
437 438
438 args->fence = submit->fence; 439 args->fence = submit->fence->seqno;
439 440
440out: 441out:
441 submit_unpin_objects(submit); 442 submit_unpin_objects(submit);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index 68a4f59e4c22..bafbcb463555 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -1337,8 +1337,8 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
1337 mutex_lock(&gpu->lock); 1337 mutex_lock(&gpu->lock);
1338 1338
1339 gpu->event[event].fence = fence; 1339 gpu->event[event].fence = fence;
1340 submit->fence = fence->seqno; 1340 submit->fence = dma_fence_get(fence);
1341 gpu->active_fence = submit->fence; 1341 gpu->active_fence = submit->fence->seqno;
1342 1342
1343 if (gpu->lastctx != cmdbuf->ctx) { 1343 if (gpu->lastctx != cmdbuf->ctx) {
1344 gpu->mmu->need_flush = true; 1344 gpu->mmu->need_flush = true;