|
@@ -41,7 +41,7 @@ extern bool hang_debug;
|
|
|
|
|
|
static void a3xx_dump(struct msm_gpu *gpu);
|
|
|
|
|
|
-static void a3xx_me_init(struct msm_gpu *gpu)
|
|
|
+static bool a3xx_me_init(struct msm_gpu *gpu)
|
|
|
{
|
|
|
struct msm_ringbuffer *ring = gpu->rb;
|
|
|
|
|
@@ -65,7 +65,7 @@ static void a3xx_me_init(struct msm_gpu *gpu)
|
|
|
OUT_RING(ring, 0x00000000);
|
|
|
|
|
|
gpu->funcs->flush(gpu);
|
|
|
- gpu->funcs->idle(gpu);
|
|
|
+ return gpu->funcs->idle(gpu);
|
|
|
}
|
|
|
|
|
|
static int a3xx_hw_init(struct msm_gpu *gpu)
|
|
@@ -294,9 +294,7 @@ static int a3xx_hw_init(struct msm_gpu *gpu)
|
|
|
/* clear ME_HALT to start micro engine */
|
|
|
gpu_write(gpu, REG_AXXX_CP_ME_CNTL, 0);
|
|
|
|
|
|
- a3xx_me_init(gpu);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return a3xx_me_init(gpu) ? 0 : -EINVAL;
|
|
|
}
|
|
|
|
|
|
static void a3xx_recover(struct msm_gpu *gpu)
|
|
@@ -337,17 +335,22 @@ static void a3xx_destroy(struct msm_gpu *gpu)
|
|
|
kfree(a3xx_gpu);
|
|
|
}
|
|
|
|
|
|
-static void a3xx_idle(struct msm_gpu *gpu)
|
|
|
+static bool a3xx_idle(struct msm_gpu *gpu)
|
|
|
{
|
|
|
/* wait for ringbuffer to drain: */
|
|
|
- adreno_idle(gpu);
|
|
|
+ if (!adreno_idle(gpu))
|
|
|
+ return false;
|
|
|
|
|
|
/* then wait for GPU to finish: */
|
|
|
if (spin_until(!(gpu_read(gpu, REG_A3XX_RBBM_STATUS) &
|
|
|
- A3XX_RBBM_STATUS_GPU_BUSY)))
|
|
|
+ A3XX_RBBM_STATUS_GPU_BUSY))) {
|
|
|
DRM_ERROR("%s: timeout waiting for GPU to idle!\n", gpu->name);
|
|
|
|
|
|
- /* TODO maybe we need to reset GPU here to recover from hang? */
|
|
|
+ /* TODO maybe we need to reset GPU here to recover from hang? */
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
static irqreturn_t a3xx_irq(struct msm_gpu *gpu)
|