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

drm/amdgpu: enable clock gating for HDP 6.0

Enable HDP 6.0 clock gating.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Evan Quan and committed by
Alex Deucher
d386f645 20139069

+73 -30
+71 -29
drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c
··· 38 38 } 39 39 40 40 static void hdp_v6_0_update_clock_gating(struct amdgpu_device *adev, 41 - bool enable) 41 + bool enable) 42 42 { 43 - uint32_t hdp_clk_cntl; 43 + uint32_t hdp_clk_cntl, hdp_clk_cntl1; 44 + uint32_t hdp_mem_pwr_cntl; 44 45 45 - if (!(adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG)) 46 + if (!(adev->cg_flags & (AMD_CG_SUPPORT_HDP_LS | 47 + AMD_CG_SUPPORT_HDP_DS | 48 + AMD_CG_SUPPORT_HDP_SD))) 46 49 return; 47 50 48 - hdp_clk_cntl = RREG32_SOC15(HDP, 0, regHDP_CLK_CNTL); 51 + hdp_clk_cntl = hdp_clk_cntl1 = RREG32_SOC15(HDP, 0,regHDP_CLK_CNTL); 52 + hdp_mem_pwr_cntl = RREG32_SOC15(HDP, 0, regHDP_MEM_POWER_CTRL); 49 53 54 + /* Before doing clock/power mode switch, 55 + * forced on IPH & RC clock */ 56 + hdp_clk_cntl = REG_SET_FIELD(hdp_clk_cntl, HDP_CLK_CNTL, 57 + RC_MEM_CLK_SOFT_OVERRIDE, 1); 58 + WREG32_SOC15(HDP, 0, regHDP_CLK_CNTL, hdp_clk_cntl); 59 + 60 + /* disable clock and power gating before any changing */ 61 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 62 + ATOMIC_MEM_POWER_CTRL_EN, 0); 63 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 64 + ATOMIC_MEM_POWER_LS_EN, 0); 65 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 66 + ATOMIC_MEM_POWER_DS_EN, 0); 67 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 68 + ATOMIC_MEM_POWER_SD_EN, 0); 69 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 70 + RC_MEM_POWER_CTRL_EN, 0); 71 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 72 + RC_MEM_POWER_LS_EN, 0); 73 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 74 + RC_MEM_POWER_DS_EN, 0); 75 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 76 + RC_MEM_POWER_SD_EN, 0); 77 + WREG32_SOC15(HDP, 0, regHDP_MEM_POWER_CTRL, hdp_mem_pwr_cntl); 78 + 79 + /* Already disabled above. The actions below are for "enabled" only */ 50 80 if (enable) { 51 - hdp_clk_cntl &= 52 - ~(uint32_t) 53 - (HDP_CLK_CNTL__ATOMIC_MEM_CLK_SOFT_OVERRIDE_MASK | 54 - HDP_CLK_CNTL__RC_MEM_CLK_SOFT_OVERRIDE_MASK | 55 - HDP_CLK_CNTL__DBUS_CLK_SOFT_OVERRIDE_MASK | 56 - HDP_CLK_CNTL__DYN_CLK_SOFT_OVERRIDE_MASK | 57 - HDP_CLK_CNTL__XDP_REG_CLK_SOFT_OVERRIDE_MASK | 58 - HDP_CLK_CNTL__HDP_REG_CLK_SOFT_OVERRIDE_MASK); 59 - } else { 60 - hdp_clk_cntl |= HDP_CLK_CNTL__ATOMIC_MEM_CLK_SOFT_OVERRIDE_MASK | 61 - HDP_CLK_CNTL__RC_MEM_CLK_SOFT_OVERRIDE_MASK | 62 - HDP_CLK_CNTL__DBUS_CLK_SOFT_OVERRIDE_MASK | 63 - HDP_CLK_CNTL__DYN_CLK_SOFT_OVERRIDE_MASK | 64 - HDP_CLK_CNTL__XDP_REG_CLK_SOFT_OVERRIDE_MASK | 65 - HDP_CLK_CNTL__HDP_REG_CLK_SOFT_OVERRIDE_MASK; 81 + /* only one clock gating mode (LS/DS/SD) can be enabled */ 82 + if (adev->cg_flags & AMD_CG_SUPPORT_HDP_SD) { 83 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, 84 + HDP_MEM_POWER_CTRL, 85 + ATOMIC_MEM_POWER_SD_EN, 1); 86 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, 87 + HDP_MEM_POWER_CTRL, 88 + RC_MEM_POWER_SD_EN, 1); 89 + } else if (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS) { 90 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, 91 + HDP_MEM_POWER_CTRL, 92 + ATOMIC_MEM_POWER_LS_EN, 1); 93 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, 94 + HDP_MEM_POWER_CTRL, 95 + RC_MEM_POWER_LS_EN, 1); 96 + } else if (adev->cg_flags & AMD_CG_SUPPORT_HDP_DS) { 97 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, 98 + HDP_MEM_POWER_CTRL, 99 + ATOMIC_MEM_POWER_DS_EN, 1); 100 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, 101 + HDP_MEM_POWER_CTRL, 102 + RC_MEM_POWER_DS_EN, 1); 103 + } 104 + 105 + /* confirmed that IPH_MEM_POWER_CTRL_EN and RC_MEM_POWER_CTRL_EN have to 106 + * be set for SRAM LS/DS/SD */ 107 + if (adev->cg_flags & (AMD_CG_SUPPORT_HDP_LS | AMD_CG_SUPPORT_HDP_DS | 108 + AMD_CG_SUPPORT_HDP_SD)) { 109 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 110 + ATOMIC_MEM_POWER_CTRL_EN, 1); 111 + hdp_mem_pwr_cntl = REG_SET_FIELD(hdp_mem_pwr_cntl, HDP_MEM_POWER_CTRL, 112 + RC_MEM_POWER_CTRL_EN, 1); 113 + WREG32_SOC15(HDP, 0, regHDP_MEM_POWER_CTRL, hdp_mem_pwr_cntl); 114 + } 66 115 } 67 116 117 + /* disable IPH & RC clock override after clock/power mode changing */ 118 + hdp_clk_cntl = REG_SET_FIELD(hdp_clk_cntl, HDP_CLK_CNTL, 119 + RC_MEM_CLK_SOFT_OVERRIDE, 0); 68 120 WREG32_SOC15(HDP, 0, regHDP_CLK_CNTL, hdp_clk_cntl); 69 121 } 70 122 ··· 124 72 u64 *flags) 125 73 { 126 74 uint32_t tmp; 127 - 128 - /* AMD_CG_SUPPORT_HDP_MGCG */ 129 - tmp = RREG32_SOC15(HDP, 0, regHDP_CLK_CNTL); 130 - if (!(tmp & (HDP_CLK_CNTL__ATOMIC_MEM_CLK_SOFT_OVERRIDE_MASK | 131 - HDP_CLK_CNTL__RC_MEM_CLK_SOFT_OVERRIDE_MASK | 132 - HDP_CLK_CNTL__DBUS_CLK_SOFT_OVERRIDE_MASK | 133 - HDP_CLK_CNTL__DYN_CLK_SOFT_OVERRIDE_MASK | 134 - HDP_CLK_CNTL__XDP_REG_CLK_SOFT_OVERRIDE_MASK | 135 - HDP_CLK_CNTL__HDP_REG_CLK_SOFT_OVERRIDE_MASK))) 136 - *flags |= AMD_CG_SUPPORT_HDP_MGCG; 137 75 138 76 /* AMD_CG_SUPPORT_HDP_LS/DS/SD */ 139 77 tmp = RREG32_SOC15(HDP, 0, regHDP_MEM_POWER_CTRL);
+2 -1
drivers/gpu/drm/amd/amdgpu/soc21.c
··· 538 538 AMD_CG_SUPPORT_ATHUB_LS | 539 539 AMD_CG_SUPPORT_MC_MGCG | 540 540 AMD_CG_SUPPORT_MC_LS | 541 - AMD_CG_SUPPORT_IH_CG; 541 + AMD_CG_SUPPORT_IH_CG | 542 + AMD_CG_SUPPORT_HDP_SD; 542 543 adev->pg_flags = AMD_PG_SUPPORT_VCN | 543 544 AMD_PG_SUPPORT_VCN_DPG | 544 545 AMD_PG_SUPPORT_JPEG |