aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c80
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 */
119int 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 */
178void 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 */
203void 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);