drm/msm/a6xx: Move ioremap out of hw_init path
authorRob Clark <robdclark@chromium.org>
Mon, 20 Mar 2023 14:43:36 +0000 (07:43 -0700)
committerRob Clark <robdclark@chromium.org>
Sat, 25 Mar 2023 23:31:45 +0000 (16:31 -0700)
Move the one-time RPMh setup to a6xx_gmu_init().  To get rid of the hack
for one-time init vs start, add in an extra a6xx_rpmh_stop() at the end
of the init sequence.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/527854/
Link: https://lore.kernel.org/r/20230320144356.803762-15-robdclark@gmail.com
drivers/gpu/drm/msm/adreno/a6xx_gmu.c

index ba6b8ea27c71432810f2b5dbaa754bad1b95558d..e16b4b3f8535f718e8a6a0ba221a47189e613962 100644 (file)
@@ -621,6 +621,8 @@ setup_pdc:
        /* ensure no writes happen before the uCode is fully written */
        wmb();
 
+       a6xx_rpmh_stop(gmu);
+
 err:
        if (!IS_ERR_OR_NULL(pdcptr))
                iounmap(pdcptr);
@@ -753,7 +755,6 @@ static int a6xx_gmu_fw_load(struct a6xx_gmu *gmu)
 
 static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, unsigned int state)
 {
-       static bool rpmh_init;
        struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);
        struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
        int ret;
@@ -776,15 +777,9 @@ static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, unsigned int state)
                /* Turn on register retention */
                gmu_write(gmu, REG_A6XX_GMU_GENERAL_7, 1);
 
-               /* We only need to load the RPMh microcode once */
-               if (!rpmh_init) {
-                       a6xx_gmu_rpmh_init(gmu);
-                       rpmh_init = true;
-               } else {
-                       ret = a6xx_rpmh_start(gmu);
-                       if (ret)
-                               return ret;
-               }
+               ret = a6xx_rpmh_start(gmu);
+               if (ret)
+                       return ret;
 
                ret = a6xx_gmu_fw_load(gmu);
                if (ret)
@@ -1670,6 +1665,9 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)
        /* Set up the HFI queues */
        a6xx_hfi_init(gmu);
 
+       /* Initialize RPMh */
+       a6xx_gmu_rpmh_init(gmu);
+
        gmu->initialized = true;
 
        return 0;