Subversion Repositories Kolibri OS

Rev

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

Rev 6938 Rev 7146
Line 506... Line 506...
506
 
506
 
507
            return r;
507
	return r;
Line 508... Line 508...
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
 *
512
 *
513
 * @fence: radeon fence object
513
 * @fence: radeon fence object
514
 * @intr: use interruptible sleep
514
 * @intr: use interruptible sleep
515
 *
515
 *
516
 * Wait for the requested fence to signal (all asics).
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.
517
 * @intr selects whether to use interruptable (true) or non-interruptable
519
 * @timeout: maximum time to wait, or MAX_SCHEDULE_TIMEOUT for infinite wait
518
 * (false) sleep when waiting for the fence.
520
 * Returns remaining time if the sequence number has passed, 0 when
519
 * Returns 0 if the fence has passed, error for all other cases.
521
 * the wait timeout, or an error for all other cases.
520
 */
522
 */
521
int radeon_fence_wait(struct radeon_fence *fence, bool intr)
523
long radeon_fence_wait_timeout(struct radeon_fence *fence, bool intr, long timeout)
522
{
524
{
-
 
525
	uint64_t seq[RADEON_NUM_RINGS] = {};
Line 523... Line 526...
523
	uint64_t seq[RADEON_NUM_RINGS] = {};
526
	long r;
524
	long r;
527
	int r_sig;
525
 
528
 
526
	/*
529
	/*
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