diff options
author | Mark Brown <broonie@kernel.org> | 2015-10-12 13:09:27 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-10-12 13:09:27 -0400 |
commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | |
parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (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.c | 28 |
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 | */ | ||
141 | void 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 | */ |
144 | void amdgpu_ring_commit(struct amdgpu_ring *ring) | 159 | void 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); |