Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add NBIO IP v7.7.0 Clock Gating support

Add BIF Clock Gating MGCG and LS support for NBIO IP v7.7.0.

Signed-off-by: Tim Huang <tim.huang@amd.com>
Reviewed-by: Yifan Zhang <yifan1.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Tim Huang and committed by
Alex Deucher
2037769f ad3b0b99

+78
+78
drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c
··· 247 247 248 248 } 249 249 250 + static void nbio_v7_7_update_medium_grain_clock_gating(struct amdgpu_device *adev, 251 + bool enable) 252 + { 253 + uint32_t def, data; 254 + 255 + if (enable && !(adev->cg_flags & AMD_CG_SUPPORT_BIF_MGCG)) 256 + return; 257 + 258 + def = data = RREG32_SOC15(NBIO, 0, regBIF0_CPM_CONTROL); 259 + if (enable) { 260 + data |= (BIF0_CPM_CONTROL__LCLK_DYN_GATE_ENABLE_MASK | 261 + BIF0_CPM_CONTROL__TXCLK_DYN_GATE_ENABLE_MASK | 262 + BIF0_CPM_CONTROL__TXCLK_LCNT_GATE_ENABLE_MASK | 263 + BIF0_CPM_CONTROL__TXCLK_REGS_GATE_ENABLE_MASK | 264 + BIF0_CPM_CONTROL__TXCLK_PRBS_GATE_ENABLE_MASK | 265 + BIF0_CPM_CONTROL__REFCLK_REGS_GATE_ENABLE_MASK); 266 + } else { 267 + data &= ~(BIF0_CPM_CONTROL__LCLK_DYN_GATE_ENABLE_MASK | 268 + BIF0_CPM_CONTROL__TXCLK_DYN_GATE_ENABLE_MASK | 269 + BIF0_CPM_CONTROL__TXCLK_LCNT_GATE_ENABLE_MASK | 270 + BIF0_CPM_CONTROL__TXCLK_REGS_GATE_ENABLE_MASK | 271 + BIF0_CPM_CONTROL__TXCLK_PRBS_GATE_ENABLE_MASK | 272 + BIF0_CPM_CONTROL__REFCLK_REGS_GATE_ENABLE_MASK); 273 + } 274 + 275 + if (def != data) 276 + WREG32_SOC15(NBIO, 0, regBIF0_CPM_CONTROL, data); 277 + } 278 + 279 + static void nbio_v7_7_update_medium_grain_light_sleep(struct amdgpu_device *adev, 280 + bool enable) 281 + { 282 + uint32_t def, data; 283 + 284 + if (enable && !(adev->cg_flags & AMD_CG_SUPPORT_BIF_LS)) 285 + return; 286 + 287 + def = data = RREG32_SOC15(NBIO, 0, regBIF0_PCIE_CNTL2); 288 + if (enable) 289 + data |= BIF0_PCIE_CNTL2__SLV_MEM_LS_EN_MASK; 290 + else 291 + data &= ~BIF0_PCIE_CNTL2__SLV_MEM_LS_EN_MASK; 292 + 293 + if (def != data) 294 + WREG32_SOC15(NBIO, 0, regBIF0_PCIE_CNTL2, data); 295 + 296 + def = data = RREG32_SOC15(NBIO, 0, regBIF0_PCIE_TX_POWER_CTRL_1); 297 + if (enable) { 298 + data |= (BIF0_PCIE_TX_POWER_CTRL_1__MST_MEM_LS_EN_MASK | 299 + BIF0_PCIE_TX_POWER_CTRL_1__REPLAY_MEM_LS_EN_MASK); 300 + } else { 301 + data &= ~(BIF0_PCIE_TX_POWER_CTRL_1__MST_MEM_LS_EN_MASK | 302 + BIF0_PCIE_TX_POWER_CTRL_1__REPLAY_MEM_LS_EN_MASK); 303 + } 304 + 305 + if (def != data) 306 + WREG32_SOC15(NBIO, 0, regBIF0_PCIE_TX_POWER_CTRL_1, data); 307 + } 308 + 309 + static void nbio_v7_7_get_clockgating_state(struct amdgpu_device *adev, 310 + u64 *flags) 311 + { 312 + uint32_t data; 313 + 314 + /* AMD_CG_SUPPORT_BIF_MGCG */ 315 + data = RREG32_SOC15(NBIO, 0, regBIF0_CPM_CONTROL); 316 + if (data & BIF0_CPM_CONTROL__LCLK_DYN_GATE_ENABLE_MASK) 317 + *flags |= AMD_CG_SUPPORT_BIF_MGCG; 318 + 319 + /* AMD_CG_SUPPORT_BIF_LS */ 320 + data = RREG32_SOC15(NBIO, 0, regBIF0_PCIE_CNTL2); 321 + if (data & BIF0_PCIE_CNTL2__SLV_MEM_LS_EN_MASK) 322 + *flags |= AMD_CG_SUPPORT_BIF_LS; 323 + } 324 + 250 325 const struct amdgpu_nbio_funcs nbio_v7_7_funcs = { 251 326 .get_hdp_flush_req_offset = nbio_v7_7_get_hdp_flush_req_offset, 252 327 .get_hdp_flush_done_offset = nbio_v7_7_get_hdp_flush_done_offset, ··· 337 262 .enable_doorbell_aperture = nbio_v7_7_enable_doorbell_aperture, 338 263 .enable_doorbell_selfring_aperture = nbio_v7_7_enable_doorbell_selfring_aperture, 339 264 .ih_doorbell_range = nbio_v7_7_ih_doorbell_range, 265 + .update_medium_grain_clock_gating = nbio_v7_7_update_medium_grain_clock_gating, 266 + .update_medium_grain_light_sleep = nbio_v7_7_update_medium_grain_light_sleep, 267 + .get_clockgating_state = nbio_v7_7_get_clockgating_state, 340 268 .ih_control = nbio_v7_7_ih_control, 341 269 .init_registers = nbio_v7_7_init_registers, 342 270 };