Blob Blame History Raw
From: Lucas Stach <l.stach@pengutronix.de>
Date: Mon, 27 Nov 2017 17:46:15 +0100
Subject: drm/etnaviv: move GPU active handling to bo pin/unpin
Git-commit: 5b223e94a8842e5e9deaa1b8198fc52558fee782
Patch-mainline: v4.16-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166

The active count is used to check if the BO is idle, where idle is defined
as not active on the GPU and all VM mappings and reference counts dropped
to the initial state. As the idling of the mappings and references now only
happens in the submit cleanup, the active state handling must be moved to
the same location in order to keep the userspace semantics.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c |    4 ++++
 drivers/gpu/drm/etnaviv/etnaviv_gpu.c        |   10 ----------
 2 files changed, 4 insertions(+), 10 deletions(-)

--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -229,6 +229,7 @@ static int submit_pin_objects(struct etn
 			ret = PTR_ERR(mapping);
 			break;
 		}
+		atomic_inc(&etnaviv_obj->gpu_active);
 
 		submit->bos[i].flags |= BO_PINNED;
 		submit->bos[i].mapping = mapping;
@@ -363,6 +364,7 @@ static void submit_cleanup(struct kref *
 		/* unpin all objects */
 		if (submit->bos[i].flags & BO_PINNED) {
 			etnaviv_gem_mapping_unreference(submit->bos[i].mapping);
+			atomic_dec(&etnaviv_obj->gpu_active);
 			submit->bos[i].mapping = NULL;
 			submit->bos[i].flags &= ~BO_PINNED;
 		}
@@ -372,6 +374,8 @@ static void submit_cleanup(struct kref *
 		drm_gem_object_put_unlocked(&etnaviv_obj->base);
 	}
 
+	wake_up_all(&submit->gpu->fence_event);
+
 	if (submit->in_fence)
 		dma_fence_put(submit->in_fence);
 	if (submit->out_fence)
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -1201,7 +1201,6 @@ static void retire_worker(struct work_st
 					       retire_work);
 	u32 fence = gpu->completed_fence;
 	struct etnaviv_gem_submit *submit, *tmp;
-	unsigned int i;
 
 	mutex_lock(&gpu->lock);
 	list_for_each_entry_safe(submit, tmp, &gpu->active_submit_list, node) {
@@ -1210,9 +1209,6 @@ static void retire_worker(struct work_st
 
 		list_del(&submit->node);
 
-		for (i = 0; i < submit->nr_bos; i++)
-			atomic_dec(&submit->bos[i].obj->gpu_active);
-
 		etnaviv_submit_put(submit);
 		/*
 		 * We need to balance the runtime PM count caused by
@@ -1227,8 +1223,6 @@ static void retire_worker(struct work_st
 	gpu->retired_fence = fence;
 
 	mutex_unlock(&gpu->lock);
-
-	wake_up_all(&gpu->fence_event);
 }
 
 int etnaviv_gpu_wait_fence_interruptible(struct etnaviv_gpu *gpu,
@@ -1429,10 +1423,6 @@ int etnaviv_gpu_submit(struct etnaviv_gp
 	/* We're committed to adding this command buffer, hold a PM reference */
 	pm_runtime_get_noresume(gpu->dev);
 
-	for (i = 0; i < submit->nr_bos; i++) {
-		struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
-		atomic_inc(&etnaviv_obj->gpu_active);
-	}
 	hangcheck_timer_reset(gpu);
 	ret = 0;