aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/cik.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-09-03 10:17:13 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-09-11 11:44:23 -0400
commit4214faf6210a107ba83b2cfb67287f3265ea6e12 (patch)
treefb135ffcbbd1d4c961f0bd90dcbed4ad21adb4d6 /drivers/gpu/drm/radeon/cik.c
parent01172772c7c973debf5b4881fcb9463891ea97ec (diff)
drm/radeon/cik: properly handle internal cp ints
The internal cp interrupts need to be enabled and disabled at specific times in order clockgating to work properly. This patch changes the handling of the CP_INT_CNTL register to respect the current state of the internal CP interrupts when making changes to the other interrupts in CP_INT_CNTL. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/cik.c')
-rw-r--r--drivers/gpu/drm/radeon/cik.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index a3bba0587276..07aa13deaa15 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -77,6 +77,8 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev);
77static void cik_program_aspm(struct radeon_device *rdev); 77static void cik_program_aspm(struct radeon_device *rdev);
78static void cik_init_pg(struct radeon_device *rdev); 78static void cik_init_pg(struct radeon_device *rdev);
79static void cik_init_cg(struct radeon_device *rdev); 79static void cik_init_cg(struct radeon_device *rdev);
80static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
81 bool enable);
80 82
81/* get temperature in millidegrees */ 83/* get temperature in millidegrees */
82int ci_get_temp(struct radeon_device *rdev) 84int ci_get_temp(struct radeon_device *rdev)
@@ -4013,6 +4015,8 @@ static int cik_cp_resume(struct radeon_device *rdev)
4013{ 4015{
4014 int r; 4016 int r;
4015 4017
4018 cik_enable_gui_idle_interrupt(rdev, false);
4019
4016 r = cik_cp_load_microcode(rdev); 4020 r = cik_cp_load_microcode(rdev);
4017 if (r) 4021 if (r)
4018 return r; 4022 return r;
@@ -4024,6 +4028,8 @@ static int cik_cp_resume(struct radeon_device *rdev)
4024 if (r) 4028 if (r)
4025 return r; 4029 return r;
4026 4030
4031 cik_enable_gui_idle_interrupt(rdev, true);
4032
4027 return 0; 4033 return 0;
4028} 4034}
4029 4035
@@ -5376,7 +5382,9 @@ static void cik_enable_hdp_ls(struct radeon_device *rdev,
5376void cik_update_cg(struct radeon_device *rdev, 5382void cik_update_cg(struct radeon_device *rdev,
5377 u32 block, bool enable) 5383 u32 block, bool enable)
5378{ 5384{
5385
5379 if (block & RADEON_CG_BLOCK_GFX) { 5386 if (block & RADEON_CG_BLOCK_GFX) {
5387 cik_enable_gui_idle_interrupt(rdev, false);
5380 /* order matters! */ 5388 /* order matters! */
5381 if (enable) { 5389 if (enable) {
5382 cik_enable_mgcg(rdev, true); 5390 cik_enable_mgcg(rdev, true);
@@ -5385,6 +5393,7 @@ void cik_update_cg(struct radeon_device *rdev,
5385 cik_enable_cgcg(rdev, false); 5393 cik_enable_cgcg(rdev, false);
5386 cik_enable_mgcg(rdev, false); 5394 cik_enable_mgcg(rdev, false);
5387 } 5395 }
5396 cik_enable_gui_idle_interrupt(rdev, true);
5388 } 5397 }
5389 5398
5390 if (block & RADEON_CG_BLOCK_MC) { 5399 if (block & RADEON_CG_BLOCK_MC) {
@@ -5895,7 +5904,9 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev)
5895 u32 tmp; 5904 u32 tmp;
5896 5905
5897 /* gfx ring */ 5906 /* gfx ring */
5898 WREG32(CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); 5907 tmp = RREG32(CP_INT_CNTL_RING0) &
5908 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
5909 WREG32(CP_INT_CNTL_RING0, tmp);
5899 /* sdma */ 5910 /* sdma */
5900 tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; 5911 tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
5901 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp); 5912 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
@@ -6036,8 +6047,7 @@ static int cik_irq_init(struct radeon_device *rdev)
6036 */ 6047 */
6037int cik_irq_set(struct radeon_device *rdev) 6048int cik_irq_set(struct radeon_device *rdev)
6038{ 6049{
6039 u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE | 6050 u32 cp_int_cntl;
6040 PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
6041 u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3; 6051 u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3;
6042 u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3; 6052 u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3;
6043 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; 6053 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
@@ -6058,6 +6068,10 @@ int cik_irq_set(struct radeon_device *rdev)
6058 return 0; 6068 return 0;
6059 } 6069 }
6060 6070
6071 cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
6072 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6073 cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
6074
6061 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; 6075 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
6062 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; 6076 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
6063 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; 6077 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;