[PATCH 1/2] drm/amd/pm: add the interface to set and save the bootup workload type
Kenneth Feng
kenneth.feng at amd.com
Wed Dec 25 08:08:13 UTC 2024
add the interface to set and save the bootup workload type
Signed-off-by: Kenneth Feng <kenneth.feng at amd.com>
---
drivers/gpu/drm/amd/pm/amdgpu_dpm.c | 27 +++++++++++++++++++
drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h | 3 +++
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 1 +
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 1 +
4 files changed, 32 insertions(+)
diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
index 6a9e26905edf..92fa19cac32a 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
@@ -349,6 +349,33 @@ int amdgpu_dpm_switch_power_profile(struct amdgpu_device *adev,
return ret;
}
+int amdgpu_dpm_set_and_save_bootup_power_profile(struct amdgpu_device *adev,
+ bool en)
+{
+ struct smu_context *smu = (struct smu_context*)(adev->powerplay.pp_handle);
+ int current_profile_mode = smu->power_profile_mode;
+ int saved_profile_mode = smu->saved_power_profile_mode;
+ int ret = 0;
+
+ if (en && current_profile_mode == PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT)
+ return 0;
+
+ if (!en && current_profile_mode != PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT)
+ return 0;
+
+ if (en) {
+ ret = amdgpu_dpm_switch_power_profile(adev, current_profile_mode, !en);
+ smu->saved_power_profile_mode = current_profile_mode;
+ smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
+ } else {
+ ret = amdgpu_dpm_switch_power_profile(adev, saved_profile_mode, !en);
+ smu->power_profile_mode = saved_profile_mode;
+ smu->saved_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
+ }
+
+ return ret;
+}
+
int amdgpu_dpm_set_xgmi_pstate(struct amdgpu_device *adev,
uint32_t pstate)
{
diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
index 1f5ac7e0230d..5fe404bbb033 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
@@ -410,6 +410,9 @@ int amdgpu_dpm_switch_power_profile(struct amdgpu_device *adev,
enum PP_SMC_POWER_PROFILE type,
bool en);
+int amdgpu_dpm_set_and_save_bootup_power_profile(struct amdgpu_device *adev,
+ bool en);
+
int amdgpu_dpm_baco_reset(struct amdgpu_device *adev);
int amdgpu_dpm_mode2_reset(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
index 8ca793c222ff..a6f748361198 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
@@ -1272,6 +1272,7 @@ static void smu_init_power_profile(struct smu_context *smu)
PP_SMC_POWER_PROFILE_FULLSCREEN3D;
}
smu_power_profile_mode_get(smu, smu->power_profile_mode);
+ smu->saved_power_profile_mode = smu->power_profile_mode;
}
static int smu_sw_init(struct amdgpu_ip_block *ip_block)
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
index 3630593bce61..c58fc31fb1d7 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
@@ -560,6 +560,7 @@ struct smu_context {
uint32_t workload_mask;
/* default/user workload preference */
uint32_t power_profile_mode;
+ uint32_t saved_power_profile_mode;
uint32_t workload_refcount[PP_SMC_POWER_PROFILE_COUNT];
/* backend specific custom workload settings */
long *custom_profile_params;
--
2.34.1
More information about the amd-gfx
mailing list