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

drm/amd/powerplay: add set_power_profile_mode for raven1_refresh

add gfxoff_state_changed_by_workload to control gfxoff
when set power_profile_mode

Signed-off-by: Chengming Gui <Jack.Gui@amd.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Chengming Gui and committed by
Alex Deucher
1019fe04 ce0e22f5

+30 -3
+1
drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
··· 92 92 hwmgr_set_user_specify_caps(hwmgr); 93 93 hwmgr->fan_ctrl_is_in_default_mode = true; 94 94 hwmgr_init_workload_prority(hwmgr); 95 + hwmgr->gfxoff_state_changed_by_workload = false; 95 96 96 97 switch (hwmgr->chip_family) { 97 98 case AMDGPU_FAMILY_CI:
+28 -3
drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
··· 1258 1258 return size; 1259 1259 } 1260 1260 1261 + static bool smu10_is_raven1_refresh(struct pp_hwmgr *hwmgr) 1262 + { 1263 + struct amdgpu_device *adev = hwmgr->adev; 1264 + if ((adev->asic_type == CHIP_RAVEN) && 1265 + (adev->rev_id != 0x15d8) && 1266 + (hwmgr->smu_version >= 0x41e2b)) 1267 + return true; 1268 + else 1269 + return false; 1270 + } 1271 + 1261 1272 static int smu10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size) 1262 1273 { 1263 1274 int workload_type = 0; 1275 + int result = 0; 1264 1276 1265 1277 if (input[size] > PP_SMC_POWER_PROFILE_COMPUTE) { 1266 1278 pr_err("Invalid power profile mode %ld\n", input[size]); 1267 1279 return -EINVAL; 1268 1280 } 1269 - hwmgr->power_profile_mode = input[size]; 1281 + if (hwmgr->power_profile_mode == input[size]) 1282 + return 0; 1270 1283 1271 1284 /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ 1272 1285 workload_type = 1273 - conv_power_profile_to_pplib_workload(hwmgr->power_profile_mode); 1274 - smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ActiveProcessNotify, 1286 + conv_power_profile_to_pplib_workload(input[size]); 1287 + if (workload_type && 1288 + smu10_is_raven1_refresh(hwmgr) && 1289 + !hwmgr->gfxoff_state_changed_by_workload) { 1290 + smu10_gfx_off_control(hwmgr, false); 1291 + hwmgr->gfxoff_state_changed_by_workload = true; 1292 + } 1293 + result = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ActiveProcessNotify, 1275 1294 1 << workload_type); 1295 + if (!result) 1296 + hwmgr->power_profile_mode = input[size]; 1297 + if (workload_type && hwmgr->gfxoff_state_changed_by_workload) { 1298 + smu10_gfx_off_control(hwmgr, true); 1299 + hwmgr->gfxoff_state_changed_by_workload = false; 1300 + } 1276 1301 1277 1302 return 0; 1278 1303 }
+1
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
··· 782 782 uint32_t workload_mask; 783 783 uint32_t workload_prority[Workload_Policy_Max]; 784 784 uint32_t workload_setting[Workload_Policy_Max]; 785 + bool gfxoff_state_changed_by_workload; 785 786 }; 786 787 787 788 int hwmgr_early_init(struct pp_hwmgr *hwmgr);