[AMD Official Use Only - AMD Internal Distribution Only]

Series is Reviewed-by: Kenneth Feng <kenneth.f...@amd.com>

-----Original Message-----
From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of Alex Deucher
Sent: Saturday, March 29, 2025 2:24 AM
To: amd-gfx@lists.freedesktop.org
Cc: Deucher, Alexander <alexander.deuc...@amd.com>
Subject: [PATCH 1/3] drm/amdgpu/pm: add workload profile pause helper

Caution: This message originated from an External Source. Use proper caution 
when opening attachments, clicking links, or responding.


To be used for display idle optimizations when we want to pause non-default 
profiles.

Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
---
 .../gpu/drm/amd/include/kgd_pp_interface.h    |  1 +
 drivers/gpu/drm/amd/pm/amdgpu_dpm.c           | 19 +++++++++++++++++++
 drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h       |  2 ++
 3 files changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h 
b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
index 2a9606118d899..21dc956b5f35d 100644
--- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
@@ -429,6 +429,7 @@ struct amd_pm_funcs {
        int (*set_pp_table)(void *handle, const char *buf, size_t size);
        void (*debugfs_print_current_performance_level)(void *handle, struct 
seq_file *m);
        int (*switch_power_profile)(void *handle, enum PP_SMC_POWER_PROFILE 
type, bool en);
+       int (*pause_power_profile)(void *handle, bool pause);
 /* export to amdgpu */
        struct amd_vce_state *(*get_vce_clock_state)(void *handle, u32 idx);
        int (*dispatch_tasks)(void *handle, enum amd_pp_task task_id, diff 
--git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
index 0bcb82b2f3ae0..0e4d243641c8f 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
@@ -381,6 +381,25 @@ int amdgpu_dpm_switch_power_profile(struct amdgpu_device 
*adev,
        return ret;
 }

+int amdgpu_dpm_pause_power_profile(struct amdgpu_device *adev,
+                                  bool pause) {
+       const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
+       int ret = 0;
+
+       if (amdgpu_sriov_vf(adev))
+               return 0;
+
+       if (pp_funcs && pp_funcs->pause_power_profile) {
+               mutex_lock(&adev->pm.mutex);
+               ret = pp_funcs->pause_power_profile(
+                       adev->powerplay.pp_handle, pause);
+               mutex_unlock(&adev->pm.mutex);
+       }
+
+       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 72565fab60673..df8850a01ea6b 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
@@ -410,6 +410,8 @@ int amdgpu_dpm_set_xgmi_pstate(struct amdgpu_device *adev,  
int amdgpu_dpm_switch_power_profile(struct amdgpu_device *adev,
                                    enum PP_SMC_POWER_PROFILE type,
                                    bool en);
+int amdgpu_dpm_pause_power_profile(struct amdgpu_device *adev,
+                                  bool pause);

 int amdgpu_dpm_baco_reset(struct amdgpu_device *adev);

--
2.49.0

Reply via email to