This reverts commit 1d2271d2fb85e54bfc9630a6c30ac0feb9ffb983.

This fix actually causes regressions, which I could verify on my systems
as well. So let's revert it and figure out a proper fix for the original
problem.

Cc: Ben Skeggs <bske...@redhat.com>
Bug: https://gitlab.freedesktop.org/drm/nouveau/-/issues/149
Signed-off-by: Karol Herbst <kher...@redhat.com>
---
 .../gpu/drm/nouveau/nvkm/subdev/pmu/base.c    | 37 ++++++++-----------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
index 455e95a89259..24382875fb4f 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
@@ -94,13 +94,20 @@ nvkm_pmu_fini(struct nvkm_subdev *subdev, bool suspend)
        return 0;
 }
 
-static void
+static int
 nvkm_pmu_reset(struct nvkm_pmu *pmu)
 {
        struct nvkm_device *device = pmu->subdev.device;
 
        if (!pmu->func->enabled(pmu))
-               return;
+               return 0;
+
+       /* Inhibit interrupts, and wait for idle. */
+       nvkm_wr32(device, 0x10a014, 0x0000ffff);
+       nvkm_msec(device, 2000,
+               if (!nvkm_rd32(device, 0x10a04c))
+                       break;
+       );
 
        /* Reset. */
        if (pmu->func->reset)
@@ -111,37 +118,25 @@ nvkm_pmu_reset(struct nvkm_pmu *pmu)
                if (!(nvkm_rd32(device, 0x10a10c) & 0x00000006))
                        break;
        );
+
+       return 0;
 }
 
 static int
 nvkm_pmu_preinit(struct nvkm_subdev *subdev)
 {
        struct nvkm_pmu *pmu = nvkm_pmu(subdev);
-       nvkm_pmu_reset(pmu);
-       return 0;
+       return nvkm_pmu_reset(pmu);
 }
 
 static int
 nvkm_pmu_init(struct nvkm_subdev *subdev)
 {
        struct nvkm_pmu *pmu = nvkm_pmu(subdev);
-       struct nvkm_device *device = pmu->subdev.device;
-
-       if (!pmu->func->init)
-               return 0;
-
-       if (pmu->func->enabled(pmu)) {
-               /* Inhibit interrupts, and wait for idle. */
-               nvkm_wr32(device, 0x10a014, 0x0000ffff);
-               nvkm_msec(device, 2000,
-                       if (!nvkm_rd32(device, 0x10a04c))
-                               break;
-               );
-
-               nvkm_pmu_reset(pmu);
-       }
-
-       return pmu->func->init(pmu);
+       int ret = nvkm_pmu_reset(pmu);
+       if (ret == 0 && pmu->func->init)
+               ret = pmu->func->init(pmu);
+       return ret;
 }
 
 static void *
-- 
2.34.1

Reply via email to