diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-04-12 13:52:52 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-06-27 10:49:18 -0400 |
commit | 2948f5e6c211eccd58b81c15a410d9f3d9cda657 (patch) | |
tree | 86324d51dc6edbd9f279a4c955d6444aed23c1c1 /drivers/gpu/drm/radeon/r600.c | |
parent | 138e4e16f0e1d7dee8e6d0534147e15c0a3d94d5 (diff) |
drm/radeon: properly set up the RLC on ON/LN/TN (v3)
This is required for certain advanced functionality.
v2: save/restore list takes dword offsets
v3: rebase on gpu reset changes
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 43 |
1 files changed, 12 insertions, 31 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 608926180e0c..4678ed102af6 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -97,6 +97,7 @@ static void r600_gpu_init(struct radeon_device *rdev); | |||
97 | void r600_fini(struct radeon_device *rdev); | 97 | void r600_fini(struct radeon_device *rdev); |
98 | void r600_irq_disable(struct radeon_device *rdev); | 98 | void r600_irq_disable(struct radeon_device *rdev); |
99 | static void r600_pcie_gen2_enable(struct radeon_device *rdev); | 99 | static void r600_pcie_gen2_enable(struct radeon_device *rdev); |
100 | extern int evergreen_rlc_resume(struct radeon_device *rdev); | ||
100 | 101 | ||
101 | /** | 102 | /** |
102 | * r600_get_xclk - get the xclk | 103 | * r600_get_xclk - get the xclk |
@@ -3778,7 +3779,7 @@ static void r600_rlc_start(struct radeon_device *rdev) | |||
3778 | WREG32(RLC_CNTL, RLC_ENABLE); | 3779 | WREG32(RLC_CNTL, RLC_ENABLE); |
3779 | } | 3780 | } |
3780 | 3781 | ||
3781 | static int r600_rlc_init(struct radeon_device *rdev) | 3782 | static int r600_rlc_resume(struct radeon_device *rdev) |
3782 | { | 3783 | { |
3783 | u32 i; | 3784 | u32 i; |
3784 | const __be32 *fw_data; | 3785 | const __be32 *fw_data; |
@@ -3790,39 +3791,16 @@ static int r600_rlc_init(struct radeon_device *rdev) | |||
3790 | 3791 | ||
3791 | WREG32(RLC_HB_CNTL, 0); | 3792 | WREG32(RLC_HB_CNTL, 0); |
3792 | 3793 | ||
3793 | if (rdev->family == CHIP_ARUBA) { | 3794 | WREG32(RLC_HB_BASE, 0); |
3794 | WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); | 3795 | WREG32(RLC_HB_RPTR, 0); |
3795 | WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); | 3796 | WREG32(RLC_HB_WPTR, 0); |
3796 | } | 3797 | WREG32(RLC_HB_WPTR_LSB_ADDR, 0); |
3797 | if (rdev->family <= CHIP_CAYMAN) { | 3798 | WREG32(RLC_HB_WPTR_MSB_ADDR, 0); |
3798 | WREG32(RLC_HB_BASE, 0); | ||
3799 | WREG32(RLC_HB_RPTR, 0); | ||
3800 | WREG32(RLC_HB_WPTR, 0); | ||
3801 | } | ||
3802 | if (rdev->family <= CHIP_CAICOS) { | ||
3803 | WREG32(RLC_HB_WPTR_LSB_ADDR, 0); | ||
3804 | WREG32(RLC_HB_WPTR_MSB_ADDR, 0); | ||
3805 | } | ||
3806 | WREG32(RLC_MC_CNTL, 0); | 3799 | WREG32(RLC_MC_CNTL, 0); |
3807 | WREG32(RLC_UCODE_CNTL, 0); | 3800 | WREG32(RLC_UCODE_CNTL, 0); |
3808 | 3801 | ||
3809 | fw_data = (const __be32 *)rdev->rlc_fw->data; | 3802 | fw_data = (const __be32 *)rdev->rlc_fw->data; |
3810 | if (rdev->family >= CHIP_ARUBA) { | 3803 | if (rdev->family >= CHIP_RV770) { |
3811 | for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) { | ||
3812 | WREG32(RLC_UCODE_ADDR, i); | ||
3813 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); | ||
3814 | } | ||
3815 | } else if (rdev->family >= CHIP_CAYMAN) { | ||
3816 | for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) { | ||
3817 | WREG32(RLC_UCODE_ADDR, i); | ||
3818 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); | ||
3819 | } | ||
3820 | } else if (rdev->family >= CHIP_CEDAR) { | ||
3821 | for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) { | ||
3822 | WREG32(RLC_UCODE_ADDR, i); | ||
3823 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); | ||
3824 | } | ||
3825 | } else if (rdev->family >= CHIP_RV770) { | ||
3826 | for (i = 0; i < R700_RLC_UCODE_SIZE; i++) { | 3804 | for (i = 0; i < R700_RLC_UCODE_SIZE; i++) { |
3827 | WREG32(RLC_UCODE_ADDR, i); | 3805 | WREG32(RLC_UCODE_ADDR, i); |
3828 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); | 3806 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); |
@@ -3936,7 +3914,10 @@ int r600_irq_init(struct radeon_device *rdev) | |||
3936 | r600_disable_interrupts(rdev); | 3914 | r600_disable_interrupts(rdev); |
3937 | 3915 | ||
3938 | /* init rlc */ | 3916 | /* init rlc */ |
3939 | ret = r600_rlc_init(rdev); | 3917 | if (rdev->family >= CHIP_CEDAR) |
3918 | ret = evergreen_rlc_resume(rdev); | ||
3919 | else | ||
3920 | ret = r600_rlc_resume(rdev); | ||
3940 | if (ret) { | 3921 | if (ret) { |
3941 | r600_ih_ring_fini(rdev); | 3922 | r600_ih_ring_fini(rdev); |
3942 | return ret; | 3923 | return ret; |