Subversion Repositories Kolibri OS

Rev

Rev 6938 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6938 Rev 7146
Line 406... Line 406...
406
 *
406
 *
407
 * @fence: radeon fence object
407
 * @fence: radeon fence object
408
 *
408
 *
409
 * Check if the requested fence has signaled (all asics).
409
 * Check if the requested fence has signaled (all asics).
410
 * Returns true if the fence has signaled or false if it has not.
410
 * Returns true if the fence has signaled or false if it has not.
411
				 */
411
 */
412
bool radeon_fence_signaled(struct radeon_fence *fence)
412
bool radeon_fence_signaled(struct radeon_fence *fence)
413
{
413
{
414
	if (!fence)
414
	if (!fence)
415
		return true;
415
		return true;
Line 473... Line 473...
473
 
473
 
474
	if (radeon_fence_any_seq_signaled(rdev, target_seq))
474
	if (radeon_fence_any_seq_signaled(rdev, target_seq))
Line 475... Line 475...
475
		return timeout;
475
		return timeout;
476
 
476
 
477
	/* enable IRQs and tracing */
477
	/* enable IRQs and tracing */
478
		for (i = 0; i < RADEON_NUM_RINGS; ++i) {
478
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
479
			if (!target_seq[i])
479
		if (!target_seq[i])
480
				continue;
480
			continue;
481
 
481
 
482
			trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]);
482
		trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]);
Line 483... Line 483...
483
			radeon_irq_kms_sw_irq_get(rdev, i);
483
		radeon_irq_kms_sw_irq_get(rdev, i);
484
        }
484
	}
485
 
485
 
486
		if (intr) {
486
	if (intr) {
487
			r = wait_event_interruptible_timeout(rdev->fence_queue, (
487
		r = wait_event_interruptible_timeout(rdev->fence_queue, (
488
			radeon_fence_any_seq_signaled(rdev, target_seq)
488
			radeon_fence_any_seq_signaled(rdev, target_seq)
489
			 || rdev->needs_reset), timeout);
489
			 || rdev->needs_reset), timeout);
490
		} else {
490
	} else {
491
			r = wait_event_timeout(rdev->fence_queue, (
491
		r = wait_event_timeout(rdev->fence_queue, (
Line 492... Line 492...
492
			radeon_fence_any_seq_signaled(rdev, target_seq)
492
			radeon_fence_any_seq_signaled(rdev, target_seq)
493
			 || rdev->needs_reset), timeout);
493
			 || rdev->needs_reset), timeout);
Line 494... Line 494...
494
        }
494
	}
495
 
495
 
496
	if (rdev->needs_reset)
496
	if (rdev->needs_reset)
497
		r = -EDEADLK;
497
		r = -EDEADLK;
498
 
498
 
499
		for (i = 0; i < RADEON_NUM_RINGS; ++i) {
499
	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
500
			if (!target_seq[i])
500
		if (!target_seq[i])
Line 501... Line 501...
501
				continue;
501
			continue;
502
 
502
 
Line 503... Line 503...
503
			radeon_irq_kms_sw_irq_put(rdev, i);
503
		radeon_irq_kms_sw_irq_put(rdev, i);
504
			trace_radeon_fence_wait_end(rdev->ddev, i, target_seq[i]);
504
		trace_radeon_fence_wait_end(rdev->ddev, i, target_seq[i]);
505
		}
505
	}
506
 
506
 
507
            return r;
507
	return r;
508
}
508
}
509
 
509
 
510
/**
510
/**
511
 * radeon_fence_wait - wait for a fence to signal
511
 * radeon_fence_wait_timeout - wait for a fence to signal with timeout
-
 
512
 *
-
 
513
 * @fence: radeon fence object
512
 *
514
 * @intr: use interruptible sleep
513
 * @fence: radeon fence object
515
 *
514
 * @intr: use interruptible sleep
516
 * Wait for the requested fence to signal (all asics).
515
 *
517
 * @intr selects whether to use interruptable (true) or non-interruptable
516
 * Wait for the requested fence to signal (all asics).
518
 * (false) sleep when waiting for the fence.
517
 * @intr selects whether to use interruptable (true) or non-interruptable
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
Line 518... Line 521...
518
 * (false) sleep when waiting for the fence.
521
 * the wait timeout, or an error for all other cases.
519
 * Returns 0 if the fence has passed, error for all other cases.
522
 */
520
 */
523
long radeon_fence_wait_timeout(struct radeon_fence *fence, bool intr, long timeout)
521
int radeon_fence_wait(struct radeon_fence *fence, bool intr)
524
{
Line 531... Line 534...
531
	 */
534
	 */
532
	if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
535
	if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
533
		return fence_wait(&fence->base, intr);
536
		return fence_wait(&fence->base, intr);
Line 534... Line 537...
534
 
537
 
535
	seq[fence->ring] = fence->seq;
538
	seq[fence->ring] = fence->seq;
536
	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
539
	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, timeout);
537
	if (r < 0) {
540
	if (r <= 0) {
538
			return r;
541
		return r;
Line 539... Line 542...
539
	}
542
	}
540
 
543
 
541
	r = fence_signal(&fence->base);
544
	r_sig = fence_signal(&fence->base);
-
 
545
	if (!r_sig)
-
 
546
		FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
-
 
547
	return r;
-
 
548
}
-
 
549
 
-
 
550
/**
-
 
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
{
542
	if (!r)
563
	long r = radeon_fence_wait_timeout(fence, intr, MAX_SCHEDULE_TIMEOUT);
-
 
564
	if (r > 0) {
-
 
565
		return 0;
-
 
566
	} else {
543
		FENCE_TRACE(&fence->base, "signaled from fence_wait\n");
567
		return r;
Line 544... Line 568...
544
    return 0;
568
	}
545
}
569
}
546
 
570