diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-08-08 19:34:07 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-08-30 16:30:49 -0400 |
commit | e16866ecfbfabc546fe8f02fdf4359707f81e81e (patch) | |
tree | 8cd5bb6ada62aa2ebfa5f45e6ae2c732e6881d92 /drivers/gpu/drm/radeon/si.c | |
parent | 0116e1efafe09a2d99042943a850deaa1d9b069c (diff) |
drm/radeon/si: restructure cg code (v3)
Resturcture clockgating code so that it can be
enabled/disabled from other components such as
dpm.
v2: make function static
v3: add fine grained cg controls
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/si.c')
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 207 |
1 files changed, 178 insertions, 29 deletions
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index e116128f3d8f..b1d22c704c53 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -4844,7 +4844,7 @@ static void si_enable_dma_pg(struct radeon_device *rdev, bool enable) | |||
4844 | u32 data, orig; | 4844 | u32 data, orig; |
4845 | 4845 | ||
4846 | orig = data = RREG32(DMA_PG); | 4846 | orig = data = RREG32(DMA_PG); |
4847 | if (enable) | 4847 | if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA)) |
4848 | data |= PG_CNTL_ENABLE; | 4848 | data |= PG_CNTL_ENABLE; |
4849 | else | 4849 | else |
4850 | data &= ~PG_CNTL_ENABLE; | 4850 | data &= ~PG_CNTL_ENABLE; |
@@ -4868,7 +4868,7 @@ static void si_enable_gfx_cgpg(struct radeon_device *rdev, | |||
4868 | { | 4868 | { |
4869 | u32 tmp; | 4869 | u32 tmp; |
4870 | 4870 | ||
4871 | if (enable) { | 4871 | if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG)) { |
4872 | tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10); | 4872 | tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10); |
4873 | WREG32(RLC_TTOP_D, tmp); | 4873 | WREG32(RLC_TTOP_D, tmp); |
4874 | 4874 | ||
@@ -4973,7 +4973,7 @@ static void si_enable_cgcg(struct radeon_device *rdev, | |||
4973 | 4973 | ||
4974 | si_enable_gui_idle_interrupt(rdev, enable); | 4974 | si_enable_gui_idle_interrupt(rdev, enable); |
4975 | 4975 | ||
4976 | if (enable) { | 4976 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) { |
4977 | WREG32(RLC_GCPM_GENERAL_3, 0x00000080); | 4977 | WREG32(RLC_GCPM_GENERAL_3, 0x00000080); |
4978 | 4978 | ||
4979 | tmp = si_halt_rlc(rdev); | 4979 | tmp = si_halt_rlc(rdev); |
@@ -5007,16 +5007,18 @@ static void si_enable_mgcg(struct radeon_device *rdev, | |||
5007 | { | 5007 | { |
5008 | u32 data, orig, tmp = 0; | 5008 | u32 data, orig, tmp = 0; |
5009 | 5009 | ||
5010 | if (enable) { | 5010 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) { |
5011 | orig = data = RREG32(CGTS_SM_CTRL_REG); | 5011 | orig = data = RREG32(CGTS_SM_CTRL_REG); |
5012 | data = 0x96940200; | 5012 | data = 0x96940200; |
5013 | if (orig != data) | 5013 | if (orig != data) |
5014 | WREG32(CGTS_SM_CTRL_REG, data); | 5014 | WREG32(CGTS_SM_CTRL_REG, data); |
5015 | 5015 | ||
5016 | orig = data = RREG32(CP_MEM_SLP_CNTL); | 5016 | if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) { |
5017 | data |= CP_MEM_LS_EN; | 5017 | orig = data = RREG32(CP_MEM_SLP_CNTL); |
5018 | if (orig != data) | 5018 | data |= CP_MEM_LS_EN; |
5019 | WREG32(CP_MEM_SLP_CNTL, data); | 5019 | if (orig != data) |
5020 | WREG32(CP_MEM_SLP_CNTL, data); | ||
5021 | } | ||
5020 | 5022 | ||
5021 | orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); | 5023 | orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); |
5022 | data &= 0xffffffc0; | 5024 | data &= 0xffffffc0; |
@@ -5061,7 +5063,7 @@ static void si_enable_uvd_mgcg(struct radeon_device *rdev, | |||
5061 | { | 5063 | { |
5062 | u32 orig, data, tmp; | 5064 | u32 orig, data, tmp; |
5063 | 5065 | ||
5064 | if (enable) { | 5066 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) { |
5065 | tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL); | 5067 | tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL); |
5066 | tmp |= 0x3fff; | 5068 | tmp |= 0x3fff; |
5067 | WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp); | 5069 | WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp); |
@@ -5109,7 +5111,7 @@ static void si_enable_mc_ls(struct radeon_device *rdev, | |||
5109 | 5111 | ||
5110 | for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) { | 5112 | for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) { |
5111 | orig = data = RREG32(mc_cg_registers[i]); | 5113 | orig = data = RREG32(mc_cg_registers[i]); |
5112 | if (enable) | 5114 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS)) |
5113 | data |= MC_LS_ENABLE; | 5115 | data |= MC_LS_ENABLE; |
5114 | else | 5116 | else |
5115 | data &= ~MC_LS_ENABLE; | 5117 | data &= ~MC_LS_ENABLE; |
@@ -5118,19 +5120,158 @@ static void si_enable_mc_ls(struct radeon_device *rdev, | |||
5118 | } | 5120 | } |
5119 | } | 5121 | } |
5120 | 5122 | ||
5123 | static void si_enable_mc_mgcg(struct radeon_device *rdev, | ||
5124 | bool enable) | ||
5125 | { | ||
5126 | int i; | ||
5127 | u32 orig, data; | ||
5128 | |||
5129 | for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) { | ||
5130 | orig = data = RREG32(mc_cg_registers[i]); | ||
5131 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG)) | ||
5132 | data |= MC_CG_ENABLE; | ||
5133 | else | ||
5134 | data &= ~MC_CG_ENABLE; | ||
5135 | if (data != orig) | ||
5136 | WREG32(mc_cg_registers[i], data); | ||
5137 | } | ||
5138 | } | ||
5139 | |||
5140 | static void si_enable_dma_mgcg(struct radeon_device *rdev, | ||
5141 | bool enable) | ||
5142 | { | ||
5143 | u32 orig, data, offset; | ||
5144 | int i; | ||
5145 | |||
5146 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) { | ||
5147 | for (i = 0; i < 2; i++) { | ||
5148 | if (i == 0) | ||
5149 | offset = DMA0_REGISTER_OFFSET; | ||
5150 | else | ||
5151 | offset = DMA1_REGISTER_OFFSET; | ||
5152 | orig = data = RREG32(DMA_POWER_CNTL + offset); | ||
5153 | data &= ~MEM_POWER_OVERRIDE; | ||
5154 | if (data != orig) | ||
5155 | WREG32(DMA_POWER_CNTL + offset, data); | ||
5156 | WREG32(DMA_CLK_CTRL + offset, 0x00000100); | ||
5157 | } | ||
5158 | } else { | ||
5159 | for (i = 0; i < 2; i++) { | ||
5160 | if (i == 0) | ||
5161 | offset = DMA0_REGISTER_OFFSET; | ||
5162 | else | ||
5163 | offset = DMA1_REGISTER_OFFSET; | ||
5164 | orig = data = RREG32(DMA_POWER_CNTL + offset); | ||
5165 | data |= MEM_POWER_OVERRIDE; | ||
5166 | if (data != orig) | ||
5167 | WREG32(DMA_POWER_CNTL + offset, data); | ||
5168 | |||
5169 | orig = data = RREG32(DMA_CLK_CTRL + offset); | ||
5170 | data = 0xff000000; | ||
5171 | if (data != orig) | ||
5172 | WREG32(DMA_CLK_CTRL + offset, data); | ||
5173 | } | ||
5174 | } | ||
5175 | } | ||
5176 | |||
5177 | static void si_enable_bif_mgls(struct radeon_device *rdev, | ||
5178 | bool enable) | ||
5179 | { | ||
5180 | u32 orig, data; | ||
5181 | |||
5182 | orig = data = RREG32_PCIE(PCIE_CNTL2); | ||
5183 | |||
5184 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS)) | ||
5185 | data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | | ||
5186 | REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN; | ||
5187 | else | ||
5188 | data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN | | ||
5189 | REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN); | ||
5190 | |||
5191 | if (orig != data) | ||
5192 | WREG32_PCIE(PCIE_CNTL2, data); | ||
5193 | } | ||
5194 | |||
5195 | static void si_enable_hdp_mgcg(struct radeon_device *rdev, | ||
5196 | bool enable) | ||
5197 | { | ||
5198 | u32 orig, data; | ||
5199 | |||
5200 | orig = data = RREG32(HDP_HOST_PATH_CNTL); | ||
5201 | |||
5202 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG)) | ||
5203 | data &= ~CLOCK_GATING_DIS; | ||
5204 | else | ||
5205 | data |= CLOCK_GATING_DIS; | ||
5206 | |||
5207 | if (orig != data) | ||
5208 | WREG32(HDP_HOST_PATH_CNTL, data); | ||
5209 | } | ||
5210 | |||
5211 | static void si_enable_hdp_ls(struct radeon_device *rdev, | ||
5212 | bool enable) | ||
5213 | { | ||
5214 | u32 orig, data; | ||
5215 | |||
5216 | orig = data = RREG32(HDP_MEM_POWER_LS); | ||
5217 | |||
5218 | if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS)) | ||
5219 | data |= HDP_LS_ENABLE; | ||
5220 | else | ||
5221 | data &= ~HDP_LS_ENABLE; | ||
5222 | |||
5223 | if (orig != data) | ||
5224 | WREG32(HDP_MEM_POWER_LS, data); | ||
5225 | } | ||
5226 | |||
5227 | void si_update_cg(struct radeon_device *rdev, | ||
5228 | u32 block, bool enable) | ||
5229 | { | ||
5230 | if (block & RADEON_CG_BLOCK_GFX) { | ||
5231 | /* order matters! */ | ||
5232 | if (enable) { | ||
5233 | si_enable_mgcg(rdev, true); | ||
5234 | si_enable_cgcg(rdev, true); | ||
5235 | } else { | ||
5236 | si_enable_cgcg(rdev, false); | ||
5237 | si_enable_mgcg(rdev, false); | ||
5238 | } | ||
5239 | } | ||
5240 | |||
5241 | if (block & RADEON_CG_BLOCK_MC) { | ||
5242 | si_enable_mc_mgcg(rdev, enable); | ||
5243 | si_enable_mc_ls(rdev, enable); | ||
5244 | } | ||
5245 | |||
5246 | if (block & RADEON_CG_BLOCK_SDMA) { | ||
5247 | si_enable_dma_mgcg(rdev, enable); | ||
5248 | } | ||
5249 | |||
5250 | if (block & RADEON_CG_BLOCK_BIF) { | ||
5251 | si_enable_bif_mgls(rdev, enable); | ||
5252 | } | ||
5253 | |||
5254 | if (block & RADEON_CG_BLOCK_UVD) { | ||
5255 | if (rdev->has_uvd) { | ||
5256 | si_enable_uvd_mgcg(rdev, enable); | ||
5257 | } | ||
5258 | } | ||
5259 | |||
5260 | if (block & RADEON_CG_BLOCK_HDP) { | ||
5261 | si_enable_hdp_mgcg(rdev, enable); | ||
5262 | si_enable_hdp_ls(rdev, enable); | ||
5263 | } | ||
5264 | } | ||
5121 | 5265 | ||
5122 | static void si_init_cg(struct radeon_device *rdev) | 5266 | static void si_init_cg(struct radeon_device *rdev) |
5123 | { | 5267 | { |
5124 | if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG) | 5268 | si_update_cg(rdev, (RADEON_CG_BLOCK_GFX | |
5125 | si_enable_mgcg(rdev, true); | 5269 | RADEON_CG_BLOCK_MC | |
5126 | if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG) | 5270 | RADEON_CG_BLOCK_SDMA | |
5127 | si_enable_cgcg(rdev, false/*true*/); | 5271 | RADEON_CG_BLOCK_BIF | |
5128 | /* Disable MC LS on tahiti */ | 5272 | RADEON_CG_BLOCK_HDP), true); |
5129 | if (!(rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS)) | ||
5130 | si_enable_mc_ls(rdev, false); | ||
5131 | if (rdev->has_uvd) { | 5273 | if (rdev->has_uvd) { |
5132 | if (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG) | 5274 | si_update_cg(rdev, RADEON_CG_BLOCK_UVD, true); |
5133 | si_enable_uvd_mgcg(rdev, true); | ||
5134 | si_init_uvd_internal_cg(rdev); | 5275 | si_init_uvd_internal_cg(rdev); |
5135 | } | 5276 | } |
5136 | } | 5277 | } |
@@ -5138,13 +5279,20 @@ static void si_init_cg(struct radeon_device *rdev) | |||
5138 | static void si_fini_cg(struct radeon_device *rdev) | 5279 | static void si_fini_cg(struct radeon_device *rdev) |
5139 | { | 5280 | { |
5140 | if (rdev->has_uvd) { | 5281 | if (rdev->has_uvd) { |
5141 | if (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG) | 5282 | si_update_cg(rdev, RADEON_CG_BLOCK_UVD, false); |
5142 | si_enable_uvd_mgcg(rdev, false); | ||
5143 | } | 5283 | } |
5144 | if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG) | 5284 | si_update_cg(rdev, (RADEON_CG_BLOCK_GFX | |
5145 | si_enable_cgcg(rdev, false); | 5285 | RADEON_CG_BLOCK_MC | |
5146 | if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG) | 5286 | RADEON_CG_BLOCK_SDMA | |
5147 | si_enable_mgcg(rdev, false); | 5287 | RADEON_CG_BLOCK_BIF | |
5288 | RADEON_CG_BLOCK_HDP), false); | ||
5289 | } | ||
5290 | |||
5291 | void si_update_pg(struct radeon_device *rdev, | ||
5292 | bool enable) | ||
5293 | { | ||
5294 | si_enable_dma_pg(rdev, enable); | ||
5295 | si_enable_gfx_cgpg(rdev, enable); | ||
5148 | } | 5296 | } |
5149 | 5297 | ||
5150 | static void si_init_pg(struct radeon_device *rdev) | 5298 | static void si_init_pg(struct radeon_device *rdev) |
@@ -5152,13 +5300,12 @@ static void si_init_pg(struct radeon_device *rdev) | |||
5152 | if (rdev->pg_flags) { | 5300 | if (rdev->pg_flags) { |
5153 | if (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA) { | 5301 | if (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA) { |
5154 | si_init_dma_pg(rdev); | 5302 | si_init_dma_pg(rdev); |
5155 | si_enable_dma_pg(rdev, true); | ||
5156 | } | 5303 | } |
5157 | si_init_ao_cu_mask(rdev); | 5304 | si_init_ao_cu_mask(rdev); |
5158 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) { | 5305 | if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) { |
5159 | si_init_gfx_cgpg(rdev); | 5306 | si_init_gfx_cgpg(rdev); |
5160 | si_enable_gfx_cgpg(rdev, true); | ||
5161 | } | 5307 | } |
5308 | si_update_pg(rdev, false); | ||
5162 | } else { | 5309 | } else { |
5163 | WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); | 5310 | WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); |
5164 | WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); | 5311 | WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); |
@@ -6308,6 +6455,8 @@ int si_suspend(struct radeon_device *rdev) | |||
6308 | uvd_v1_0_fini(rdev); | 6455 | uvd_v1_0_fini(rdev); |
6309 | radeon_uvd_suspend(rdev); | 6456 | radeon_uvd_suspend(rdev); |
6310 | } | 6457 | } |
6458 | si_fini_pg(rdev); | ||
6459 | si_fini_cg(rdev); | ||
6311 | si_irq_suspend(rdev); | 6460 | si_irq_suspend(rdev); |
6312 | radeon_wb_disable(rdev); | 6461 | radeon_wb_disable(rdev); |
6313 | si_pcie_gart_disable(rdev); | 6462 | si_pcie_gart_disable(rdev); |
@@ -6439,10 +6588,10 @@ void si_fini(struct radeon_device *rdev) | |||
6439 | { | 6588 | { |
6440 | si_cp_fini(rdev); | 6589 | si_cp_fini(rdev); |
6441 | cayman_dma_fini(rdev); | 6590 | cayman_dma_fini(rdev); |
6591 | si_fini_pg(rdev); | ||
6592 | si_fini_cg(rdev); | ||
6442 | si_irq_fini(rdev); | 6593 | si_irq_fini(rdev); |
6443 | sumo_rlc_fini(rdev); | 6594 | sumo_rlc_fini(rdev); |
6444 | si_fini_cg(rdev); | ||
6445 | si_fini_pg(rdev); | ||
6446 | radeon_wb_fini(rdev); | 6595 | radeon_wb_fini(rdev); |
6447 | radeon_vm_manager_fini(rdev); | 6596 | radeon_vm_manager_fini(rdev); |
6448 | radeon_ib_pool_fini(rdev); | 6597 | radeon_ib_pool_fini(rdev); |