drm/msm: Reset ringbuffer pointers at hw init

Ringbuffer pointers were getting reset only when resuming after
recovery. However, we need to reset them even after resuming
from SLUMBER or we will end up sending stale commands to the GPU
with bad results. Make ringbuffer reset part of the GPU init
sequence.

Change-Id: I93fc2f2e293245e584184315f8eb8a4ec73d2455
Signed-off-by: Sushmita Susheelendra <ssusheel@codeaurora.org>
This commit is contained in:
Sushmita Susheelendra 2017-07-14 17:31:31 -06:00
parent 9d4c3788b4
commit 5ec068d55b

View file

@ -75,14 +75,25 @@ int adreno_hw_init(struct msm_gpu *gpu)
DBG("%s", gpu->name);
for (i = 0; i < gpu->nr_rings; i++) {
int ret = msm_gem_get_iova(gpu->rb[i]->bo, gpu->aspace,
&gpu->rb[i]->iova);
struct msm_ringbuffer *ring = gpu->rb[i];
int ret = msm_gem_get_iova(ring->bo, gpu->aspace,
&ring->iova);
if (ret) {
gpu->rb[i]->iova = 0;
ring->iova = 0;
dev_err(gpu->dev->dev,
"could not map ringbuffer %d: %d\n", i, ret);
return ret;
}
/* reset ringbuffer(s): */
/* No need for a lock here, nobody else is peeking in */
ring->cur = ring->start;
ring->next = ring->start;
/* reset completed fence seqno, discard anything pending: */
ring->memptrs->fence = adreno_submitted_fence(gpu, ring);
ring->memptrs->rptr = 0;
}
/*
@ -140,8 +151,7 @@ uint32_t adreno_submitted_fence(struct msm_gpu *gpu,
void adreno_recover(struct msm_gpu *gpu)
{
struct drm_device *dev = gpu->dev;
struct msm_ringbuffer *ring;
int ret, i;
int ret;
/*
* XXX pm-runtime?? we *need* the device to be off after this
@ -150,21 +160,6 @@ void adreno_recover(struct msm_gpu *gpu)
gpu->funcs->pm_suspend(gpu);
/* reset ringbuffer(s): */
FOR_EACH_RING(gpu, ring, i) {
if (!ring)
continue;
/* No need for a lock here, nobody else is peeking in */
ring->cur = ring->start;
ring->next = ring->start;
/* reset completed fence seqno, discard anything pending: */
ring->memptrs->fence = adreno_submitted_fence(gpu, ring);
ring->memptrs->rptr = 0;
}
gpu->funcs->pm_resume(gpu);
ret = msm_gpu_hw_init(gpu);