It isn't really useful to start sampling counters before hw_init().  And
the next commit will require IFPC OOB request to come after hw_init().

Signed-off-by: Rob Clark <[email protected]>
---
 drivers/gpu/drm/msm/adreno/adreno_device.c | 5 +----
 drivers/gpu/drm/msm/adreno/adreno_gpu.c    | 1 -
 drivers/gpu/drm/msm/msm_gpu.c              | 4 +++-
 drivers/gpu/drm/msm/msm_perfcntr.c         | 9 ++++++++-
 4 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c 
b/drivers/gpu/drm/msm/adreno/adreno_device.c
index 7108d4aa59b5..749269843e42 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_device.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_device.c
@@ -309,10 +309,7 @@ MODULE_DEVICE_TABLE(of, dt_match);
 static int adreno_runtime_resume(struct device *dev)
 {
        struct msm_gpu *gpu = dev_to_gpu(dev);
-       int ret = gpu->funcs->pm_resume(gpu);
-       if (!ret)
-               ret = msm_perfcntr_resume(gpu);
-       return ret;
+       return gpu->funcs->pm_resume(gpu);
 }
 
 static int adreno_runtime_suspend(struct device *dev)
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c 
b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 6db6cb7eb287..d074f4df78f6 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -720,7 +720,6 @@ void adreno_recover(struct msm_gpu *gpu)
        msm_perfcntr_suspend(gpu);
        gpu->funcs->pm_suspend(gpu);
        gpu->funcs->pm_resume(gpu);
-       msm_perfcntr_resume(gpu);
 
        ret = msm_gpu_hw_init(gpu);
        if (ret) {
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index fb07803f5aba..ca21b3bf20df 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -168,8 +168,10 @@ int msm_gpu_hw_init(struct msm_gpu *gpu)
 
        disable_irq(gpu->irq);
        ret = gpu->funcs->hw_init(gpu);
-       if (!ret)
+       if (!ret) {
+               msm_perfcntr_resume(gpu);
                gpu->needs_hw_init = false;
+       }
        enable_irq(gpu->irq);
 
        return ret;
diff --git a/drivers/gpu/drm/msm/msm_perfcntr.c 
b/drivers/gpu/drm/msm/msm_perfcntr.c
index ce65b1160955..36ce9a102c5e 100644
--- a/drivers/gpu/drm/msm/msm_perfcntr.c
+++ b/drivers/gpu/drm/msm/msm_perfcntr.c
@@ -199,10 +199,17 @@ sel_worker(struct work_struct *w)
                return;
 
        scoped_guard (mutex, &gpu->lock) {
+               /*
+                * If gpu still needs hw_init, bail.  We'll be rescheduled
+                * after hw_init, and there is no point to collect counters
+                * beforehand
+                */
+               if (gpu->needs_hw_init)
+                       return;
+
                guard(mutex)(&gpu->perfcntr_lock);
 
                if (stream == gpu->perfcntrs->stream) {
-                       msm_gpu_hw_init(gpu);
                        gpu->funcs->perfcntr_configure(gpu, ring, stream);
                }
        }
-- 
2.56.0

Reply via email to