RE: [PATCH 2/2] drm/amd/pm: add zero RPM stop temp OD setting support for SMU 14.0.2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[AMD Official Use Only - AMD Internal Distribution Only]

-----Original Message-----
From: Tomasz Pakuła <tomasz.pakula.oficjalny@xxxxxxxxx>
Sent: Sunday, March 16, 2025 4:16 AM
To: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Feng, Kenneth <Kenneth.Feng@xxxxxxx>; Wang, Yang(Kevin) <KevinYang.Wang@xxxxxxx>
Cc: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
Subject: [PATCH 2/2] drm/amd/pm: add zero RPM stop temp OD setting support for SMU 14.0.2

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


Hook up zero RPM stop temperature for 9070 and 9070 XT based on RDNA3 (smu 13.0.0 and 13.0.7) code.

Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@xxxxxxxxx>
---
 .../swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h |  3 +-  .../drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c  | 50 ++++++++++++++++++-
 2 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h
index c2fd0a4a13e5..a5eba7b91e2f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h
@@ -846,9 +846,10 @@ typedef struct {
   uint16_t               FanTargetTemperature; // Degree Celcius
   //zero fan
   uint8_t                FanZeroRpmEnable;
+  uint8_t                FanZeroRpmStopTemp;
   //temperature
   uint8_t                MaxOpTemp;
-  uint8_t                Padding1[2];
+  uint8_t                Padding1;
[Kenneth] - This change on this file is not required. The latest version on drm-next has the change.
Could you please confirm?
Thanks


   //Full Ctrl
   uint16_t               GfxVoltageFullCtrlMode;
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 fedf0c8c4741..4e7eed0cc41c 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
@@ -80,6 +80,7 @@
 #define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE           9
 #define PP_OD_FEATURE_FAN_MINIMUM_PWM                  10
 #define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE              11
+#define PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP           12

 static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = {
        MSG_MAP(TestMessage,                    PPSMC_MSG_TestMessage,                 1),
@@ -1057,6 +1058,10 @@ static void smu_v14_0_2_get_od_setting_limits(struct smu_context *smu,
                od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable;
                od_max_setting = overdrive_upperlimits->FanZeroRpmEnable;
                break;
+       case PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP:
+               od_min_setting = overdrive_lowerlimits->FanZeroRpmStopTemp;
+               od_max_setting = overdrive_upperlimits->FanZeroRpmStopTemp;
+               break;
        default:
                od_min_setting = od_max_setting = INT_MAX;
                break;
@@ -1360,6 +1365,24 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
                                      min_value, max_value);
                break;

+       case SMU_OD_FAN_ZERO_RPM_STOP_TEMP:
+               if (!smu_v14_0_2_is_od_feature_supported(smu,
+                                                        PP_OD_FEATURE_ZERO_FAN_BIT))
+                       break;
+
+               size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_STOP_TEMPERATURE:\n");
+               size += sysfs_emit_at(buf, size, "%d\n",
+
+ (int)od_table->OverDriveTable.FanZeroRpmStopTemp);
+
+               size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
+               smu_v14_0_2_get_od_setting_limits(smu,
+                                                 PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
+                                                 &min_value,
+                                                 &max_value);
+               size += sysfs_emit_at(buf, size, "ZERO_RPM_STOP_TEMPERATURE: %u %u\n",
+                                     min_value, max_value);
+               break;
+
        case SMU_OD_RANGE:
                if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) &&
                    !smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) && @@ -2306,7 +2329,9 @@ static void smu_v14_0_2_set_supported_od_feature_mask(struct smu_context *smu)
                                            OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE |
                                            OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET |
                                            OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE |
-                                           OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET;
+                                           OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET |
+                                           OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE |
+
+ OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET;
 }

 static int smu_v14_0_2_get_overdrive_table(struct smu_context *smu, @@ -2387,6 +2412,8 @@ static int smu_v14_0_2_set_default_od_settings(struct smu_context *smu)
                        user_od_table_bak.OverDriveTable.FanMinimumPwm;
                user_od_table->OverDriveTable.FanZeroRpmEnable =
                        user_od_table_bak.OverDriveTable.FanZeroRpmEnable;
+               user_od_table->OverDriveTable.FanZeroRpmStopTemp =
+
+ user_od_table_bak.OverDriveTable.FanZeroRpmStopTemp;
        }

        smu_v14_0_2_set_supported_od_feature_mask(smu);
@@ -2754,6 +2781,27 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
                od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
                break;

+       case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP:
+               if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) {
+                       dev_warn(adev->dev, "Zero RPM setting not supported!\n");
+                       return -ENOTSUPP;
+               }
+
+               smu_v14_0_2_get_od_setting_limits(smu,
+                                                 PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
+                                                 &minimum,
+                                                 &maximum);
+               if (input[0] < minimum ||
+                   input[0] > maximum) {
+                       dev_info(adev->dev, "zero RPM stop temperature setting(%ld) must be within [%d, %d]!\n",
+                                input[0], minimum, maximum);
+                       return -EINVAL;
+               }
+
+               od_table->OverDriveTable.FanZeroRpmStopTemp = input[0];
+               od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
+               break;
+
        case PP_OD_RESTORE_DEFAULT_TABLE:
                if (size == 1) {
                        ret = smu_v14_0_2_od_restore_table_single(smu, input[0]);
--
2.48.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux