OverDriveTable.FanMinimumPwm and FeatureCtrlMask.PP_OD_FEATURE_FAN_LEGACY_BIT
have a hard dependency.
Invalid handling of this dependency leads to disabled thermal monitoring
and temperature boundary validation.

Fixes: 9710b84e2a6a ("drm/amd/pm: add overdrive support on smu v14.0.2/3")

Signed-off-by: Yang Wang <[email protected]>
---
 drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
index 2be080b4cbc3..bc1bfb618aa0 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
@@ -2390,6 +2390,7 @@ static int smu_v14_0_2_od_restore_table_single(struct 
smu_context *smu, long inp
                }
                od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
                od_table->OverDriveTable.FeatureCtrlMask |= 
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
+               od_table->OverDriveTable.FeatureCtrlMask &= 
BIT(PP_OD_FEATURE_FAN_LEGACY_BIT);
                break;
        case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
                od_table->OverDriveTable.FanZeroRpmEnable =
@@ -2418,7 +2419,8 @@ static int smu_v14_0_2_od_restore_table_single(struct 
smu_context *smu, long inp
                od_table->OverDriveTable.FanMinimumPwm =
                                        
boot_overdrive_table->OverDriveTable.FanMinimumPwm;
                od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
-               od_table->OverDriveTable.FeatureCtrlMask |= 
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
+               od_table->OverDriveTable.FeatureCtrlMask |= 
BIT(PP_OD_FEATURE_FAN_LEGACY_BIT);
+               od_table->OverDriveTable.FeatureCtrlMask &= 
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
                break;
        default:
                dev_info(adev->dev, "Invalid table index: %ld\n", input);
@@ -2588,6 +2590,7 @@ static int smu_v14_0_2_od_edit_dpm_table(struct 
smu_context *smu,
                od_table->OverDriveTable.FanLinearPwmPoints[input[0]] = 
input[2];
                od_table->OverDriveTable.FanMode = FAN_MODE_MANUAL_LINEAR;
                od_table->OverDriveTable.FeatureCtrlMask |= 
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
+               od_table->OverDriveTable.FeatureCtrlMask &= 
~BIT(PP_OD_FEATURE_FAN_LEGACY_BIT);
                break;
 
        case PP_OD_EDIT_ACOUSTIC_LIMIT:
@@ -2657,7 +2660,7 @@ static int smu_v14_0_2_od_edit_dpm_table(struct 
smu_context *smu,
                break;
 
        case PP_OD_EDIT_FAN_MINIMUM_PWM:
-               if (!smu_v14_0_2_is_od_feature_supported(smu, 
PP_OD_FEATURE_FAN_CURVE_BIT)) {
+               if (!smu_v14_0_2_is_od_feature_supported(smu, 
PP_OD_FEATURE_FAN_LEGACY_BIT)) {
                        dev_warn(adev->dev, "Fan curve setting not 
supported!\n");
                        return -ENOTSUPP;
                }
@@ -2675,7 +2678,8 @@ static int smu_v14_0_2_od_edit_dpm_table(struct 
smu_context *smu,
 
                od_table->OverDriveTable.FanMinimumPwm = input[0];
                od_table->OverDriveTable.FanMode = FAN_MODE_AUTO;
-               od_table->OverDriveTable.FeatureCtrlMask |= 
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
+               od_table->OverDriveTable.FeatureCtrlMask |= 
BIT(PP_OD_FEATURE_FAN_LEGACY_BIT);
+               od_table->OverDriveTable.FeatureCtrlMask &= 
BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
                break;
 
        case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE:
-- 
2.47.3

Reply via email to