Subversion Repositories Kolibri OS

Rev

Rev 3764 | Rev 5271 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3764 Rev 5078
Line 22... Line 22...
22
 * OTHER DEALINGS IN THE SOFTWARE.
22
 * OTHER DEALINGS IN THE SOFTWARE.
23
 *
23
 *
24
 * Authors: Dave Airlie
24
 * Authors: Dave Airlie
25
 *          Alex Deucher
25
 *          Alex Deucher
26
 *          Jerome Glisse
26
 *          Jerome Glisse
27
 *          Christian Konig
27
 *          Christian König
28
 */
28
 */
29
#include 
-
 
30
#include 
-
 
31
#include 
29
#include 
32
#include 
-
 
33
#include "radeon_reg.h"
-
 
34
#include "radeon.h"
30
#include "radeon.h"
35
#include "atom.h"
-
 
36
 
-
 
37
/*
-
 
38
 * IB
-
 
39
 * IBs (Indirect Buffers) and areas of GPU accessible memory where
-
 
40
 * commands are stored.  You can put a pointer to the IB in the
-
 
41
 * command ring and the hw will fetch the commands from the IB
-
 
42
 * and execute them.  Generally userspace acceleration drivers
-
 
43
 * produce command buffers which are send to the kernel and
-
 
44
 * put in IBs for execution by the requested ring.
-
 
45
 */
-
 
46
static int radeon_debugfs_sa_init(struct radeon_device *rdev);
-
 
47
 
-
 
48
/**
-
 
49
 * radeon_ib_get - request an IB (Indirect Buffer)
-
 
50
 *
-
 
51
 * @rdev: radeon_device pointer
-
 
52
 * @ring: ring index the IB is associated with
-
 
53
 * @ib: IB object returned
-
 
54
 * @size: requested IB size
-
 
55
 *
-
 
56
 * Request an IB (all asics).  IBs are allocated using the
-
 
57
 * suballocator.
-
 
58
 * Returns 0 on success, error on failure.
-
 
59
 */
-
 
60
int radeon_ib_get(struct radeon_device *rdev, int ring,
-
 
61
		  struct radeon_ib *ib, struct radeon_vm *vm,
-
 
62
		  unsigned size)
-
 
63
{
-
 
64
	int i, r;
-
 
65
 
-
 
66
	r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256, true);
-
 
67
	if (r) {
-
 
68
		dev_err(rdev->dev, "failed to get a new IB (%d)\n", r);
-
 
69
		return r;
-
 
70
	}
-
 
71
 
-
 
72
	r = radeon_semaphore_create(rdev, &ib->semaphore);
-
 
73
		if (r) {
-
 
74
			return r;
-
 
75
		}
-
 
76
 
-
 
77
	ib->ring = ring;
-
 
78
	ib->fence = NULL;
-
 
79
	ib->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo);
-
 
80
	ib->vm = vm;
-
 
81
	if (vm) {
-
 
82
		/* ib pool is bound at RADEON_VA_IB_OFFSET in virtual address
-
 
83
		 * space and soffset is the offset inside the pool bo
-
 
84
		 */
-
 
85
		ib->gpu_addr = ib->sa_bo->soffset + RADEON_VA_IB_OFFSET;
-
 
86
	} else {
-
 
87
	ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo);
-
 
88
	}
-
 
89
	ib->is_const_ib = false;
-
 
90
	for (i = 0; i < RADEON_NUM_RINGS; ++i)
-
 
91
		ib->sync_to[i] = NULL;
-
 
92
 
-
 
93
	return 0;
-
 
94
}
-
 
95
 
-
 
96
/**
-
 
97
 * radeon_ib_free - free an IB (Indirect Buffer)
-
 
98
 *
-
 
99
 * @rdev: radeon_device pointer
-
 
100
 * @ib: IB object to free
-
 
101
 *
-
 
102
 * Free an IB (all asics).
-
 
103
 */
-
 
104
void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib)
-
 
105
{
-
 
106
	radeon_semaphore_free(rdev, &ib->semaphore, ib->fence);
-
 
107
	radeon_sa_bo_free(rdev, &ib->sa_bo, ib->fence);
-
 
108
	radeon_fence_unref(&ib->fence);
-
 
109
}
-
 
110
 
-
 
111
/**
-
 
112
 * radeon_ib_sync_to - sync to fence before executing the IB
-
 
113
 *
-
 
114
 * @ib: IB object to add fence to
-
 
115
 * @fence: fence to sync to
-
 
116
 *
-
 
117
 * Sync to the fence before executing the IB
-
 
118
 */
-
 
119
void radeon_ib_sync_to(struct radeon_ib *ib, struct radeon_fence *fence)
-
 
120
{
-
 
121
	struct radeon_fence *other;
-
 
122
 
-
 
123
	if (!fence)
-
 
124
		return;
-
 
125
 
-
 
126
	other = ib->sync_to[fence->ring];
-
 
127
	ib->sync_to[fence->ring] = radeon_fence_later(fence, other);
-
 
128
}
-
 
129
 
-
 
130
/**
-
 
131
 * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring
-
 
132
 *
-
 
133
 * @rdev: radeon_device pointer
-
 
134
 * @ib: IB object to schedule
-
 
135
 * @const_ib: Const IB to schedule (SI only)
-
 
136
 *
-
 
137
 * Schedule an IB on the associated ring (all asics).
-
 
138
 * Returns 0 on success, error on failure.
-
 
139
 *
-
 
140
 * On SI, there are two parallel engines fed from the primary ring,
-
 
141
 * the CE (Constant Engine) and the DE (Drawing Engine).  Since
-
 
142
 * resource descriptors have moved to memory, the CE allows you to
-
 
143
 * prime the caches while the DE is updating register state so that
-
 
144
 * the resource descriptors will be already in cache when the draw is
-
 
145
 * processed.  To accomplish this, the userspace driver submits two
-
 
146
 * IBs, one for the CE and one for the DE.  If there is a CE IB (called
-
 
147
 * a CONST_IB), it will be put on the ring prior to the DE IB.  Prior
-
 
148
 * to SI there was just a DE IB.
-
 
149
 */
-
 
150
int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
-
 
151
		       struct radeon_ib *const_ib)
-
 
152
{
-
 
153
	struct radeon_ring *ring = &rdev->ring[ib->ring];
-
 
154
	bool need_sync = false;
-
 
155
	int i, r = 0;
-
 
156
 
-
 
157
	if (!ib->length_dw || !ring->ready) {
-
 
158
		/* TODO: Nothings in the ib we should report. */
-
 
159
		dev_err(rdev->dev, "couldn't schedule ib\n");
-
 
160
		return -EINVAL;
-
 
161
	}
-
 
162
 
-
 
163
	/* 64 dwords should be enough for fence too */
-
 
164
	r = radeon_ring_lock(rdev, ring, 64 + RADEON_NUM_RINGS * 8);
-
 
165
	if (r) {
-
 
166
		dev_err(rdev->dev, "scheduling IB failed (%d).\n", r);
-
 
167
		return r;
-
 
168
	}
-
 
169
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
-
 
170
		struct radeon_fence *fence = ib->sync_to[i];
-
 
171
		if (radeon_fence_need_sync(fence, ib->ring)) {
-
 
172
			need_sync = true;
-
 
173
			radeon_semaphore_sync_rings(rdev, ib->semaphore,
-
 
174
						    fence->ring, ib->ring);
-
 
175
			radeon_fence_note_sync(fence, ib->ring);
-
 
176
		}
-
 
177
	}
-
 
178
	/* immediately free semaphore when we don't need to sync */
-
 
179
	if (!need_sync) {
-
 
180
		radeon_semaphore_free(rdev, &ib->semaphore, NULL);
-
 
181
	}
-
 
182
	/* if we can't remember our last VM flush then flush now! */
-
 
183
	/* XXX figure out why we have to flush for every IB */
-
 
184
	if (ib->vm /*&& !ib->vm->last_flush*/) {
-
 
185
		radeon_ring_vm_flush(rdev, ib->ring, ib->vm);
-
 
186
	}
-
 
187
	if (const_ib) {
-
 
188
		radeon_ring_ib_execute(rdev, const_ib->ring, const_ib);
-
 
189
		radeon_semaphore_free(rdev, &const_ib->semaphore, NULL);
-
 
190
	}
-
 
191
	radeon_ring_ib_execute(rdev, ib->ring, ib);
-
 
192
	r = radeon_fence_emit(rdev, &ib->fence, ib->ring);
-
 
193
	if (r) {
-
 
194
		dev_err(rdev->dev, "failed to emit fence for new IB (%d)\n", r);
-
 
195
		radeon_ring_unlock_undo(rdev, ring);
-
 
196
		return r;
-
 
197
	}
-
 
198
	if (const_ib) {
-
 
199
		const_ib->fence = radeon_fence_ref(ib->fence);
-
 
200
	}
-
 
201
	/* we just flushed the VM, remember that */
-
 
202
	if (ib->vm && !ib->vm->last_flush) {
-
 
203
		ib->vm->last_flush = radeon_fence_ref(ib->fence);
-
 
204
	}
-
 
205
	radeon_ring_unlock_commit(rdev, ring);
-
 
206
	return 0;
-
 
207
}
-
 
208
 
-
 
209
/**
-
 
210
 * radeon_ib_pool_init - Init the IB (Indirect Buffer) pool
-
 
211
 *
-
 
212
 * @rdev: radeon_device pointer
-
 
213
 *
-
 
214
 * Initialize the suballocator to manage a pool of memory
-
 
215
 * for use as IBs (all asics).
-
 
216
 * Returns 0 on success, error on failure.
-
 
217
 */
-
 
218
int radeon_ib_pool_init(struct radeon_device *rdev)
-
 
219
{
-
 
220
	int r;
-
 
221
 
-
 
222
	if (rdev->ib_pool_ready) {
-
 
223
		return 0;
-
 
224
	}
-
 
225
	r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo,
-
 
226
				      RADEON_IB_POOL_SIZE*64*1024,
-
 
227
				      RADEON_GEM_DOMAIN_GTT);
-
 
228
	if (r) {
-
 
229
		return r;
-
 
230
	}
-
 
231
 
-
 
232
	r = radeon_sa_bo_manager_start(rdev, &rdev->ring_tmp_bo);
-
 
233
	if (r) {
-
 
234
		return r;
-
 
235
	}
-
 
236
 
-
 
237
	rdev->ib_pool_ready = true;
-
 
238
	if (radeon_debugfs_sa_init(rdev)) {
-
 
239
		dev_err(rdev->dev, "failed to register debugfs file for SA\n");
-
 
240
	}
-
 
241
	return 0;
-
 
242
}
-
 
243
 
-
 
244
/**
-
 
245
 * radeon_ib_pool_fini - Free the IB (Indirect Buffer) pool
-
 
246
 *
-
 
247
 * @rdev: radeon_device pointer
-
 
248
 *
-
 
249
 * Tear down the suballocator managing the pool of memory
-
 
250
 * for use as IBs (all asics).
-
 
251
 */
-
 
252
void radeon_ib_pool_fini(struct radeon_device *rdev)
-
 
253
{
-
 
254
	if (rdev->ib_pool_ready) {
-
 
255
		radeon_sa_bo_manager_suspend(rdev, &rdev->ring_tmp_bo);
-
 
256
		radeon_sa_bo_manager_fini(rdev, &rdev->ring_tmp_bo);
-
 
257
		rdev->ib_pool_ready = false;
-
 
258
	}
-
 
259
}
-
 
260
 
-
 
261
/**
-
 
262
 * radeon_ib_ring_tests - test IBs on the rings
-
 
263
 *
-
 
264
 * @rdev: radeon_device pointer
-
 
265
 *
-
 
266
 * Test an IB (Indirect Buffer) on each ring.
-
 
267
 * If the test fails, disable the ring.
-
 
268
 * Returns 0 on success, error if the primary GFX ring
-
 
269
 * IB test fails.
-
 
270
 */
-
 
271
int radeon_ib_ring_tests(struct radeon_device *rdev)
-
 
272
{
-
 
273
	unsigned i;
-
 
274
	int r;
-
 
275
 
-
 
276
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
-
 
277
		struct radeon_ring *ring = &rdev->ring[i];
-
 
278
 
-
 
279
		if (!ring->ready)
-
 
280
			continue;
-
 
281
 
-
 
282
		r = radeon_ib_test(rdev, i, ring);
-
 
283
		if (r) {
-
 
284
			ring->ready = false;
-
 
285
 
-
 
286
			if (i == RADEON_RING_TYPE_GFX_INDEX) {
-
 
287
				/* oh, oh, that's really bad */
-
 
288
				DRM_ERROR("radeon: failed testing IB on GFX ring (%d).\n", r);
-
 
289
		                rdev->accel_working = false;
-
 
290
				return r;
-
 
291
 
-
 
292
			} else {
-
 
293
				/* still not good, but we can live with it */
-
 
294
				DRM_ERROR("radeon: failed testing IB on ring %d (%d).\n", i, r);
-
 
295
	}
-
 
296
		}
-
 
297
	}
-
 
298
	return 0;
-
 
299
}
-
 
Line 300... Line 31...
300
 
31
 
301
/*
32
/*
302
 * Rings
33
 * Rings
303
 * Most engines on the GPU are fed via ring buffers.  Ring
34
 * Most engines on the GPU are fed via ring buffers.  Ring
Line 365... Line 96...
365
 *
96
 *
366
 * Update the free dw slots in the ring buffer (all asics).
97
 * Update the free dw slots in the ring buffer (all asics).
367
 */
98
 */
368
void radeon_ring_free_size(struct radeon_device *rdev, struct radeon_ring *ring)
99
void radeon_ring_free_size(struct radeon_device *rdev, struct radeon_ring *ring)
369
{
100
{
370
	u32 rptr;
101
	uint32_t rptr = radeon_ring_get_rptr(rdev, ring);
Line 371... Line -...
371
 
-
 
372
	if (rdev->wb.enabled && ring != &rdev->ring[R600_RING_TYPE_UVD_INDEX])
-
 
373
		rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]);
-
 
374
	else
-
 
375
		rptr = RREG32(ring->rptr_reg);
-
 
376
	ring->rptr = (rptr & ring->ptr_reg_mask) >> ring->ptr_reg_shift;
102
 
377
	/* This works because ring_size is a power of 2 */
103
	/* This works because ring_size is a power of 2 */
378
	ring->ring_free_dw = (ring->rptr + (ring->ring_size / 4));
104
	ring->ring_free_dw = rptr + (ring->ring_size / 4);
379
	ring->ring_free_dw -= ring->wptr;
105
	ring->ring_free_dw -= ring->wptr;
380
	ring->ring_free_dw &= ring->ptr_mask;
106
	ring->ring_free_dw &= ring->ptr_mask;
-
 
107
	if (!ring->ring_free_dw) {
381
	if (!ring->ring_free_dw) {
108
		/* this is an empty ring */
-
 
109
		ring->ring_free_dw = ring->ring_size / 4;
-
 
110
		/*  update lockup info to avoid false positive */
382
		ring->ring_free_dw = ring->ring_size / 4;
111
		radeon_ring_lockup_update(rdev, ring);
383
	}
112
	}
Line 384... Line 113...
384
}
113
}
385
 
114
 
Line 401... Line 130...
401
	if (ndw > (ring->ring_size / 4))
130
	if (ndw > (ring->ring_size / 4))
402
		return -ENOMEM;
131
		return -ENOMEM;
403
	/* Align requested size with padding so unlock_commit can
132
	/* Align requested size with padding so unlock_commit can
404
	 * pad safely */
133
	 * pad safely */
405
	radeon_ring_free_size(rdev, ring);
134
	radeon_ring_free_size(rdev, ring);
406
	if (ring->ring_free_dw == (ring->ring_size / 4)) {
-
 
407
		/* This is an empty ring update lockup info to avoid
-
 
408
		 * false positive.
-
 
409
		 */
-
 
410
		radeon_ring_lockup_update(ring);
-
 
411
	}
-
 
412
	ndw = (ndw + ring->align_mask) & ~ring->align_mask;
135
	ndw = (ndw + ring->align_mask) & ~ring->align_mask;
413
	while (ndw > (ring->ring_free_dw - 1)) {
136
	while (ndw > (ring->ring_free_dw - 1)) {
414
		radeon_ring_free_size(rdev, ring);
137
		radeon_ring_free_size(rdev, ring);
415
		if (ndw < ring->ring_free_dw) {
138
		if (ndw < ring->ring_free_dw) {
416
			break;
139
			break;
417
		}
140
		}
418
		r = radeon_fence_wait_next_locked(rdev, ring->idx);
141
		r = radeon_fence_wait_next(rdev, ring->idx);
419
		if (r)
142
		if (r)
420
			return r;
143
			return r;
421
	}
144
	}
422
	ring->count_dw = ndw;
145
	ring->count_dw = ndw;
423
	ring->wptr_old = ring->wptr;
146
	ring->wptr_old = ring->wptr;
Line 452... Line 175...
452
 * radeon_ring_commit - tell the GPU to execute the new
175
 * radeon_ring_commit - tell the GPU to execute the new
453
 * commands on the ring buffer
176
 * commands on the ring buffer
454
 *
177
 *
455
 * @rdev: radeon_device pointer
178
 * @rdev: radeon_device pointer
456
 * @ring: radeon_ring structure holding ring information
179
 * @ring: radeon_ring structure holding ring information
-
 
180
 * @hdp_flush: Whether or not to perform an HDP cache flush
457
 *
181
 *
458
 * Update the wptr (write pointer) to tell the GPU to
182
 * Update the wptr (write pointer) to tell the GPU to
459
 * execute new commands on the ring buffer (all asics).
183
 * execute new commands on the ring buffer (all asics).
460
 */
184
 */
461
void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *ring)
185
void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *ring,
-
 
186
			bool hdp_flush)
462
{
187
{
-
 
188
	/* If we are emitting the HDP flush via the ring buffer, we need to
-
 
189
	 * do it before padding.
-
 
190
	 */
-
 
191
	if (hdp_flush && rdev->asic->ring[ring->idx]->hdp_flush)
-
 
192
		rdev->asic->ring[ring->idx]->hdp_flush(rdev, ring);
463
	/* We pad to match fetch size */
193
	/* We pad to match fetch size */
464
	while (ring->wptr & ring->align_mask) {
194
	while (ring->wptr & ring->align_mask) {
465
		radeon_ring_write(ring, ring->nop);
195
		radeon_ring_write(ring, ring->nop);
466
	}
196
	}
467
	DRM_MEMORYBARRIER();
197
	mb();
468
	WREG32(ring->wptr_reg, (ring->wptr << ring->ptr_reg_shift) & ring->ptr_reg_mask);
198
	/* If we are emitting the HDP flush via MMIO, we need to do it after
-
 
199
	 * all CPU writes to VRAM finished.
-
 
200
	 */
-
 
201
	if (hdp_flush && rdev->asic->mmio_hdp_flush)
-
 
202
		rdev->asic->mmio_hdp_flush(rdev);
469
	(void)RREG32(ring->wptr_reg);
203
	radeon_ring_set_wptr(rdev, ring);
470
}
204
}
Line 471... Line 205...
471
 
205
 
472
/**
206
/**
473
 * radeon_ring_unlock_commit - tell the GPU to execute the new
207
 * radeon_ring_unlock_commit - tell the GPU to execute the new
474
 * commands on the ring buffer and unlock it
208
 * commands on the ring buffer and unlock it
475
 *
209
 *
476
 * @rdev: radeon_device pointer
210
 * @rdev: radeon_device pointer
-
 
211
 * @ring: radeon_ring structure holding ring information
477
 * @ring: radeon_ring structure holding ring information
212
 * @hdp_flush: Whether or not to perform an HDP cache flush
478
 *
213
 *
479
 * Call radeon_ring_commit() then unlock the ring (all asics).
214
 * Call radeon_ring_commit() then unlock the ring (all asics).
480
 */
215
 */
-
 
216
void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *ring,
481
void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *ring)
217
			       bool hdp_flush)
482
{
218
{
483
	radeon_ring_commit(rdev, ring);
219
	radeon_ring_commit(rdev, ring, hdp_flush);
484
	mutex_unlock(&rdev->ring_lock);
220
	mutex_unlock(&rdev->ring_lock);
Line 485... Line 221...
485
}
221
}
486
 
222
 
Line 508... Line 244...
508
	radeon_ring_undo(ring);
244
	radeon_ring_undo(ring);
509
	mutex_unlock(&rdev->ring_lock);
245
	mutex_unlock(&rdev->ring_lock);
510
}
246
}
Line 511... Line 247...
511
 
247
 
512
/**
-
 
513
 * radeon_ring_force_activity - add some nop packets to the ring
-
 
514
 *
-
 
515
 * @rdev: radeon_device pointer
-
 
516
 * @ring: radeon_ring structure holding ring information
-
 
517
 *
-
 
518
 * Add some nop packets to the ring to force activity (all asics).
-
 
519
 * Used for lockup detection to see if the rptr is advancing.
-
 
520
 */
-
 
521
void radeon_ring_force_activity(struct radeon_device *rdev, struct radeon_ring *ring)
-
 
522
{
-
 
523
	int r;
-
 
524
 
-
 
525
	radeon_ring_free_size(rdev, ring);
-
 
526
	if (ring->rptr == ring->wptr) {
-
 
527
		r = radeon_ring_alloc(rdev, ring, 1);
-
 
528
		if (!r) {
-
 
529
			radeon_ring_write(ring, ring->nop);
-
 
530
			radeon_ring_commit(rdev, ring);
-
 
531
		}
-
 
532
	}
-
 
533
}
-
 
534
 
-
 
535
/**
248
/**
536
 * radeon_ring_lockup_update - update lockup variables
249
 * radeon_ring_lockup_update - update lockup variables
537
 *
250
 *
538
 * @ring: radeon_ring structure holding ring information
251
 * @ring: radeon_ring structure holding ring information
539
 *
252
 *
540
 * Update the last rptr value and timestamp (all asics).
253
 * Update the last rptr value and timestamp (all asics).
541
 */
254
 */
-
 
255
void radeon_ring_lockup_update(struct radeon_device *rdev,
542
void radeon_ring_lockup_update(struct radeon_ring *ring)
256
			       struct radeon_ring *ring)
543
{
257
{
544
	ring->last_rptr = ring->rptr;
258
	atomic_set(&ring->last_rptr, radeon_ring_get_rptr(rdev, ring));
545
	ring->last_activity = GetTimerTicks();
259
	atomic64_set(&ring->last_activity, jiffies_64);
Line 546... Line 260...
546
}
260
}
547
 
261
 
548
/**
262
/**
549
 * radeon_ring_test_lockup() - check if ring is lockedup by recording information
263
 * radeon_ring_test_lockup() - check if ring is lockedup by recording information
550
 * @rdev:       radeon device structure
264
 * @rdev:       radeon device structure
551
 * @ring:       radeon_ring structure holding ring information
-
 
552
 *
-
 
553
 * We don't need to initialize the lockup tracking information as we will either
-
 
554
 * have CP rptr to a different value of jiffies wrap around which will force
-
 
555
 * initialization of the lockup tracking informations.
-
 
556
 *
-
 
557
 * A possible false positivie is if we get call after while and last_cp_rptr ==
-
 
558
 * the current CP rptr, even if it's unlikely it might happen. To avoid this
-
 
559
 * if the elapsed time since last call is bigger than 2 second than we return
-
 
560
 * false and update the tracking information. Due to this the caller must call
-
 
561
 * radeon_ring_test_lockup several time in less than 2sec for lockup to be reported
-
 
562
 * the fencing code should be cautious about that.
-
 
563
 *
-
 
564
 * Caller should write to the ring to force CP to do something so we don't get
-
 
565
 * false positive when CP is just gived nothing to do.
265
 * @ring:       radeon_ring structure holding ring information
566
 *
266
 *
567
 **/
267
 */
568
bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
268
bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
-
 
269
{
569
{
270
	uint32_t rptr = radeon_ring_get_rptr(rdev, ring);
570
	unsigned long cjiffies, elapsed;
271
	uint64_t last = atomic64_read(&ring->last_activity);
571
	uint32_t rptr;
-
 
572
 
272
	uint64_t elapsed;
573
	cjiffies = GetTimerTicks();
273
 
574
	if (!time_after(cjiffies, ring->last_activity)) {
274
	if (rptr != atomic_read(&ring->last_rptr)) {
575
		/* likely a wrap around */
275
		/* ring is still working, no lockup */
576
		radeon_ring_lockup_update(ring);
276
		radeon_ring_lockup_update(rdev, ring);
577
		return false;
-
 
578
	}
-
 
579
	rptr = RREG32(ring->rptr_reg);
-
 
580
	ring->rptr = (rptr & ring->ptr_reg_mask) >> ring->ptr_reg_shift;
-
 
581
	if (ring->rptr != ring->last_rptr) {
-
 
582
		/* CP is still working no lockup */
-
 
583
		radeon_ring_lockup_update(ring);
277
		return false;
584
		return false;
278
	}
585
	}
279
 
586
	elapsed = jiffies_to_msecs(cjiffies - ring->last_activity);
280
	elapsed = jiffies_to_msecs(jiffies_64 - last);
-
 
281
	if (radeon_lockup_timeout && elapsed >= radeon_lockup_timeout) {
587
	if (radeon_lockup_timeout && elapsed >= radeon_lockup_timeout) {
282
		dev_err(rdev->dev, "ring %d stalled for more than %llumsec\n",
588
		dev_err(rdev->dev, "GPU lockup CP stall for more than %lumsec\n", elapsed);
283
			ring->idx, elapsed);
589
		return true;
284
		return true;
590
	}
285
	}
591
	/* give a chance to the GPU ... */
286
	/* give a chance to the GPU ... */
Line 679... Line 374...
679
 
374
 
680
	for (i = 0; i < size; ++i) {
375
	for (i = 0; i < size; ++i) {
681
		radeon_ring_write(ring, data[i]);
376
		radeon_ring_write(ring, data[i]);
Line 682... Line 377...
682
	}
377
	}
683
 
378
 
684
	radeon_ring_unlock_commit(rdev, ring);
379
	radeon_ring_unlock_commit(rdev, ring, false);
685
	kfree(data);
380
	kfree(data);
Line 686... Line 381...
686
	return 0;
381
	return 0;
Line 691... Line 386...
691
 *
386
 *
692
 * @rdev: radeon_device pointer
387
 * @rdev: radeon_device pointer
693
 * @ring: radeon_ring structure holding ring information
388
 * @ring: radeon_ring structure holding ring information
694
 * @ring_size: size of the ring
389
 * @ring_size: size of the ring
695
 * @rptr_offs: offset of the rptr writeback location in the WB buffer
390
 * @rptr_offs: offset of the rptr writeback location in the WB buffer
696
 * @rptr_reg: MMIO offset of the rptr register
-
 
697
 * @wptr_reg: MMIO offset of the wptr register
-
 
698
 * @ptr_reg_shift: bit offset of the rptr/wptr values
-
 
699
 * @ptr_reg_mask: bit mask of the rptr/wptr values
-
 
700
 * @nop: nop packet for this ring
391
 * @nop: nop packet for this ring
701
 *
392
 *
702
 * Initialize the driver information for the selected ring (all asics).
393
 * Initialize the driver information for the selected ring (all asics).
703
 * Returns 0 on success, error on failure.
394
 * Returns 0 on success, error on failure.
704
 */
395
 */
705
int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size,
396
int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size,
706
		     unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg,
-
 
707
		     u32 ptr_reg_shift, u32 ptr_reg_mask, u32 nop)
397
		     unsigned rptr_offs, u32 nop)
708
{
398
{
709
	int r;
399
	int r;
Line 710... Line 400...
710
 
400
 
711
	ring->ring_size = ring_size;
401
	ring->ring_size = ring_size;
712
	ring->rptr_offs = rptr_offs;
-
 
713
	ring->rptr_reg = rptr_reg;
-
 
714
	ring->wptr_reg = wptr_reg;
-
 
715
	ring->ptr_reg_shift = ptr_reg_shift;
-
 
716
	ring->ptr_reg_mask = ptr_reg_mask;
402
	ring->rptr_offs = rptr_offs;
717
	ring->nop = nop;
403
	ring->nop = nop;
718
    /* Allocate ring buffer */
404
	/* Allocate ring buffer */
719
	if (ring->ring_obj == NULL) {
405
	if (ring->ring_obj == NULL) {
720
		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
406
		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
721
					 RADEON_GEM_DOMAIN_GTT,
407
				     RADEON_GEM_DOMAIN_GTT, 0,
722
				     NULL, &ring->ring_obj);
408
				     NULL, &ring->ring_obj);
723
		if (r) {
409
		if (r) {
724
			dev_err(rdev->dev, "(%d) ring create failed\n", r);
410
			dev_err(rdev->dev, "(%d) ring create failed\n", r);
725
			return r;
411
			return r;
Line 750... Line 436...
750
		ring->next_rptr_cpu_addr = &rdev->wb.wb[index/4];
436
		ring->next_rptr_cpu_addr = &rdev->wb.wb[index/4];
751
	}
437
	}
752
	if (radeon_debugfs_ring_init(rdev, ring)) {
438
	if (radeon_debugfs_ring_init(rdev, ring)) {
753
		DRM_ERROR("Failed to register debugfs file for rings !\n");
439
		DRM_ERROR("Failed to register debugfs file for rings !\n");
754
	}
440
	}
755
	radeon_ring_lockup_update(ring);
441
	radeon_ring_lockup_update(rdev, ring);
756
	return 0;
442
	return 0;
757
}
443
}
Line 758... Line 444...
758
 
444
 
759
/**
445
/**
Line 797... Line 483...
797
	struct drm_info_node *node = (struct drm_info_node *) m->private;
483
	struct drm_info_node *node = (struct drm_info_node *) m->private;
798
	struct drm_device *dev = node->minor->dev;
484
	struct drm_device *dev = node->minor->dev;
799
	struct radeon_device *rdev = dev->dev_private;
485
	struct radeon_device *rdev = dev->dev_private;
800
	int ridx = *(int*)node->info_ent->data;
486
	int ridx = *(int*)node->info_ent->data;
801
	struct radeon_ring *ring = &rdev->ring[ridx];
487
	struct radeon_ring *ring = &rdev->ring[ridx];
-
 
488
 
-
 
489
	uint32_t rptr, wptr, rptr_next;
802
	unsigned count, i, j;
490
	unsigned count, i, j;
803
	u32 tmp;
-
 
Line 804... Line 491...
804
 
491
 
805
	radeon_ring_free_size(rdev, ring);
492
	radeon_ring_free_size(rdev, ring);
-
 
493
	count = (ring->ring_size / 4) - ring->ring_free_dw;
806
	count = (ring->ring_size / 4) - ring->ring_free_dw;
494
 
807
	tmp = RREG32(ring->wptr_reg) >> ring->ptr_reg_shift;
495
	wptr = radeon_ring_get_wptr(rdev, ring);
-
 
496
	seq_printf(m, "wptr: 0x%08x [%5d]\n",
-
 
497
		   wptr, wptr);
808
	seq_printf(m, "wptr(0x%04x): 0x%08x [%5d]\n", ring->wptr_reg, tmp, tmp);
498
 
809
	tmp = RREG32(ring->rptr_reg) >> ring->ptr_reg_shift;
499
	rptr = radeon_ring_get_rptr(rdev, ring);
-
 
500
	seq_printf(m, "rptr: 0x%08x [%5d]\n",
-
 
501
		   rptr, rptr);
810
	seq_printf(m, "rptr(0x%04x): 0x%08x [%5d]\n", ring->rptr_reg, tmp, tmp);
502
 
-
 
503
	if (ring->rptr_save_reg) {
811
	if (ring->rptr_save_reg) {
504
		rptr_next = RREG32(ring->rptr_save_reg);
812
		seq_printf(m, "rptr next(0x%04x): 0x%08x\n", ring->rptr_save_reg,
505
		seq_printf(m, "rptr next(0x%04x): 0x%08x [%5d]\n",
-
 
506
			   ring->rptr_save_reg, rptr_next, rptr_next);
-
 
507
	} else
813
			   RREG32(ring->rptr_save_reg));
508
		rptr_next = ~0;
814
	}
509
 
815
	seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", ring->wptr, ring->wptr);
510
	seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n",
816
	seq_printf(m, "driver's copy of the rptr: 0x%08x [%5d]\n", ring->rptr, ring->rptr);
511
		   ring->wptr, ring->wptr);
-
 
512
	seq_printf(m, "last semaphore signal addr : 0x%016llx\n",
817
	seq_printf(m, "last semaphore signal addr : 0x%016llx\n", ring->last_semaphore_signal_addr);
513
		   ring->last_semaphore_signal_addr);
-
 
514
	seq_printf(m, "last semaphore wait addr   : 0x%016llx\n",
818
	seq_printf(m, "last semaphore wait addr   : 0x%016llx\n", ring->last_semaphore_wait_addr);
515
		   ring->last_semaphore_wait_addr);
819
	seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
516
	seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
-
 
517
	seq_printf(m, "%u dwords in ring\n", count);
-
 
518
 
-
 
519
	if (!ring->ready)
-
 
520
		return 0;
820
	seq_printf(m, "%u dwords in ring\n", count);
521
 
821
	/* print 8 dw before current rptr as often it's the last executed
522
	/* print 8 dw before current rptr as often it's the last executed
822
	 * packet that is the root issue
523
	 * packet that is the root issue
823
	 */
524
	 */
824
	i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask;
525
	i = (rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask;
825
	for (j = 0; j <= (count + 32); j++) {
526
	for (j = 0; j <= (count + 32); j++) {
-
 
527
		seq_printf(m, "r[%5d]=0x%08x", i, ring->ring[i]);
-
 
528
		if (rptr == i)
-
 
529
			seq_puts(m, " *");
-
 
530
		if (rptr_next == i)
-
 
531
			seq_puts(m, " #");
826
		seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]);
532
		seq_puts(m, "\n");
827
		i = (i + 1) & ring->ptr_mask;
533
		i = (i + 1) & ring->ptr_mask;
828
	}
534
	}
829
	return 0;
535
	return 0;
Line 833... Line 539...
833
static int cayman_cp1_index = CAYMAN_RING_TYPE_CP1_INDEX;
539
static int cayman_cp1_index = CAYMAN_RING_TYPE_CP1_INDEX;
834
static int cayman_cp2_index = CAYMAN_RING_TYPE_CP2_INDEX;
540
static int cayman_cp2_index = CAYMAN_RING_TYPE_CP2_INDEX;
835
static int radeon_dma1_index = R600_RING_TYPE_DMA_INDEX;
541
static int radeon_dma1_index = R600_RING_TYPE_DMA_INDEX;
836
static int radeon_dma2_index = CAYMAN_RING_TYPE_DMA1_INDEX;
542
static int radeon_dma2_index = CAYMAN_RING_TYPE_DMA1_INDEX;
837
static int r600_uvd_index = R600_RING_TYPE_UVD_INDEX;
543
static int r600_uvd_index = R600_RING_TYPE_UVD_INDEX;
-
 
544
static int si_vce1_index = TN_RING_TYPE_VCE1_INDEX;
-
 
545
static int si_vce2_index = TN_RING_TYPE_VCE2_INDEX;
Line 838... Line 546...
838
 
546
 
839
static struct drm_info_list radeon_debugfs_ring_info_list[] = {
547
static struct drm_info_list radeon_debugfs_ring_info_list[] = {
840
	{"radeon_ring_gfx", radeon_debugfs_ring_info, 0, &radeon_gfx_index},
548
	{"radeon_ring_gfx", radeon_debugfs_ring_info, 0, &radeon_gfx_index},
841
	{"radeon_ring_cp1", radeon_debugfs_ring_info, 0, &cayman_cp1_index},
549
	{"radeon_ring_cp1", radeon_debugfs_ring_info, 0, &cayman_cp1_index},
842
	{"radeon_ring_cp2", radeon_debugfs_ring_info, 0, &cayman_cp2_index},
550
	{"radeon_ring_cp2", radeon_debugfs_ring_info, 0, &cayman_cp2_index},
843
	{"radeon_ring_dma1", radeon_debugfs_ring_info, 0, &radeon_dma1_index},
551
	{"radeon_ring_dma1", radeon_debugfs_ring_info, 0, &radeon_dma1_index},
844
	{"radeon_ring_dma2", radeon_debugfs_ring_info, 0, &radeon_dma2_index},
552
	{"radeon_ring_dma2", radeon_debugfs_ring_info, 0, &radeon_dma2_index},
845
	{"radeon_ring_uvd", radeon_debugfs_ring_info, 0, &r600_uvd_index},
-
 
846
};
-
 
847
 
553
	{"radeon_ring_uvd", radeon_debugfs_ring_info, 0, &r600_uvd_index},
848
static int radeon_debugfs_sa_info(struct seq_file *m, void *data)
-
 
849
{
-
 
850
	struct drm_info_node *node = (struct drm_info_node *) m->private;
-
 
851
	struct drm_device *dev = node->minor->dev;
-
 
852
	struct radeon_device *rdev = dev->dev_private;
-
 
853
 
-
 
854
	radeon_sa_bo_dump_debug_info(&rdev->ring_tmp_bo, m);
-
 
855
 
-
 
856
	return 0;
-
 
857
 
-
 
858
}
-
 
859
 
-
 
860
static struct drm_info_list radeon_debugfs_sa_list[] = {
554
	{"radeon_ring_vce1", radeon_debugfs_ring_info, 0, &si_vce1_index},
861
        {"radeon_sa_info", &radeon_debugfs_sa_info, 0, NULL},
555
	{"radeon_ring_vce2", radeon_debugfs_ring_info, 0, &si_vce2_index},
Line 862... Line 556...
862
};
556
};
Line 863... Line 557...
863
 
557
 
Line 880... Line 574...
880
		return r;
574
			return r;
881
	}
575
	}
882
#endif
576
#endif
883
	return 0;
577
	return 0;
884
}
578
}
885
 
-
 
886
static int radeon_debugfs_sa_init(struct radeon_device *rdev)
-
 
887
{
-
 
888
#if defined(CONFIG_DEBUG_FS)
-
 
889
	return radeon_debugfs_add_files(rdev, radeon_debugfs_sa_list, 1);
-
 
890
#else
-
 
891
	return 0;
-
 
892
#endif
-
 
893
}
-