1 1.3 riastrad /* $NetBSD: radeon_sumo_dpm.c,v 1.3 2021/12/18 23:45:43 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2012 Advanced Micro Devices, Inc. 5 1.1 riastrad * 6 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 7 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 8 1.1 riastrad * to deal in the Software without restriction, including without limitation 9 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 11 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 12 1.1 riastrad * 13 1.1 riastrad * The above copyright notice and this permission notice shall be included in 14 1.1 riastrad * all copies or substantial portions of the Software. 15 1.1 riastrad * 16 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 1.1 riastrad * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 1.1 riastrad * OTHER DEALINGS IN THE SOFTWARE. 23 1.1 riastrad * 24 1.1 riastrad */ 25 1.1 riastrad 26 1.1 riastrad #include <sys/cdefs.h> 27 1.3 riastrad __KERNEL_RCSID(0, "$NetBSD: radeon_sumo_dpm.c,v 1.3 2021/12/18 23:45:43 riastradh Exp $"); 28 1.1 riastrad 29 1.1 riastrad #include "radeon.h" 30 1.1 riastrad #include "radeon_asic.h" 31 1.1 riastrad #include "sumod.h" 32 1.1 riastrad #include "r600_dpm.h" 33 1.1 riastrad #include "cypress_dpm.h" 34 1.1 riastrad #include "sumo_dpm.h" 35 1.1 riastrad #include <linux/seq_file.h> 36 1.1 riastrad 37 1.1 riastrad #define SUMO_MAX_DEEPSLEEP_DIVIDER_ID 5 38 1.1 riastrad #define SUMO_MINIMUM_ENGINE_CLOCK 800 39 1.1 riastrad #define BOOST_DPM_LEVEL 7 40 1.1 riastrad 41 1.1 riastrad static const u32 sumo_utc[SUMO_PM_NUMBER_OF_TC] = 42 1.1 riastrad { 43 1.1 riastrad SUMO_UTC_DFLT_00, 44 1.1 riastrad SUMO_UTC_DFLT_01, 45 1.1 riastrad SUMO_UTC_DFLT_02, 46 1.1 riastrad SUMO_UTC_DFLT_03, 47 1.1 riastrad SUMO_UTC_DFLT_04, 48 1.1 riastrad SUMO_UTC_DFLT_05, 49 1.1 riastrad SUMO_UTC_DFLT_06, 50 1.1 riastrad SUMO_UTC_DFLT_07, 51 1.1 riastrad SUMO_UTC_DFLT_08, 52 1.1 riastrad SUMO_UTC_DFLT_09, 53 1.1 riastrad SUMO_UTC_DFLT_10, 54 1.1 riastrad SUMO_UTC_DFLT_11, 55 1.1 riastrad SUMO_UTC_DFLT_12, 56 1.1 riastrad SUMO_UTC_DFLT_13, 57 1.1 riastrad SUMO_UTC_DFLT_14, 58 1.1 riastrad }; 59 1.1 riastrad 60 1.1 riastrad static const u32 sumo_dtc[SUMO_PM_NUMBER_OF_TC] = 61 1.1 riastrad { 62 1.1 riastrad SUMO_DTC_DFLT_00, 63 1.1 riastrad SUMO_DTC_DFLT_01, 64 1.1 riastrad SUMO_DTC_DFLT_02, 65 1.1 riastrad SUMO_DTC_DFLT_03, 66 1.1 riastrad SUMO_DTC_DFLT_04, 67 1.1 riastrad SUMO_DTC_DFLT_05, 68 1.1 riastrad SUMO_DTC_DFLT_06, 69 1.1 riastrad SUMO_DTC_DFLT_07, 70 1.1 riastrad SUMO_DTC_DFLT_08, 71 1.1 riastrad SUMO_DTC_DFLT_09, 72 1.1 riastrad SUMO_DTC_DFLT_10, 73 1.1 riastrad SUMO_DTC_DFLT_11, 74 1.1 riastrad SUMO_DTC_DFLT_12, 75 1.1 riastrad SUMO_DTC_DFLT_13, 76 1.1 riastrad SUMO_DTC_DFLT_14, 77 1.1 riastrad }; 78 1.1 riastrad 79 1.1 riastrad static struct sumo_ps *sumo_get_ps(struct radeon_ps *rps) 80 1.1 riastrad { 81 1.1 riastrad struct sumo_ps *ps = rps->ps_priv; 82 1.1 riastrad 83 1.1 riastrad return ps; 84 1.1 riastrad } 85 1.1 riastrad 86 1.1 riastrad struct sumo_power_info *sumo_get_pi(struct radeon_device *rdev) 87 1.1 riastrad { 88 1.1 riastrad struct sumo_power_info *pi = rdev->pm.dpm.priv; 89 1.1 riastrad 90 1.1 riastrad return pi; 91 1.1 riastrad } 92 1.1 riastrad 93 1.1 riastrad static void sumo_gfx_clockgating_enable(struct radeon_device *rdev, bool enable) 94 1.1 riastrad { 95 1.1 riastrad if (enable) 96 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, DYN_GFX_CLK_OFF_EN, ~DYN_GFX_CLK_OFF_EN); 97 1.1 riastrad else { 98 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, 0, ~DYN_GFX_CLK_OFF_EN); 99 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, GFX_CLK_FORCE_ON, ~GFX_CLK_FORCE_ON); 100 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, 0, ~GFX_CLK_FORCE_ON); 101 1.1 riastrad RREG32(GB_ADDR_CONFIG); 102 1.1 riastrad } 103 1.1 riastrad } 104 1.1 riastrad 105 1.1 riastrad #define CGCG_CGTT_LOCAL0_MASK 0xE5BFFFFF 106 1.1 riastrad #define CGCG_CGTT_LOCAL1_MASK 0xEFFF07FF 107 1.1 riastrad 108 1.1 riastrad static void sumo_mg_clockgating_enable(struct radeon_device *rdev, bool enable) 109 1.1 riastrad { 110 1.1 riastrad u32 local0; 111 1.1 riastrad u32 local1; 112 1.1 riastrad 113 1.1 riastrad local0 = RREG32(CG_CGTT_LOCAL_0); 114 1.1 riastrad local1 = RREG32(CG_CGTT_LOCAL_1); 115 1.1 riastrad 116 1.1 riastrad if (enable) { 117 1.1 riastrad WREG32(CG_CGTT_LOCAL_0, (0 & CGCG_CGTT_LOCAL0_MASK) | (local0 & ~CGCG_CGTT_LOCAL0_MASK) ); 118 1.1 riastrad WREG32(CG_CGTT_LOCAL_1, (0 & CGCG_CGTT_LOCAL1_MASK) | (local1 & ~CGCG_CGTT_LOCAL1_MASK) ); 119 1.1 riastrad } else { 120 1.1 riastrad WREG32(CG_CGTT_LOCAL_0, (0xFFFFFFFF & CGCG_CGTT_LOCAL0_MASK) | (local0 & ~CGCG_CGTT_LOCAL0_MASK) ); 121 1.1 riastrad WREG32(CG_CGTT_LOCAL_1, (0xFFFFCFFF & CGCG_CGTT_LOCAL1_MASK) | (local1 & ~CGCG_CGTT_LOCAL1_MASK) ); 122 1.1 riastrad } 123 1.1 riastrad } 124 1.1 riastrad 125 1.1 riastrad static void sumo_program_git(struct radeon_device *rdev) 126 1.1 riastrad { 127 1.1 riastrad u32 p, u; 128 1.1 riastrad u32 xclk = radeon_get_xclk(rdev); 129 1.1 riastrad 130 1.1 riastrad r600_calculate_u_and_p(SUMO_GICST_DFLT, 131 1.1 riastrad xclk, 16, &p, &u); 132 1.1 riastrad 133 1.1 riastrad WREG32_P(CG_GIT, CG_GICST(p), ~CG_GICST_MASK); 134 1.1 riastrad } 135 1.1 riastrad 136 1.1 riastrad static void sumo_program_grsd(struct radeon_device *rdev) 137 1.1 riastrad { 138 1.1 riastrad u32 p, u; 139 1.1 riastrad u32 xclk = radeon_get_xclk(rdev); 140 1.1 riastrad u32 grs = 256 * 25 / 100; 141 1.1 riastrad 142 1.1 riastrad r600_calculate_u_and_p(1, xclk, 14, &p, &u); 143 1.1 riastrad 144 1.1 riastrad WREG32(CG_GCOOR, PHC(grs) | SDC(p) | SU(u)); 145 1.1 riastrad } 146 1.1 riastrad 147 1.1 riastrad void sumo_gfx_clockgating_initialize(struct radeon_device *rdev) 148 1.1 riastrad { 149 1.1 riastrad sumo_program_git(rdev); 150 1.1 riastrad sumo_program_grsd(rdev); 151 1.1 riastrad } 152 1.1 riastrad 153 1.1 riastrad static void sumo_gfx_powergating_initialize(struct radeon_device *rdev) 154 1.1 riastrad { 155 1.1 riastrad u32 rcu_pwr_gating_cntl; 156 1.1 riastrad u32 p, u; 157 1.1 riastrad u32 p_c, p_p, d_p; 158 1.1 riastrad u32 r_t, i_t; 159 1.1 riastrad u32 xclk = radeon_get_xclk(rdev); 160 1.1 riastrad 161 1.1 riastrad if (rdev->family == CHIP_PALM) { 162 1.1 riastrad p_c = 4; 163 1.1 riastrad d_p = 10; 164 1.1 riastrad r_t = 10; 165 1.1 riastrad i_t = 4; 166 1.1 riastrad p_p = 50 + 1000/200 + 6 * 32; 167 1.1 riastrad } else { 168 1.1 riastrad p_c = 16; 169 1.1 riastrad d_p = 50; 170 1.1 riastrad r_t = 50; 171 1.1 riastrad i_t = 50; 172 1.1 riastrad p_p = 113; 173 1.1 riastrad } 174 1.1 riastrad 175 1.1 riastrad WREG32(CG_SCRATCH2, 0x01B60A17); 176 1.1 riastrad 177 1.1 riastrad r600_calculate_u_and_p(SUMO_GFXPOWERGATINGT_DFLT, 178 1.1 riastrad xclk, 16, &p, &u); 179 1.1 riastrad 180 1.1 riastrad WREG32_P(CG_PWR_GATING_CNTL, PGP(p) | PGU(u), 181 1.1 riastrad ~(PGP_MASK | PGU_MASK)); 182 1.1 riastrad 183 1.1 riastrad r600_calculate_u_and_p(SUMO_VOLTAGEDROPT_DFLT, 184 1.1 riastrad xclk, 16, &p, &u); 185 1.1 riastrad 186 1.1 riastrad WREG32_P(CG_CG_VOLTAGE_CNTL, PGP(p) | PGU(u), 187 1.1 riastrad ~(PGP_MASK | PGU_MASK)); 188 1.1 riastrad 189 1.1 riastrad if (rdev->family == CHIP_PALM) { 190 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_SEQ0, 0x10103210); 191 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_SEQ1, 0x10101010); 192 1.1 riastrad } else { 193 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_SEQ0, 0x76543210); 194 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_SEQ1, 0xFEDCBA98); 195 1.1 riastrad } 196 1.1 riastrad 197 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL); 198 1.1 riastrad rcu_pwr_gating_cntl &= 199 1.1 riastrad ~(RSVD_MASK | PCV_MASK | PGS_MASK); 200 1.1 riastrad rcu_pwr_gating_cntl |= PCV(p_c) | PGS(1) | PWR_GATING_EN; 201 1.1 riastrad if (rdev->family == CHIP_PALM) { 202 1.1 riastrad rcu_pwr_gating_cntl &= ~PCP_MASK; 203 1.1 riastrad rcu_pwr_gating_cntl |= PCP(0x77); 204 1.1 riastrad } 205 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL, rcu_pwr_gating_cntl); 206 1.1 riastrad 207 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL_2); 208 1.1 riastrad rcu_pwr_gating_cntl &= ~(MPPU_MASK | MPPD_MASK); 209 1.1 riastrad rcu_pwr_gating_cntl |= MPPU(p_p) | MPPD(50); 210 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_2, rcu_pwr_gating_cntl); 211 1.1 riastrad 212 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL_3); 213 1.1 riastrad rcu_pwr_gating_cntl &= ~(DPPU_MASK | DPPD_MASK); 214 1.1 riastrad rcu_pwr_gating_cntl |= DPPU(d_p) | DPPD(50); 215 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_3, rcu_pwr_gating_cntl); 216 1.1 riastrad 217 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL_4); 218 1.1 riastrad rcu_pwr_gating_cntl &= ~(RT_MASK | IT_MASK); 219 1.1 riastrad rcu_pwr_gating_cntl |= RT(r_t) | IT(i_t); 220 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_4, rcu_pwr_gating_cntl); 221 1.1 riastrad 222 1.1 riastrad if (rdev->family == CHIP_PALM) 223 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_5, 0xA02); 224 1.1 riastrad 225 1.1 riastrad sumo_smu_pg_init(rdev); 226 1.1 riastrad 227 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL); 228 1.1 riastrad rcu_pwr_gating_cntl &= 229 1.1 riastrad ~(RSVD_MASK | PCV_MASK | PGS_MASK); 230 1.1 riastrad rcu_pwr_gating_cntl |= PCV(p_c) | PGS(4) | PWR_GATING_EN; 231 1.1 riastrad if (rdev->family == CHIP_PALM) { 232 1.1 riastrad rcu_pwr_gating_cntl &= ~PCP_MASK; 233 1.1 riastrad rcu_pwr_gating_cntl |= PCP(0x77); 234 1.1 riastrad } 235 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL, rcu_pwr_gating_cntl); 236 1.1 riastrad 237 1.1 riastrad if (rdev->family == CHIP_PALM) { 238 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL_2); 239 1.1 riastrad rcu_pwr_gating_cntl &= ~(MPPU_MASK | MPPD_MASK); 240 1.1 riastrad rcu_pwr_gating_cntl |= MPPU(113) | MPPD(50); 241 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_2, rcu_pwr_gating_cntl); 242 1.1 riastrad 243 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL_3); 244 1.1 riastrad rcu_pwr_gating_cntl &= ~(DPPU_MASK | DPPD_MASK); 245 1.1 riastrad rcu_pwr_gating_cntl |= DPPU(16) | DPPD(50); 246 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_3, rcu_pwr_gating_cntl); 247 1.1 riastrad } 248 1.1 riastrad 249 1.1 riastrad sumo_smu_pg_init(rdev); 250 1.1 riastrad 251 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL); 252 1.1 riastrad rcu_pwr_gating_cntl &= 253 1.1 riastrad ~(RSVD_MASK | PCV_MASK | PGS_MASK); 254 1.1 riastrad rcu_pwr_gating_cntl |= PGS(5) | PWR_GATING_EN; 255 1.1 riastrad 256 1.1 riastrad if (rdev->family == CHIP_PALM) { 257 1.1 riastrad rcu_pwr_gating_cntl |= PCV(4); 258 1.1 riastrad rcu_pwr_gating_cntl &= ~PCP_MASK; 259 1.1 riastrad rcu_pwr_gating_cntl |= PCP(0x77); 260 1.1 riastrad } else 261 1.1 riastrad rcu_pwr_gating_cntl |= PCV(11); 262 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL, rcu_pwr_gating_cntl); 263 1.1 riastrad 264 1.1 riastrad if (rdev->family == CHIP_PALM) { 265 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL_2); 266 1.1 riastrad rcu_pwr_gating_cntl &= ~(MPPU_MASK | MPPD_MASK); 267 1.1 riastrad rcu_pwr_gating_cntl |= MPPU(113) | MPPD(50); 268 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_2, rcu_pwr_gating_cntl); 269 1.1 riastrad 270 1.1 riastrad rcu_pwr_gating_cntl = RREG32_RCU(RCU_PWR_GATING_CNTL_3); 271 1.1 riastrad rcu_pwr_gating_cntl &= ~(DPPU_MASK | DPPD_MASK); 272 1.1 riastrad rcu_pwr_gating_cntl |= DPPU(22) | DPPD(50); 273 1.1 riastrad WREG32_RCU(RCU_PWR_GATING_CNTL_3, rcu_pwr_gating_cntl); 274 1.1 riastrad } 275 1.1 riastrad 276 1.1 riastrad sumo_smu_pg_init(rdev); 277 1.1 riastrad } 278 1.1 riastrad 279 1.1 riastrad static void sumo_gfx_powergating_enable(struct radeon_device *rdev, bool enable) 280 1.1 riastrad { 281 1.1 riastrad if (enable) 282 1.1 riastrad WREG32_P(CG_PWR_GATING_CNTL, DYN_PWR_DOWN_EN, ~DYN_PWR_DOWN_EN); 283 1.1 riastrad else { 284 1.1 riastrad WREG32_P(CG_PWR_GATING_CNTL, 0, ~DYN_PWR_DOWN_EN); 285 1.1 riastrad RREG32(GB_ADDR_CONFIG); 286 1.1 riastrad } 287 1.1 riastrad } 288 1.1 riastrad 289 1.1 riastrad static int sumo_enable_clock_power_gating(struct radeon_device *rdev) 290 1.1 riastrad { 291 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 292 1.1 riastrad 293 1.1 riastrad if (pi->enable_gfx_clock_gating) 294 1.1 riastrad sumo_gfx_clockgating_initialize(rdev); 295 1.1 riastrad if (pi->enable_gfx_power_gating) 296 1.1 riastrad sumo_gfx_powergating_initialize(rdev); 297 1.1 riastrad if (pi->enable_mg_clock_gating) 298 1.1 riastrad sumo_mg_clockgating_enable(rdev, true); 299 1.1 riastrad if (pi->enable_gfx_clock_gating) 300 1.1 riastrad sumo_gfx_clockgating_enable(rdev, true); 301 1.1 riastrad if (pi->enable_gfx_power_gating) 302 1.1 riastrad sumo_gfx_powergating_enable(rdev, true); 303 1.1 riastrad 304 1.1 riastrad return 0; 305 1.1 riastrad } 306 1.1 riastrad 307 1.1 riastrad static void sumo_disable_clock_power_gating(struct radeon_device *rdev) 308 1.1 riastrad { 309 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 310 1.1 riastrad 311 1.1 riastrad if (pi->enable_gfx_clock_gating) 312 1.1 riastrad sumo_gfx_clockgating_enable(rdev, false); 313 1.1 riastrad if (pi->enable_gfx_power_gating) 314 1.1 riastrad sumo_gfx_powergating_enable(rdev, false); 315 1.1 riastrad if (pi->enable_mg_clock_gating) 316 1.1 riastrad sumo_mg_clockgating_enable(rdev, false); 317 1.1 riastrad } 318 1.1 riastrad 319 1.1 riastrad static void sumo_calculate_bsp(struct radeon_device *rdev, 320 1.1 riastrad u32 high_clk) 321 1.1 riastrad { 322 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 323 1.1 riastrad u32 xclk = radeon_get_xclk(rdev); 324 1.1 riastrad 325 1.1 riastrad pi->pasi = 65535 * 100 / high_clk; 326 1.1 riastrad pi->asi = 65535 * 100 / high_clk; 327 1.1 riastrad 328 1.1 riastrad r600_calculate_u_and_p(pi->asi, 329 1.1 riastrad xclk, 16, &pi->bsp, &pi->bsu); 330 1.1 riastrad 331 1.1 riastrad r600_calculate_u_and_p(pi->pasi, 332 1.1 riastrad xclk, 16, &pi->pbsp, &pi->pbsu); 333 1.1 riastrad 334 1.1 riastrad pi->dsp = BSP(pi->bsp) | BSU(pi->bsu); 335 1.1 riastrad pi->psp = BSP(pi->pbsp) | BSU(pi->pbsu); 336 1.1 riastrad } 337 1.1 riastrad 338 1.1 riastrad static void sumo_init_bsp(struct radeon_device *rdev) 339 1.1 riastrad { 340 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 341 1.1 riastrad 342 1.1 riastrad WREG32(CG_BSP_0, pi->psp); 343 1.1 riastrad } 344 1.1 riastrad 345 1.1 riastrad 346 1.1 riastrad static void sumo_program_bsp(struct radeon_device *rdev, 347 1.1 riastrad struct radeon_ps *rps) 348 1.1 riastrad { 349 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 350 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 351 1.1 riastrad u32 i; 352 1.1 riastrad u32 highest_engine_clock = ps->levels[ps->num_levels - 1].sclk; 353 1.1 riastrad 354 1.1 riastrad if (ps->flags & SUMO_POWERSTATE_FLAGS_BOOST_STATE) 355 1.1 riastrad highest_engine_clock = pi->boost_pl.sclk; 356 1.1 riastrad 357 1.1 riastrad sumo_calculate_bsp(rdev, highest_engine_clock); 358 1.1 riastrad 359 1.1 riastrad for (i = 0; i < ps->num_levels - 1; i++) 360 1.1 riastrad WREG32(CG_BSP_0 + (i * 4), pi->dsp); 361 1.1 riastrad 362 1.1 riastrad WREG32(CG_BSP_0 + (i * 4), pi->psp); 363 1.1 riastrad 364 1.1 riastrad if (ps->flags & SUMO_POWERSTATE_FLAGS_BOOST_STATE) 365 1.1 riastrad WREG32(CG_BSP_0 + (BOOST_DPM_LEVEL * 4), pi->psp); 366 1.1 riastrad } 367 1.1 riastrad 368 1.1 riastrad static void sumo_write_at(struct radeon_device *rdev, 369 1.1 riastrad u32 index, u32 value) 370 1.1 riastrad { 371 1.1 riastrad if (index == 0) 372 1.1 riastrad WREG32(CG_AT_0, value); 373 1.1 riastrad else if (index == 1) 374 1.1 riastrad WREG32(CG_AT_1, value); 375 1.1 riastrad else if (index == 2) 376 1.1 riastrad WREG32(CG_AT_2, value); 377 1.1 riastrad else if (index == 3) 378 1.1 riastrad WREG32(CG_AT_3, value); 379 1.1 riastrad else if (index == 4) 380 1.1 riastrad WREG32(CG_AT_4, value); 381 1.1 riastrad else if (index == 5) 382 1.1 riastrad WREG32(CG_AT_5, value); 383 1.1 riastrad else if (index == 6) 384 1.1 riastrad WREG32(CG_AT_6, value); 385 1.1 riastrad else if (index == 7) 386 1.1 riastrad WREG32(CG_AT_7, value); 387 1.1 riastrad } 388 1.1 riastrad 389 1.1 riastrad static void sumo_program_at(struct radeon_device *rdev, 390 1.1 riastrad struct radeon_ps *rps) 391 1.1 riastrad { 392 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 393 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 394 1.1 riastrad u32 asi; 395 1.1 riastrad u32 i; 396 1.1 riastrad u32 m_a; 397 1.1 riastrad u32 a_t; 398 1.1 riastrad u32 r[SUMO_MAX_HARDWARE_POWERLEVELS]; 399 1.1 riastrad u32 l[SUMO_MAX_HARDWARE_POWERLEVELS]; 400 1.1 riastrad 401 1.1 riastrad r[0] = SUMO_R_DFLT0; 402 1.1 riastrad r[1] = SUMO_R_DFLT1; 403 1.1 riastrad r[2] = SUMO_R_DFLT2; 404 1.1 riastrad r[3] = SUMO_R_DFLT3; 405 1.1 riastrad r[4] = SUMO_R_DFLT4; 406 1.1 riastrad 407 1.1 riastrad l[0] = SUMO_L_DFLT0; 408 1.1 riastrad l[1] = SUMO_L_DFLT1; 409 1.1 riastrad l[2] = SUMO_L_DFLT2; 410 1.1 riastrad l[3] = SUMO_L_DFLT3; 411 1.1 riastrad l[4] = SUMO_L_DFLT4; 412 1.1 riastrad 413 1.1 riastrad for (i = 0; i < ps->num_levels; i++) { 414 1.1 riastrad asi = (i == ps->num_levels - 1) ? pi->pasi : pi->asi; 415 1.1 riastrad 416 1.1 riastrad m_a = asi * ps->levels[i].sclk / 100; 417 1.1 riastrad 418 1.1 riastrad a_t = CG_R(m_a * r[i] / 100) | CG_L(m_a * l[i] / 100); 419 1.1 riastrad 420 1.1 riastrad sumo_write_at(rdev, i, a_t); 421 1.1 riastrad } 422 1.1 riastrad 423 1.1 riastrad if (ps->flags & SUMO_POWERSTATE_FLAGS_BOOST_STATE) { 424 1.1 riastrad asi = pi->pasi; 425 1.1 riastrad 426 1.1 riastrad m_a = asi * pi->boost_pl.sclk / 100; 427 1.1 riastrad 428 1.1 riastrad a_t = CG_R(m_a * r[ps->num_levels - 1] / 100) | 429 1.1 riastrad CG_L(m_a * l[ps->num_levels - 1] / 100); 430 1.1 riastrad 431 1.1 riastrad sumo_write_at(rdev, BOOST_DPM_LEVEL, a_t); 432 1.1 riastrad } 433 1.1 riastrad } 434 1.1 riastrad 435 1.1 riastrad static void sumo_program_tp(struct radeon_device *rdev) 436 1.1 riastrad { 437 1.1 riastrad int i; 438 1.1 riastrad enum r600_td td = R600_TD_DFLT; 439 1.1 riastrad 440 1.1 riastrad for (i = 0; i < SUMO_PM_NUMBER_OF_TC; i++) { 441 1.1 riastrad WREG32_P(CG_FFCT_0 + (i * 4), UTC_0(sumo_utc[i]), ~UTC_0_MASK); 442 1.1 riastrad WREG32_P(CG_FFCT_0 + (i * 4), DTC_0(sumo_dtc[i]), ~DTC_0_MASK); 443 1.1 riastrad } 444 1.1 riastrad 445 1.1 riastrad if (td == R600_TD_AUTO) 446 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, 0, ~FIR_FORCE_TREND_SEL); 447 1.1 riastrad else 448 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, FIR_FORCE_TREND_SEL, ~FIR_FORCE_TREND_SEL); 449 1.1 riastrad 450 1.1 riastrad if (td == R600_TD_UP) 451 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, 0, ~FIR_TREND_MODE); 452 1.1 riastrad 453 1.1 riastrad if (td == R600_TD_DOWN) 454 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, FIR_TREND_MODE, ~FIR_TREND_MODE); 455 1.1 riastrad } 456 1.1 riastrad 457 1.1 riastrad void sumo_program_vc(struct radeon_device *rdev, u32 vrc) 458 1.1 riastrad { 459 1.1 riastrad WREG32(CG_FTV, vrc); 460 1.1 riastrad } 461 1.1 riastrad 462 1.1 riastrad void sumo_clear_vc(struct radeon_device *rdev) 463 1.1 riastrad { 464 1.1 riastrad WREG32(CG_FTV, 0); 465 1.1 riastrad } 466 1.1 riastrad 467 1.1 riastrad void sumo_program_sstp(struct radeon_device *rdev) 468 1.1 riastrad { 469 1.1 riastrad u32 p, u; 470 1.1 riastrad u32 xclk = radeon_get_xclk(rdev); 471 1.1 riastrad 472 1.1 riastrad r600_calculate_u_and_p(SUMO_SST_DFLT, 473 1.1 riastrad xclk, 16, &p, &u); 474 1.1 riastrad 475 1.1 riastrad WREG32(CG_SSP, SSTU(u) | SST(p)); 476 1.1 riastrad } 477 1.1 riastrad 478 1.1 riastrad static void sumo_set_divider_value(struct radeon_device *rdev, 479 1.1 riastrad u32 index, u32 divider) 480 1.1 riastrad { 481 1.1 riastrad u32 reg_index = index / 4; 482 1.1 riastrad u32 field_index = index % 4; 483 1.1 riastrad 484 1.1 riastrad if (field_index == 0) 485 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 486 1.1 riastrad SCLK_FSTATE_0_DIV(divider), ~SCLK_FSTATE_0_DIV_MASK); 487 1.1 riastrad else if (field_index == 1) 488 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 489 1.1 riastrad SCLK_FSTATE_1_DIV(divider), ~SCLK_FSTATE_1_DIV_MASK); 490 1.1 riastrad else if (field_index == 2) 491 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 492 1.1 riastrad SCLK_FSTATE_2_DIV(divider), ~SCLK_FSTATE_2_DIV_MASK); 493 1.1 riastrad else if (field_index == 3) 494 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 495 1.1 riastrad SCLK_FSTATE_3_DIV(divider), ~SCLK_FSTATE_3_DIV_MASK); 496 1.1 riastrad } 497 1.1 riastrad 498 1.1 riastrad static void sumo_set_ds_dividers(struct radeon_device *rdev, 499 1.1 riastrad u32 index, u32 divider) 500 1.1 riastrad { 501 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 502 1.1 riastrad 503 1.1 riastrad if (pi->enable_sclk_ds) { 504 1.1 riastrad u32 dpm_ctrl = RREG32(CG_SCLK_DPM_CTRL_6); 505 1.1 riastrad 506 1.1 riastrad dpm_ctrl &= ~(0x7 << (index * 3)); 507 1.1 riastrad dpm_ctrl |= (divider << (index * 3)); 508 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_6, dpm_ctrl); 509 1.1 riastrad } 510 1.1 riastrad } 511 1.1 riastrad 512 1.1 riastrad static void sumo_set_ss_dividers(struct radeon_device *rdev, 513 1.1 riastrad u32 index, u32 divider) 514 1.1 riastrad { 515 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 516 1.1 riastrad 517 1.1 riastrad if (pi->enable_sclk_ds) { 518 1.1 riastrad u32 dpm_ctrl = RREG32(CG_SCLK_DPM_CTRL_11); 519 1.1 riastrad 520 1.1 riastrad dpm_ctrl &= ~(0x7 << (index * 3)); 521 1.1 riastrad dpm_ctrl |= (divider << (index * 3)); 522 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_11, dpm_ctrl); 523 1.1 riastrad } 524 1.1 riastrad } 525 1.1 riastrad 526 1.1 riastrad static void sumo_set_vid(struct radeon_device *rdev, u32 index, u32 vid) 527 1.1 riastrad { 528 1.1 riastrad u32 voltage_cntl = RREG32(CG_DPM_VOLTAGE_CNTL); 529 1.1 riastrad 530 1.1 riastrad voltage_cntl &= ~(DPM_STATE0_LEVEL_MASK << (index * 2)); 531 1.1 riastrad voltage_cntl |= (vid << (DPM_STATE0_LEVEL_SHIFT + index * 2)); 532 1.1 riastrad WREG32(CG_DPM_VOLTAGE_CNTL, voltage_cntl); 533 1.1 riastrad } 534 1.1 riastrad 535 1.1 riastrad static void sumo_set_allos_gnb_slow(struct radeon_device *rdev, u32 index, u32 gnb_slow) 536 1.1 riastrad { 537 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 538 1.1 riastrad u32 temp = gnb_slow; 539 1.1 riastrad u32 cg_sclk_dpm_ctrl_3; 540 1.1 riastrad 541 1.1 riastrad if (pi->driver_nbps_policy_disable) 542 1.1 riastrad temp = 1; 543 1.1 riastrad 544 1.1 riastrad cg_sclk_dpm_ctrl_3 = RREG32(CG_SCLK_DPM_CTRL_3); 545 1.1 riastrad cg_sclk_dpm_ctrl_3 &= ~(GNB_SLOW_FSTATE_0_MASK << index); 546 1.1 riastrad cg_sclk_dpm_ctrl_3 |= (temp << (GNB_SLOW_FSTATE_0_SHIFT + index)); 547 1.1 riastrad 548 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_3, cg_sclk_dpm_ctrl_3); 549 1.1 riastrad } 550 1.1 riastrad 551 1.1 riastrad static void sumo_program_power_level(struct radeon_device *rdev, 552 1.1 riastrad struct sumo_pl *pl, u32 index) 553 1.1 riastrad { 554 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 555 1.1 riastrad int ret; 556 1.1 riastrad struct atom_clock_dividers dividers; 557 1.1 riastrad u32 ds_en = RREG32(DEEP_SLEEP_CNTL) & ENABLE_DS; 558 1.1 riastrad 559 1.1 riastrad ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 560 1.1 riastrad pl->sclk, false, ÷rs); 561 1.1 riastrad if (ret) 562 1.1 riastrad return; 563 1.1 riastrad 564 1.1 riastrad sumo_set_divider_value(rdev, index, dividers.post_div); 565 1.1 riastrad 566 1.1 riastrad sumo_set_vid(rdev, index, pl->vddc_index); 567 1.1 riastrad 568 1.1 riastrad if (pl->ss_divider_index == 0 || pl->ds_divider_index == 0) { 569 1.1 riastrad if (ds_en) 570 1.1 riastrad WREG32_P(DEEP_SLEEP_CNTL, 0, ~ENABLE_DS); 571 1.1 riastrad } else { 572 1.1 riastrad sumo_set_ss_dividers(rdev, index, pl->ss_divider_index); 573 1.1 riastrad sumo_set_ds_dividers(rdev, index, pl->ds_divider_index); 574 1.1 riastrad 575 1.1 riastrad if (!ds_en) 576 1.1 riastrad WREG32_P(DEEP_SLEEP_CNTL, ENABLE_DS, ~ENABLE_DS); 577 1.1 riastrad } 578 1.1 riastrad 579 1.1 riastrad sumo_set_allos_gnb_slow(rdev, index, pl->allow_gnb_slow); 580 1.1 riastrad 581 1.1 riastrad if (pi->enable_boost) 582 1.1 riastrad sumo_set_tdp_limit(rdev, index, pl->sclk_dpm_tdp_limit); 583 1.1 riastrad } 584 1.1 riastrad 585 1.1 riastrad static void sumo_power_level_enable(struct radeon_device *rdev, u32 index, bool enable) 586 1.1 riastrad { 587 1.1 riastrad u32 reg_index = index / 4; 588 1.1 riastrad u32 field_index = index % 4; 589 1.1 riastrad 590 1.1 riastrad if (field_index == 0) 591 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 592 1.1 riastrad enable ? SCLK_FSTATE_0_VLD : 0, ~SCLK_FSTATE_0_VLD); 593 1.1 riastrad else if (field_index == 1) 594 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 595 1.1 riastrad enable ? SCLK_FSTATE_1_VLD : 0, ~SCLK_FSTATE_1_VLD); 596 1.1 riastrad else if (field_index == 2) 597 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 598 1.1 riastrad enable ? SCLK_FSTATE_2_VLD : 0, ~SCLK_FSTATE_2_VLD); 599 1.1 riastrad else if (field_index == 3) 600 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL + (reg_index * 4), 601 1.1 riastrad enable ? SCLK_FSTATE_3_VLD : 0, ~SCLK_FSTATE_3_VLD); 602 1.1 riastrad } 603 1.1 riastrad 604 1.1 riastrad static bool sumo_dpm_enabled(struct radeon_device *rdev) 605 1.1 riastrad { 606 1.1 riastrad if (RREG32(CG_SCLK_DPM_CTRL_3) & DPM_SCLK_ENABLE) 607 1.1 riastrad return true; 608 1.1 riastrad else 609 1.1 riastrad return false; 610 1.1 riastrad } 611 1.1 riastrad 612 1.1 riastrad static void sumo_start_dpm(struct radeon_device *rdev) 613 1.1 riastrad { 614 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, DPM_SCLK_ENABLE, ~DPM_SCLK_ENABLE); 615 1.1 riastrad } 616 1.1 riastrad 617 1.1 riastrad static void sumo_stop_dpm(struct radeon_device *rdev) 618 1.1 riastrad { 619 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, 0, ~DPM_SCLK_ENABLE); 620 1.1 riastrad } 621 1.1 riastrad 622 1.1 riastrad static void sumo_set_forced_mode(struct radeon_device *rdev, bool enable) 623 1.1 riastrad { 624 1.1 riastrad if (enable) 625 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, FORCE_SCLK_STATE_EN, ~FORCE_SCLK_STATE_EN); 626 1.1 riastrad else 627 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, 0, ~FORCE_SCLK_STATE_EN); 628 1.1 riastrad } 629 1.1 riastrad 630 1.1 riastrad static void sumo_set_forced_mode_enabled(struct radeon_device *rdev) 631 1.1 riastrad { 632 1.1 riastrad int i; 633 1.1 riastrad 634 1.1 riastrad sumo_set_forced_mode(rdev, true); 635 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 636 1.1 riastrad if (RREG32(CG_SCLK_STATUS) & SCLK_OVERCLK_DETECT) 637 1.1 riastrad break; 638 1.1 riastrad udelay(1); 639 1.1 riastrad } 640 1.1 riastrad } 641 1.1 riastrad 642 1.1 riastrad static void sumo_wait_for_level_0(struct radeon_device *rdev) 643 1.1 riastrad { 644 1.1 riastrad int i; 645 1.1 riastrad 646 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 647 1.1 riastrad if ((RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURR_SCLK_INDEX_MASK) == 0) 648 1.1 riastrad break; 649 1.1 riastrad udelay(1); 650 1.1 riastrad } 651 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 652 1.1 riastrad if ((RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURR_INDEX_MASK) == 0) 653 1.1 riastrad break; 654 1.1 riastrad udelay(1); 655 1.1 riastrad } 656 1.1 riastrad } 657 1.1 riastrad 658 1.1 riastrad static void sumo_set_forced_mode_disabled(struct radeon_device *rdev) 659 1.1 riastrad { 660 1.1 riastrad sumo_set_forced_mode(rdev, false); 661 1.1 riastrad } 662 1.1 riastrad 663 1.1 riastrad static void sumo_enable_power_level_0(struct radeon_device *rdev) 664 1.1 riastrad { 665 1.1 riastrad sumo_power_level_enable(rdev, 0, true); 666 1.1 riastrad } 667 1.1 riastrad 668 1.1 riastrad static void sumo_patch_boost_state(struct radeon_device *rdev, 669 1.1 riastrad struct radeon_ps *rps) 670 1.1 riastrad { 671 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 672 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(rps); 673 1.1 riastrad 674 1.1 riastrad if (new_ps->flags & SUMO_POWERSTATE_FLAGS_BOOST_STATE) { 675 1.1 riastrad pi->boost_pl = new_ps->levels[new_ps->num_levels - 1]; 676 1.1 riastrad pi->boost_pl.sclk = pi->sys_info.boost_sclk; 677 1.1 riastrad pi->boost_pl.vddc_index = pi->sys_info.boost_vid_2bit; 678 1.1 riastrad pi->boost_pl.sclk_dpm_tdp_limit = pi->sys_info.sclk_dpm_tdp_limit_boost; 679 1.1 riastrad } 680 1.1 riastrad } 681 1.1 riastrad 682 1.1 riastrad static void sumo_pre_notify_alt_vddnb_change(struct radeon_device *rdev, 683 1.1 riastrad struct radeon_ps *new_rps, 684 1.1 riastrad struct radeon_ps *old_rps) 685 1.1 riastrad { 686 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(new_rps); 687 1.1 riastrad struct sumo_ps *old_ps = sumo_get_ps(old_rps); 688 1.1 riastrad u32 nbps1_old = 0; 689 1.1 riastrad u32 nbps1_new = 0; 690 1.1 riastrad 691 1.1 riastrad if (old_ps != NULL) 692 1.1 riastrad nbps1_old = (old_ps->flags & SUMO_POWERSTATE_FLAGS_FORCE_NBPS1_STATE) ? 1 : 0; 693 1.1 riastrad 694 1.1 riastrad nbps1_new = (new_ps->flags & SUMO_POWERSTATE_FLAGS_FORCE_NBPS1_STATE) ? 1 : 0; 695 1.1 riastrad 696 1.1 riastrad if (nbps1_old == 1 && nbps1_new == 0) 697 1.1 riastrad sumo_smu_notify_alt_vddnb_change(rdev, 0, 0); 698 1.1 riastrad } 699 1.1 riastrad 700 1.1 riastrad static void sumo_post_notify_alt_vddnb_change(struct radeon_device *rdev, 701 1.1 riastrad struct radeon_ps *new_rps, 702 1.1 riastrad struct radeon_ps *old_rps) 703 1.1 riastrad { 704 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(new_rps); 705 1.1 riastrad struct sumo_ps *old_ps = sumo_get_ps(old_rps); 706 1.1 riastrad u32 nbps1_old = 0; 707 1.1 riastrad u32 nbps1_new = 0; 708 1.1 riastrad 709 1.1 riastrad if (old_ps != NULL) 710 1.1 riastrad nbps1_old = (old_ps->flags & SUMO_POWERSTATE_FLAGS_FORCE_NBPS1_STATE)? 1 : 0; 711 1.1 riastrad 712 1.1 riastrad nbps1_new = (new_ps->flags & SUMO_POWERSTATE_FLAGS_FORCE_NBPS1_STATE)? 1 : 0; 713 1.1 riastrad 714 1.1 riastrad if (nbps1_old == 0 && nbps1_new == 1) 715 1.1 riastrad sumo_smu_notify_alt_vddnb_change(rdev, 1, 1); 716 1.1 riastrad } 717 1.1 riastrad 718 1.1 riastrad static void sumo_enable_boost(struct radeon_device *rdev, 719 1.1 riastrad struct radeon_ps *rps, 720 1.1 riastrad bool enable) 721 1.1 riastrad { 722 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(rps); 723 1.1 riastrad 724 1.1 riastrad if (enable) { 725 1.1 riastrad if (new_ps->flags & SUMO_POWERSTATE_FLAGS_BOOST_STATE) 726 1.1 riastrad sumo_boost_state_enable(rdev, true); 727 1.1 riastrad } else 728 1.1 riastrad sumo_boost_state_enable(rdev, false); 729 1.1 riastrad } 730 1.1 riastrad 731 1.1 riastrad static void sumo_set_forced_level(struct radeon_device *rdev, u32 index) 732 1.1 riastrad { 733 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, FORCE_SCLK_STATE(index), ~FORCE_SCLK_STATE_MASK); 734 1.1 riastrad } 735 1.1 riastrad 736 1.1 riastrad static void sumo_set_forced_level_0(struct radeon_device *rdev) 737 1.1 riastrad { 738 1.1 riastrad sumo_set_forced_level(rdev, 0); 739 1.1 riastrad } 740 1.1 riastrad 741 1.1 riastrad static void sumo_program_wl(struct radeon_device *rdev, 742 1.1 riastrad struct radeon_ps *rps) 743 1.1 riastrad { 744 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(rps); 745 1.1 riastrad u32 dpm_ctrl4 = RREG32(CG_SCLK_DPM_CTRL_4); 746 1.1 riastrad 747 1.1 riastrad dpm_ctrl4 &= 0xFFFFFF00; 748 1.1 riastrad dpm_ctrl4 |= (1 << (new_ps->num_levels - 1)); 749 1.1 riastrad 750 1.1 riastrad if (new_ps->flags & SUMO_POWERSTATE_FLAGS_BOOST_STATE) 751 1.1 riastrad dpm_ctrl4 |= (1 << BOOST_DPM_LEVEL); 752 1.1 riastrad 753 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_4, dpm_ctrl4); 754 1.1 riastrad } 755 1.1 riastrad 756 1.1 riastrad static void sumo_program_power_levels_0_to_n(struct radeon_device *rdev, 757 1.1 riastrad struct radeon_ps *new_rps, 758 1.1 riastrad struct radeon_ps *old_rps) 759 1.1 riastrad { 760 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 761 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(new_rps); 762 1.1 riastrad struct sumo_ps *old_ps = sumo_get_ps(old_rps); 763 1.1 riastrad u32 i; 764 1.1 riastrad u32 n_current_state_levels = (old_ps == NULL) ? 1 : old_ps->num_levels; 765 1.1 riastrad 766 1.1 riastrad for (i = 0; i < new_ps->num_levels; i++) { 767 1.1 riastrad sumo_program_power_level(rdev, &new_ps->levels[i], i); 768 1.1 riastrad sumo_power_level_enable(rdev, i, true); 769 1.1 riastrad } 770 1.1 riastrad 771 1.1 riastrad for (i = new_ps->num_levels; i < n_current_state_levels; i++) 772 1.1 riastrad sumo_power_level_enable(rdev, i, false); 773 1.1 riastrad 774 1.1 riastrad if (new_ps->flags & SUMO_POWERSTATE_FLAGS_BOOST_STATE) 775 1.1 riastrad sumo_program_power_level(rdev, &pi->boost_pl, BOOST_DPM_LEVEL); 776 1.1 riastrad } 777 1.1 riastrad 778 1.1 riastrad static void sumo_enable_acpi_pm(struct radeon_device *rdev) 779 1.1 riastrad { 780 1.1 riastrad WREG32_P(GENERAL_PWRMGT, STATIC_PM_EN, ~STATIC_PM_EN); 781 1.1 riastrad } 782 1.1 riastrad 783 1.1 riastrad static void sumo_program_power_level_enter_state(struct radeon_device *rdev) 784 1.1 riastrad { 785 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_5, SCLK_FSTATE_BOOTUP(0), ~SCLK_FSTATE_BOOTUP_MASK); 786 1.1 riastrad } 787 1.1 riastrad 788 1.1 riastrad static void sumo_program_acpi_power_level(struct radeon_device *rdev) 789 1.1 riastrad { 790 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 791 1.1 riastrad struct atom_clock_dividers dividers; 792 1.1 riastrad int ret; 793 1.1 riastrad 794 1.3 riastrad ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 795 1.3 riastrad pi->acpi_pl.sclk, 796 1.1 riastrad false, ÷rs); 797 1.1 riastrad if (ret) 798 1.1 riastrad return; 799 1.1 riastrad 800 1.1 riastrad WREG32_P(CG_ACPI_CNTL, SCLK_ACPI_DIV(dividers.post_div), ~SCLK_ACPI_DIV_MASK); 801 1.1 riastrad WREG32_P(CG_ACPI_VOLTAGE_CNTL, 0, ~ACPI_VOLTAGE_EN); 802 1.1 riastrad } 803 1.1 riastrad 804 1.1 riastrad static void sumo_program_bootup_state(struct radeon_device *rdev) 805 1.1 riastrad { 806 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 807 1.1 riastrad u32 dpm_ctrl4 = RREG32(CG_SCLK_DPM_CTRL_4); 808 1.1 riastrad u32 i; 809 1.1 riastrad 810 1.1 riastrad sumo_program_power_level(rdev, &pi->boot_pl, 0); 811 1.1 riastrad 812 1.1 riastrad dpm_ctrl4 &= 0xFFFFFF00; 813 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_4, dpm_ctrl4); 814 1.1 riastrad 815 1.1 riastrad for (i = 1; i < 8; i++) 816 1.1 riastrad sumo_power_level_enable(rdev, i, false); 817 1.1 riastrad } 818 1.1 riastrad 819 1.1 riastrad static void sumo_setup_uvd_clocks(struct radeon_device *rdev, 820 1.1 riastrad struct radeon_ps *new_rps, 821 1.1 riastrad struct radeon_ps *old_rps) 822 1.1 riastrad { 823 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 824 1.1 riastrad 825 1.1 riastrad if (pi->enable_gfx_power_gating) { 826 1.1 riastrad sumo_gfx_powergating_enable(rdev, false); 827 1.1 riastrad } 828 1.1 riastrad 829 1.1 riastrad radeon_set_uvd_clocks(rdev, new_rps->vclk, new_rps->dclk); 830 1.1 riastrad 831 1.1 riastrad if (pi->enable_gfx_power_gating) { 832 1.1 riastrad if (!pi->disable_gfx_power_gating_in_uvd || 833 1.1 riastrad !r600_is_uvd_state(new_rps->class, new_rps->class2)) 834 1.1 riastrad sumo_gfx_powergating_enable(rdev, true); 835 1.1 riastrad } 836 1.1 riastrad } 837 1.1 riastrad 838 1.1 riastrad static void sumo_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev, 839 1.1 riastrad struct radeon_ps *new_rps, 840 1.1 riastrad struct radeon_ps *old_rps) 841 1.1 riastrad { 842 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(new_rps); 843 1.1 riastrad struct sumo_ps *current_ps = sumo_get_ps(old_rps); 844 1.1 riastrad 845 1.1 riastrad if ((new_rps->vclk == old_rps->vclk) && 846 1.1 riastrad (new_rps->dclk == old_rps->dclk)) 847 1.1 riastrad return; 848 1.1 riastrad 849 1.1 riastrad if (new_ps->levels[new_ps->num_levels - 1].sclk >= 850 1.1 riastrad current_ps->levels[current_ps->num_levels - 1].sclk) 851 1.1 riastrad return; 852 1.1 riastrad 853 1.1 riastrad sumo_setup_uvd_clocks(rdev, new_rps, old_rps); 854 1.1 riastrad } 855 1.1 riastrad 856 1.1 riastrad static void sumo_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev, 857 1.1 riastrad struct radeon_ps *new_rps, 858 1.1 riastrad struct radeon_ps *old_rps) 859 1.1 riastrad { 860 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(new_rps); 861 1.1 riastrad struct sumo_ps *current_ps = sumo_get_ps(old_rps); 862 1.1 riastrad 863 1.1 riastrad if ((new_rps->vclk == old_rps->vclk) && 864 1.1 riastrad (new_rps->dclk == old_rps->dclk)) 865 1.1 riastrad return; 866 1.1 riastrad 867 1.1 riastrad if (new_ps->levels[new_ps->num_levels - 1].sclk < 868 1.1 riastrad current_ps->levels[current_ps->num_levels - 1].sclk) 869 1.1 riastrad return; 870 1.1 riastrad 871 1.1 riastrad sumo_setup_uvd_clocks(rdev, new_rps, old_rps); 872 1.1 riastrad } 873 1.1 riastrad 874 1.1 riastrad void sumo_take_smu_control(struct radeon_device *rdev, bool enable) 875 1.1 riastrad { 876 1.1 riastrad /* This bit selects who handles display phy powergating. 877 1.1 riastrad * Clear the bit to let atom handle it. 878 1.1 riastrad * Set it to let the driver handle it. 879 1.1 riastrad * For now we just let atom handle it. 880 1.1 riastrad */ 881 1.1 riastrad #if 0 882 1.1 riastrad u32 v = RREG32(DOUT_SCRATCH3); 883 1.1 riastrad 884 1.1 riastrad if (enable) 885 1.1 riastrad v |= 0x4; 886 1.1 riastrad else 887 1.1 riastrad v &= 0xFFFFFFFB; 888 1.1 riastrad 889 1.1 riastrad WREG32(DOUT_SCRATCH3, v); 890 1.1 riastrad #endif 891 1.1 riastrad } 892 1.1 riastrad 893 1.1 riastrad static void sumo_enable_sclk_ds(struct radeon_device *rdev, bool enable) 894 1.1 riastrad { 895 1.1 riastrad if (enable) { 896 1.1 riastrad u32 deep_sleep_cntl = RREG32(DEEP_SLEEP_CNTL); 897 1.1 riastrad u32 deep_sleep_cntl2 = RREG32(DEEP_SLEEP_CNTL2); 898 1.1 riastrad u32 t = 1; 899 1.1 riastrad 900 1.1 riastrad deep_sleep_cntl &= ~R_DIS; 901 1.1 riastrad deep_sleep_cntl &= ~HS_MASK; 902 1.1 riastrad deep_sleep_cntl |= HS(t > 4095 ? 4095 : t); 903 1.1 riastrad 904 1.1 riastrad deep_sleep_cntl2 |= LB_UFP_EN; 905 1.1 riastrad deep_sleep_cntl2 &= INOUT_C_MASK; 906 1.1 riastrad deep_sleep_cntl2 |= INOUT_C(0xf); 907 1.1 riastrad 908 1.1 riastrad WREG32(DEEP_SLEEP_CNTL2, deep_sleep_cntl2); 909 1.1 riastrad WREG32(DEEP_SLEEP_CNTL, deep_sleep_cntl); 910 1.1 riastrad } else 911 1.1 riastrad WREG32_P(DEEP_SLEEP_CNTL, 0, ~ENABLE_DS); 912 1.1 riastrad } 913 1.1 riastrad 914 1.1 riastrad static void sumo_program_bootup_at(struct radeon_device *rdev) 915 1.1 riastrad { 916 1.1 riastrad WREG32_P(CG_AT_0, CG_R(0xffff), ~CG_R_MASK); 917 1.1 riastrad WREG32_P(CG_AT_0, CG_L(0), ~CG_L_MASK); 918 1.1 riastrad } 919 1.1 riastrad 920 1.1 riastrad static void sumo_reset_am(struct radeon_device *rdev) 921 1.1 riastrad { 922 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, FIR_RESET, ~FIR_RESET); 923 1.1 riastrad } 924 1.1 riastrad 925 1.1 riastrad static void sumo_start_am(struct radeon_device *rdev) 926 1.1 riastrad { 927 1.1 riastrad WREG32_P(SCLK_PWRMGT_CNTL, 0, ~FIR_RESET); 928 1.1 riastrad } 929 1.1 riastrad 930 1.1 riastrad static void sumo_program_ttp(struct radeon_device *rdev) 931 1.1 riastrad { 932 1.1 riastrad u32 xclk = radeon_get_xclk(rdev); 933 1.1 riastrad u32 p, u; 934 1.1 riastrad u32 cg_sclk_dpm_ctrl_5 = RREG32(CG_SCLK_DPM_CTRL_5); 935 1.1 riastrad 936 1.1 riastrad r600_calculate_u_and_p(1000, 937 1.1 riastrad xclk, 16, &p, &u); 938 1.1 riastrad 939 1.1 riastrad cg_sclk_dpm_ctrl_5 &= ~(TT_TP_MASK | TT_TU_MASK); 940 1.1 riastrad cg_sclk_dpm_ctrl_5 |= TT_TP(p) | TT_TU(u); 941 1.1 riastrad 942 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_5, cg_sclk_dpm_ctrl_5); 943 1.1 riastrad } 944 1.1 riastrad 945 1.1 riastrad static void sumo_program_ttt(struct radeon_device *rdev) 946 1.1 riastrad { 947 1.1 riastrad u32 cg_sclk_dpm_ctrl_3 = RREG32(CG_SCLK_DPM_CTRL_3); 948 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 949 1.1 riastrad 950 1.1 riastrad cg_sclk_dpm_ctrl_3 &= ~(GNB_TT_MASK | GNB_THERMTHRO_MASK); 951 1.1 riastrad cg_sclk_dpm_ctrl_3 |= GNB_TT(pi->thermal_auto_throttling + 49); 952 1.1 riastrad 953 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_3, cg_sclk_dpm_ctrl_3); 954 1.1 riastrad } 955 1.1 riastrad 956 1.1 riastrad 957 1.1 riastrad static void sumo_enable_voltage_scaling(struct radeon_device *rdev, bool enable) 958 1.1 riastrad { 959 1.1 riastrad if (enable) { 960 1.1 riastrad WREG32_P(CG_DPM_VOLTAGE_CNTL, DPM_VOLTAGE_EN, ~DPM_VOLTAGE_EN); 961 1.1 riastrad WREG32_P(CG_CG_VOLTAGE_CNTL, 0, ~CG_VOLTAGE_EN); 962 1.1 riastrad } else { 963 1.1 riastrad WREG32_P(CG_CG_VOLTAGE_CNTL, CG_VOLTAGE_EN, ~CG_VOLTAGE_EN); 964 1.1 riastrad WREG32_P(CG_DPM_VOLTAGE_CNTL, 0, ~DPM_VOLTAGE_EN); 965 1.1 riastrad } 966 1.1 riastrad } 967 1.1 riastrad 968 1.1 riastrad static void sumo_override_cnb_thermal_events(struct radeon_device *rdev) 969 1.1 riastrad { 970 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, CNB_THERMTHRO_MASK_SCLK, 971 1.1 riastrad ~CNB_THERMTHRO_MASK_SCLK); 972 1.1 riastrad } 973 1.1 riastrad 974 1.1 riastrad static void sumo_program_dc_hto(struct radeon_device *rdev) 975 1.1 riastrad { 976 1.1 riastrad u32 cg_sclk_dpm_ctrl_4 = RREG32(CG_SCLK_DPM_CTRL_4); 977 1.1 riastrad u32 p, u; 978 1.1 riastrad u32 xclk = radeon_get_xclk(rdev); 979 1.1 riastrad 980 1.1 riastrad r600_calculate_u_and_p(100000, 981 1.1 riastrad xclk, 14, &p, &u); 982 1.1 riastrad 983 1.1 riastrad cg_sclk_dpm_ctrl_4 &= ~(DC_HDC_MASK | DC_HU_MASK); 984 1.1 riastrad cg_sclk_dpm_ctrl_4 |= DC_HDC(p) | DC_HU(u); 985 1.1 riastrad 986 1.1 riastrad WREG32(CG_SCLK_DPM_CTRL_4, cg_sclk_dpm_ctrl_4); 987 1.1 riastrad } 988 1.1 riastrad 989 1.1 riastrad static void sumo_force_nbp_state(struct radeon_device *rdev, 990 1.1 riastrad struct radeon_ps *rps) 991 1.1 riastrad { 992 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 993 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(rps); 994 1.1 riastrad 995 1.1 riastrad if (!pi->driver_nbps_policy_disable) { 996 1.1 riastrad if (new_ps->flags & SUMO_POWERSTATE_FLAGS_FORCE_NBPS1_STATE) 997 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, FORCE_NB_PSTATE_1, ~FORCE_NB_PSTATE_1); 998 1.1 riastrad else 999 1.1 riastrad WREG32_P(CG_SCLK_DPM_CTRL_3, 0, ~FORCE_NB_PSTATE_1); 1000 1.1 riastrad } 1001 1.1 riastrad } 1002 1.1 riastrad 1003 1.1 riastrad u32 sumo_get_sleep_divider_from_id(u32 id) 1004 1.1 riastrad { 1005 1.1 riastrad return 1 << id; 1006 1.1 riastrad } 1007 1.1 riastrad 1008 1.1 riastrad u32 sumo_get_sleep_divider_id_from_clock(struct radeon_device *rdev, 1009 1.1 riastrad u32 sclk, 1010 1.1 riastrad u32 min_sclk_in_sr) 1011 1.1 riastrad { 1012 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1013 1.1 riastrad u32 i; 1014 1.1 riastrad u32 temp; 1015 1.2 riastrad u32 min = (min_sclk_in_sr > SUMO_MINIMUM_ENGINE_CLOCK) ? 1016 1.1 riastrad min_sclk_in_sr : SUMO_MINIMUM_ENGINE_CLOCK; 1017 1.1 riastrad 1018 1.2 riastrad if (sclk < min) 1019 1.1 riastrad return 0; 1020 1.1 riastrad 1021 1.1 riastrad if (!pi->enable_sclk_ds) 1022 1.1 riastrad return 0; 1023 1.1 riastrad 1024 1.1 riastrad for (i = SUMO_MAX_DEEPSLEEP_DIVIDER_ID; ; i--) { 1025 1.1 riastrad temp = sclk / sumo_get_sleep_divider_from_id(i); 1026 1.1 riastrad 1027 1.2 riastrad if (temp >= min || i == 0) 1028 1.1 riastrad break; 1029 1.1 riastrad } 1030 1.1 riastrad return i; 1031 1.1 riastrad } 1032 1.1 riastrad 1033 1.1 riastrad static u32 sumo_get_valid_engine_clock(struct radeon_device *rdev, 1034 1.1 riastrad u32 lower_limit) 1035 1.1 riastrad { 1036 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1037 1.1 riastrad u32 i; 1038 1.1 riastrad 1039 1.1 riastrad for (i = 0; i < pi->sys_info.sclk_voltage_mapping_table.num_max_dpm_entries; i++) { 1040 1.1 riastrad if (pi->sys_info.sclk_voltage_mapping_table.entries[i].sclk_frequency >= lower_limit) 1041 1.1 riastrad return pi->sys_info.sclk_voltage_mapping_table.entries[i].sclk_frequency; 1042 1.1 riastrad } 1043 1.1 riastrad 1044 1.1 riastrad return pi->sys_info.sclk_voltage_mapping_table.entries[pi->sys_info.sclk_voltage_mapping_table.num_max_dpm_entries - 1].sclk_frequency; 1045 1.1 riastrad } 1046 1.1 riastrad 1047 1.1 riastrad static void sumo_patch_thermal_state(struct radeon_device *rdev, 1048 1.1 riastrad struct sumo_ps *ps, 1049 1.1 riastrad struct sumo_ps *current_ps) 1050 1.1 riastrad { 1051 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1052 1.1 riastrad u32 sclk_in_sr = pi->sys_info.min_sclk; /* ??? */ 1053 1.1 riastrad u32 current_vddc; 1054 1.1 riastrad u32 current_sclk; 1055 1.1 riastrad u32 current_index = 0; 1056 1.1 riastrad 1057 1.1 riastrad if (current_ps) { 1058 1.1 riastrad current_vddc = current_ps->levels[current_index].vddc_index; 1059 1.1 riastrad current_sclk = current_ps->levels[current_index].sclk; 1060 1.1 riastrad } else { 1061 1.1 riastrad current_vddc = pi->boot_pl.vddc_index; 1062 1.1 riastrad current_sclk = pi->boot_pl.sclk; 1063 1.1 riastrad } 1064 1.1 riastrad 1065 1.1 riastrad ps->levels[0].vddc_index = current_vddc; 1066 1.1 riastrad 1067 1.1 riastrad if (ps->levels[0].sclk > current_sclk) 1068 1.1 riastrad ps->levels[0].sclk = current_sclk; 1069 1.1 riastrad 1070 1.1 riastrad ps->levels[0].ss_divider_index = 1071 1.1 riastrad sumo_get_sleep_divider_id_from_clock(rdev, ps->levels[0].sclk, sclk_in_sr); 1072 1.1 riastrad 1073 1.1 riastrad ps->levels[0].ds_divider_index = 1074 1.1 riastrad sumo_get_sleep_divider_id_from_clock(rdev, ps->levels[0].sclk, SUMO_MINIMUM_ENGINE_CLOCK); 1075 1.1 riastrad 1076 1.1 riastrad if (ps->levels[0].ds_divider_index > ps->levels[0].ss_divider_index + 1) 1077 1.1 riastrad ps->levels[0].ds_divider_index = ps->levels[0].ss_divider_index + 1; 1078 1.1 riastrad 1079 1.1 riastrad if (ps->levels[0].ss_divider_index == ps->levels[0].ds_divider_index) { 1080 1.1 riastrad if (ps->levels[0].ss_divider_index > 1) 1081 1.1 riastrad ps->levels[0].ss_divider_index = ps->levels[0].ss_divider_index - 1; 1082 1.1 riastrad } 1083 1.1 riastrad 1084 1.1 riastrad if (ps->levels[0].ss_divider_index == 0) 1085 1.1 riastrad ps->levels[0].ds_divider_index = 0; 1086 1.1 riastrad 1087 1.1 riastrad if (ps->levels[0].ds_divider_index == 0) 1088 1.1 riastrad ps->levels[0].ss_divider_index = 0; 1089 1.1 riastrad } 1090 1.1 riastrad 1091 1.1 riastrad static void sumo_apply_state_adjust_rules(struct radeon_device *rdev, 1092 1.1 riastrad struct radeon_ps *new_rps, 1093 1.1 riastrad struct radeon_ps *old_rps) 1094 1.1 riastrad { 1095 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(new_rps); 1096 1.1 riastrad struct sumo_ps *current_ps = sumo_get_ps(old_rps); 1097 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1098 1.1 riastrad u32 min_voltage = 0; /* ??? */ 1099 1.1 riastrad u32 min_sclk = pi->sys_info.min_sclk; /* XXX check against disp reqs */ 1100 1.1 riastrad u32 sclk_in_sr = pi->sys_info.min_sclk; /* ??? */ 1101 1.1 riastrad u32 i; 1102 1.1 riastrad 1103 1.1 riastrad if (new_rps->class & ATOM_PPLIB_CLASSIFICATION_THERMAL) 1104 1.1 riastrad return sumo_patch_thermal_state(rdev, ps, current_ps); 1105 1.1 riastrad 1106 1.1 riastrad if (pi->enable_boost) { 1107 1.1 riastrad if (new_rps->class & ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) 1108 1.1 riastrad ps->flags |= SUMO_POWERSTATE_FLAGS_BOOST_STATE; 1109 1.1 riastrad } 1110 1.1 riastrad 1111 1.1 riastrad if ((new_rps->class & ATOM_PPLIB_CLASSIFICATION_UI_BATTERY) || 1112 1.1 riastrad (new_rps->class & ATOM_PPLIB_CLASSIFICATION_SDSTATE) || 1113 1.1 riastrad (new_rps->class & ATOM_PPLIB_CLASSIFICATION_HDSTATE)) 1114 1.1 riastrad ps->flags |= SUMO_POWERSTATE_FLAGS_FORCE_NBPS1_STATE; 1115 1.1 riastrad 1116 1.1 riastrad for (i = 0; i < ps->num_levels; i++) { 1117 1.1 riastrad if (ps->levels[i].vddc_index < min_voltage) 1118 1.1 riastrad ps->levels[i].vddc_index = min_voltage; 1119 1.1 riastrad 1120 1.1 riastrad if (ps->levels[i].sclk < min_sclk) 1121 1.1 riastrad ps->levels[i].sclk = 1122 1.1 riastrad sumo_get_valid_engine_clock(rdev, min_sclk); 1123 1.1 riastrad 1124 1.1 riastrad ps->levels[i].ss_divider_index = 1125 1.1 riastrad sumo_get_sleep_divider_id_from_clock(rdev, ps->levels[i].sclk, sclk_in_sr); 1126 1.1 riastrad 1127 1.1 riastrad ps->levels[i].ds_divider_index = 1128 1.1 riastrad sumo_get_sleep_divider_id_from_clock(rdev, ps->levels[i].sclk, SUMO_MINIMUM_ENGINE_CLOCK); 1129 1.1 riastrad 1130 1.1 riastrad if (ps->levels[i].ds_divider_index > ps->levels[i].ss_divider_index + 1) 1131 1.1 riastrad ps->levels[i].ds_divider_index = ps->levels[i].ss_divider_index + 1; 1132 1.1 riastrad 1133 1.1 riastrad if (ps->levels[i].ss_divider_index == ps->levels[i].ds_divider_index) { 1134 1.1 riastrad if (ps->levels[i].ss_divider_index > 1) 1135 1.1 riastrad ps->levels[i].ss_divider_index = ps->levels[i].ss_divider_index - 1; 1136 1.1 riastrad } 1137 1.1 riastrad 1138 1.1 riastrad if (ps->levels[i].ss_divider_index == 0) 1139 1.1 riastrad ps->levels[i].ds_divider_index = 0; 1140 1.1 riastrad 1141 1.1 riastrad if (ps->levels[i].ds_divider_index == 0) 1142 1.1 riastrad ps->levels[i].ss_divider_index = 0; 1143 1.1 riastrad 1144 1.1 riastrad if (ps->flags & SUMO_POWERSTATE_FLAGS_FORCE_NBPS1_STATE) 1145 1.1 riastrad ps->levels[i].allow_gnb_slow = 1; 1146 1.1 riastrad else if ((new_rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE) || 1147 1.1 riastrad (new_rps->class2 & ATOM_PPLIB_CLASSIFICATION2_MVC)) 1148 1.1 riastrad ps->levels[i].allow_gnb_slow = 0; 1149 1.1 riastrad else if (i == ps->num_levels - 1) 1150 1.1 riastrad ps->levels[i].allow_gnb_slow = 0; 1151 1.1 riastrad else 1152 1.1 riastrad ps->levels[i].allow_gnb_slow = 1; 1153 1.1 riastrad } 1154 1.1 riastrad } 1155 1.1 riastrad 1156 1.1 riastrad static void sumo_cleanup_asic(struct radeon_device *rdev) 1157 1.1 riastrad { 1158 1.1 riastrad sumo_take_smu_control(rdev, false); 1159 1.1 riastrad } 1160 1.1 riastrad 1161 1.1 riastrad static int sumo_set_thermal_temperature_range(struct radeon_device *rdev, 1162 1.1 riastrad int min_temp, int max_temp) 1163 1.1 riastrad { 1164 1.1 riastrad int low_temp = 0 * 1000; 1165 1.1 riastrad int high_temp = 255 * 1000; 1166 1.1 riastrad 1167 1.1 riastrad if (low_temp < min_temp) 1168 1.1 riastrad low_temp = min_temp; 1169 1.1 riastrad if (high_temp > max_temp) 1170 1.1 riastrad high_temp = max_temp; 1171 1.1 riastrad if (high_temp < low_temp) { 1172 1.1 riastrad DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp); 1173 1.1 riastrad return -EINVAL; 1174 1.1 riastrad } 1175 1.1 riastrad 1176 1.1 riastrad WREG32_P(CG_THERMAL_INT, DIG_THERM_INTH(49 + (high_temp / 1000)), ~DIG_THERM_INTH_MASK); 1177 1.1 riastrad WREG32_P(CG_THERMAL_INT, DIG_THERM_INTL(49 + (low_temp / 1000)), ~DIG_THERM_INTL_MASK); 1178 1.1 riastrad 1179 1.1 riastrad rdev->pm.dpm.thermal.min_temp = low_temp; 1180 1.1 riastrad rdev->pm.dpm.thermal.max_temp = high_temp; 1181 1.1 riastrad 1182 1.1 riastrad return 0; 1183 1.1 riastrad } 1184 1.1 riastrad 1185 1.1 riastrad static void sumo_update_current_ps(struct radeon_device *rdev, 1186 1.1 riastrad struct radeon_ps *rps) 1187 1.1 riastrad { 1188 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(rps); 1189 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1190 1.1 riastrad 1191 1.1 riastrad pi->current_rps = *rps; 1192 1.1 riastrad pi->current_ps = *new_ps; 1193 1.1 riastrad pi->current_rps.ps_priv = &pi->current_ps; 1194 1.1 riastrad } 1195 1.1 riastrad 1196 1.1 riastrad static void sumo_update_requested_ps(struct radeon_device *rdev, 1197 1.1 riastrad struct radeon_ps *rps) 1198 1.1 riastrad { 1199 1.1 riastrad struct sumo_ps *new_ps = sumo_get_ps(rps); 1200 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1201 1.1 riastrad 1202 1.1 riastrad pi->requested_rps = *rps; 1203 1.1 riastrad pi->requested_ps = *new_ps; 1204 1.1 riastrad pi->requested_rps.ps_priv = &pi->requested_ps; 1205 1.1 riastrad } 1206 1.1 riastrad 1207 1.1 riastrad int sumo_dpm_enable(struct radeon_device *rdev) 1208 1.1 riastrad { 1209 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1210 1.1 riastrad 1211 1.1 riastrad if (sumo_dpm_enabled(rdev)) 1212 1.1 riastrad return -EINVAL; 1213 1.1 riastrad 1214 1.1 riastrad sumo_program_bootup_state(rdev); 1215 1.1 riastrad sumo_init_bsp(rdev); 1216 1.1 riastrad sumo_reset_am(rdev); 1217 1.1 riastrad sumo_program_tp(rdev); 1218 1.1 riastrad sumo_program_bootup_at(rdev); 1219 1.1 riastrad sumo_start_am(rdev); 1220 1.1 riastrad if (pi->enable_auto_thermal_throttling) { 1221 1.1 riastrad sumo_program_ttp(rdev); 1222 1.1 riastrad sumo_program_ttt(rdev); 1223 1.1 riastrad } 1224 1.1 riastrad sumo_program_dc_hto(rdev); 1225 1.1 riastrad sumo_program_power_level_enter_state(rdev); 1226 1.1 riastrad sumo_enable_voltage_scaling(rdev, true); 1227 1.1 riastrad sumo_program_sstp(rdev); 1228 1.1 riastrad sumo_program_vc(rdev, SUMO_VRC_DFLT); 1229 1.1 riastrad sumo_override_cnb_thermal_events(rdev); 1230 1.1 riastrad sumo_start_dpm(rdev); 1231 1.1 riastrad sumo_wait_for_level_0(rdev); 1232 1.1 riastrad if (pi->enable_sclk_ds) 1233 1.1 riastrad sumo_enable_sclk_ds(rdev, true); 1234 1.1 riastrad if (pi->enable_boost) 1235 1.1 riastrad sumo_enable_boost_timer(rdev); 1236 1.1 riastrad 1237 1.1 riastrad sumo_update_current_ps(rdev, rdev->pm.dpm.boot_ps); 1238 1.1 riastrad 1239 1.1 riastrad return 0; 1240 1.1 riastrad } 1241 1.1 riastrad 1242 1.1 riastrad int sumo_dpm_late_enable(struct radeon_device *rdev) 1243 1.1 riastrad { 1244 1.1 riastrad int ret; 1245 1.1 riastrad 1246 1.1 riastrad ret = sumo_enable_clock_power_gating(rdev); 1247 1.1 riastrad if (ret) 1248 1.1 riastrad return ret; 1249 1.1 riastrad 1250 1.1 riastrad if (rdev->irq.installed && 1251 1.1 riastrad r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1252 1.1 riastrad ret = sumo_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 1253 1.1 riastrad if (ret) 1254 1.1 riastrad return ret; 1255 1.1 riastrad rdev->irq.dpm_thermal = true; 1256 1.1 riastrad radeon_irq_set(rdev); 1257 1.1 riastrad } 1258 1.1 riastrad 1259 1.1 riastrad return 0; 1260 1.1 riastrad } 1261 1.1 riastrad 1262 1.1 riastrad void sumo_dpm_disable(struct radeon_device *rdev) 1263 1.1 riastrad { 1264 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1265 1.1 riastrad 1266 1.1 riastrad if (!sumo_dpm_enabled(rdev)) 1267 1.1 riastrad return; 1268 1.1 riastrad sumo_disable_clock_power_gating(rdev); 1269 1.1 riastrad if (pi->enable_sclk_ds) 1270 1.1 riastrad sumo_enable_sclk_ds(rdev, false); 1271 1.1 riastrad sumo_clear_vc(rdev); 1272 1.1 riastrad sumo_wait_for_level_0(rdev); 1273 1.1 riastrad sumo_stop_dpm(rdev); 1274 1.1 riastrad sumo_enable_voltage_scaling(rdev, false); 1275 1.1 riastrad 1276 1.1 riastrad if (rdev->irq.installed && 1277 1.1 riastrad r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { 1278 1.1 riastrad rdev->irq.dpm_thermal = false; 1279 1.1 riastrad radeon_irq_set(rdev); 1280 1.1 riastrad } 1281 1.1 riastrad 1282 1.1 riastrad sumo_update_current_ps(rdev, rdev->pm.dpm.boot_ps); 1283 1.1 riastrad } 1284 1.1 riastrad 1285 1.1 riastrad int sumo_dpm_pre_set_power_state(struct radeon_device *rdev) 1286 1.1 riastrad { 1287 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1288 1.1 riastrad struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps; 1289 1.1 riastrad struct radeon_ps *new_ps = &requested_ps; 1290 1.1 riastrad 1291 1.1 riastrad sumo_update_requested_ps(rdev, new_ps); 1292 1.1 riastrad 1293 1.1 riastrad if (pi->enable_dynamic_patch_ps) 1294 1.1 riastrad sumo_apply_state_adjust_rules(rdev, 1295 1.1 riastrad &pi->requested_rps, 1296 1.1 riastrad &pi->current_rps); 1297 1.1 riastrad 1298 1.1 riastrad return 0; 1299 1.1 riastrad } 1300 1.1 riastrad 1301 1.1 riastrad int sumo_dpm_set_power_state(struct radeon_device *rdev) 1302 1.1 riastrad { 1303 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1304 1.1 riastrad struct radeon_ps *new_ps = &pi->requested_rps; 1305 1.1 riastrad struct radeon_ps *old_ps = &pi->current_rps; 1306 1.1 riastrad 1307 1.1 riastrad if (pi->enable_dpm) 1308 1.1 riastrad sumo_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps); 1309 1.1 riastrad if (pi->enable_boost) { 1310 1.1 riastrad sumo_enable_boost(rdev, new_ps, false); 1311 1.1 riastrad sumo_patch_boost_state(rdev, new_ps); 1312 1.1 riastrad } 1313 1.1 riastrad if (pi->enable_dpm) { 1314 1.1 riastrad sumo_pre_notify_alt_vddnb_change(rdev, new_ps, old_ps); 1315 1.1 riastrad sumo_enable_power_level_0(rdev); 1316 1.1 riastrad sumo_set_forced_level_0(rdev); 1317 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1318 1.1 riastrad sumo_wait_for_level_0(rdev); 1319 1.1 riastrad sumo_program_power_levels_0_to_n(rdev, new_ps, old_ps); 1320 1.1 riastrad sumo_program_wl(rdev, new_ps); 1321 1.1 riastrad sumo_program_bsp(rdev, new_ps); 1322 1.1 riastrad sumo_program_at(rdev, new_ps); 1323 1.1 riastrad sumo_force_nbp_state(rdev, new_ps); 1324 1.1 riastrad sumo_set_forced_mode_disabled(rdev); 1325 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1326 1.1 riastrad sumo_set_forced_mode_disabled(rdev); 1327 1.1 riastrad sumo_post_notify_alt_vddnb_change(rdev, new_ps, old_ps); 1328 1.1 riastrad } 1329 1.1 riastrad if (pi->enable_boost) 1330 1.1 riastrad sumo_enable_boost(rdev, new_ps, true); 1331 1.1 riastrad if (pi->enable_dpm) 1332 1.1 riastrad sumo_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps); 1333 1.1 riastrad 1334 1.1 riastrad return 0; 1335 1.1 riastrad } 1336 1.1 riastrad 1337 1.1 riastrad void sumo_dpm_post_set_power_state(struct radeon_device *rdev) 1338 1.1 riastrad { 1339 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1340 1.1 riastrad struct radeon_ps *new_ps = &pi->requested_rps; 1341 1.1 riastrad 1342 1.1 riastrad sumo_update_current_ps(rdev, new_ps); 1343 1.1 riastrad } 1344 1.1 riastrad 1345 1.1 riastrad #if 0 1346 1.1 riastrad void sumo_dpm_reset_asic(struct radeon_device *rdev) 1347 1.1 riastrad { 1348 1.1 riastrad sumo_program_bootup_state(rdev); 1349 1.1 riastrad sumo_enable_power_level_0(rdev); 1350 1.1 riastrad sumo_set_forced_level_0(rdev); 1351 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1352 1.1 riastrad sumo_wait_for_level_0(rdev); 1353 1.1 riastrad sumo_set_forced_mode_disabled(rdev); 1354 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1355 1.1 riastrad sumo_set_forced_mode_disabled(rdev); 1356 1.1 riastrad } 1357 1.1 riastrad #endif 1358 1.1 riastrad 1359 1.1 riastrad void sumo_dpm_setup_asic(struct radeon_device *rdev) 1360 1.1 riastrad { 1361 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1362 1.1 riastrad 1363 1.1 riastrad sumo_initialize_m3_arb(rdev); 1364 1.1 riastrad pi->fw_version = sumo_get_running_fw_version(rdev); 1365 1.1 riastrad DRM_INFO("Found smc ucode version: 0x%08x\n", pi->fw_version); 1366 1.1 riastrad sumo_program_acpi_power_level(rdev); 1367 1.1 riastrad sumo_enable_acpi_pm(rdev); 1368 1.1 riastrad sumo_take_smu_control(rdev, true); 1369 1.1 riastrad } 1370 1.1 riastrad 1371 1.1 riastrad void sumo_dpm_display_configuration_changed(struct radeon_device *rdev) 1372 1.1 riastrad { 1373 1.1 riastrad 1374 1.1 riastrad } 1375 1.1 riastrad 1376 1.1 riastrad union power_info { 1377 1.1 riastrad struct _ATOM_POWERPLAY_INFO info; 1378 1.1 riastrad struct _ATOM_POWERPLAY_INFO_V2 info_2; 1379 1.1 riastrad struct _ATOM_POWERPLAY_INFO_V3 info_3; 1380 1.1 riastrad struct _ATOM_PPLIB_POWERPLAYTABLE pplib; 1381 1.1 riastrad struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2; 1382 1.1 riastrad struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3; 1383 1.1 riastrad }; 1384 1.1 riastrad 1385 1.1 riastrad union pplib_clock_info { 1386 1.1 riastrad struct _ATOM_PPLIB_R600_CLOCK_INFO r600; 1387 1.1 riastrad struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780; 1388 1.1 riastrad struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen; 1389 1.1 riastrad struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo; 1390 1.1 riastrad }; 1391 1.1 riastrad 1392 1.1 riastrad union pplib_power_state { 1393 1.1 riastrad struct _ATOM_PPLIB_STATE v1; 1394 1.1 riastrad struct _ATOM_PPLIB_STATE_V2 v2; 1395 1.1 riastrad }; 1396 1.1 riastrad 1397 1.1 riastrad static void sumo_patch_boot_state(struct radeon_device *rdev, 1398 1.1 riastrad struct sumo_ps *ps) 1399 1.1 riastrad { 1400 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1401 1.1 riastrad 1402 1.1 riastrad ps->num_levels = 1; 1403 1.1 riastrad ps->flags = 0; 1404 1.1 riastrad ps->levels[0] = pi->boot_pl; 1405 1.1 riastrad } 1406 1.1 riastrad 1407 1.1 riastrad static void sumo_parse_pplib_non_clock_info(struct radeon_device *rdev, 1408 1.1 riastrad struct radeon_ps *rps, 1409 1.1 riastrad struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info, 1410 1.1 riastrad u8 table_rev) 1411 1.1 riastrad { 1412 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 1413 1.1 riastrad 1414 1.1 riastrad rps->caps = le32_to_cpu(non_clock_info->ulCapsAndSettings); 1415 1.1 riastrad rps->class = le16_to_cpu(non_clock_info->usClassification); 1416 1.1 riastrad rps->class2 = le16_to_cpu(non_clock_info->usClassification2); 1417 1.1 riastrad 1418 1.1 riastrad if (ATOM_PPLIB_NONCLOCKINFO_VER1 < table_rev) { 1419 1.1 riastrad rps->vclk = le32_to_cpu(non_clock_info->ulVCLK); 1420 1.1 riastrad rps->dclk = le32_to_cpu(non_clock_info->ulDCLK); 1421 1.1 riastrad } else { 1422 1.1 riastrad rps->vclk = 0; 1423 1.1 riastrad rps->dclk = 0; 1424 1.1 riastrad } 1425 1.1 riastrad 1426 1.1 riastrad if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) { 1427 1.1 riastrad rdev->pm.dpm.boot_ps = rps; 1428 1.1 riastrad sumo_patch_boot_state(rdev, ps); 1429 1.1 riastrad } 1430 1.1 riastrad if (rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE) 1431 1.1 riastrad rdev->pm.dpm.uvd_ps = rps; 1432 1.1 riastrad } 1433 1.1 riastrad 1434 1.1 riastrad static void sumo_parse_pplib_clock_info(struct radeon_device *rdev, 1435 1.1 riastrad struct radeon_ps *rps, int index, 1436 1.1 riastrad union pplib_clock_info *clock_info) 1437 1.1 riastrad { 1438 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1439 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 1440 1.1 riastrad struct sumo_pl *pl = &ps->levels[index]; 1441 1.1 riastrad u32 sclk; 1442 1.1 riastrad 1443 1.1 riastrad sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow); 1444 1.1 riastrad sclk |= clock_info->sumo.ucEngineClockHigh << 16; 1445 1.1 riastrad pl->sclk = sclk; 1446 1.1 riastrad pl->vddc_index = clock_info->sumo.vddcIndex; 1447 1.1 riastrad pl->sclk_dpm_tdp_limit = clock_info->sumo.tdpLimit; 1448 1.1 riastrad 1449 1.1 riastrad ps->num_levels = index + 1; 1450 1.1 riastrad 1451 1.1 riastrad if (pi->enable_sclk_ds) { 1452 1.1 riastrad pl->ds_divider_index = 5; 1453 1.1 riastrad pl->ss_divider_index = 4; 1454 1.1 riastrad } 1455 1.1 riastrad } 1456 1.1 riastrad 1457 1.1 riastrad static int sumo_parse_power_table(struct radeon_device *rdev) 1458 1.1 riastrad { 1459 1.1 riastrad struct radeon_mode_info *mode_info = &rdev->mode_info; 1460 1.1 riastrad struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info; 1461 1.1 riastrad union pplib_power_state *power_state; 1462 1.1 riastrad int i, j, k, non_clock_array_index, clock_array_index; 1463 1.1 riastrad union pplib_clock_info *clock_info; 1464 1.1 riastrad struct _StateArray *state_array; 1465 1.1 riastrad struct _ClockInfoArray *clock_info_array; 1466 1.1 riastrad struct _NonClockInfoArray *non_clock_info_array; 1467 1.1 riastrad union power_info *power_info; 1468 1.1 riastrad int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 1469 1.3 riastrad u16 data_offset; 1470 1.1 riastrad u8 frev, crev; 1471 1.1 riastrad u8 *power_state_offset; 1472 1.1 riastrad struct sumo_ps *ps; 1473 1.1 riastrad 1474 1.1 riastrad if (!atom_parse_data_header(mode_info->atom_context, index, NULL, 1475 1.1 riastrad &frev, &crev, &data_offset)) 1476 1.1 riastrad return -EINVAL; 1477 1.1 riastrad power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); 1478 1.1 riastrad 1479 1.1 riastrad state_array = (struct _StateArray *) 1480 1.1 riastrad (mode_info->atom_context->bios + data_offset + 1481 1.1 riastrad le16_to_cpu(power_info->pplib.usStateArrayOffset)); 1482 1.1 riastrad clock_info_array = (struct _ClockInfoArray *) 1483 1.1 riastrad (mode_info->atom_context->bios + data_offset + 1484 1.1 riastrad le16_to_cpu(power_info->pplib.usClockInfoArrayOffset)); 1485 1.1 riastrad non_clock_info_array = (struct _NonClockInfoArray *) 1486 1.1 riastrad (mode_info->atom_context->bios + data_offset + 1487 1.1 riastrad le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset)); 1488 1.1 riastrad 1489 1.3 riastrad rdev->pm.dpm.ps = kcalloc(state_array->ucNumEntries, 1490 1.3 riastrad sizeof(struct radeon_ps), 1491 1.3 riastrad GFP_KERNEL); 1492 1.1 riastrad if (!rdev->pm.dpm.ps) 1493 1.1 riastrad return -ENOMEM; 1494 1.1 riastrad power_state_offset = (u8 *)state_array->states; 1495 1.1 riastrad for (i = 0; i < state_array->ucNumEntries; i++) { 1496 1.1 riastrad u8 *idx; 1497 1.1 riastrad power_state = (union pplib_power_state *)power_state_offset; 1498 1.1 riastrad non_clock_array_index = power_state->v2.nonClockInfoIndex; 1499 1.1 riastrad non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 1500 1.1 riastrad &non_clock_info_array->nonClockInfo[non_clock_array_index]; 1501 1.1 riastrad if (!rdev->pm.power_state[i].clock_info) 1502 1.1 riastrad return -EINVAL; 1503 1.1 riastrad ps = kzalloc(sizeof(struct sumo_ps), GFP_KERNEL); 1504 1.1 riastrad if (ps == NULL) { 1505 1.1 riastrad kfree(rdev->pm.dpm.ps); 1506 1.1 riastrad return -ENOMEM; 1507 1.1 riastrad } 1508 1.1 riastrad rdev->pm.dpm.ps[i].ps_priv = ps; 1509 1.1 riastrad k = 0; 1510 1.1 riastrad idx = (u8 *)&power_state->v2.clockInfoIndex[0]; 1511 1.1 riastrad for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) { 1512 1.1 riastrad clock_array_index = idx[j]; 1513 1.1 riastrad if (k >= SUMO_MAX_HARDWARE_POWERLEVELS) 1514 1.1 riastrad break; 1515 1.1 riastrad 1516 1.1 riastrad clock_info = (union pplib_clock_info *) 1517 1.1 riastrad ((u8 *)&clock_info_array->clockInfo[0] + 1518 1.1 riastrad (clock_array_index * clock_info_array->ucEntrySize)); 1519 1.1 riastrad sumo_parse_pplib_clock_info(rdev, 1520 1.1 riastrad &rdev->pm.dpm.ps[i], k, 1521 1.1 riastrad clock_info); 1522 1.1 riastrad k++; 1523 1.1 riastrad } 1524 1.1 riastrad sumo_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], 1525 1.1 riastrad non_clock_info, 1526 1.1 riastrad non_clock_info_array->ucEntrySize); 1527 1.1 riastrad power_state_offset += 2 + power_state->v2.ucNumDPMLevels; 1528 1.1 riastrad } 1529 1.1 riastrad rdev->pm.dpm.num_ps = state_array->ucNumEntries; 1530 1.1 riastrad return 0; 1531 1.1 riastrad } 1532 1.1 riastrad 1533 1.1 riastrad u32 sumo_convert_vid2_to_vid7(struct radeon_device *rdev, 1534 1.1 riastrad struct sumo_vid_mapping_table *vid_mapping_table, 1535 1.1 riastrad u32 vid_2bit) 1536 1.1 riastrad { 1537 1.1 riastrad u32 i; 1538 1.1 riastrad 1539 1.1 riastrad for (i = 0; i < vid_mapping_table->num_entries; i++) { 1540 1.1 riastrad if (vid_mapping_table->entries[i].vid_2bit == vid_2bit) 1541 1.1 riastrad return vid_mapping_table->entries[i].vid_7bit; 1542 1.1 riastrad } 1543 1.1 riastrad 1544 1.1 riastrad return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_7bit; 1545 1.1 riastrad } 1546 1.1 riastrad 1547 1.1 riastrad #if 0 1548 1.1 riastrad u32 sumo_convert_vid7_to_vid2(struct radeon_device *rdev, 1549 1.1 riastrad struct sumo_vid_mapping_table *vid_mapping_table, 1550 1.1 riastrad u32 vid_7bit) 1551 1.1 riastrad { 1552 1.1 riastrad u32 i; 1553 1.1 riastrad 1554 1.1 riastrad for (i = 0; i < vid_mapping_table->num_entries; i++) { 1555 1.1 riastrad if (vid_mapping_table->entries[i].vid_7bit == vid_7bit) 1556 1.1 riastrad return vid_mapping_table->entries[i].vid_2bit; 1557 1.1 riastrad } 1558 1.1 riastrad 1559 1.1 riastrad return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_2bit; 1560 1.1 riastrad } 1561 1.1 riastrad #endif 1562 1.1 riastrad 1563 1.1 riastrad static u16 sumo_convert_voltage_index_to_value(struct radeon_device *rdev, 1564 1.1 riastrad u32 vid_2bit) 1565 1.1 riastrad { 1566 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1567 1.1 riastrad u32 vid_7bit = sumo_convert_vid2_to_vid7(rdev, &pi->sys_info.vid_mapping_table, vid_2bit); 1568 1.1 riastrad 1569 1.1 riastrad if (vid_7bit > 0x7C) 1570 1.1 riastrad return 0; 1571 1.1 riastrad 1572 1.1 riastrad return (15500 - vid_7bit * 125 + 5) / 10; 1573 1.1 riastrad } 1574 1.1 riastrad 1575 1.1 riastrad static void sumo_construct_display_voltage_mapping_table(struct radeon_device *rdev, 1576 1.1 riastrad struct sumo_disp_clock_voltage_mapping_table *disp_clk_voltage_mapping_table, 1577 1.1 riastrad ATOM_CLK_VOLT_CAPABILITY *table) 1578 1.1 riastrad { 1579 1.1 riastrad u32 i; 1580 1.1 riastrad 1581 1.1 riastrad for (i = 0; i < SUMO_MAX_NUMBER_VOLTAGES; i++) { 1582 1.1 riastrad if (table[i].ulMaximumSupportedCLK == 0) 1583 1.1 riastrad break; 1584 1.1 riastrad 1585 1.1 riastrad disp_clk_voltage_mapping_table->display_clock_frequency[i] = 1586 1.1 riastrad table[i].ulMaximumSupportedCLK; 1587 1.1 riastrad } 1588 1.1 riastrad 1589 1.1 riastrad disp_clk_voltage_mapping_table->num_max_voltage_levels = i; 1590 1.1 riastrad 1591 1.1 riastrad if (disp_clk_voltage_mapping_table->num_max_voltage_levels == 0) { 1592 1.1 riastrad disp_clk_voltage_mapping_table->display_clock_frequency[0] = 80000; 1593 1.1 riastrad disp_clk_voltage_mapping_table->num_max_voltage_levels = 1; 1594 1.1 riastrad } 1595 1.1 riastrad } 1596 1.1 riastrad 1597 1.1 riastrad void sumo_construct_sclk_voltage_mapping_table(struct radeon_device *rdev, 1598 1.1 riastrad struct sumo_sclk_voltage_mapping_table *sclk_voltage_mapping_table, 1599 1.1 riastrad ATOM_AVAILABLE_SCLK_LIST *table) 1600 1.1 riastrad { 1601 1.1 riastrad u32 i; 1602 1.1 riastrad u32 n = 0; 1603 1.1 riastrad u32 prev_sclk = 0; 1604 1.1 riastrad 1605 1.1 riastrad for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) { 1606 1.1 riastrad if (table[i].ulSupportedSCLK > prev_sclk) { 1607 1.1 riastrad sclk_voltage_mapping_table->entries[n].sclk_frequency = 1608 1.1 riastrad table[i].ulSupportedSCLK; 1609 1.1 riastrad sclk_voltage_mapping_table->entries[n].vid_2bit = 1610 1.1 riastrad table[i].usVoltageIndex; 1611 1.1 riastrad prev_sclk = table[i].ulSupportedSCLK; 1612 1.1 riastrad n++; 1613 1.1 riastrad } 1614 1.1 riastrad } 1615 1.1 riastrad 1616 1.1 riastrad sclk_voltage_mapping_table->num_max_dpm_entries = n; 1617 1.1 riastrad } 1618 1.1 riastrad 1619 1.1 riastrad void sumo_construct_vid_mapping_table(struct radeon_device *rdev, 1620 1.1 riastrad struct sumo_vid_mapping_table *vid_mapping_table, 1621 1.1 riastrad ATOM_AVAILABLE_SCLK_LIST *table) 1622 1.1 riastrad { 1623 1.1 riastrad u32 i, j; 1624 1.1 riastrad 1625 1.1 riastrad for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) { 1626 1.1 riastrad if (table[i].ulSupportedSCLK != 0) { 1627 1.1 riastrad vid_mapping_table->entries[table[i].usVoltageIndex].vid_7bit = 1628 1.1 riastrad table[i].usVoltageID; 1629 1.1 riastrad vid_mapping_table->entries[table[i].usVoltageIndex].vid_2bit = 1630 1.1 riastrad table[i].usVoltageIndex; 1631 1.1 riastrad } 1632 1.1 riastrad } 1633 1.1 riastrad 1634 1.1 riastrad for (i = 0; i < SUMO_MAX_NUMBER_VOLTAGES; i++) { 1635 1.1 riastrad if (vid_mapping_table->entries[i].vid_7bit == 0) { 1636 1.1 riastrad for (j = i + 1; j < SUMO_MAX_NUMBER_VOLTAGES; j++) { 1637 1.1 riastrad if (vid_mapping_table->entries[j].vid_7bit != 0) { 1638 1.1 riastrad vid_mapping_table->entries[i] = 1639 1.1 riastrad vid_mapping_table->entries[j]; 1640 1.1 riastrad vid_mapping_table->entries[j].vid_7bit = 0; 1641 1.1 riastrad break; 1642 1.1 riastrad } 1643 1.1 riastrad } 1644 1.1 riastrad 1645 1.1 riastrad if (j == SUMO_MAX_NUMBER_VOLTAGES) 1646 1.1 riastrad break; 1647 1.1 riastrad } 1648 1.1 riastrad } 1649 1.1 riastrad 1650 1.1 riastrad vid_mapping_table->num_entries = i; 1651 1.1 riastrad } 1652 1.1 riastrad 1653 1.1 riastrad union igp_info { 1654 1.1 riastrad struct _ATOM_INTEGRATED_SYSTEM_INFO info; 1655 1.1 riastrad struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2; 1656 1.1 riastrad struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 info_5; 1657 1.1 riastrad struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6; 1658 1.1 riastrad }; 1659 1.1 riastrad 1660 1.1 riastrad static int sumo_parse_sys_info_table(struct radeon_device *rdev) 1661 1.1 riastrad { 1662 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1663 1.1 riastrad struct radeon_mode_info *mode_info = &rdev->mode_info; 1664 1.1 riastrad int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); 1665 1.1 riastrad union igp_info *igp_info; 1666 1.1 riastrad u8 frev, crev; 1667 1.1 riastrad u16 data_offset; 1668 1.1 riastrad int i; 1669 1.1 riastrad 1670 1.1 riastrad if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1671 1.1 riastrad &frev, &crev, &data_offset)) { 1672 1.1 riastrad igp_info = (union igp_info *)(mode_info->atom_context->bios + 1673 1.1 riastrad data_offset); 1674 1.1 riastrad 1675 1.1 riastrad if (crev != 6) { 1676 1.1 riastrad DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev); 1677 1.1 riastrad return -EINVAL; 1678 1.1 riastrad } 1679 1.1 riastrad pi->sys_info.bootup_sclk = le32_to_cpu(igp_info->info_6.ulBootUpEngineClock); 1680 1.1 riastrad pi->sys_info.min_sclk = le32_to_cpu(igp_info->info_6.ulMinEngineClock); 1681 1.1 riastrad pi->sys_info.bootup_uma_clk = le32_to_cpu(igp_info->info_6.ulBootUpUMAClock); 1682 1.1 riastrad pi->sys_info.bootup_nb_voltage_index = 1683 1.1 riastrad le16_to_cpu(igp_info->info_6.usBootUpNBVoltage); 1684 1.1 riastrad if (igp_info->info_6.ucHtcTmpLmt == 0) 1685 1.1 riastrad pi->sys_info.htc_tmp_lmt = 203; 1686 1.1 riastrad else 1687 1.1 riastrad pi->sys_info.htc_tmp_lmt = igp_info->info_6.ucHtcTmpLmt; 1688 1.1 riastrad if (igp_info->info_6.ucHtcHystLmt == 0) 1689 1.1 riastrad pi->sys_info.htc_hyst_lmt = 5; 1690 1.1 riastrad else 1691 1.1 riastrad pi->sys_info.htc_hyst_lmt = igp_info->info_6.ucHtcHystLmt; 1692 1.1 riastrad if (pi->sys_info.htc_tmp_lmt <= pi->sys_info.htc_hyst_lmt) { 1693 1.1 riastrad DRM_ERROR("The htcTmpLmt should be larger than htcHystLmt.\n"); 1694 1.1 riastrad } 1695 1.1 riastrad for (i = 0; i < NUMBER_OF_M3ARB_PARAM_SETS; i++) { 1696 1.1 riastrad pi->sys_info.csr_m3_arb_cntl_default[i] = 1697 1.1 riastrad le32_to_cpu(igp_info->info_6.ulCSR_M3_ARB_CNTL_DEFAULT[i]); 1698 1.1 riastrad pi->sys_info.csr_m3_arb_cntl_uvd[i] = 1699 1.1 riastrad le32_to_cpu(igp_info->info_6.ulCSR_M3_ARB_CNTL_UVD[i]); 1700 1.1 riastrad pi->sys_info.csr_m3_arb_cntl_fs3d[i] = 1701 1.1 riastrad le32_to_cpu(igp_info->info_6.ulCSR_M3_ARB_CNTL_FS3D[i]); 1702 1.1 riastrad } 1703 1.1 riastrad pi->sys_info.sclk_dpm_boost_margin = 1704 1.1 riastrad le32_to_cpu(igp_info->info_6.SclkDpmBoostMargin); 1705 1.1 riastrad pi->sys_info.sclk_dpm_throttle_margin = 1706 1.1 riastrad le32_to_cpu(igp_info->info_6.SclkDpmThrottleMargin); 1707 1.1 riastrad pi->sys_info.sclk_dpm_tdp_limit_pg = 1708 1.1 riastrad le16_to_cpu(igp_info->info_6.SclkDpmTdpLimitPG); 1709 1.1 riastrad pi->sys_info.gnb_tdp_limit = le16_to_cpu(igp_info->info_6.GnbTdpLimit); 1710 1.1 riastrad pi->sys_info.sclk_dpm_tdp_limit_boost = 1711 1.1 riastrad le16_to_cpu(igp_info->info_6.SclkDpmTdpLimitBoost); 1712 1.1 riastrad pi->sys_info.boost_sclk = le32_to_cpu(igp_info->info_6.ulBoostEngineCLock); 1713 1.1 riastrad pi->sys_info.boost_vid_2bit = igp_info->info_6.ulBoostVid_2bit; 1714 1.1 riastrad if (igp_info->info_6.EnableBoost) 1715 1.1 riastrad pi->sys_info.enable_boost = true; 1716 1.1 riastrad else 1717 1.1 riastrad pi->sys_info.enable_boost = false; 1718 1.1 riastrad sumo_construct_display_voltage_mapping_table(rdev, 1719 1.1 riastrad &pi->sys_info.disp_clk_voltage_mapping_table, 1720 1.1 riastrad igp_info->info_6.sDISPCLK_Voltage); 1721 1.1 riastrad sumo_construct_sclk_voltage_mapping_table(rdev, 1722 1.1 riastrad &pi->sys_info.sclk_voltage_mapping_table, 1723 1.1 riastrad igp_info->info_6.sAvail_SCLK); 1724 1.1 riastrad sumo_construct_vid_mapping_table(rdev, &pi->sys_info.vid_mapping_table, 1725 1.1 riastrad igp_info->info_6.sAvail_SCLK); 1726 1.1 riastrad 1727 1.1 riastrad } 1728 1.1 riastrad return 0; 1729 1.1 riastrad } 1730 1.1 riastrad 1731 1.1 riastrad static void sumo_construct_boot_and_acpi_state(struct radeon_device *rdev) 1732 1.1 riastrad { 1733 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1734 1.1 riastrad 1735 1.1 riastrad pi->boot_pl.sclk = pi->sys_info.bootup_sclk; 1736 1.1 riastrad pi->boot_pl.vddc_index = pi->sys_info.bootup_nb_voltage_index; 1737 1.1 riastrad pi->boot_pl.ds_divider_index = 0; 1738 1.1 riastrad pi->boot_pl.ss_divider_index = 0; 1739 1.1 riastrad pi->boot_pl.allow_gnb_slow = 1; 1740 1.1 riastrad pi->acpi_pl = pi->boot_pl; 1741 1.1 riastrad pi->current_ps.num_levels = 1; 1742 1.1 riastrad pi->current_ps.levels[0] = pi->boot_pl; 1743 1.1 riastrad } 1744 1.1 riastrad 1745 1.1 riastrad int sumo_dpm_init(struct radeon_device *rdev) 1746 1.1 riastrad { 1747 1.1 riastrad struct sumo_power_info *pi; 1748 1.1 riastrad u32 hw_rev = (RREG32(HW_REV) & ATI_REV_ID_MASK) >> ATI_REV_ID_SHIFT; 1749 1.1 riastrad int ret; 1750 1.1 riastrad 1751 1.1 riastrad pi = kzalloc(sizeof(struct sumo_power_info), GFP_KERNEL); 1752 1.1 riastrad if (pi == NULL) 1753 1.1 riastrad return -ENOMEM; 1754 1.1 riastrad rdev->pm.dpm.priv = pi; 1755 1.1 riastrad 1756 1.1 riastrad pi->driver_nbps_policy_disable = false; 1757 1.1 riastrad if ((rdev->family == CHIP_PALM) && (hw_rev < 3)) 1758 1.1 riastrad pi->disable_gfx_power_gating_in_uvd = true; 1759 1.1 riastrad else 1760 1.1 riastrad pi->disable_gfx_power_gating_in_uvd = false; 1761 1.1 riastrad pi->enable_alt_vddnb = true; 1762 1.1 riastrad pi->enable_sclk_ds = true; 1763 1.1 riastrad pi->enable_dynamic_m3_arbiter = false; 1764 1.1 riastrad pi->enable_dynamic_patch_ps = true; 1765 1.1 riastrad /* Some PALM chips don't seem to properly ungate gfx when UVD is in use; 1766 1.1 riastrad * for now just disable gfx PG. 1767 1.1 riastrad */ 1768 1.1 riastrad if (rdev->family == CHIP_PALM) 1769 1.1 riastrad pi->enable_gfx_power_gating = false; 1770 1.1 riastrad else 1771 1.1 riastrad pi->enable_gfx_power_gating = true; 1772 1.1 riastrad pi->enable_gfx_clock_gating = true; 1773 1.1 riastrad pi->enable_mg_clock_gating = true; 1774 1.1 riastrad pi->enable_auto_thermal_throttling = true; 1775 1.1 riastrad 1776 1.1 riastrad ret = sumo_parse_sys_info_table(rdev); 1777 1.1 riastrad if (ret) 1778 1.1 riastrad return ret; 1779 1.1 riastrad 1780 1.1 riastrad sumo_construct_boot_and_acpi_state(rdev); 1781 1.1 riastrad 1782 1.1 riastrad ret = r600_get_platform_caps(rdev); 1783 1.1 riastrad if (ret) 1784 1.1 riastrad return ret; 1785 1.1 riastrad 1786 1.1 riastrad ret = sumo_parse_power_table(rdev); 1787 1.1 riastrad if (ret) 1788 1.1 riastrad return ret; 1789 1.1 riastrad 1790 1.1 riastrad pi->pasi = CYPRESS_HASI_DFLT; 1791 1.1 riastrad pi->asi = RV770_ASI_DFLT; 1792 1.1 riastrad pi->thermal_auto_throttling = pi->sys_info.htc_tmp_lmt; 1793 1.1 riastrad pi->enable_boost = pi->sys_info.enable_boost; 1794 1.1 riastrad pi->enable_dpm = true; 1795 1.1 riastrad 1796 1.1 riastrad return 0; 1797 1.1 riastrad } 1798 1.1 riastrad 1799 1.1 riastrad void sumo_dpm_print_power_state(struct radeon_device *rdev, 1800 1.1 riastrad struct radeon_ps *rps) 1801 1.1 riastrad { 1802 1.1 riastrad int i; 1803 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 1804 1.1 riastrad 1805 1.1 riastrad r600_dpm_print_class_info(rps->class, rps->class2); 1806 1.1 riastrad r600_dpm_print_cap_info(rps->caps); 1807 1.1 riastrad printk("\tuvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk); 1808 1.1 riastrad for (i = 0; i < ps->num_levels; i++) { 1809 1.1 riastrad struct sumo_pl *pl = &ps->levels[i]; 1810 1.1 riastrad printk("\t\tpower level %d sclk: %u vddc: %u\n", 1811 1.1 riastrad i, pl->sclk, 1812 1.1 riastrad sumo_convert_voltage_index_to_value(rdev, pl->vddc_index)); 1813 1.1 riastrad } 1814 1.1 riastrad r600_dpm_print_ps_status(rdev, rps); 1815 1.1 riastrad } 1816 1.1 riastrad 1817 1.1 riastrad #ifdef CONFIG_DEBUG_FS 1818 1.1 riastrad void sumo_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev, 1819 1.1 riastrad struct seq_file *m) 1820 1.1 riastrad { 1821 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1822 1.1 riastrad struct radeon_ps *rps = &pi->current_rps; 1823 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 1824 1.1 riastrad struct sumo_pl *pl; 1825 1.1 riastrad u32 current_index = 1826 1.1 riastrad (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURR_INDEX_MASK) >> 1827 1.1 riastrad CURR_INDEX_SHIFT; 1828 1.1 riastrad 1829 1.1 riastrad if (current_index == BOOST_DPM_LEVEL) { 1830 1.1 riastrad pl = &pi->boost_pl; 1831 1.1 riastrad seq_printf(m, "uvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk); 1832 1.1 riastrad seq_printf(m, "power level %d sclk: %u vddc: %u\n", 1833 1.1 riastrad current_index, pl->sclk, 1834 1.1 riastrad sumo_convert_voltage_index_to_value(rdev, pl->vddc_index)); 1835 1.1 riastrad } else if (current_index >= ps->num_levels) { 1836 1.1 riastrad seq_printf(m, "invalid dpm profile %d\n", current_index); 1837 1.1 riastrad } else { 1838 1.1 riastrad pl = &ps->levels[current_index]; 1839 1.1 riastrad seq_printf(m, "uvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk); 1840 1.1 riastrad seq_printf(m, "power level %d sclk: %u vddc: %u\n", 1841 1.1 riastrad current_index, pl->sclk, 1842 1.1 riastrad sumo_convert_voltage_index_to_value(rdev, pl->vddc_index)); 1843 1.1 riastrad } 1844 1.1 riastrad } 1845 1.1 riastrad #endif 1846 1.1 riastrad 1847 1.1 riastrad u32 sumo_dpm_get_current_sclk(struct radeon_device *rdev) 1848 1.1 riastrad { 1849 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1850 1.1 riastrad struct radeon_ps *rps = &pi->current_rps; 1851 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 1852 1.1 riastrad struct sumo_pl *pl; 1853 1.1 riastrad u32 current_index = 1854 1.1 riastrad (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURR_INDEX_MASK) >> 1855 1.1 riastrad CURR_INDEX_SHIFT; 1856 1.1 riastrad 1857 1.1 riastrad if (current_index == BOOST_DPM_LEVEL) { 1858 1.1 riastrad pl = &pi->boost_pl; 1859 1.1 riastrad return pl->sclk; 1860 1.1 riastrad } else if (current_index >= ps->num_levels) { 1861 1.1 riastrad return 0; 1862 1.1 riastrad } else { 1863 1.1 riastrad pl = &ps->levels[current_index]; 1864 1.1 riastrad return pl->sclk; 1865 1.1 riastrad } 1866 1.1 riastrad } 1867 1.1 riastrad 1868 1.1 riastrad u32 sumo_dpm_get_current_mclk(struct radeon_device *rdev) 1869 1.1 riastrad { 1870 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1871 1.1 riastrad 1872 1.1 riastrad return pi->sys_info.bootup_uma_clk; 1873 1.1 riastrad } 1874 1.1 riastrad 1875 1.1 riastrad void sumo_dpm_fini(struct radeon_device *rdev) 1876 1.1 riastrad { 1877 1.1 riastrad int i; 1878 1.1 riastrad 1879 1.1 riastrad sumo_cleanup_asic(rdev); /* ??? */ 1880 1.1 riastrad 1881 1.1 riastrad for (i = 0; i < rdev->pm.dpm.num_ps; i++) { 1882 1.1 riastrad kfree(rdev->pm.dpm.ps[i].ps_priv); 1883 1.1 riastrad } 1884 1.1 riastrad kfree(rdev->pm.dpm.ps); 1885 1.1 riastrad kfree(rdev->pm.dpm.priv); 1886 1.1 riastrad } 1887 1.1 riastrad 1888 1.1 riastrad u32 sumo_dpm_get_sclk(struct radeon_device *rdev, bool low) 1889 1.1 riastrad { 1890 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1891 1.1 riastrad struct sumo_ps *requested_state = sumo_get_ps(&pi->requested_rps); 1892 1.1 riastrad 1893 1.1 riastrad if (low) 1894 1.1 riastrad return requested_state->levels[0].sclk; 1895 1.1 riastrad else 1896 1.1 riastrad return requested_state->levels[requested_state->num_levels - 1].sclk; 1897 1.1 riastrad } 1898 1.1 riastrad 1899 1.1 riastrad u32 sumo_dpm_get_mclk(struct radeon_device *rdev, bool low) 1900 1.1 riastrad { 1901 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1902 1.1 riastrad 1903 1.1 riastrad return pi->sys_info.bootup_uma_clk; 1904 1.1 riastrad } 1905 1.1 riastrad 1906 1.1 riastrad int sumo_dpm_force_performance_level(struct radeon_device *rdev, 1907 1.1 riastrad enum radeon_dpm_forced_level level) 1908 1.1 riastrad { 1909 1.1 riastrad struct sumo_power_info *pi = sumo_get_pi(rdev); 1910 1.1 riastrad struct radeon_ps *rps = &pi->current_rps; 1911 1.1 riastrad struct sumo_ps *ps = sumo_get_ps(rps); 1912 1.1 riastrad int i; 1913 1.1 riastrad 1914 1.1 riastrad if (ps->num_levels <= 1) 1915 1.1 riastrad return 0; 1916 1.1 riastrad 1917 1.1 riastrad if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { 1918 1.1 riastrad if (pi->enable_boost) 1919 1.1 riastrad sumo_enable_boost(rdev, rps, false); 1920 1.1 riastrad sumo_power_level_enable(rdev, ps->num_levels - 1, true); 1921 1.1 riastrad sumo_set_forced_level(rdev, ps->num_levels - 1); 1922 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1923 1.1 riastrad for (i = 0; i < ps->num_levels - 1; i++) { 1924 1.1 riastrad sumo_power_level_enable(rdev, i, false); 1925 1.1 riastrad } 1926 1.1 riastrad sumo_set_forced_mode(rdev, false); 1927 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1928 1.1 riastrad sumo_set_forced_mode(rdev, false); 1929 1.1 riastrad } else if (level == RADEON_DPM_FORCED_LEVEL_LOW) { 1930 1.1 riastrad if (pi->enable_boost) 1931 1.1 riastrad sumo_enable_boost(rdev, rps, false); 1932 1.1 riastrad sumo_power_level_enable(rdev, 0, true); 1933 1.1 riastrad sumo_set_forced_level(rdev, 0); 1934 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1935 1.1 riastrad for (i = 1; i < ps->num_levels; i++) { 1936 1.1 riastrad sumo_power_level_enable(rdev, i, false); 1937 1.1 riastrad } 1938 1.1 riastrad sumo_set_forced_mode(rdev, false); 1939 1.1 riastrad sumo_set_forced_mode_enabled(rdev); 1940 1.1 riastrad sumo_set_forced_mode(rdev, false); 1941 1.1 riastrad } else { 1942 1.1 riastrad for (i = 0; i < ps->num_levels; i++) { 1943 1.1 riastrad sumo_power_level_enable(rdev, i, true); 1944 1.1 riastrad } 1945 1.1 riastrad if (pi->enable_boost) 1946 1.1 riastrad sumo_enable_boost(rdev, rps, true); 1947 1.1 riastrad } 1948 1.1 riastrad 1949 1.1 riastrad rdev->pm.dpm.forced_level = level; 1950 1.1 riastrad 1951 1.1 riastrad return 0; 1952 1.1 riastrad } 1953