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

drm/radeon: add dpm UVD handling for sumo asics

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+65
+55
drivers/gpu/drm/radeon/sumo_dpm.c
··· 811 811 sumo_power_level_enable(rdev, i, false); 812 812 } 813 813 814 + static void sumo_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev) 815 + { 816 + struct sumo_ps *new_ps = sumo_get_ps(rdev->pm.dpm.requested_ps); 817 + struct sumo_ps *current_ps = sumo_get_ps(rdev->pm.dpm.current_ps); 818 + 819 + if ((rdev->pm.dpm.requested_ps->vclk == rdev->pm.dpm.current_ps->vclk) && 820 + (rdev->pm.dpm.requested_ps->dclk == rdev->pm.dpm.current_ps->dclk)) 821 + return; 822 + 823 + if (new_ps->levels[new_ps->num_levels - 1].sclk >= 824 + current_ps->levels[current_ps->num_levels - 1].sclk) 825 + return; 826 + 827 + radeon_set_uvd_clocks(rdev, rdev->pm.dpm.requested_ps->vclk, 828 + rdev->pm.dpm.requested_ps->dclk); 829 + } 830 + 831 + static void sumo_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev) 832 + { 833 + struct sumo_ps *new_ps = sumo_get_ps(rdev->pm.dpm.requested_ps); 834 + struct sumo_ps *current_ps = sumo_get_ps(rdev->pm.dpm.current_ps); 835 + 836 + if ((rdev->pm.dpm.requested_ps->vclk == rdev->pm.dpm.current_ps->vclk) && 837 + (rdev->pm.dpm.requested_ps->dclk == rdev->pm.dpm.current_ps->dclk)) 838 + return; 839 + 840 + if (new_ps->levels[new_ps->num_levels - 1].sclk < 841 + current_ps->levels[current_ps->num_levels - 1].sclk) 842 + return; 843 + 844 + radeon_set_uvd_clocks(rdev, rdev->pm.dpm.requested_ps->vclk, 845 + rdev->pm.dpm.requested_ps->dclk); 846 + } 847 + 814 848 void sumo_take_smu_control(struct radeon_device *rdev, bool enable) 815 849 { 816 850 /* This bit selects who handles display phy powergating. ··· 1130 1096 sumo_take_smu_control(rdev, false); 1131 1097 } 1132 1098 1099 + static void sumo_uvd_init(struct radeon_device *rdev) 1100 + { 1101 + u32 tmp; 1102 + 1103 + tmp = RREG32(CG_VCLK_CNTL); 1104 + tmp &= ~VCLK_DIR_CNTL_EN; 1105 + WREG32(CG_VCLK_CNTL, tmp); 1106 + 1107 + tmp = RREG32(CG_DCLK_CNTL); 1108 + tmp &= ~DCLK_DIR_CNTL_EN; 1109 + WREG32(CG_DCLK_CNTL, tmp); 1110 + 1111 + /* 100 Mhz */ 1112 + radeon_set_uvd_clocks(rdev, 10000, 10000); 1113 + } 1114 + 1133 1115 static int sumo_set_thermal_temperature_range(struct radeon_device *rdev, 1134 1116 int min_temp, int max_temp) 1135 1117 { ··· 1238 1188 1239 1189 if (pi->enable_dynamic_patch_ps) 1240 1190 sumo_apply_state_adjust_rules(rdev); 1191 + if (pi->enable_dpm) 1192 + sumo_set_uvd_clock_before_set_eng_clock(rdev); 1241 1193 sumo_update_current_power_levels(rdev); 1242 1194 if (pi->enable_boost) { 1243 1195 sumo_enable_boost(rdev, false); ··· 1263 1211 } 1264 1212 if (pi->enable_boost) 1265 1213 sumo_enable_boost(rdev, true); 1214 + if (pi->enable_dpm) 1215 + sumo_set_uvd_clock_after_set_eng_clock(rdev); 1266 1216 1267 1217 return 0; 1268 1218 } ··· 1291 1237 sumo_program_acpi_power_level(rdev); 1292 1238 sumo_enable_acpi_pm(rdev); 1293 1239 sumo_take_smu_control(rdev, true); 1240 + sumo_uvd_init(rdev); 1294 1241 } 1295 1242 1296 1243 void sumo_dpm_display_configuration_changed(struct radeon_device *rdev)
+10
drivers/gpu/drm/radeon/sumod.h
··· 136 136 #define CG_SCLK_STATUS 0x604 137 137 # define SCLK_OVERCLK_DETECT (1 << 2) 138 138 139 + #define CG_DCLK_CNTL 0x610 140 + # define DCLK_DIVIDER_MASK 0x7f 141 + # define DCLK_DIR_CNTL_EN (1 << 8) 142 + #define CG_DCLK_STATUS 0x614 143 + # define DCLK_STATUS (1 << 0) 144 + #define CG_VCLK_CNTL 0x618 145 + # define VCLK_DIVIDER_MASK 0x7f 146 + # define VCLK_DIR_CNTL_EN (1 << 8) 147 + #define CG_VCLK_STATUS 0x61c 148 + 139 149 #define GENERAL_PWRMGT 0x63c 140 150 # define STATIC_PM_EN (1 << 1) 141 151