diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/cik.c')
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index a3bba0587276..adbdb6503b05 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); | |||
77 | static void cik_program_aspm(struct radeon_device *rdev); | 77 | static void cik_program_aspm(struct radeon_device *rdev); |
78 | static void cik_init_pg(struct radeon_device *rdev); | 78 | static void cik_init_pg(struct radeon_device *rdev); |
79 | static void cik_init_cg(struct radeon_device *rdev); | 79 | static void cik_init_cg(struct radeon_device *rdev); |
80 | static 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 */ |
82 | int ci_get_temp(struct radeon_device *rdev) | 84 | int ci_get_temp(struct radeon_device *rdev) |
@@ -120,20 +122,27 @@ int kv_get_temp(struct radeon_device *rdev) | |||
120 | */ | 122 | */ |
121 | u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg) | 123 | u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg) |
122 | { | 124 | { |
125 | unsigned long flags; | ||
123 | u32 r; | 126 | u32 r; |
124 | 127 | ||
128 | spin_lock_irqsave(&rdev->pciep_idx_lock, flags); | ||
125 | WREG32(PCIE_INDEX, reg); | 129 | WREG32(PCIE_INDEX, reg); |
126 | (void)RREG32(PCIE_INDEX); | 130 | (void)RREG32(PCIE_INDEX); |
127 | r = RREG32(PCIE_DATA); | 131 | r = RREG32(PCIE_DATA); |
132 | spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags); | ||
128 | return r; | 133 | return r; |
129 | } | 134 | } |
130 | 135 | ||
131 | void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) | 136 | void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) |
132 | { | 137 | { |
138 | unsigned long flags; | ||
139 | |||
140 | spin_lock_irqsave(&rdev->pciep_idx_lock, flags); | ||
133 | WREG32(PCIE_INDEX, reg); | 141 | WREG32(PCIE_INDEX, reg); |
134 | (void)RREG32(PCIE_INDEX); | 142 | (void)RREG32(PCIE_INDEX); |
135 | WREG32(PCIE_DATA, v); | 143 | WREG32(PCIE_DATA, v); |
136 | (void)RREG32(PCIE_DATA); | 144 | (void)RREG32(PCIE_DATA); |
145 | spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags); | ||
137 | } | 146 | } |
138 | 147 | ||
139 | static const u32 spectre_rlc_save_restore_register_list[] = | 148 | static const u32 spectre_rlc_save_restore_register_list[] = |
@@ -2722,7 +2731,8 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
2722 | } else if ((rdev->pdev->device == 0x1309) || | 2731 | } else if ((rdev->pdev->device == 0x1309) || |
2723 | (rdev->pdev->device == 0x130A) || | 2732 | (rdev->pdev->device == 0x130A) || |
2724 | (rdev->pdev->device == 0x130D) || | 2733 | (rdev->pdev->device == 0x130D) || |
2725 | (rdev->pdev->device == 0x1313)) { | 2734 | (rdev->pdev->device == 0x1313) || |
2735 | (rdev->pdev->device == 0x131D)) { | ||
2726 | rdev->config.cik.max_cu_per_sh = 6; | 2736 | rdev->config.cik.max_cu_per_sh = 6; |
2727 | rdev->config.cik.max_backends_per_se = 2; | 2737 | rdev->config.cik.max_backends_per_se = 2; |
2728 | } else if ((rdev->pdev->device == 0x1306) || | 2738 | } else if ((rdev->pdev->device == 0x1306) || |
@@ -4013,6 +4023,8 @@ static int cik_cp_resume(struct radeon_device *rdev) | |||
4013 | { | 4023 | { |
4014 | int r; | 4024 | int r; |
4015 | 4025 | ||
4026 | cik_enable_gui_idle_interrupt(rdev, false); | ||
4027 | |||
4016 | r = cik_cp_load_microcode(rdev); | 4028 | r = cik_cp_load_microcode(rdev); |
4017 | if (r) | 4029 | if (r) |
4018 | return r; | 4030 | return r; |
@@ -4024,6 +4036,8 @@ static int cik_cp_resume(struct radeon_device *rdev) | |||
4024 | if (r) | 4036 | if (r) |
4025 | return r; | 4037 | return r; |
4026 | 4038 | ||
4039 | cik_enable_gui_idle_interrupt(rdev, true); | ||
4040 | |||
4027 | return 0; | 4041 | return 0; |
4028 | } | 4042 | } |
4029 | 4043 | ||
@@ -5376,7 +5390,9 @@ static void cik_enable_hdp_ls(struct radeon_device *rdev, | |||
5376 | void cik_update_cg(struct radeon_device *rdev, | 5390 | void cik_update_cg(struct radeon_device *rdev, |
5377 | u32 block, bool enable) | 5391 | u32 block, bool enable) |
5378 | { | 5392 | { |
5393 | |||
5379 | if (block & RADEON_CG_BLOCK_GFX) { | 5394 | if (block & RADEON_CG_BLOCK_GFX) { |
5395 | cik_enable_gui_idle_interrupt(rdev, false); | ||
5380 | /* order matters! */ | 5396 | /* order matters! */ |
5381 | if (enable) { | 5397 | if (enable) { |
5382 | cik_enable_mgcg(rdev, true); | 5398 | cik_enable_mgcg(rdev, true); |
@@ -5385,6 +5401,7 @@ void cik_update_cg(struct radeon_device *rdev, | |||
5385 | cik_enable_cgcg(rdev, false); | 5401 | cik_enable_cgcg(rdev, false); |
5386 | cik_enable_mgcg(rdev, false); | 5402 | cik_enable_mgcg(rdev, false); |
5387 | } | 5403 | } |
5404 | cik_enable_gui_idle_interrupt(rdev, true); | ||
5388 | } | 5405 | } |
5389 | 5406 | ||
5390 | if (block & RADEON_CG_BLOCK_MC) { | 5407 | if (block & RADEON_CG_BLOCK_MC) { |
@@ -5541,7 +5558,7 @@ static void cik_enable_gfx_cgpg(struct radeon_device *rdev, | |||
5541 | { | 5558 | { |
5542 | u32 data, orig; | 5559 | u32 data, orig; |
5543 | 5560 | ||
5544 | if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG)) { | 5561 | if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) { |
5545 | orig = data = RREG32(RLC_PG_CNTL); | 5562 | orig = data = RREG32(RLC_PG_CNTL); |
5546 | data |= GFX_PG_ENABLE; | 5563 | data |= GFX_PG_ENABLE; |
5547 | if (orig != data) | 5564 | if (orig != data) |
@@ -5805,7 +5822,7 @@ static void cik_init_pg(struct radeon_device *rdev) | |||
5805 | if (rdev->pg_flags) { | 5822 | if (rdev->pg_flags) { |
5806 | cik_enable_sck_slowdown_on_pu(rdev, true); | 5823 | cik_enable_sck_slowdown_on_pu(rdev, true); |
5807 | cik_enable_sck_slowdown_on_pd(rdev, true); | 5824 | cik_enable_sck_slowdown_on_pd(rdev, true); |
5808 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) { | 5825 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) { |
5809 | cik_init_gfx_cgpg(rdev); | 5826 | cik_init_gfx_cgpg(rdev); |
5810 | cik_enable_cp_pg(rdev, true); | 5827 | cik_enable_cp_pg(rdev, true); |
5811 | cik_enable_gds_pg(rdev, true); | 5828 | cik_enable_gds_pg(rdev, true); |
@@ -5819,7 +5836,7 @@ static void cik_fini_pg(struct radeon_device *rdev) | |||
5819 | { | 5836 | { |
5820 | if (rdev->pg_flags) { | 5837 | if (rdev->pg_flags) { |
5821 | cik_update_gfx_pg(rdev, false); | 5838 | cik_update_gfx_pg(rdev, false); |
5822 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) { | 5839 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) { |
5823 | cik_enable_cp_pg(rdev, false); | 5840 | cik_enable_cp_pg(rdev, false); |
5824 | cik_enable_gds_pg(rdev, false); | 5841 | cik_enable_gds_pg(rdev, false); |
5825 | } | 5842 | } |
@@ -5895,7 +5912,9 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev) | |||
5895 | u32 tmp; | 5912 | u32 tmp; |
5896 | 5913 | ||
5897 | /* gfx ring */ | 5914 | /* gfx ring */ |
5898 | WREG32(CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | 5915 | tmp = RREG32(CP_INT_CNTL_RING0) & |
5916 | (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
5917 | WREG32(CP_INT_CNTL_RING0, tmp); | ||
5899 | /* sdma */ | 5918 | /* sdma */ |
5900 | tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; | 5919 | tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; |
5901 | WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp); | 5920 | WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp); |
@@ -6036,8 +6055,7 @@ static int cik_irq_init(struct radeon_device *rdev) | |||
6036 | */ | 6055 | */ |
6037 | int cik_irq_set(struct radeon_device *rdev) | 6056 | int cik_irq_set(struct radeon_device *rdev) |
6038 | { | 6057 | { |
6039 | u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE | | 6058 | u32 cp_int_cntl; |
6040 | PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE; | ||
6041 | u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3; | 6059 | u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3; |
6042 | u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3; | 6060 | u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3; |
6043 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; | 6061 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
@@ -6058,6 +6076,10 @@ int cik_irq_set(struct radeon_device *rdev) | |||
6058 | return 0; | 6076 | return 0; |
6059 | } | 6077 | } |
6060 | 6078 | ||
6079 | cp_int_cntl = RREG32(CP_INT_CNTL_RING0) & | ||
6080 | (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); | ||
6081 | cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE; | ||
6082 | |||
6061 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; | 6083 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6062 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; | 6084 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6063 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; | 6085 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; |