aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/si.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-08-08 19:34:07 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-08-30 16:30:49 -0400
commite16866ecfbfabc546fe8f02fdf4359707f81e81e (patch)
tree8cd5bb6ada62aa2ebfa5f45e6ae2c732e6881d92 /drivers/gpu/drm/radeon/si.c
parent0116e1efafe09a2d99042943a850deaa1d9b069c (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.c207
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
5123static 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
5140static 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
5177static 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
5195static 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
5211static 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
5227void 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
5122static void si_init_cg(struct radeon_device *rdev) 5266static 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)
5138static void si_fini_cg(struct radeon_device *rdev) 5279static 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
5291void 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
5150static void si_init_pg(struct radeon_device *rdev) 5298static 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);