diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2017-11-23 11:49:59 -0500 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2018-01-02 11:27:53 -0500 |
commit | 0236efe97e165a1eefef9c38c8b3d10133a3e627 (patch) | |
tree | 0596fc07dddee2610207d555fc36af08d49972a8 | |
parent | c52837238038f61b6511eadee94fcab622d635f0 (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.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 7 |
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 | ||
183 | static 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 | |||
183 | static void submit_unpin_objects(struct etnaviv_gem_submit *submit) | 201 | static 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); |