aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r600.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-04-12 13:52:52 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-06-27 10:49:18 -0400
commit2948f5e6c211eccd58b81c15a410d9f3d9cda657 (patch)
tree86324d51dc6edbd9f279a4c955d6444aed23c1c1 /drivers/gpu/drm/radeon/r600.c
parent138e4e16f0e1d7dee8e6d0534147e15c0a3d94d5 (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.c43
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);
97void r600_fini(struct radeon_device *rdev); 97void r600_fini(struct radeon_device *rdev);
98void r600_irq_disable(struct radeon_device *rdev); 98void r600_irq_disable(struct radeon_device *rdev);
99static void r600_pcie_gen2_enable(struct radeon_device *rdev); 99static void r600_pcie_gen2_enable(struct radeon_device *rdev);
100extern 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
3781static int r600_rlc_init(struct radeon_device *rdev) 3782static 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;