summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/msm/adreno/a2xx_gpu.c')
-rw-r--r--drivers/gpu/drm/msm/adreno/a2xx_gpu.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
index df4cded9143f..59d2f1684e6a 100644
--- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
@@ -489,6 +489,23 @@ static u32 a2xx_get_rptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring)
return ring->memptrs->rptr;
}
+static bool a2xx_progress(struct msm_gpu *gpu, struct msm_ringbuffer *ring)
+{
+ struct msm_cp_state cp_state = {
+ .ib1_base = gpu_read(gpu, REG_AXXX_CP_IB1_BASE),
+ .ib2_base = gpu_read(gpu, REG_AXXX_CP_IB2_BASE),
+ .ib1_rem = gpu_read(gpu, REG_AXXX_CP_IB1_BUFSZ),
+ .ib2_rem = gpu_read(gpu, REG_AXXX_CP_IB2_BUFSZ),
+ };
+ bool progress;
+
+ progress = !!memcmp(&cp_state, &ring->last_cp_state, sizeof(cp_state));
+
+ ring->last_cp_state = cp_state;
+
+ return progress;
+}
+
static struct msm_gpu *a2xx_gpu_init(struct drm_device *dev)
{
struct a2xx_gpu *a2xx_gpu = NULL;
@@ -553,6 +570,7 @@ const struct adreno_gpu_funcs a2xx_gpu_funcs = {
.gpu_state_put = adreno_gpu_state_put,
.create_vm = a2xx_create_vm,
.get_rptr = a2xx_get_rptr,
+ .progress = a2xx_progress,
},
.init = a2xx_gpu_init,
};