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 |