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 |