diff options
author | Christian König <christian.koenig@amd.com> | 2013-04-19 10:14:19 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-04-23 18:03:51 -0400 |
commit | b05e9e4c9d5d0d32357468b64d72101b0fb2b650 (patch) | |
tree | 066e3ae84eda1b0d6610ddcb53f21eaf0482c3dc | |
parent | 55b51c88c5167ba0c95919cdd25b0bd376a3f0ea (diff) |
drm/radeon: raise UVD clocks on init v3
v2: not only raise the clocks on VCPU boot, but also on IB test.
v3: agd5f: fix r600_uvd_init return value.
fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=63730
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 5fe9e74d6360..709f3e4e49ec 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2645,6 +2645,9 @@ int r600_uvd_init(struct radeon_device *rdev) | |||
2645 | { | 2645 | { |
2646 | int i, j, r; | 2646 | int i, j, r; |
2647 | 2647 | ||
2648 | /* raise clocks while booting up the VCPU */ | ||
2649 | radeon_set_uvd_clocks(rdev, 53300, 40000); | ||
2650 | |||
2648 | /* disable clock gating */ | 2651 | /* disable clock gating */ |
2649 | WREG32(UVD_CGC_GATE, 0); | 2652 | WREG32(UVD_CGC_GATE, 0); |
2650 | 2653 | ||
@@ -2715,19 +2718,24 @@ int r600_uvd_init(struct radeon_device *rdev) | |||
2715 | mdelay(10); | 2718 | mdelay(10); |
2716 | r = -1; | 2719 | r = -1; |
2717 | } | 2720 | } |
2721 | |||
2718 | if (r) { | 2722 | if (r) { |
2719 | DRM_ERROR("UVD not responding, giving up!!!\n"); | 2723 | DRM_ERROR("UVD not responding, giving up!!!\n"); |
2724 | radeon_set_uvd_clocks(rdev, 0, 0); | ||
2720 | return r; | 2725 | return r; |
2721 | } | 2726 | } |
2727 | |||
2722 | /* enable interupt */ | 2728 | /* enable interupt */ |
2723 | WREG32_P(UVD_MASTINT_EN, 3<<1, ~(3 << 1)); | 2729 | WREG32_P(UVD_MASTINT_EN, 3<<1, ~(3 << 1)); |
2724 | 2730 | ||
2725 | r = r600_uvd_rbc_start(rdev); | 2731 | r = r600_uvd_rbc_start(rdev); |
2726 | if (r) | 2732 | if (!r) |
2727 | return r; | 2733 | DRM_INFO("UVD initialized successfully.\n"); |
2728 | 2734 | ||
2729 | DRM_INFO("UVD initialized successfully.\n"); | 2735 | /* lower clocks again */ |
2730 | return 0; | 2736 | radeon_set_uvd_clocks(rdev, 0, 0); |
2737 | |||
2738 | return r; | ||
2731 | } | 2739 | } |
2732 | 2740 | ||
2733 | /* | 2741 | /* |
@@ -3566,28 +3574,36 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
3566 | 3574 | ||
3567 | int r600_uvd_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | 3575 | int r600_uvd_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) |
3568 | { | 3576 | { |
3569 | struct radeon_fence *fence; | 3577 | struct radeon_fence *fence = NULL; |
3570 | int r; | 3578 | int r; |
3571 | 3579 | ||
3580 | r = radeon_set_uvd_clocks(rdev, 53300, 40000); | ||
3581 | if (r) { | ||
3582 | DRM_ERROR("radeon: failed to raise UVD clocks (%d).\n", r); | ||
3583 | return r; | ||
3584 | } | ||
3585 | |||
3572 | r = radeon_uvd_get_create_msg(rdev, ring->idx, 1, NULL); | 3586 | r = radeon_uvd_get_create_msg(rdev, ring->idx, 1, NULL); |
3573 | if (r) { | 3587 | if (r) { |
3574 | DRM_ERROR("radeon: failed to get create msg (%d).\n", r); | 3588 | DRM_ERROR("radeon: failed to get create msg (%d).\n", r); |
3575 | return r; | 3589 | goto error; |
3576 | } | 3590 | } |
3577 | 3591 | ||
3578 | r = radeon_uvd_get_destroy_msg(rdev, ring->idx, 1, &fence); | 3592 | r = radeon_uvd_get_destroy_msg(rdev, ring->idx, 1, &fence); |
3579 | if (r) { | 3593 | if (r) { |
3580 | DRM_ERROR("radeon: failed to get destroy ib (%d).\n", r); | 3594 | DRM_ERROR("radeon: failed to get destroy ib (%d).\n", r); |
3581 | return r; | 3595 | goto error; |
3582 | } | 3596 | } |
3583 | 3597 | ||
3584 | r = radeon_fence_wait(fence, false); | 3598 | r = radeon_fence_wait(fence, false); |
3585 | if (r) { | 3599 | if (r) { |
3586 | DRM_ERROR("radeon: fence wait failed (%d).\n", r); | 3600 | DRM_ERROR("radeon: fence wait failed (%d).\n", r); |
3587 | return r; | 3601 | goto error; |
3588 | } | 3602 | } |
3589 | DRM_INFO("ib test on ring %d succeeded\n", ring->idx); | 3603 | DRM_INFO("ib test on ring %d succeeded\n", ring->idx); |
3604 | error: | ||
3590 | radeon_fence_unref(&fence); | 3605 | radeon_fence_unref(&fence); |
3606 | radeon_set_uvd_clocks(rdev, 0, 0); | ||
3591 | return r; | 3607 | return r; |
3592 | } | 3608 | } |
3593 | 3609 | ||