drm/etnaviv: split out wait for gpu idle
authorLucas Stach <l.stach@pengutronix.de>
Wed, 17 Aug 2016 13:16:57 +0000 (15:16 +0200)
committerLucas Stach <l.stach@pengutronix.de>
Thu, 15 Sep 2016 13:29:38 +0000 (15:29 +0200)
Split out into a new externally visible function, as the IOMMUv2
code needs this functionality, too.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
drivers/gpu/drm/etnaviv/etnaviv_gpu.c
drivers/gpu/drm/etnaviv/etnaviv_gpu.h

index 6309d27045a625be270d1728969067fb77519c5e..74e09dcae75f9bbc50ea0b40145efa2b68babcc4 100644 (file)
@@ -1437,11 +1437,30 @@ static int etnaviv_gpu_clk_disable(struct etnaviv_gpu *gpu)
        return 0;
 }
 
+int etnaviv_gpu_wait_idle(struct etnaviv_gpu *gpu, unsigned int timeout_ms)
+{
+       unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
+
+       do {
+               u32 idle = gpu_read(gpu, VIVS_HI_IDLE_STATE);
+
+               if ((idle & gpu->idle_mask) == gpu->idle_mask)
+                       return 0;
+
+               if (time_is_before_jiffies(timeout)) {
+                       dev_warn(gpu->dev,
+                                "timed out waiting for idle: idle=0x%x\n",
+                                idle);
+                       return -ETIMEDOUT;
+               }
+
+               udelay(5);
+       } while (1);
+}
+
 static int etnaviv_gpu_hw_suspend(struct etnaviv_gpu *gpu)
 {
        if (gpu->buffer) {
-               unsigned long timeout;
-
                /* Replace the last WAIT with END */
                etnaviv_buffer_end(gpu);
 
@@ -1450,22 +1469,7 @@ static int etnaviv_gpu_hw_suspend(struct etnaviv_gpu *gpu)
                 * happen quickly (as the WAIT is only 200 cycles).  If
                 * we fail, just warn and continue.
                 */
-               timeout = jiffies + msecs_to_jiffies(100);
-               do {
-                       u32 idle = gpu_read(gpu, VIVS_HI_IDLE_STATE);
-
-                       if ((idle & gpu->idle_mask) == gpu->idle_mask)
-                               break;
-
-                       if (time_is_before_jiffies(timeout)) {
-                               dev_warn(gpu->dev,
-                                        "timed out waiting for idle: idle=0x%x\n",
-                                        idle);
-                               break;
-                       }
-
-                       udelay(5);
-               } while (1);
+               etnaviv_gpu_wait_idle(gpu, 100);
        }
 
        return etnaviv_gpu_clk_disable(gpu);
index a69cdd526bf83149af1ee486c34d96a6e1913123..303450b1f981e2ace91196c42dc67a6acd53785c 100644 (file)
@@ -214,6 +214,7 @@ struct etnaviv_cmdbuf *etnaviv_gpu_cmdbuf_new(struct etnaviv_gpu *gpu,
 void etnaviv_gpu_cmdbuf_free(struct etnaviv_cmdbuf *cmdbuf);
 int etnaviv_gpu_pm_get_sync(struct etnaviv_gpu *gpu);
 void etnaviv_gpu_pm_put(struct etnaviv_gpu *gpu);
+int etnaviv_gpu_wait_idle(struct etnaviv_gpu *gpu, unsigned int timeout_ms);
 
 extern struct platform_driver etnaviv_gpu_driver;