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:
parent
9d4c3788b4
commit
5ec068d55b
1 changed files with 15 additions and 20 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue