]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
Revert "drm/amd/pm: correct the workload setting"
authorAlex Deucher <alexander.deucher@amd.com>
Sat, 16 Nov 2024 14:22:14 +0000 (09:22 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 2 Dec 2024 23:35:57 +0000 (18:35 -0500)
This reverts commit 74e1006430a5377228e49310f6d915628609929e.

This causes a regression in the workload selection.
A more extensive fix is being worked on.
For now, revert.

This came back after a merge in 6.13-rc1, so revert again.

Link: https://gitlab.freedesktop.org/drm/amd/-/issues/3618
Fixes: 74e1006430a5 ("drm/amd/pm: correct the workload setting")
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 44f392fbf628a7ff2d8bb8e83ca1851261f81a6f)

12 files changed:
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h

index b8355293518f89e8ea3f1f26ac91551a3d09084c..563824f42b1d191bafa25131c36ca6aeb493cd96 100644 (file)
@@ -1261,33 +1261,26 @@ static int smu_sw_init(struct amdgpu_ip_block *ip_block)
        smu->watermarks_bitmap = 0;
        smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
        smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
-       smu->user_dpm_profile.user_workload_mask = 0;
 
        atomic_set(&smu->smu_power.power_gate.vcn_gated, 1);
        atomic_set(&smu->smu_power.power_gate.jpeg_gated, 1);
        atomic_set(&smu->smu_power.power_gate.vpe_gated, 1);
        atomic_set(&smu->smu_power.power_gate.umsch_mm_gated, 1);
 
-       smu->workload_priority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT] = 0;
-       smu->workload_priority[PP_SMC_POWER_PROFILE_FULLSCREEN3D] = 1;
-       smu->workload_priority[PP_SMC_POWER_PROFILE_POWERSAVING] = 2;
-       smu->workload_priority[PP_SMC_POWER_PROFILE_VIDEO] = 3;
-       smu->workload_priority[PP_SMC_POWER_PROFILE_VR] = 4;
-       smu->workload_priority[PP_SMC_POWER_PROFILE_COMPUTE] = 5;
-       smu->workload_priority[PP_SMC_POWER_PROFILE_CUSTOM] = 6;
+       smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT] = 0;
+       smu->workload_prority[PP_SMC_POWER_PROFILE_FULLSCREEN3D] = 1;
+       smu->workload_prority[PP_SMC_POWER_PROFILE_POWERSAVING] = 2;
+       smu->workload_prority[PP_SMC_POWER_PROFILE_VIDEO] = 3;
+       smu->workload_prority[PP_SMC_POWER_PROFILE_VR] = 4;
+       smu->workload_prority[PP_SMC_POWER_PROFILE_COMPUTE] = 5;
+       smu->workload_prority[PP_SMC_POWER_PROFILE_CUSTOM] = 6;
 
        if (smu->is_apu ||
-           !smu_is_workload_profile_available(smu, PP_SMC_POWER_PROFILE_FULLSCREEN3D)) {
-               smu->driver_workload_mask =
-                       1 << smu->workload_priority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT];
-       } else {
-               smu->driver_workload_mask =
-                       1 << smu->workload_priority[PP_SMC_POWER_PROFILE_FULLSCREEN3D];
-               smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_FULLSCREEN3D;
-       }
+           !smu_is_workload_profile_available(smu, PP_SMC_POWER_PROFILE_FULLSCREEN3D))
+               smu->workload_mask = 1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT];
+       else
+               smu->workload_mask = 1 << smu->workload_prority[PP_SMC_POWER_PROFILE_FULLSCREEN3D];
 
-       smu->workload_mask = smu->driver_workload_mask |
-                                                       smu->user_dpm_profile.user_workload_mask;
        smu->workload_setting[0] = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
        smu->workload_setting[1] = PP_SMC_POWER_PROFILE_FULLSCREEN3D;
        smu->workload_setting[2] = PP_SMC_POWER_PROFILE_POWERSAVING;
@@ -2366,20 +2359,17 @@ static int smu_switch_power_profile(void *handle,
                return -EINVAL;
 
        if (!en) {
-               smu->driver_workload_mask &= ~(1 << smu->workload_priority[type]);
+               smu->workload_mask &= ~(1 << smu->workload_prority[type]);
                index = fls(smu->workload_mask);
                index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0;
                workload[0] = smu->workload_setting[index];
        } else {
-               smu->driver_workload_mask |= (1 << smu->workload_priority[type]);
+               smu->workload_mask |= (1 << smu->workload_prority[type]);
                index = fls(smu->workload_mask);
                index = index <= WORKLOAD_POLICY_MAX ? index - 1 : 0;
                workload[0] = smu->workload_setting[index];
        }
 
-       smu->workload_mask = smu->driver_workload_mask |
-                                                smu->user_dpm_profile.user_workload_mask;
-
        if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL &&
                smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM)
                smu_bump_power_profile_mode(smu, workload, 0);
@@ -3074,23 +3064,12 @@ static int smu_set_power_profile_mode(void *handle,
                                      uint32_t param_size)
 {
        struct smu_context *smu = handle;
-       int ret;
 
        if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled ||
            !smu->ppt_funcs->set_power_profile_mode)
                return -EOPNOTSUPP;
 
-       if (smu->user_dpm_profile.user_workload_mask &
-          (1 << smu->workload_priority[param[param_size]]))
-          return 0;
-
-       smu->user_dpm_profile.user_workload_mask =
-               (1 << smu->workload_priority[param[param_size]]);
-       smu->workload_mask = smu->user_dpm_profile.user_workload_mask |
-               smu->driver_workload_mask;
-       ret = smu_bump_power_profile_mode(smu, param, param_size);
-
-       return ret;
+       return smu_bump_power_profile_mode(smu, param, param_size);
 }
 
 static int smu_get_fan_control_mode(void *handle, u32 *fan_mode)
index d665c47f19b77b654a2ae79f3ca6a4d41300fa4d..4ebcc1e53ea2f63565f26f05e0dba6c2e287a9f7 100644 (file)
@@ -240,7 +240,6 @@ struct smu_user_dpm_profile {
        /* user clock state information */
        uint32_t clk_mask[SMU_CLK_COUNT];
        uint32_t clk_dependency;
-       uint32_t user_workload_mask;
 };
 
 #define SMU_TABLE_INIT(tables, table_id, s, a, d)      \
@@ -558,8 +557,7 @@ struct smu_context {
        bool disable_uclk_switch;
 
        uint32_t workload_mask;
-       uint32_t driver_workload_mask;
-       uint32_t workload_priority[WORKLOAD_POLICY_MAX];
+       uint32_t workload_prority[WORKLOAD_POLICY_MAX];
        uint32_t workload_setting[WORKLOAD_POLICY_MAX];
        uint32_t power_profile_mode;
        uint32_t default_power_profile_mode;
index 12125303bb7991b521fcc58b788d5fae0c7a6547..a15754b1989f4236c8f1fc297207be9a40688147 100644 (file)
@@ -1459,6 +1459,7 @@ static int arcturus_set_power_profile_mode(struct smu_context *smu,
                return -EINVAL;
        }
 
+
        if ((profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) &&
             (smu->smc_fw_version >= 0x360d00)) {
                if (size != 10)
@@ -1526,14 +1527,14 @@ static int arcturus_set_power_profile_mode(struct smu_context *smu,
 
        ret = smu_cmn_send_smc_msg_with_param(smu,
                                          SMU_MSG_SetWorkloadMask,
-                                         smu->workload_mask,
+                                         1 << workload_type,
                                          NULL);
        if (ret) {
                dev_err(smu->adev->dev, "Fail to set workload type %d\n", workload_type);
                return ret;
        }
 
-       smu_cmn_assign_power_profile(smu);
+       smu->power_profile_mode = profile_mode;
 
        return 0;
 }
index 211635dabed851ffb0e3963e5a0155c42742a004..faa8e7d9c3c6285cbf812bb03ce20fb9b1be93d5 100644 (file)
@@ -2083,13 +2083,10 @@ static int navi10_set_power_profile_mode(struct smu_context *smu, long *input, u
                                                       smu->power_profile_mode);
        if (workload_type < 0)
                return -EINVAL;
-
        ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask,
-                                   smu->workload_mask, NULL);
+                                   1 << workload_type, NULL);
        if (ret)
                dev_err(smu->adev->dev, "[%s] Failed to set work load mask!", __func__);
-       else
-               smu_cmn_assign_power_profile(smu);
 
        return ret;
 }
index d0ed0d060a8a3af587f37a45422aa73714095a4c..a9cb28ce21337586eb0a3b583162a79a9b48e4e8 100644 (file)
@@ -1788,13 +1788,10 @@ static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *
                                                       smu->power_profile_mode);
        if (workload_type < 0)
                return -EINVAL;
-
        ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask,
-                                   smu->workload_mask, NULL);
+                                   1 << workload_type, NULL);
        if (ret)
                dev_err(smu->adev->dev, "[%s] Failed to set work load mask!", __func__);
-       else
-               smu_cmn_assign_power_profile(smu);
 
        return ret;
 }
index f89c487dce723d15488c5f66570e22f4f13d0fe5..cd3e9ba3eff442ac03ebcb011506f89b8c8d2828 100644 (file)
@@ -1081,7 +1081,7 @@ static int vangogh_set_power_profile_mode(struct smu_context *smu, long *input,
        }
 
        ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ActiveProcessNotify,
-                                   smu->workload_mask,
+                                   1 << workload_type,
                                    NULL);
        if (ret) {
                dev_err_once(smu->adev->dev, "Fail to set workload type %d\n",
@@ -1089,7 +1089,7 @@ static int vangogh_set_power_profile_mode(struct smu_context *smu, long *input,
                return ret;
        }
 
-       smu_cmn_assign_power_profile(smu);
+       smu->power_profile_mode = profile_mode;
 
        return 0;
 }
index 75a9ea87f419af8bbdfecbb99941b21dcd9f5185..a34797f3576bf562029d56bacf7d167b49c93996 100644 (file)
@@ -892,14 +892,14 @@ static int renoir_set_power_profile_mode(struct smu_context *smu, long *input, u
        }
 
        ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ActiveProcessNotify,
-                                   smu->workload_mask,
+                                   1 << workload_type,
                                    NULL);
        if (ret) {
                dev_err_once(smu->adev->dev, "Fail to set workload type %d\n", workload_type);
                return ret;
        }
 
-       smu_cmn_assign_power_profile(smu);
+       smu->power_profile_mode = profile_mode;
 
        return 0;
 }
index 80c6b1e523aae0a02313dd5942289121bd49ffde..199bdd9720d3697bbd12ed1c01ee1f5401b0dabf 100644 (file)
@@ -2579,7 +2579,7 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,
        DpmActivityMonitorCoeffInt_t *activity_monitor =
                &(activity_monitor_external.DpmActivityMonitorCoeffInt);
        int workload_type, ret = 0;
-       u32 workload_mask;
+       u32 workload_mask, selected_workload_mask;
 
        smu->power_profile_mode = input[size];
 
@@ -2646,7 +2646,7 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,
        if (workload_type < 0)
                return -EINVAL;
 
-       workload_mask = 1 << workload_type;
+       selected_workload_mask = workload_mask = 1 << workload_type;
 
        /* Add optimizations for SMU13.0.0/10.  Reuse the power saving profile */
        if ((amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 0) &&
@@ -2661,22 +2661,12 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,
                        workload_mask |= 1 << workload_type;
        }
 
-       smu->workload_mask |= workload_mask;
        ret = smu_cmn_send_smc_msg_with_param(smu,
                                               SMU_MSG_SetWorkloadMask,
-                                              smu->workload_mask,
+                                              workload_mask,
                                               NULL);
-       if (!ret) {
-               smu_cmn_assign_power_profile(smu);
-               if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_POWERSAVING) {
-                       workload_type = smu_cmn_to_asic_specific_index(smu,
-                                                              CMN2ASIC_MAPPING_WORKLOAD,
-                                                              PP_SMC_POWER_PROFILE_FULLSCREEN3D);
-                       smu->power_profile_mode = smu->workload_mask & (1 << workload_type)
-                                                                               ? PP_SMC_POWER_PROFILE_FULLSCREEN3D
-                                                                               : PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;
-               }
-       }
+       if (!ret)
+               smu->workload_mask = selected_workload_mask;
 
        return ret;
 }
index 4fd0354bd312f2e225fb1cb121cba43054b35586..34c1e0c7e1e4940b7bbd77f3a3c00e34ab4844b0 100644 (file)
@@ -2595,14 +2595,13 @@ static int smu_v13_0_7_set_power_profile_mode(struct smu_context *smu, long *inp
                                                       smu->power_profile_mode);
        if (workload_type < 0)
                return -EINVAL;
-
        ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask,
-                                   smu->workload_mask, NULL);
+                                   1 << workload_type, NULL);
 
        if (ret)
                dev_err(smu->adev->dev, "[%s] Failed to set work load mask!", __func__);
        else
-               smu_cmn_assign_power_profile(smu);
+               smu->workload_mask = (1 << workload_type);
 
        return ret;
 }
index 687a0f5ac94f580f5105f65325c4511dbe52c5aa..98e01a06add8202dfe92f890fbc8f4978bceaaf4 100644 (file)
@@ -1817,11 +1817,12 @@ static int smu_v14_0_2_set_power_profile_mode(struct smu_context *smu,
        if (workload_type < 0)
                return -EINVAL;
 
-       ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask,
-                                                                                 smu->workload_mask, NULL);
-
+       ret = smu_cmn_send_smc_msg_with_param(smu,
+                                              SMU_MSG_SetWorkloadMask,
+                                              1 << workload_type,
+                                              NULL);
        if (!ret)
-               smu_cmn_assign_power_profile(smu);
+               smu->workload_mask = 1 << workload_type;
 
        return ret;
 }
index dbbd3759bff375e3feb3b9c14df18fb7b281f82c..0bc6fb7d7223aa35c2ad3b465198128b2897e39e 100644 (file)
@@ -1144,14 +1144,6 @@ int smu_cmn_set_mp1_state(struct smu_context *smu,
        return ret;
 }
 
-void smu_cmn_assign_power_profile(struct smu_context *smu)
-{
-       uint32_t index;
-       index = fls(smu->workload_mask);
-       index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0;
-       smu->power_profile_mode = smu->workload_setting[index];
-}
-
 bool smu_cmn_is_audio_func_enabled(struct amdgpu_device *adev)
 {
        struct pci_dev *p = NULL;
index 8a801e389659d1b6f7bc162a93de43761e7739bd..1de685defe85b19e3d2895ec33a2e95101c8ded8 100644 (file)
@@ -130,8 +130,6 @@ void smu_cmn_init_soft_gpu_metrics(void *table, uint8_t frev, uint8_t crev);
 int smu_cmn_set_mp1_state(struct smu_context *smu,
                          enum pp_mp1_state mp1_state);
 
-void smu_cmn_assign_power_profile(struct smu_context *smu);
-
 /*
  * Helper function to make sysfs_emit_at() happy. Align buf to
  * the current page boundary and record the offset.