Subversion Repositories Kolibri OS

Rev

Rev 6938 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1125 serge 1
/*
2
 * Copyright 2009 Jerome Glisse.
3
 * All Rights Reserved.
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the
7
 * "Software"), to deal in the Software without restriction, including
8
 * without limitation the rights to use, copy, modify, merge, publish,
9
 * distribute, sub license, and/or sell copies of the Software, and to
10
 * permit persons to whom the Software is furnished to do so, subject to
11
 * the following conditions:
12
 *
13
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
16
 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
17
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
20
 *
21
 * The above copyright notice and this permission notice (including the
22
 * next paragraph) shall be included in all copies or substantial portions
23
 * of the Software.
24
 *
25
 */
26
/*
27
 * Authors:
28
 *    Jerome Glisse 
29
 *    Dave Airlie
30
 */
31
#include 
5271 serge 32
#include 
3192 Serge 33
#include 
1125 serge 34
#include 
1986 serge 35
#include 
6104 serge 36
#include 
2997 Serge 37
#include 
1125 serge 38
#include "radeon_reg.h"
39
#include "radeon.h"
5078 serge 40
#include "radeon_trace.h"
1125 serge 41
 
2997 Serge 42
/*
43
 * Fences
44
 * Fences mark an event in the GPUs pipeline and are used
45
 * for GPU/CPU synchronization.  When the fence is written,
46
 * it is expected that all buffers associated with that fence
47
 * are no longer in use by the associated ring on the GPU and
48
 * that the the relevant GPU caches have been flushed.  Whether
49
 * we use a scratch register or memory location depends on the asic
50
 * and whether writeback is enabled.
51
 */
52
 
53
/**
54
 * radeon_fence_write - write a fence value
55
 *
56
 * @rdev: radeon_device pointer
57
 * @seq: sequence number to write
58
 * @ring: ring index the fence is associated with
59
 *
60
 * Writes a fence value to memory or a scratch register (all asics).
61
 */
62
static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring)
2004 serge 63
{
2997 Serge 64
	struct radeon_fence_driver *drv = &rdev->fence_drv[ring];
65
	if (likely(rdev->wb.enabled || !drv->scratch_reg)) {
3764 Serge 66
		if (drv->cpu_addr) {
6104 serge 67
			*drv->cpu_addr = cpu_to_le32(seq);
3764 Serge 68
		}
2997 Serge 69
	} else {
70
		WREG32(drv->scratch_reg, seq);
71
	}
2004 serge 72
}
73
 
2997 Serge 74
/**
75
 * radeon_fence_read - read a fence value
76
 *
77
 * @rdev: radeon_device pointer
78
 * @ring: ring index the fence is associated with
79
 *
80
 * Reads a fence value from memory or a scratch register (all asics).
81
 * Returns the value of the fence read from memory or register.
82
 */
83
static u32 radeon_fence_read(struct radeon_device *rdev, int ring)
2004 serge 84
{
2997 Serge 85
	struct radeon_fence_driver *drv = &rdev->fence_drv[ring];
86
	u32 seq = 0;
2004 serge 87
 
2997 Serge 88
	if (likely(rdev->wb.enabled || !drv->scratch_reg)) {
3764 Serge 89
		if (drv->cpu_addr) {
6104 serge 90
			seq = le32_to_cpu(*drv->cpu_addr);
91
		} else {
3764 Serge 92
			seq = lower_32_bits(atomic64_read(&drv->last_seq));
93
		}
94
	} else {
2997 Serge 95
		seq = RREG32(drv->scratch_reg);
96
	}
2004 serge 97
	return seq;
98
}
99
 
2997 Serge 100
/**
101
 * radeon_fence_emit - emit a fence on the requested ring
102
 *
103
 * @rdev: radeon_device pointer
104
 * @fence: radeon fence object
105
 * @ring: ring index the fence is associated with
106
 *
107
 * Emits a fence command on the requested ring (all asics).
108
 * Returns 0 on success, -ENOMEM on failure.
109
 */
110
int radeon_fence_emit(struct radeon_device *rdev,
111
		      struct radeon_fence **fence,
112
		      int ring)
1125 serge 113
{
6938 serge 114
	u64 seq;
5271 serge 115
 
2997 Serge 116
	/* we are protected by the ring emission mutex */
117
	*fence = kmalloc(sizeof(struct radeon_fence), GFP_KERNEL);
118
	if ((*fence) == NULL) {
119
		return -ENOMEM;
1125 serge 120
	}
2997 Serge 121
	(*fence)->rdev = rdev;
6938 serge 122
	(*fence)->seq = seq = ++rdev->fence_drv[ring].sync_seq[ring];
2997 Serge 123
	(*fence)->ring = ring;
5271 serge 124
	(*fence)->is_vm_update = false;
125
	fence_init(&(*fence)->base, &radeon_fence_ops,
126
		   &rdev->fence_queue.lock, rdev->fence_context + ring, seq);
2997 Serge 127
	radeon_fence_ring_emit(rdev, ring, *fence);
5078 serge 128
	trace_radeon_fence_emit(rdev->ddev, ring, (*fence)->seq);
1125 serge 129
	return 0;
130
}
131
 
2997 Serge 132
/**
5271 serge 133
 * radeon_fence_check_signaled - callback from fence_queue
2997 Serge 134
 *
5271 serge 135
 * this function is called with fence_queue lock held, which is also used
136
 * for the fence locking itself, so unlocked variants are used for
137
 * fence_signal, and remove_wait_queue.
138
 */
139
static int radeon_fence_check_signaled(wait_queue_t *wait, unsigned mode, int flags, void *key)
140
{
141
	struct radeon_fence *fence;
142
	u64 seq;
143
 
144
	fence = container_of(wait, struct radeon_fence, fence_wake);
145
 
146
	/*
147
	 * We cannot use radeon_fence_process here because we're already
148
	 * in the waitqueue, in a call from wake_up_all.
149
	 */
150
	seq = atomic64_read(&fence->rdev->fence_drv[fence->ring].last_seq);
151
	if (seq >= fence->seq) {
152
		int ret = fence_signal_locked(&fence->base);
153
 
154
		if (!ret)
155
			FENCE_TRACE(&fence->base, "signaled from irq context\n");
156
		else
157
			FENCE_TRACE(&fence->base, "was already signaled\n");
158
 
159
		radeon_irq_kms_sw_irq_put(fence->rdev, fence->ring);
160
//       __remove_wait_queue(&fence->rdev->fence_queue, &fence->fence_wake);
161
		fence_put(&fence->base);
162
	} else
163
		FENCE_TRACE(&fence->base, "pending\n");
164
	return 0;
165
}
166
 
167
/**
168
 * radeon_fence_activity - check for fence activity
169
 *
2997 Serge 170
 * @rdev: radeon_device pointer
171
 * @ring: ring index the fence is associated with
172
 *
5271 serge 173
 * Checks the current fence value and calculates the last
174
 * signalled fence value. Returns true if activity occured
175
 * on the ring, and the fence_queue should be waken up.
2997 Serge 176
 */
5271 serge 177
static bool radeon_fence_activity(struct radeon_device *rdev, int ring)
1125 serge 178
{
2997 Serge 179
	uint64_t seq, last_seq, last_emitted;
180
	unsigned count_loop = 0;
1125 serge 181
	bool wake = false;
182
 
2997 Serge 183
	/* Note there is a scenario here for an infinite loop but it's
184
	 * very unlikely to happen. For it to happen, the current polling
185
	 * process need to be interrupted by another process and another
186
	 * process needs to update the last_seq btw the atomic read and
187
	 * xchg of the current process.
188
	 *
189
	 * More over for this to go in infinite loop there need to be
190
	 * continuously new fence signaled ie radeon_fence_read needs
191
	 * to return a different value each time for both the currently
192
	 * polling process and the other process that xchg the last_seq
193
	 * btw atomic read and xchg of the current process. And the
194
	 * value the other process set as last seq must be higher than
195
	 * the seq value we just read. Which means that current process
196
	 * need to be interrupted after radeon_fence_read and before
197
	 * atomic xchg.
198
	 *
199
	 * To be even more safe we count the number of time we loop and
200
	 * we bail after 10 loop just accepting the fact that we might
201
	 * have temporarly set the last_seq not to the true real last
202
	 * seq but to an older one.
203
	 */
204
	last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq);
205
	do {
206
		last_emitted = rdev->fence_drv[ring].sync_seq[ring];
207
		seq = radeon_fence_read(rdev, ring);
208
		seq |= last_seq & 0xffffffff00000000LL;
209
		if (seq < last_seq) {
210
			seq &= 0xffffffff;
211
			seq |= last_emitted & 0xffffffff00000000LL;
212
		}
213
 
214
		if (seq <= last_seq || seq > last_emitted) {
215
			break;
216
		}
217
		/* If we loop over we don't want to return without
218
		 * checking if a fence is signaled as it means that the
219
		 * seq we just read is different from the previous on.
220
		 */
221
		wake = true;
222
		last_seq = seq;
223
		if ((count_loop++) > 10) {
224
			/* We looped over too many time leave with the
225
			 * fact that we might have set an older fence
226
			 * seq then the current real last seq as signaled
227
			 * by the hw.
1963 serge 228
			 */
1125 serge 229
			break;
230
		}
2997 Serge 231
	} while (atomic64_xchg(&rdev->fence_drv[ring].last_seq, seq) > seq);
232
 
5271 serge 233
//	if (seq < last_emitted)
234
//		radeon_fence_schedule_check(rdev, ring);
235
 
236
	return wake;
2997 Serge 237
}
238
 
239
/**
5271 serge 240
 * radeon_fence_check_lockup - check for hardware lockup
2997 Serge 241
 *
5271 serge 242
 * @work: delayed work item
2997 Serge 243
 *
5271 serge 244
 * Checks for fence activity and if there is none probe
245
 * the hardware if a lockup occured.
2997 Serge 246
 */
5271 serge 247
static void radeon_fence_check_lockup(struct work_struct *work)
2997 Serge 248
{
5271 serge 249
	struct radeon_fence_driver *fence_drv;
250
	struct radeon_device *rdev;
251
	int ring;
2997 Serge 252
 
5271 serge 253
	fence_drv = container_of(work, struct radeon_fence_driver,
254
				 lockup_work.work);
255
	rdev = fence_drv->rdev;
256
	ring = fence_drv - &rdev->fence_drv[0];
257
 
258
//	if (!down_read_trylock(&rdev->exclusive_lock)) {
259
//		/* just reschedule the check if a reset is going on */
260
//		radeon_fence_schedule_check(rdev, ring);
261
//		return;
262
//	}
263
 
264
	if (fence_drv->delayed_irq && rdev->ddev->irq_enabled) {
265
		unsigned long irqflags;
266
 
267
		fence_drv->delayed_irq = false;
268
		spin_lock_irqsave(&rdev->irq.lock, irqflags);
269
		radeon_irq_set(rdev);
270
		spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
271
	}
272
 
273
	if (radeon_fence_activity(rdev, ring))
274
		wake_up_all(&rdev->fence_queue);
275
 
276
	else if (radeon_ring_is_lockup(rdev, ring, &rdev->ring[ring])) {
277
 
278
		/* good news we believe it's a lockup */
279
		dev_warn(rdev->dev, "GPU lockup (current fence id "
280
			 "0x%016llx last fence id 0x%016llx on ring %d)\n",
281
			 (uint64_t)atomic64_read(&fence_drv->last_seq),
282
			 fence_drv->sync_seq[ring], ring);
283
 
284
		/* remember that we need an reset */
285
		rdev->needs_reset = true;
286
		wake_up_all(&rdev->fence_queue);
287
	}
288
//	up_read(&rdev->exclusive_lock);
2997 Serge 289
}
290
 
291
/**
5271 serge 292
 * radeon_fence_process - process a fence
293
 *
294
 * @rdev: radeon_device pointer
295
 * @ring: ring index the fence is associated with
296
 *
297
 * Checks the current fence value and wakes the fence queue
298
 * if the sequence number has increased (all asics).
299
 */
300
void radeon_fence_process(struct radeon_device *rdev, int ring)
301
{
302
	if (radeon_fence_activity(rdev, ring))
303
		wake_up_all(&rdev->fence_queue);
304
}
305
 
306
/**
5078 serge 307
 * radeon_fence_seq_signaled - check if a fence sequence number has signaled
2997 Serge 308
 *
309
 * @rdev: radeon device pointer
310
 * @seq: sequence number
311
 * @ring: ring index the fence is associated with
312
 *
5078 serge 313
 * Check if the last signaled fence sequnce number is >= the requested
2997 Serge 314
 * sequence number (all asics).
315
 * Returns true if the fence has signaled (current fence value
316
 * is >= requested value) or false if it has not (current fence
317
 * value is < the requested value.  Helper function for
318
 * radeon_fence_signaled().
319
 */
320
static bool radeon_fence_seq_signaled(struct radeon_device *rdev,
321
				      u64 seq, unsigned ring)
322
{
323
	if (atomic64_read(&rdev->fence_drv[ring].last_seq) >= seq) {
324
		return true;
1125 serge 325
	}
2997 Serge 326
	/* poll new last sequence at least once */
327
	radeon_fence_process(rdev, ring);
328
	if (atomic64_read(&rdev->fence_drv[ring].last_seq) >= seq) {
329
		return true;
330
	}
331
	return false;
1125 serge 332
}
333
 
5271 serge 334
static bool radeon_fence_is_signaled(struct fence *f)
335
{
336
	struct radeon_fence *fence = to_radeon_fence(f);
337
	struct radeon_device *rdev = fence->rdev;
338
	unsigned ring = fence->ring;
339
	u64 seq = fence->seq;
340
 
341
	if (atomic64_read(&rdev->fence_drv[ring].last_seq) >= seq) {
342
		return true;
343
	}
344
 
6104 serge 345
	if (down_read_trylock(&rdev->exclusive_lock)) {
5271 serge 346
		radeon_fence_process(rdev, ring);
6104 serge 347
		up_read(&rdev->exclusive_lock);
5271 serge 348
 
349
		if (atomic64_read(&rdev->fence_drv[ring].last_seq) >= seq) {
350
			return true;
351
		}
352
	}
353
	return false;
354
}
355
 
2997 Serge 356
/**
5271 serge 357
 * radeon_fence_enable_signaling - enable signalling on fence
358
 * @fence: fence
359
 *
360
 * This function is called with fence_queue lock held, and adds a callback
361
 * to fence_queue that checks if this fence is signaled, and if so it
362
 * signals the fence and removes itself.
363
 */
364
static bool radeon_fence_enable_signaling(struct fence *f)
365
{
366
	struct radeon_fence *fence = to_radeon_fence(f);
367
	struct radeon_device *rdev = fence->rdev;
368
 
369
	if (atomic64_read(&rdev->fence_drv[fence->ring].last_seq) >= fence->seq)
370
		return false;
371
 
372
//   if (down_read_trylock(&rdev->exclusive_lock))
373
         {
374
		radeon_irq_kms_sw_irq_get(rdev, fence->ring);
375
 
376
//       if (radeon_fence_activity(rdev, fence->ring))
377
//           wake_up_all_locked(&rdev->fence_queue);
378
 
379
		/* did fence get signaled after we enabled the sw irq? */
380
		if (atomic64_read(&rdev->fence_drv[fence->ring].last_seq) >= fence->seq) {
381
			radeon_irq_kms_sw_irq_put(rdev, fence->ring);
382
//           up_read(&rdev->exclusive_lock);
383
			return false;
384
		}
385
 
386
//       up_read(&rdev->exclusive_lock);
387
//   } else {
388
		/* we're probably in a lockup, lets not fiddle too much */
389
//       if (radeon_irq_kms_sw_irq_get_delayed(rdev, fence->ring))
390
//           rdev->fence_drv[fence->ring].delayed_irq = true;
391
//       radeon_fence_schedule_check(rdev, fence->ring);
392
	}
393
 
394
//	fence->fence_wake.flags = 0;
395
//	fence->fence_wake.private = NULL;
396
	fence->fence_wake.func = radeon_fence_check_signaled;
397
	__add_wait_queue(&rdev->fence_queue, &fence->fence_wake);
398
	fence_get(f);
399
 
400
	FENCE_TRACE(&fence->base, "armed on ring %i!\n", fence->ring);
401
	return true;
402
}
403
 
404
/**
2997 Serge 405
 * radeon_fence_signaled - check if a fence has signaled
406
 *
407
 * @fence: radeon fence object
408
 *
409
 * Check if the requested fence has signaled (all asics).
410
 * Returns true if the fence has signaled or false if it has not.
7146 serge 411
 */
2997 Serge 412
bool radeon_fence_signaled(struct radeon_fence *fence)
413
{
5271 serge 414
	if (!fence)
2997 Serge 415
		return true;
5271 serge 416
 
2997 Serge 417
	if (radeon_fence_seq_signaled(fence->rdev, fence->seq, fence->ring)) {
5271 serge 418
		int ret;
419
 
420
		ret = fence_signal(&fence->base);
421
		if (!ret)
422
			FENCE_TRACE(&fence->base, "signaled from radeon_fence_signaled\n");
2997 Serge 423
		return true;
424
	}
425
	return false;
426
}
1125 serge 427
 
2997 Serge 428
/**
5078 serge 429
 * radeon_fence_any_seq_signaled - check if any sequence number is signaled
2997 Serge 430
 *
431
 * @rdev: radeon device pointer
5078 serge 432
 * @seq: sequence numbers
433
 *
434
 * Check if the last signaled fence sequnce number is >= the requested
435
 * sequence number (all asics).
436
 * Returns true if any has signaled (current value is >= requested value)
437
 * or false if it has not. Helper function for radeon_fence_wait_seq.
438
 */
439
static bool radeon_fence_any_seq_signaled(struct radeon_device *rdev, u64 *seq)
440
{
441
	unsigned i;
442
 
443
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
444
		if (seq[i] && radeon_fence_seq_signaled(rdev, seq[i], i))
445
			return true;
446
	}
447
	return false;
448
}
449
 
450
/**
5271 serge 451
 * radeon_fence_wait_seq_timeout - wait for a specific sequence numbers
5078 serge 452
 *
453
 * @rdev: radeon device pointer
454
 * @target_seq: sequence number(s) we want to wait for
2997 Serge 455
 * @intr: use interruptable sleep
5271 serge 456
 * @timeout: maximum time to wait, or MAX_SCHEDULE_TIMEOUT for infinite wait
2997 Serge 457
 *
5078 serge 458
 * Wait for the requested sequence number(s) to be written by any ring
459
 * (all asics).  Sequnce number array is indexed by ring id.
2997 Serge 460
 * @intr selects whether to use interruptable (true) or non-interruptable
461
 * (false) sleep when waiting for the sequence number.  Helper function
5078 serge 462
 * for radeon_fence_wait_*().
5271 serge 463
 * Returns remaining time if the sequence number has passed, 0 when
464
 * the wait timeout, or an error for all other cases.
5078 serge 465
 * -EDEADLK is returned when a GPU lockup has been detected.
2997 Serge 466
 */
5271 serge 467
static long radeon_fence_wait_seq_timeout(struct radeon_device *rdev,
468
					  u64 *target_seq, bool intr,
469
					  long timeout)
1125 serge 470
{
5271 serge 471
	long r;
472
	int i;
1125 serge 473
 
5271 serge 474
	if (radeon_fence_any_seq_signaled(rdev, target_seq))
475
		return timeout;
5078 serge 476
 
5271 serge 477
	/* enable IRQs and tracing */
7146 serge 478
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
479
		if (!target_seq[i])
480
			continue;
5078 serge 481
 
7146 serge 482
		trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]);
483
		radeon_irq_kms_sw_irq_get(rdev, i);
484
	}
2997 Serge 485
 
7146 serge 486
	if (intr) {
487
		r = wait_event_interruptible_timeout(rdev->fence_queue, (
5271 serge 488
			radeon_fence_any_seq_signaled(rdev, target_seq)
489
			 || rdev->needs_reset), timeout);
7146 serge 490
	} else {
491
		r = wait_event_timeout(rdev->fence_queue, (
5271 serge 492
			radeon_fence_any_seq_signaled(rdev, target_seq)
493
			 || rdev->needs_reset), timeout);
7146 serge 494
	}
2005 serge 495
 
5271 serge 496
	if (rdev->needs_reset)
497
		r = -EDEADLK;
498
 
7146 serge 499
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
500
		if (!target_seq[i])
501
			continue;
5078 serge 502
 
7146 serge 503
		radeon_irq_kms_sw_irq_put(rdev, i);
504
		trace_radeon_fence_wait_end(rdev->ddev, i, target_seq[i]);
505
	}
5078 serge 506
 
7146 serge 507
	return r;
1125 serge 508
}
509
 
2997 Serge 510
/**
7146 serge 511
 * radeon_fence_wait_timeout - wait for a fence to signal with timeout
2997 Serge 512
 *
513
 * @fence: radeon fence object
5271 serge 514
 * @intr: use interruptible sleep
2997 Serge 515
 *
516
 * Wait for the requested fence to signal (all asics).
517
 * @intr selects whether to use interruptable (true) or non-interruptable
518
 * (false) sleep when waiting for the fence.
7146 serge 519
 * @timeout: maximum time to wait, or MAX_SCHEDULE_TIMEOUT for infinite wait
520
 * Returns remaining time if the sequence number has passed, 0 when
521
 * the wait timeout, or an error for all other cases.
2997 Serge 522
 */
7146 serge 523
long radeon_fence_wait_timeout(struct radeon_fence *fence, bool intr, long timeout)
1179 serge 524
{
5078 serge 525
	uint64_t seq[RADEON_NUM_RINGS] = {};
5271 serge 526
	long r;
7146 serge 527
	int r_sig;
1125 serge 528
 
5271 serge 529
	/*
530
	 * This function should not be called on !radeon fences.
531
	 * If this is the case, it would mean this function can
532
	 * also be called on radeon fences belonging to another card.
533
	 * exclusive_lock is not held in that case.
534
	 */
535
	if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
536
		return fence_wait(&fence->base, intr);
2997 Serge 537
 
5078 serge 538
	seq[fence->ring] = fence->seq;
7146 serge 539
	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, timeout);
540
	if (r <= 0) {
541
		return r;
5271 serge 542
	}
2997 Serge 543
 
7146 serge 544
	r_sig = fence_signal(&fence->base);
545
	if (!r_sig)
5271 serge 546
		FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
7146 serge 547
	return r;
1125 serge 548
}
549
 
2997 Serge 550
/**
7146 serge 551
 * radeon_fence_wait - wait for a fence to signal
552
 *
553
 * @fence: radeon fence object
554
 * @intr: use interruptible sleep
555
 *
556
 * Wait for the requested fence to signal (all asics).
557
 * @intr selects whether to use interruptable (true) or non-interruptable
558
 * (false) sleep when waiting for the fence.
559
 * Returns 0 if the fence has passed, error for all other cases.
560
 */
561
int radeon_fence_wait(struct radeon_fence *fence, bool intr)
562
{
563
	long r = radeon_fence_wait_timeout(fence, intr, MAX_SCHEDULE_TIMEOUT);
564
	if (r > 0) {
565
		return 0;
566
	} else {
567
		return r;
568
	}
569
}
570
 
571
/**
2997 Serge 572
 * radeon_fence_wait_any - wait for a fence to signal on any ring
573
 *
574
 * @rdev: radeon device pointer
575
 * @fences: radeon fence object(s)
576
 * @intr: use interruptable sleep
577
 *
578
 * Wait for any requested fence to signal (all asics).  Fence
579
 * array is indexed by ring id.  @intr selects whether to use
580
 * interruptable (true) or non-interruptable (false) sleep when
581
 * waiting for the fences. Used by the suballocator.
582
 * Returns 0 if any fence has passed, error for all other cases.
583
 */
584
int radeon_fence_wait_any(struct radeon_device *rdev,
585
			  struct radeon_fence **fences,
586
			  bool intr)
1125 serge 587
{
2997 Serge 588
	uint64_t seq[RADEON_NUM_RINGS];
5078 serge 589
	unsigned i, num_rings = 0;
5271 serge 590
	long r;
1125 serge 591
 
2997 Serge 592
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
593
		seq[i] = 0;
594
 
595
		if (!fences[i]) {
596
			continue;
597
		}
598
 
5078 serge 599
		seq[i] = fences[i]->seq;
600
		++num_rings;
1125 serge 601
	}
2997 Serge 602
 
5078 serge 603
	/* nothing to wait for ? */
604
	if (num_rings == 0)
605
		return -ENOENT;
2997 Serge 606
 
5271 serge 607
	r = radeon_fence_wait_seq_timeout(rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
608
	if (r < 0) {
2997 Serge 609
		return r;
610
	}
611
	return 0;
1125 serge 612
}
613
 
2997 Serge 614
/**
5078 serge 615
 * radeon_fence_wait_next - wait for the next fence to signal
2997 Serge 616
 *
617
 * @rdev: radeon device pointer
618
 * @ring: ring index the fence is associated with
619
 *
620
 * Wait for the next fence on the requested ring to signal (all asics).
621
 * Returns 0 if the next fence has passed, error for all other cases.
622
 * Caller must hold ring lock.
623
 */
5078 serge 624
int radeon_fence_wait_next(struct radeon_device *rdev, int ring)
1125 serge 625
{
5078 serge 626
	uint64_t seq[RADEON_NUM_RINGS] = {};
5271 serge 627
	long r;
1125 serge 628
 
5078 serge 629
	seq[ring] = atomic64_read(&rdev->fence_drv[ring].last_seq) + 1ULL;
630
	if (seq[ring] >= rdev->fence_drv[ring].sync_seq[ring]) {
2997 Serge 631
		/* nothing to wait for, last_seq is
632
		   already the last emited fence */
633
		return -ENOENT;
1125 serge 634
	}
5271 serge 635
	r = radeon_fence_wait_seq_timeout(rdev, seq, false, MAX_SCHEDULE_TIMEOUT);
636
	if (r < 0)
637
		return r;
638
	return 0;
2997 Serge 639
}
640
 
641
/**
5078 serge 642
 * radeon_fence_wait_empty - wait for all fences to signal
2997 Serge 643
 *
644
 * @rdev: radeon device pointer
645
 * @ring: ring index the fence is associated with
646
 *
647
 * Wait for all fences on the requested ring to signal (all asics).
648
 * Returns 0 if the fences have passed, error for all other cases.
649
 * Caller must hold ring lock.
650
 */
5078 serge 651
int radeon_fence_wait_empty(struct radeon_device *rdev, int ring)
2997 Serge 652
{
5078 serge 653
	uint64_t seq[RADEON_NUM_RINGS] = {};
5271 serge 654
	long r;
2997 Serge 655
 
5078 serge 656
	seq[ring] = rdev->fence_drv[ring].sync_seq[ring];
657
	if (!seq[ring])
658
		return 0;
659
 
5271 serge 660
	r = radeon_fence_wait_seq_timeout(rdev, seq, false, MAX_SCHEDULE_TIMEOUT);
661
	if (r < 0) {
5078 serge 662
		if (r == -EDEADLK)
3192 Serge 663
			return -EDEADLK;
5078 serge 664
 
5271 serge 665
		dev_err(rdev->dev, "error waiting for ring[%d] to become idle (%ld)\n",
3192 Serge 666
			ring, r);
2997 Serge 667
	}
3192 Serge 668
	return 0;
1125 serge 669
}
670
 
2997 Serge 671
/**
672
 * radeon_fence_ref - take a ref on a fence
673
 *
674
 * @fence: radeon fence object
675
 *
676
 * Take a reference on a fence (all asics).
677
 * Returns the fence.
678
 */
1125 serge 679
struct radeon_fence *radeon_fence_ref(struct radeon_fence *fence)
680
{
5271 serge 681
	fence_get(&fence->base);
1125 serge 682
	return fence;
683
}
684
 
2997 Serge 685
/**
686
 * radeon_fence_unref - remove a ref on a fence
687
 *
688
 * @fence: radeon fence object
689
 *
690
 * Remove a reference on a fence (all asics).
691
 */
1125 serge 692
void radeon_fence_unref(struct radeon_fence **fence)
693
{
6104 serge 694
	struct radeon_fence *tmp = *fence;
1125 serge 695
 
6104 serge 696
	*fence = NULL;
2997 Serge 697
	if (tmp) {
5271 serge 698
		fence_put(&tmp->base);
2997 Serge 699
	}
700
}
2005 serge 701
 
2997 Serge 702
/**
703
 * radeon_fence_count_emitted - get the count of emitted fences
704
 *
705
 * @rdev: radeon device pointer
706
 * @ring: ring index the fence is associated with
707
 *
708
 * Get the number of fences emitted on the requested ring (all asics).
709
 * Returns the number of emitted fences on the ring.  Used by the
710
 * dynpm code to ring track activity.
711
 */
712
unsigned radeon_fence_count_emitted(struct radeon_device *rdev, int ring)
713
{
714
	uint64_t emitted;
715
 
716
	/* We are not protected by ring lock when reading the last sequence
717
	 * but it's ok to report slightly wrong fence count here.
718
	 */
719
	radeon_fence_process(rdev, ring);
720
	emitted = rdev->fence_drv[ring].sync_seq[ring]
721
		- atomic64_read(&rdev->fence_drv[ring].last_seq);
722
	/* to avoid 32bits warp around */
723
	if (emitted > 0x10000000) {
724
		emitted = 0x10000000;
725
	}
726
	return (unsigned)emitted;
1125 serge 727
}
728
 
2997 Serge 729
/**
730
 * radeon_fence_need_sync - do we need a semaphore
731
 *
732
 * @fence: radeon fence object
733
 * @dst_ring: which ring to check against
734
 *
735
 * Check if the fence needs to be synced against another ring
736
 * (all asics).  If so, we need to emit a semaphore.
737
 * Returns true if we need to sync with another ring, false if
738
 * not.
739
 */
740
bool radeon_fence_need_sync(struct radeon_fence *fence, int dst_ring)
1125 serge 741
{
2997 Serge 742
	struct radeon_fence_driver *fdrv;
1125 serge 743
 
2997 Serge 744
	if (!fence) {
745
		return false;
746
	}
747
 
748
	if (fence->ring == dst_ring) {
749
		return false;
750
	}
751
 
752
	/* we are protected by the ring mutex */
753
	fdrv = &fence->rdev->fence_drv[dst_ring];
754
	if (fence->seq <= fdrv->sync_seq[fence->ring]) {
755
		return false;
756
	}
757
 
758
	return true;
1125 serge 759
}
760
 
2997 Serge 761
/**
762
 * radeon_fence_note_sync - record the sync point
763
 *
764
 * @fence: radeon fence object
765
 * @dst_ring: which ring to check against
766
 *
767
 * Note the sequence number at which point the fence will
768
 * be synced with the requested ring (all asics).
769
 */
770
void radeon_fence_note_sync(struct radeon_fence *fence, int dst_ring)
1125 serge 771
{
2997 Serge 772
	struct radeon_fence_driver *dst, *src;
773
	unsigned i;
774
 
775
	if (!fence) {
776
		return;
777
	}
778
 
779
	if (fence->ring == dst_ring) {
780
		return;
781
	}
782
 
783
	/* we are protected by the ring mutex */
784
	src = &fence->rdev->fence_drv[fence->ring];
785
	dst = &fence->rdev->fence_drv[dst_ring];
786
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
787
		if (i == dst_ring) {
788
			continue;
789
		}
790
		dst->sync_seq[i] = max(dst->sync_seq[i], src->sync_seq[i]);
791
	}
792
}
793
 
794
/**
795
 * radeon_fence_driver_start_ring - make the fence driver
796
 * ready for use on the requested ring.
797
 *
798
 * @rdev: radeon device pointer
799
 * @ring: ring index to start the fence driver on
800
 *
801
 * Make the fence driver ready for processing (all asics).
802
 * Not all asics have all rings, so each asic will only
803
 * start the fence driver on the rings it has.
804
 * Returns 0 for success, errors for failure.
805
 */
806
int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring)
807
{
808
	uint64_t index;
1125 serge 809
	int r;
810
 
2997 Serge 811
	radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
3192 Serge 812
	if (rdev->wb.use_event || !radeon_ring_supports_scratch_reg(rdev, &rdev->ring[ring])) {
2997 Serge 813
		rdev->fence_drv[ring].scratch_reg = 0;
3764 Serge 814
		if (ring != R600_RING_TYPE_UVD_INDEX) {
6104 serge 815
			index = R600_WB_EVENT_OFFSET + ring * 4;
3764 Serge 816
			rdev->fence_drv[ring].cpu_addr = &rdev->wb.wb[index/4];
817
			rdev->fence_drv[ring].gpu_addr = rdev->wb.gpu_addr +
818
							 index;
819
 
820
		} else {
821
			/* put fence directly behind firmware */
822
			index = ALIGN(rdev->uvd_fw->size, 8);
823
			rdev->fence_drv[ring].cpu_addr = rdev->uvd.cpu_addr + index;
824
			rdev->fence_drv[ring].gpu_addr = rdev->uvd.gpu_addr + index;
825
		}
826
 
2997 Serge 827
	} else {
828
		r = radeon_scratch_get(rdev, &rdev->fence_drv[ring].scratch_reg);
6104 serge 829
		if (r) {
830
			dev_err(rdev->dev, "fence failed to get scratch register\n");
831
			return r;
832
		}
2997 Serge 833
		index = RADEON_WB_SCRATCH_OFFSET +
834
			rdev->fence_drv[ring].scratch_reg -
835
			rdev->scratch.reg_base;
6104 serge 836
		rdev->fence_drv[ring].cpu_addr = &rdev->wb.wb[index/4];
837
		rdev->fence_drv[ring].gpu_addr = rdev->wb.gpu_addr + index;
3764 Serge 838
	}
2997 Serge 839
	radeon_fence_write(rdev, atomic64_read(&rdev->fence_drv[ring].last_seq), ring);
840
	rdev->fence_drv[ring].initialized = true;
841
	dev_info(rdev->dev, "fence driver on ring %d use gpu addr 0x%016llx and cpu addr 0x%p\n",
842
		 ring, rdev->fence_drv[ring].gpu_addr, rdev->fence_drv[ring].cpu_addr);
6104 serge 843
	return 0;
1125 serge 844
}
845
 
2997 Serge 846
/**
847
 * radeon_fence_driver_init_ring - init the fence driver
848
 * for the requested ring.
849
 *
850
 * @rdev: radeon device pointer
851
 * @ring: ring index to start the fence driver on
852
 *
853
 * Init the fence driver for the requested ring (all asics).
854
 * Helper function for radeon_fence_driver_init().
855
 */
856
static void radeon_fence_driver_init_ring(struct radeon_device *rdev, int ring)
857
{
858
	int i;
1125 serge 859
 
2997 Serge 860
	rdev->fence_drv[ring].scratch_reg = -1;
861
	rdev->fence_drv[ring].cpu_addr = NULL;
862
	rdev->fence_drv[ring].gpu_addr = 0;
863
	for (i = 0; i < RADEON_NUM_RINGS; ++i)
864
		rdev->fence_drv[ring].sync_seq[i] = 0;
865
	atomic64_set(&rdev->fence_drv[ring].last_seq, 0);
866
	rdev->fence_drv[ring].initialized = false;
5271 serge 867
	INIT_DELAYED_WORK(&rdev->fence_drv[ring].lockup_work,
868
			  radeon_fence_check_lockup);
869
	rdev->fence_drv[ring].rdev = rdev;
2997 Serge 870
}
871
 
872
/**
873
 * radeon_fence_driver_init - init the fence driver
874
 * for all possible rings.
875
 *
876
 * @rdev: radeon device pointer
877
 *
878
 * Init the fence driver for all possible rings (all asics).
879
 * Not all asics have all rings, so each asic will only
880
 * start the fence driver on the rings it has using
881
 * radeon_fence_driver_start_ring().
882
 * Returns 0 for success.
883
 */
884
int radeon_fence_driver_init(struct radeon_device *rdev)
885
{
886
	int ring;
887
 
888
	init_waitqueue_head(&rdev->fence_queue);
889
	for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
890
		radeon_fence_driver_init_ring(rdev, ring);
891
	}
892
	if (radeon_debugfs_fence_init(rdev)) {
893
		dev_err(rdev->dev, "fence debugfs file creation failed\n");
894
	}
895
	return 0;
896
}
897
 
898
/**
899
 * radeon_fence_driver_fini - tear down the fence driver
900
 * for all possible rings.
901
 *
902
 * @rdev: radeon device pointer
903
 *
904
 * Tear down the fence driver for all possible rings (all asics).
905
 */
906
void radeon_fence_driver_fini(struct radeon_device *rdev)
907
{
3192 Serge 908
	int ring, r;
2997 Serge 909
 
910
	mutex_lock(&rdev->ring_lock);
911
	for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
912
		if (!rdev->fence_drv[ring].initialized)
913
			continue;
5078 serge 914
		r = radeon_fence_wait_empty(rdev, ring);
3192 Serge 915
		if (r) {
916
			/* no need to trigger GPU reset as we are unloading */
5271 serge 917
			radeon_fence_driver_force_completion(rdev, ring);
3192 Serge 918
		}
2997 Serge 919
		wake_up_all(&rdev->fence_queue);
920
		radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
921
		rdev->fence_drv[ring].initialized = false;
922
	}
923
	mutex_unlock(&rdev->ring_lock);
924
}
925
 
3192 Serge 926
/**
927
 * radeon_fence_driver_force_completion - force all fence waiter to complete
928
 *
929
 * @rdev: radeon device pointer
5271 serge 930
 * @ring: the ring to complete
3192 Serge 931
 *
932
 * In case of GPU reset failure make sure no process keep waiting on fence
933
 * that will never complete.
934
 */
5271 serge 935
void radeon_fence_driver_force_completion(struct radeon_device *rdev, int ring)
3192 Serge 936
{
5271 serge 937
	if (rdev->fence_drv[ring].initialized) {
3192 Serge 938
		radeon_fence_write(rdev, rdev->fence_drv[ring].sync_seq[ring], ring);
939
	}
940
}
941
 
942
 
1125 serge 943
/*
944
 * Fence debugfs
945
 */
946
#if defined(CONFIG_DEBUG_FS)
947
static int radeon_debugfs_fence_info(struct seq_file *m, void *data)
948
{
949
	struct drm_info_node *node = (struct drm_info_node *)m->private;
950
	struct drm_device *dev = node->minor->dev;
951
	struct radeon_device *rdev = dev->dev_private;
2997 Serge 952
	int i, j;
1125 serge 953
 
2997 Serge 954
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
955
		if (!rdev->fence_drv[i].initialized)
956
			continue;
957
 
5078 serge 958
		radeon_fence_process(rdev, i);
959
 
2997 Serge 960
		seq_printf(m, "--- ring %d ---\n", i);
961
		seq_printf(m, "Last signaled fence 0x%016llx\n",
962
			   (unsigned long long)atomic64_read(&rdev->fence_drv[i].last_seq));
963
		seq_printf(m, "Last emitted        0x%016llx\n",
964
			   rdev->fence_drv[i].sync_seq[i]);
965
 
966
		for (j = 0; j < RADEON_NUM_RINGS; ++j) {
967
			if (i != j && rdev->fence_drv[j].initialized)
968
				seq_printf(m, "Last sync to ring %d 0x%016llx\n",
969
					   j, rdev->fence_drv[i].sync_seq[j]);
970
		}
1125 serge 971
	}
972
	return 0;
973
}
974
 
5078 serge 975
/**
976
 * radeon_debugfs_gpu_reset - manually trigger a gpu reset
977
 *
978
 * Manually trigger a gpu reset at the next fence wait.
979
 */
980
static int radeon_debugfs_gpu_reset(struct seq_file *m, void *data)
981
{
982
	struct drm_info_node *node = (struct drm_info_node *) m->private;
983
	struct drm_device *dev = node->minor->dev;
984
	struct radeon_device *rdev = dev->dev_private;
985
 
986
	down_read(&rdev->exclusive_lock);
987
	seq_printf(m, "%d\n", rdev->needs_reset);
988
	rdev->needs_reset = true;
5271 serge 989
	wake_up_all(&rdev->fence_queue);
5078 serge 990
	up_read(&rdev->exclusive_lock);
991
 
992
	return 0;
993
}
994
 
1125 serge 995
static struct drm_info_list radeon_debugfs_fence_list[] = {
996
	{"radeon_fence_info", &radeon_debugfs_fence_info, 0, NULL},
5078 serge 997
	{"radeon_gpu_reset", &radeon_debugfs_gpu_reset, 0, NULL}
1125 serge 998
};
999
#endif
1000
 
1001
int radeon_debugfs_fence_init(struct radeon_device *rdev)
1002
{
1003
#if defined(CONFIG_DEBUG_FS)
5078 serge 1004
	return radeon_debugfs_add_files(rdev, radeon_debugfs_fence_list, 2);
1125 serge 1005
#else
1006
	return 0;
1007
#endif
1008
}
5271 serge 1009
 
1010
static const char *radeon_fence_get_driver_name(struct fence *fence)
1011
{
1012
	return "radeon";
1013
}
1014
 
1015
static const char *radeon_fence_get_timeline_name(struct fence *f)
1016
{
1017
	struct radeon_fence *fence = to_radeon_fence(f);
1018
	switch (fence->ring) {
1019
	case RADEON_RING_TYPE_GFX_INDEX: return "radeon.gfx";
1020
	case CAYMAN_RING_TYPE_CP1_INDEX: return "radeon.cp1";
1021
	case CAYMAN_RING_TYPE_CP2_INDEX: return "radeon.cp2";
1022
	case R600_RING_TYPE_DMA_INDEX: return "radeon.dma";
1023
	case CAYMAN_RING_TYPE_DMA1_INDEX: return "radeon.dma1";
1024
	case R600_RING_TYPE_UVD_INDEX: return "radeon.uvd";
1025
	case TN_RING_TYPE_VCE1_INDEX: return "radeon.vce1";
1026
	case TN_RING_TYPE_VCE2_INDEX: return "radeon.vce2";
1027
	default: WARN_ON_ONCE(1); return "radeon.unk";
1028
	}
1029
}
1030
 
1031
static inline bool radeon_test_signaled(struct radeon_fence *fence)
1032
{
1033
	return test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags);
1034
}
1035
 
1036
static signed long radeon_fence_default_wait(struct fence *f, bool intr,
1037
					     signed long t)
1038
{
1039
	struct radeon_fence *fence = to_radeon_fence(f);
1040
	struct radeon_device *rdev = fence->rdev;
1041
	bool signaled;
1042
 
1043
	fence_enable_sw_signaling(&fence->base);
1044
 
1045
	/*
1046
	 * This function has to return -EDEADLK, but cannot hold
1047
	 * exclusive_lock during the wait because some callers
1048
	 * may already hold it. This means checking needs_reset without
1049
	 * lock, and not fiddling with any gpu internals.
1050
	 *
1051
	 * The callback installed with fence_enable_sw_signaling will
1052
	 * run before our wait_event_*timeout call, so we will see
1053
	 * both the signaled fence and the changes to needs_reset.
1054
	 */
1055
 
1056
	if (intr)
1057
		t = wait_event_interruptible_timeout(rdev->fence_queue,
1058
			((signaled = radeon_test_signaled(fence)) ||
1059
			 rdev->needs_reset), t);
1060
	else
1061
		t = wait_event_timeout(rdev->fence_queue,
1062
			((signaled = radeon_test_signaled(fence)) ||
1063
			 rdev->needs_reset), t);
1064
 
1065
	if (t > 0 && !signaled)
1066
		return -EDEADLK;
1067
	return t;
1068
}
1069
 
1070
const struct fence_ops radeon_fence_ops = {
1071
	.get_driver_name = radeon_fence_get_driver_name,
1072
	.get_timeline_name = radeon_fence_get_timeline_name,
1073
	.enable_signaling = radeon_fence_enable_signaling,
1074
	.signaled = radeon_fence_is_signaled,
1075
	.wait = radeon_fence_default_wait,
1076
	.release = NULL,
1077
};