aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2017-11-23 11:49:59 -0500
committerLucas Stach <l.stach@pengutronix.de>2018-01-02 11:27:53 -0500
commit0236efe97e165a1eefef9c38c8b3d10133a3e627 (patch)
tree0596fc07dddee2610207d555fc36af08d49972a8
parentc52837238038f61b6511eadee94fcab622d635f0 (diff)
drm/etnaviv: move object fence attachment to gem_submit path
The object fencing has nothing to do with the actual GPU buffer submit, so move it to the gem submit path to have a cleaner split. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c21
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gpu.c7
2 files changed, 21 insertions, 7 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 51ed34586c10..72468f11dd16 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -180,6 +180,24 @@ static int submit_fence_sync(const struct etnaviv_gem_submit *submit)
180 return ret; 180 return ret;
181} 181}
182 182
183static void submit_attach_object_fences(struct etnaviv_gem_submit *submit)
184{
185 int i;
186
187 for (i = 0; i < submit->nr_bos; i++) {
188 struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
189
190 if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE)
191 reservation_object_add_excl_fence(etnaviv_obj->resv,
192 submit->fence);
193 else
194 reservation_object_add_shared_fence(etnaviv_obj->resv,
195 submit->fence);
196
197 submit_unlock_object(submit, i);
198 }
199}
200
183static void submit_unpin_objects(struct etnaviv_gem_submit *submit) 201static void submit_unpin_objects(struct etnaviv_gem_submit *submit)
184{ 202{
185 int i; 203 int i;
@@ -335,6 +353,7 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
335 for (i = 0; i < submit->nr_bos; i++) { 353 for (i = 0; i < submit->nr_bos; i++) {
336 struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; 354 struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
337 355
356 /* if the GPU submit failed, objects might still be locked */
338 submit_unlock_object(submit, i); 357 submit_unlock_object(submit, i);
339 drm_gem_object_put_unlocked(&etnaviv_obj->base); 358 drm_gem_object_put_unlocked(&etnaviv_obj->base);
340 } 359 }
@@ -507,6 +526,8 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
507 if (ret) 526 if (ret)
508 goto out; 527 goto out;
509 528
529 submit_attach_object_fences(submit);
530
510 cmdbuf = NULL; 531 cmdbuf = NULL;
511 532
512 if (args->flags & ETNA_SUBMIT_FENCE_FD_OUT) { 533 if (args->flags & ETNA_SUBMIT_FENCE_FD_OUT) {
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index c4f518d56ead..93d71ad2d681 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -1443,13 +1443,6 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
1443 etnaviv_gem_mapping_reference(submit->bos[i].mapping); 1443 etnaviv_gem_mapping_reference(submit->bos[i].mapping);
1444 cmdbuf->bo_map[i] = submit->bos[i].mapping; 1444 cmdbuf->bo_map[i] = submit->bos[i].mapping;
1445 atomic_inc(&etnaviv_obj->gpu_active); 1445 atomic_inc(&etnaviv_obj->gpu_active);
1446
1447 if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE)
1448 reservation_object_add_excl_fence(etnaviv_obj->resv,
1449 fence);
1450 else
1451 reservation_object_add_shared_fence(etnaviv_obj->resv,
1452 fence);
1453 } 1446 }
1454 cmdbuf->nr_bos = submit->nr_bos; 1447 cmdbuf->nr_bos = submit->nr_bos;
1455 hangcheck_timer_reset(gpu); 1448 hangcheck_timer_reset(gpu);