I hit this while loop in an error state of the gpu

v2: unlock mutex only if reply == true

Signed-off-by: Karol Herbst <[email protected]>
---
 drm/nouveau/nvkm/subdev/pmu/base.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drm/nouveau/nvkm/subdev/pmu/base.c 
b/drm/nouveau/nvkm/subdev/pmu/base.c
index 81a5583..eb248fd 100644
--- a/drm/nouveau/nvkm/subdev/pmu/base.c
+++ b/drm/nouveau/nvkm/subdev/pmu/base.c
@@ -100,9 +100,16 @@ nvkm_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
        }
 
        /* acquire data segment access */
-       do {
+       nvkm_wr32(device, 0x10a580, 0x00000001);
+       if (nvkm_msec(device, 2000,
+               if (nvkm_rd32(device, 0x10a580) == 0x00000001)
+                       break;
                nvkm_wr32(device, 0x10a580, 0x00000001);
-       } while (nvkm_rd32(device, 0x10a580) != 0x00000001);
+       ) < 0) {
+               if (reply)
+                       mutex_unlock(&subdev->mutex);
+               return -EBUSY;
+       }
 
        /* write the packet */
        nvkm_wr32(device, 0x10a1c0, 0x01000000 | (((addr & 0x07) << 4) +
-- 
2.6.3

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to