[PATCH v6 2/6] drm/msm: Resume perfcntrs after hw_init

From: Rob Clark

Date: Thu Nov 05 2026 - 11:52:49 EST


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 <robin.clark@xxxxxxxxxxxxxxxx>
---
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 | 10 +++++++++-
4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/msm/adreno/adreno_device.c
index 7066be3b8e15..a3b2440a1a27 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_device.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_device.c
@@ -315,10 +315,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 54f337475231..f9a546a2cfb0 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -722,7 +722,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 ab04a442ca9d..44e5da9d6ab9 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 7fa2e858bd08..189be6cc23f1 100644
--- a/drivers/gpu/drm/msm/msm_perfcntr.c
+++ b/drivers/gpu/drm/msm/msm_perfcntr.c
@@ -199,14 +199,22 @@ 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)
+ goto out;
+
guard(mutex)(&gpu->perfcntr_lock);

if (stream == gpu->perfcntrs->stream) {
- msm_gpu_hw_init(gpu);
gpu->funcs->perfcntr_configure(gpu, ring, stream);
}
}

+out:
pm_runtime_put_autosuspend(&gpu->pdev->dev);
}

--
2.56.0