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

drm/amd/powerplay: add power profile support for SMU7

Signed-off-by: Eric Huang <JinHuiEric.Huang@amd.com>
Acked-by: Rex Zhu <Rex.Zhu@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Eric Huang and committed by
Alex Deucher
ff3953d4 789fd60f

+86
+71
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
··· 4502 4502 return 0; 4503 4503 } 4504 4504 4505 + static void smu7_find_min_clock_masks(struct pp_hwmgr *hwmgr, 4506 + uint32_t *sclk_mask, uint32_t *mclk_mask, 4507 + uint32_t min_sclk, uint32_t min_mclk) 4508 + { 4509 + struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 4510 + struct smu7_dpm_table *dpm_table = &(data->dpm_table); 4511 + uint32_t i; 4512 + 4513 + for (i = 0; i < dpm_table->sclk_table.count; i++) { 4514 + if (dpm_table->sclk_table.dpm_levels[i].enabled && 4515 + dpm_table->sclk_table.dpm_levels[i].value >= min_sclk) 4516 + *sclk_mask |= 1 << i; 4517 + } 4518 + 4519 + for (i = 0; i < dpm_table->mclk_table.count; i++) { 4520 + if (dpm_table->mclk_table.dpm_levels[i].enabled && 4521 + dpm_table->mclk_table.dpm_levels[i].value >= min_mclk) 4522 + *mclk_mask |= 1 << i; 4523 + } 4524 + } 4525 + 4526 + static int smu7_set_power_profile_state(struct pp_hwmgr *hwmgr, 4527 + struct amd_pp_profile *request) 4528 + { 4529 + struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 4530 + int tmp_result, result = 0; 4531 + uint32_t sclk_mask = 0, mclk_mask = 0; 4532 + 4533 + if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_AUTO) 4534 + return -EINVAL; 4535 + 4536 + tmp_result = smu7_freeze_sclk_mclk_dpm(hwmgr); 4537 + PP_ASSERT_WITH_CODE(!tmp_result, 4538 + "Failed to freeze SCLK MCLK DPM!", 4539 + result = tmp_result); 4540 + 4541 + tmp_result = smum_populate_requested_graphic_levels(hwmgr, request); 4542 + PP_ASSERT_WITH_CODE(!tmp_result, 4543 + "Failed to populate requested graphic levels!", 4544 + result = tmp_result); 4545 + 4546 + tmp_result = smu7_unfreeze_sclk_mclk_dpm(hwmgr); 4547 + PP_ASSERT_WITH_CODE(!tmp_result, 4548 + "Failed to unfreeze SCLK MCLK DPM!", 4549 + result = tmp_result); 4550 + 4551 + smu7_find_min_clock_masks(hwmgr, &sclk_mask, &mclk_mask, 4552 + request->min_sclk, request->min_mclk); 4553 + 4554 + if (sclk_mask) { 4555 + if (!data->sclk_dpm_key_disabled) 4556 + smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, 4557 + PPSMC_MSG_SCLKDPM_SetEnabledMask, 4558 + data->dpm_level_enable_mask. 4559 + sclk_dpm_enable_mask & 4560 + sclk_mask); 4561 + } 4562 + 4563 + if (mclk_mask) { 4564 + if (!data->mclk_dpm_key_disabled) 4565 + smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, 4566 + PPSMC_MSG_MCLKDPM_SetEnabledMask, 4567 + data->dpm_level_enable_mask. 4568 + mclk_dpm_enable_mask & 4569 + mclk_mask); 4570 + } 4571 + 4572 + return result; 4573 + } 4574 + 4505 4575 static const struct pp_hwmgr_func smu7_hwmgr_funcs = { 4506 4576 .backend_init = &smu7_hwmgr_backend_init, 4507 4577 .backend_fini = &smu7_hwmgr_backend_fini, ··· 4621 4551 .dynamic_state_management_disable = smu7_disable_dpm_tasks, 4622 4552 .request_firmware = smu7_request_firmware, 4623 4553 .release_firmware = smu7_release_firmware, 4554 + .set_power_profile_state = smu7_set_power_profile_state, 4624 4555 }; 4625 4556 4626 4557 uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock,
+5
drivers/gpu/drm/amd/powerplay/inc/smumgr.h
··· 127 127 uint32_t (*get_offsetof)(uint32_t type, uint32_t member); 128 128 uint32_t (*get_mac_definition)(uint32_t value); 129 129 bool (*is_dpm_running)(struct pp_hwmgr *hwmgr); 130 + int (*populate_requested_graphic_levels)(struct pp_hwmgr *hwmgr, 131 + struct amd_pp_profile *request); 130 132 }; 131 133 132 134 struct pp_smumgr { ··· 194 192 extern uint32_t smum_get_mac_definition(struct pp_smumgr *smumgr, uint32_t value); 195 193 196 194 extern bool smum_is_dpm_running(struct pp_hwmgr *hwmgr); 195 + 196 + extern int smum_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr, 197 + struct amd_pp_profile *request); 197 198 198 199 #define SMUM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT 199 200
+10
drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
··· 374 374 375 375 return true; 376 376 } 377 + 378 + int smum_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr, 379 + struct amd_pp_profile *request) 380 + { 381 + if (hwmgr->smumgr->smumgr_funcs->populate_requested_graphic_levels) 382 + return hwmgr->smumgr->smumgr_funcs->populate_requested_graphic_levels( 383 + hwmgr, request); 384 + 385 + return 0; 386 + }