Commit 4214faf6 authored by Alex Deucher's avatar Alex Deucher

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: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 01172772
...@@ -77,6 +77,8 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev); ...@@ -77,6 +77,8 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev);
static void cik_program_aspm(struct radeon_device *rdev); static void cik_program_aspm(struct radeon_device *rdev);
static void cik_init_pg(struct radeon_device *rdev); static void cik_init_pg(struct radeon_device *rdev);
static void cik_init_cg(struct radeon_device *rdev); static void cik_init_cg(struct radeon_device *rdev);
static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
bool enable);
/* get temperature in millidegrees */ /* get temperature in millidegrees */
int ci_get_temp(struct radeon_device *rdev) int ci_get_temp(struct radeon_device *rdev)
...@@ -4013,6 +4015,8 @@ static int cik_cp_resume(struct radeon_device *rdev) ...@@ -4013,6 +4015,8 @@ static int cik_cp_resume(struct radeon_device *rdev)
{ {
int r; int r;
cik_enable_gui_idle_interrupt(rdev, false);
r = cik_cp_load_microcode(rdev); r = cik_cp_load_microcode(rdev);
if (r) if (r)
return r; return r;
...@@ -4024,6 +4028,8 @@ static int cik_cp_resume(struct radeon_device *rdev) ...@@ -4024,6 +4028,8 @@ static int cik_cp_resume(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
cik_enable_gui_idle_interrupt(rdev, true);
return 0; return 0;
} }
...@@ -5376,7 +5382,9 @@ static void cik_enable_hdp_ls(struct radeon_device *rdev, ...@@ -5376,7 +5382,9 @@ static void cik_enable_hdp_ls(struct radeon_device *rdev,
void cik_update_cg(struct radeon_device *rdev, void cik_update_cg(struct radeon_device *rdev,
u32 block, bool enable) u32 block, bool enable)
{ {
if (block & RADEON_CG_BLOCK_GFX) { if (block & RADEON_CG_BLOCK_GFX) {
cik_enable_gui_idle_interrupt(rdev, false);
/* order matters! */ /* order matters! */
if (enable) { if (enable) {
cik_enable_mgcg(rdev, true); cik_enable_mgcg(rdev, true);
...@@ -5385,6 +5393,7 @@ void cik_update_cg(struct radeon_device *rdev, ...@@ -5385,6 +5393,7 @@ void cik_update_cg(struct radeon_device *rdev,
cik_enable_cgcg(rdev, false); cik_enable_cgcg(rdev, false);
cik_enable_mgcg(rdev, false); cik_enable_mgcg(rdev, false);
} }
cik_enable_gui_idle_interrupt(rdev, true);
} }
if (block & RADEON_CG_BLOCK_MC) { if (block & RADEON_CG_BLOCK_MC) {
...@@ -5895,7 +5904,9 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev) ...@@ -5895,7 +5904,9 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev)
u32 tmp; u32 tmp;
/* gfx ring */ /* gfx ring */
WREG32(CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); tmp = RREG32(CP_INT_CNTL_RING0) &
(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
WREG32(CP_INT_CNTL_RING0, tmp);
/* sdma */ /* sdma */
tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp); WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
...@@ -6036,8 +6047,7 @@ static int cik_irq_init(struct radeon_device *rdev) ...@@ -6036,8 +6047,7 @@ static int cik_irq_init(struct radeon_device *rdev)
*/ */
int cik_irq_set(struct radeon_device *rdev) int cik_irq_set(struct radeon_device *rdev)
{ {
u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE | u32 cp_int_cntl;
PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3; u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3;
u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3; u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3;
u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; 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,6 +6068,10 @@ int cik_irq_set(struct radeon_device *rdev)
return 0; return 0;
} }
cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment