diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 80 |
1 files changed, 6 insertions, 74 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index 66c6bbd27309..81d06d772dde 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | |||
@@ -105,30 +105,6 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw) | |||
105 | return 0; | 105 | return 0; |
106 | } | 106 | } |
107 | 107 | ||
108 | /** | ||
109 | * amdgpu_ring_lock - lock the ring and allocate space on it | ||
110 | * | ||
111 | * @adev: amdgpu_device pointer | ||
112 | * @ring: amdgpu_ring structure holding ring information | ||
113 | * @ndw: number of dwords to allocate in the ring buffer | ||
114 | * | ||
115 | * Lock the ring and allocate @ndw dwords in the ring buffer | ||
116 | * (all asics). | ||
117 | * Returns 0 on success, error on failure. | ||
118 | */ | ||
119 | int amdgpu_ring_lock(struct amdgpu_ring *ring, unsigned ndw) | ||
120 | { | ||
121 | int r; | ||
122 | |||
123 | mutex_lock(ring->ring_lock); | ||
124 | r = amdgpu_ring_alloc(ring, ndw); | ||
125 | if (r) { | ||
126 | mutex_unlock(ring->ring_lock); | ||
127 | return r; | ||
128 | } | ||
129 | return 0; | ||
130 | } | ||
131 | |||
132 | /** amdgpu_ring_insert_nop - insert NOP packets | 108 | /** amdgpu_ring_insert_nop - insert NOP packets |
133 | * | 109 | * |
134 | * @ring: amdgpu_ring structure holding ring information | 110 | * @ring: amdgpu_ring structure holding ring information |
@@ -168,20 +144,6 @@ void amdgpu_ring_commit(struct amdgpu_ring *ring) | |||
168 | } | 144 | } |
169 | 145 | ||
170 | /** | 146 | /** |
171 | * amdgpu_ring_unlock_commit - tell the GPU to execute the new | ||
172 | * commands on the ring buffer and unlock it | ||
173 | * | ||
174 | * @ring: amdgpu_ring structure holding ring information | ||
175 | * | ||
176 | * Call amdgpu_ring_commit() then unlock the ring (all asics). | ||
177 | */ | ||
178 | void amdgpu_ring_unlock_commit(struct amdgpu_ring *ring) | ||
179 | { | ||
180 | amdgpu_ring_commit(ring); | ||
181 | mutex_unlock(ring->ring_lock); | ||
182 | } | ||
183 | |||
184 | /** | ||
185 | * amdgpu_ring_undo - reset the wptr | 147 | * amdgpu_ring_undo - reset the wptr |
186 | * | 148 | * |
187 | * @ring: amdgpu_ring structure holding ring information | 149 | * @ring: amdgpu_ring structure holding ring information |
@@ -194,19 +156,6 @@ void amdgpu_ring_undo(struct amdgpu_ring *ring) | |||
194 | } | 156 | } |
195 | 157 | ||
196 | /** | 158 | /** |
197 | * amdgpu_ring_unlock_undo - reset the wptr and unlock the ring | ||
198 | * | ||
199 | * @ring: amdgpu_ring structure holding ring information | ||
200 | * | ||
201 | * Call amdgpu_ring_undo() then unlock the ring (all asics). | ||
202 | */ | ||
203 | void amdgpu_ring_unlock_undo(struct amdgpu_ring *ring) | ||
204 | { | ||
205 | amdgpu_ring_undo(ring); | ||
206 | mutex_unlock(ring->ring_lock); | ||
207 | } | ||
208 | |||
209 | /** | ||
210 | * amdgpu_ring_backup - Back up the content of a ring | 159 | * amdgpu_ring_backup - Back up the content of a ring |
211 | * | 160 | * |
212 | * @ring: the ring we want to back up | 161 | * @ring: the ring we want to back up |
@@ -218,43 +167,32 @@ unsigned amdgpu_ring_backup(struct amdgpu_ring *ring, | |||
218 | { | 167 | { |
219 | unsigned size, ptr, i; | 168 | unsigned size, ptr, i; |
220 | 169 | ||
221 | /* just in case lock the ring */ | ||
222 | mutex_lock(ring->ring_lock); | ||
223 | *data = NULL; | 170 | *data = NULL; |
224 | 171 | ||
225 | if (ring->ring_obj == NULL) { | 172 | if (ring->ring_obj == NULL) |
226 | mutex_unlock(ring->ring_lock); | ||
227 | return 0; | 173 | return 0; |
228 | } | ||
229 | 174 | ||
230 | /* it doesn't make sense to save anything if all fences are signaled */ | 175 | /* it doesn't make sense to save anything if all fences are signaled */ |
231 | if (!amdgpu_fence_count_emitted(ring)) { | 176 | if (!amdgpu_fence_count_emitted(ring)) |
232 | mutex_unlock(ring->ring_lock); | ||
233 | return 0; | 177 | return 0; |
234 | } | ||
235 | 178 | ||
236 | ptr = le32_to_cpu(*ring->next_rptr_cpu_addr); | 179 | ptr = le32_to_cpu(*ring->next_rptr_cpu_addr); |
237 | 180 | ||
238 | size = ring->wptr + (ring->ring_size / 4); | 181 | size = ring->wptr + (ring->ring_size / 4); |
239 | size -= ptr; | 182 | size -= ptr; |
240 | size &= ring->ptr_mask; | 183 | size &= ring->ptr_mask; |
241 | if (size == 0) { | 184 | if (size == 0) |
242 | mutex_unlock(ring->ring_lock); | ||
243 | return 0; | 185 | return 0; |
244 | } | ||
245 | 186 | ||
246 | /* and then save the content of the ring */ | 187 | /* and then save the content of the ring */ |
247 | *data = kmalloc_array(size, sizeof(uint32_t), GFP_KERNEL); | 188 | *data = kmalloc_array(size, sizeof(uint32_t), GFP_KERNEL); |
248 | if (!*data) { | 189 | if (!*data) |
249 | mutex_unlock(ring->ring_lock); | ||
250 | return 0; | 190 | return 0; |
251 | } | ||
252 | for (i = 0; i < size; ++i) { | 191 | for (i = 0; i < size; ++i) { |
253 | (*data)[i] = ring->ring[ptr++]; | 192 | (*data)[i] = ring->ring[ptr++]; |
254 | ptr &= ring->ptr_mask; | 193 | ptr &= ring->ptr_mask; |
255 | } | 194 | } |
256 | 195 | ||
257 | mutex_unlock(ring->ring_lock); | ||
258 | return size; | 196 | return size; |
259 | } | 197 | } |
260 | 198 | ||
@@ -276,7 +214,7 @@ int amdgpu_ring_restore(struct amdgpu_ring *ring, | |||
276 | return 0; | 214 | return 0; |
277 | 215 | ||
278 | /* restore the saved ring content */ | 216 | /* restore the saved ring content */ |
279 | r = amdgpu_ring_lock(ring, size); | 217 | r = amdgpu_ring_alloc(ring, size); |
280 | if (r) | 218 | if (r) |
281 | return r; | 219 | return r; |
282 | 220 | ||
@@ -284,7 +222,7 @@ int amdgpu_ring_restore(struct amdgpu_ring *ring, | |||
284 | amdgpu_ring_write(ring, data[i]); | 222 | amdgpu_ring_write(ring, data[i]); |
285 | } | 223 | } |
286 | 224 | ||
287 | amdgpu_ring_unlock_commit(ring); | 225 | amdgpu_ring_commit(ring); |
288 | kfree(data); | 226 | kfree(data); |
289 | return 0; | 227 | return 0; |
290 | } | 228 | } |
@@ -352,7 +290,6 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, | |||
352 | return r; | 290 | return r; |
353 | } | 291 | } |
354 | 292 | ||
355 | ring->ring_lock = &adev->ring_lock; | ||
356 | /* Align ring size */ | 293 | /* Align ring size */ |
357 | rb_bufsz = order_base_2(ring_size / 8); | 294 | rb_bufsz = order_base_2(ring_size / 8); |
358 | ring_size = (1 << (rb_bufsz + 1)) * 4; | 295 | ring_size = (1 << (rb_bufsz + 1)) * 4; |
@@ -410,15 +347,10 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring) | |||
410 | int r; | 347 | int r; |
411 | struct amdgpu_bo *ring_obj; | 348 | struct amdgpu_bo *ring_obj; |
412 | 349 | ||
413 | if (ring->ring_lock == NULL) | ||
414 | return; | ||
415 | |||
416 | mutex_lock(ring->ring_lock); | ||
417 | ring_obj = ring->ring_obj; | 350 | ring_obj = ring->ring_obj; |
418 | ring->ready = false; | 351 | ring->ready = false; |
419 | ring->ring = NULL; | 352 | ring->ring = NULL; |
420 | ring->ring_obj = NULL; | 353 | ring->ring_obj = NULL; |
421 | mutex_unlock(ring->ring_lock); | ||
422 | 354 | ||
423 | amdgpu_wb_free(ring->adev, ring->fence_offs); | 355 | amdgpu_wb_free(ring->adev, ring->fence_offs); |
424 | amdgpu_wb_free(ring->adev, ring->rptr_offs); | 356 | amdgpu_wb_free(ring->adev, ring->rptr_offs); |