This feature is for UMD to run benchmark in a
power state that is as steady as possible. kmd
need to fix the power state as stable as possible.
now, kmd support four level:
profile_standard,peak,min_sclk,min_mclk

move common related code to amd_powerplay.c

Change-Id: Ie06c122199b7246f5b1951c354cf502bbed27485
Signed-off-by: Rex Zhu <rex....@amd.com>
---
 drivers/gpu/drm/amd/powerplay/amd_powerplay.c      | 40 +++++++++++++++++++++-
 drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c     | 24 +------------
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c   | 25 +-------------
 drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 25 +-------------
 drivers/gpu/drm/amd/powerplay/inc/hwmgr.h          |  3 +-
 5 files changed, 44 insertions(+), 73 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c 
b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
index f73e80c..310f34a 100644
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
@@ -30,7 +30,7 @@
 #include "pp_instance.h"
 #include "power_state.h"
 #include "eventmanager.h"
-
+#include "eventtasks.h"
 
 static inline int pp_check(struct pp_instance *handle)
 {
@@ -324,12 +324,44 @@ static int pp_dpm_fw_loading_complete(void *handle)
        return 0;
 }
 
+static void pp_dpm_en_umd_pstate(struct pp_hwmgr  *hwmgr,
+                                               enum amd_dpm_forced_level level)
+{
+       uint32_t profile_mode_mask = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD |
+                                       AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK |
+                                       AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK |
+                                       AMD_DPM_FORCED_LEVEL_PROFILE_PEAK;
+
+       if (!(hwmgr->dpm_level & profile_mode_mask)) {
+               /* enter umd pstate, save current level, disable gfx cg*/
+               if (level & profile_mode_mask) {
+                       hwmgr->saved_dpm_level = hwmgr->dpm_level;
+                       hwmgr->en_umd_pstate = true;
+                       cgs_set_clockgating_state(hwmgr->device,
+                                               AMD_IP_BLOCK_TYPE_GFX,
+                                               AMD_CG_STATE_UNGATE);
+               }
+       } else {
+               /* exit umd pstate, restore level, enable gfx cg*/
+               if (!(level & profile_mode_mask)) {
+                       if (level == AMD_DPM_FORCED_LEVEL_PROFILE_EXIT)
+                               level = hwmgr->saved_dpm_level;
+                       hwmgr->en_umd_pstate = false;
+                       cgs_set_clockgating_state(hwmgr->device,
+                                       AMD_IP_BLOCK_TYPE_GFX,
+                                       AMD_CG_STATE_GATE);
+               }
+       }
+       return;
+}
+
 static int pp_dpm_force_performance_level(void *handle,
                                        enum amd_dpm_forced_level level)
 {
        struct pp_hwmgr  *hwmgr;
        struct pp_instance *pp_handle = (struct pp_instance *)handle;
        int ret = 0;
+       struct pem_event_data data = { {0} };
 
        ret = pp_check(pp_handle);
 
@@ -338,13 +370,19 @@ static int pp_dpm_force_performance_level(void *handle,
 
        hwmgr = pp_handle->hwmgr;
 
+       if (level == hwmgr->dpm_level)
+               return 0;
+
        if (hwmgr->hwmgr_func->force_dpm_level == NULL) {
                pr_info("%s was not implemented.\n", __func__);
                return 0;
        }
 
        mutex_lock(&pp_handle->pp_lock);
+       pp_dpm_en_umd_pstate(hwmgr, level);
+       pem_task_adjust_power_state(pp_handle->eventmgr, &data);
        hwmgr->hwmgr_func->force_dpm_level(hwmgr, level);
+
        mutex_unlock(&pp_handle->pp_lock);
        return 0;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
index bc839ff..a125e30 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
@@ -1355,31 +1355,9 @@ static int cz_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
 {
        uint32_t sclk = 0;
        int ret = 0;
-       uint32_t profile_mode_mask = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_PEAK;
 
        if (level == hwmgr->dpm_level)
-               return ret;
-
-       if (!(hwmgr->dpm_level & profile_mode_mask)) {
-               /* enter profile mode, save current level, disable gfx cg*/
-               if (level & profile_mode_mask) {
-                       hwmgr->saved_dpm_level = hwmgr->dpm_level;
-                       cgs_set_clockgating_state(hwmgr->device,
-                                               AMD_IP_BLOCK_TYPE_GFX,
-                                               AMD_CG_STATE_UNGATE);
-               }
-       } else {
-               /* exit profile mode, restore level, enable gfx cg*/
-               if (!(level & profile_mode_mask)) {
-                       if (level == AMD_DPM_FORCED_LEVEL_PROFILE_EXIT)
-                               level = hwmgr->saved_dpm_level;
-                       cgs_set_clockgating_state(hwmgr->device,
-                                       AMD_IP_BLOCK_TYPE_GFX,
-                                       AMD_CG_STATE_GATE);
-               }
-       }
+               return 0;
 
        switch (level) {
        case AMD_DPM_FORCED_LEVEL_HIGH:
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index f7aa057..a917fc5 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -2577,32 +2577,9 @@ static int smu7_force_dpm_level(struct pp_hwmgr *hwmgr,
        uint32_t sclk_mask = 0;
        uint32_t mclk_mask = 0;
        uint32_t pcie_mask = 0;
-       uint32_t profile_mode_mask = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_PEAK;
 
        if (level == hwmgr->dpm_level)
-               return ret;
-
-       if (!(hwmgr->dpm_level & profile_mode_mask)) {
-               /* enter profile mode, save current level, disable gfx cg*/
-               if (level & profile_mode_mask) {
-                       hwmgr->saved_dpm_level = hwmgr->dpm_level;
-                       cgs_set_clockgating_state(hwmgr->device,
-                                               AMD_IP_BLOCK_TYPE_GFX,
-                                               AMD_CG_STATE_UNGATE);
-               }
-       } else {
-               /* exit profile mode, restore level, enable gfx cg*/
-               if (!(level & profile_mode_mask)) {
-                       if (level == AMD_DPM_FORCED_LEVEL_PROFILE_EXIT)
-                               level = hwmgr->saved_dpm_level;
-                       cgs_set_clockgating_state(hwmgr->device,
-                                       AMD_IP_BLOCK_TYPE_GFX,
-                                       AMD_CG_STATE_GATE);
-               }
-       }
+               return 0;
 
        switch (level) {
        case AMD_DPM_FORCED_LEVEL_HIGH:
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
index 268fa24..f14047d 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -4536,32 +4536,9 @@ static int vega10_dpm_force_dpm_level(struct pp_hwmgr 
*hwmgr,
        uint32_t sclk_mask = 0;
        uint32_t mclk_mask = 0;
        uint32_t soc_mask = 0;
-       uint32_t profile_mode_mask = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK |
-                                       AMD_DPM_FORCED_LEVEL_PROFILE_PEAK;
 
        if (level == hwmgr->dpm_level)
-               return ret;
-
-       if (!(hwmgr->dpm_level & profile_mode_mask)) {
-               /* enter profile mode, save current level, disable gfx cg*/
-               if (level & profile_mode_mask) {
-                       hwmgr->saved_dpm_level = hwmgr->dpm_level;
-                       cgs_set_clockgating_state(hwmgr->device,
-                                               AMD_IP_BLOCK_TYPE_GFX,
-                                               AMD_CG_STATE_UNGATE);
-               }
-       } else {
-               /* exit profile mode, restore level, enable gfx cg*/
-               if (!(level & profile_mode_mask)) {
-                       if (level == AMD_DPM_FORCED_LEVEL_PROFILE_EXIT)
-                               level = hwmgr->saved_dpm_level;
-                       cgs_set_clockgating_state(hwmgr->device,
-                                       AMD_IP_BLOCK_TYPE_GFX,
-                                       AMD_CG_STATE_GATE);
-               }
-       }
+               return 0;
 
        switch (level) {
        case AMD_DPM_FORCED_LEVEL_HIGH:
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h 
b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
index eb2e277..d2224ed 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
@@ -802,12 +802,13 @@ struct pp_hwmgr {
        struct amd_pp_display_configuration display_config;
        uint32_t feature_mask;
 
-       /* power profile */
+       /* UMD Pstate */
        struct amd_pp_profile gfx_power_profile;
        struct amd_pp_profile compute_power_profile;
        struct amd_pp_profile default_gfx_power_profile;
        struct amd_pp_profile default_compute_power_profile;
        enum amd_pp_profile_type current_power_profile;
+       bool en_umd_pstate;
 };
 
 extern int hwmgr_early_init(struct pp_instance *handle);
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to