.. | .. |
---|
45 | 45 | if (!ring) |
---|
46 | 46 | return; |
---|
47 | 47 | |
---|
48 | | - spin_lock_irqsave(&ring->lock, flags); |
---|
| 48 | + spin_lock_irqsave(&ring->preempt_lock, flags); |
---|
49 | 49 | wptr = get_wptr(ring); |
---|
50 | | - spin_unlock_irqrestore(&ring->lock, flags); |
---|
| 50 | + spin_unlock_irqrestore(&ring->preempt_lock, flags); |
---|
51 | 51 | |
---|
52 | 52 | gpu_write(gpu, REG_A5XX_CP_RB_WPTR, wptr); |
---|
53 | 53 | } |
---|
.. | .. |
---|
62 | 62 | bool empty; |
---|
63 | 63 | struct msm_ringbuffer *ring = gpu->rb[i]; |
---|
64 | 64 | |
---|
65 | | - spin_lock_irqsave(&ring->lock, flags); |
---|
66 | | - empty = (get_wptr(ring) == ring->memptrs->rptr); |
---|
67 | | - spin_unlock_irqrestore(&ring->lock, flags); |
---|
| 65 | + spin_lock_irqsave(&ring->preempt_lock, flags); |
---|
| 66 | + empty = (get_wptr(ring) == gpu->funcs->get_rptr(gpu, ring)); |
---|
| 67 | + spin_unlock_irqrestore(&ring->preempt_lock, flags); |
---|
68 | 68 | |
---|
69 | 69 | if (!empty) |
---|
70 | 70 | return ring; |
---|
.. | .. |
---|
132 | 132 | } |
---|
133 | 133 | |
---|
134 | 134 | /* Make sure the wptr doesn't update while we're in motion */ |
---|
135 | | - spin_lock_irqsave(&ring->lock, flags); |
---|
| 135 | + spin_lock_irqsave(&ring->preempt_lock, flags); |
---|
136 | 136 | a5xx_gpu->preempt[ring->id]->wptr = get_wptr(ring); |
---|
137 | | - spin_unlock_irqrestore(&ring->lock, flags); |
---|
| 137 | + spin_unlock_irqrestore(&ring->preempt_lock, flags); |
---|
138 | 138 | |
---|
139 | 139 | /* Set the address of the incoming preemption record */ |
---|
140 | 140 | gpu_write64(gpu, REG_A5XX_CP_CONTEXT_SWITCH_RESTORE_ADDR_LO, |
---|
.. | .. |
---|
210 | 210 | a5xx_gpu->preempt[i]->wptr = 0; |
---|
211 | 211 | a5xx_gpu->preempt[i]->rptr = 0; |
---|
212 | 212 | a5xx_gpu->preempt[i]->rbase = gpu->rb[i]->iova; |
---|
| 213 | + a5xx_gpu->preempt[i]->rptr_addr = shadowptr(a5xx_gpu, gpu->rb[i]); |
---|
213 | 214 | } |
---|
214 | 215 | |
---|
215 | 216 | /* Write a 0 to signal that we aren't switching pagetables */ |
---|
.. | .. |
---|
261 | 262 | ptr->data = 0; |
---|
262 | 263 | ptr->cntl = MSM_GPU_RB_CNTL_DEFAULT | AXXX_CP_RB_CNTL_NO_UPDATE; |
---|
263 | 264 | |
---|
264 | | - ptr->rptr_addr = shadowptr(a5xx_gpu, ring); |
---|
265 | 265 | ptr->counter = counters_iova; |
---|
266 | 266 | |
---|
267 | 267 | return 0; |
---|