drm/amd/powerplay: update current profile mode only when it's really applied
authorEvan Quan <evan.quan@amd.com>
Tue, 26 Mar 2019 09:16:36 +0000 (17:16 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 Mar 2019 03:43:11 +0000 (22:43 -0500)
No need to update current profile mode if the new profile mode
does not take effect in fact.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Kent Russell <kent.russell@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c

index ed6c638700f543ac8935db02c10069794fa51a8c..85a5369245712d8786614347b4d3fb28fec82c51 100644 (file)
@@ -4904,13 +4904,12 @@ static int vega10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui
        uint8_t FPS;
        uint8_t use_rlc_busy;
        uint8_t min_active_level;
-
-       hwmgr->power_profile_mode = input[size];
+       uint32_t power_profile_mode = input[size];
 
        smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask,
-                                               1<<hwmgr->power_profile_mode);
+                                               1 << power_profile_mode);
 
-       if (hwmgr->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
+       if (power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
                if (size == 0 || size > 4)
                        return -EINVAL;
 
@@ -4924,6 +4923,8 @@ static int vega10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui
                                        use_rlc_busy << 16 | min_active_level<<24);
        }
 
+       hwmgr->power_profile_mode = power_profile_mode;
+
        return 0;
 }
 
index 664544e7fcdc7623a7ce059fb952f51000bc38c1..3f349ada8de0dac36eecfceb7e469bdd8e521d1d 100644 (file)
@@ -3819,15 +3819,14 @@ static int vega20_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui
 {
        DpmActivityMonitorCoeffInt_t activity_monitor;
        int workload_type, result = 0;
+       uint32_t power_profile_mode = input[size];
 
-       hwmgr->power_profile_mode = input[size];
-
-       if (hwmgr->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) {
-               pr_err("Invalid power profile mode %d\n", hwmgr->power_profile_mode);
+       if (power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) {
+               pr_err("Invalid power profile mode %d\n", power_profile_mode);
                return -EINVAL;
        }
 
-       if (hwmgr->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
+       if (power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
                if (size < 10)
                        return -EINVAL;
 
@@ -3895,10 +3894,12 @@ static int vega20_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui
 
        /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */
        workload_type =
-               conv_power_profile_to_pplib_workload(hwmgr->power_profile_mode);
+               conv_power_profile_to_pplib_workload(power_profile_mode);
        smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask,
                                                1 << workload_type);
 
+       hwmgr->power_profile_mode = power_profile_mode;
+
        return 0;
 }