diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2017-03-22 08:00:53 -0400 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2017-03-29 10:19:01 -0400 |
commit | 6e2b98cf3b4f81df68a150e1d8737100160e1262 (patch) | |
tree | 2f54411b7b9f68c7db2eebaec08f182b2701bb7d | |
parent | 9ad59fea162c139f62335f0ca0ce1fdf4f82bd91 (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.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 4 |
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 | ||
23 | struct dma_fence; | ||
23 | struct etnaviv_gem_ops; | 24 | struct etnaviv_gem_ops; |
24 | struct etnaviv_gem_object; | 25 | struct 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 | ||
440 | out: | 441 | out: |
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; |