aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2015-10-12 13:09:27 -0400
committerMark Brown <broonie@kernel.org>2015-10-12 13:09:27 -0400
commit79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch)
tree5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
parent721b51fcf91898299d96f4b72cb9434cda29dce6 (diff)
parent8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff)
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 855e2196657a..9bec91484c24 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -131,6 +131,21 @@ int amdgpu_ring_lock(struct amdgpu_ring *ring, unsigned ndw)
131 return 0; 131 return 0;
132} 132}
133 133
134/** amdgpu_ring_insert_nop - insert NOP packets
135 *
136 * @ring: amdgpu_ring structure holding ring information
137 * @count: the number of NOP packets to insert
138 *
139 * This is the generic insert_nop function for rings except SDMA
140 */
141void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
142{
143 int i;
144
145 for (i = 0; i < count; i++)
146 amdgpu_ring_write(ring, ring->nop);
147}
148
134/** 149/**
135 * amdgpu_ring_commit - tell the GPU to execute the new 150 * amdgpu_ring_commit - tell the GPU to execute the new
136 * commands on the ring buffer 151 * commands on the ring buffer
@@ -143,10 +158,13 @@ int amdgpu_ring_lock(struct amdgpu_ring *ring, unsigned ndw)
143 */ 158 */
144void amdgpu_ring_commit(struct amdgpu_ring *ring) 159void amdgpu_ring_commit(struct amdgpu_ring *ring)
145{ 160{
161 uint32_t count;
162
146 /* We pad to match fetch size */ 163 /* We pad to match fetch size */
147 while (ring->wptr & ring->align_mask) { 164 count = ring->align_mask + 1 - (ring->wptr & ring->align_mask);
148 amdgpu_ring_write(ring, ring->nop); 165 count %= ring->align_mask + 1;
149 } 166 ring->funcs->insert_nop(ring, count);
167
150 mb(); 168 mb();
151 amdgpu_ring_set_wptr(ring); 169 amdgpu_ring_set_wptr(ring);
152} 170}
@@ -342,6 +360,8 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
342 amdgpu_fence_driver_init_ring(ring); 360 amdgpu_fence_driver_init_ring(ring);
343 } 361 }
344 362
363 init_waitqueue_head(&ring->fence_drv.fence_queue);
364
345 r = amdgpu_wb_get(adev, &ring->rptr_offs); 365 r = amdgpu_wb_get(adev, &ring->rptr_offs);
346 if (r) { 366 if (r) {
347 dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r); 367 dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r);
@@ -367,7 +387,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
367 } 387 }
368 ring->next_rptr_gpu_addr = adev->wb.gpu_addr + (ring->next_rptr_offs * 4); 388 ring->next_rptr_gpu_addr = adev->wb.gpu_addr + (ring->next_rptr_offs * 4);
369 ring->next_rptr_cpu_addr = &adev->wb.wb[ring->next_rptr_offs]; 389 ring->next_rptr_cpu_addr = &adev->wb.wb[ring->next_rptr_offs];
370 390 spin_lock_init(&ring->fence_lock);
371 r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type); 391 r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
372 if (r) { 392 if (r) {
373 dev_err(adev->dev, "failed initializing fences (%d).\n", r); 393 dev_err(adev->dev, "failed initializing fences (%d).\n", r);