Skip to content

Commit 6bfe777

Browse files
wylfenalexdeucher
authored andcommitted
drm/amd/pm: add zero RPM stop temperature OD setting support for SMU13
Together with the feature to enable or disable zero RPM in the last commit, it also makes sense to expose the OD setting determining under which temperature the fan should stop if zero RPM is enabled. Reviewed-by: Kenneth Feng <kenneth.feng@amd.com> Signed-off-by: Wolfgang Müller <wolf@oriole.systems> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent e89bd36 commit 6bfe777

File tree

8 files changed

+186
-2
lines changed

8 files changed

+186
-2
lines changed

Documentation/gpu/amdgpu/thermal.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ fan_zero_rpm_enable
106106
.. kernel-doc:: drivers/gpu/drm/amd/pm/amdgpu_pm.c
107107
:doc: fan_zero_rpm_enable
108108

109+
fan_zero_rpm_stop_temperature
110+
-----------------------------
111+
112+
.. kernel-doc:: drivers/gpu/drm/amd/pm/amdgpu_pm.c
113+
:doc: fan_zero_rpm_stop_temperature
114+
109115
GFXOFF
110116
======
111117

drivers/gpu/drm/amd/include/kgd_pp_interface.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ enum pp_clock_type {
120120
OD_FAN_TARGET_TEMPERATURE,
121121
OD_FAN_MINIMUM_PWM,
122122
OD_FAN_ZERO_RPM_ENABLE,
123+
OD_FAN_ZERO_RPM_STOP_TEMP,
123124
};
124125

125126
enum amd_pp_sensors {
@@ -201,6 +202,7 @@ enum PP_OD_DPM_TABLE_COMMAND {
201202
PP_OD_EDIT_FAN_TARGET_TEMPERATURE,
202203
PP_OD_EDIT_FAN_MINIMUM_PWM,
203204
PP_OD_EDIT_FAN_ZERO_RPM_ENABLE,
205+
PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP,
204206
};
205207

206208
struct pp_states_info {

drivers/gpu/drm/amd/pm/amdgpu_pm.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4163,6 +4163,63 @@ static umode_t fan_zero_rpm_enable_visible(struct amdgpu_device *adev)
41634163
return umode;
41644164
}
41654165

4166+
/**
4167+
* DOC: fan_zero_rpm_stop_temperature
4168+
*
4169+
* The amdgpu driver provides a sysfs API for checking and adjusting the
4170+
* zero RPM stop temperature feature.
4171+
*
4172+
* Reading back the file shows you the current setting and the permitted
4173+
* ranges if changable.
4174+
*
4175+
* Writing an integer to the file, change the setting accordingly.
4176+
*
4177+
* When you have finished the editing, write "c" (commit) to the file to commit
4178+
* your changes.
4179+
*
4180+
* If you want to reset to the default value, write "r" (reset) to the file to
4181+
* reset them.
4182+
*
4183+
* This setting works only if the Zero RPM setting is enabled. It adjusts the
4184+
* temperature below which the fan can stop.
4185+
*/
4186+
static ssize_t fan_zero_rpm_stop_temp_show(struct kobject *kobj,
4187+
struct kobj_attribute *attr,
4188+
char *buf)
4189+
{
4190+
struct od_kobj *container = container_of(kobj, struct od_kobj, kobj);
4191+
struct amdgpu_device *adev = (struct amdgpu_device *)container->priv;
4192+
4193+
return (ssize_t)amdgpu_retrieve_od_settings(adev, OD_FAN_ZERO_RPM_STOP_TEMP, buf);
4194+
}
4195+
4196+
static ssize_t fan_zero_rpm_stop_temp_store(struct kobject *kobj,
4197+
struct kobj_attribute *attr,
4198+
const char *buf,
4199+
size_t count)
4200+
{
4201+
struct od_kobj *container = container_of(kobj, struct od_kobj, kobj);
4202+
struct amdgpu_device *adev = (struct amdgpu_device *)container->priv;
4203+
4204+
return (ssize_t)amdgpu_distribute_custom_od_settings(adev,
4205+
PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP,
4206+
buf,
4207+
count);
4208+
}
4209+
4210+
static umode_t fan_zero_rpm_stop_temp_visible(struct amdgpu_device *adev)
4211+
{
4212+
umode_t umode = 0000;
4213+
4214+
if (adev->pm.od_feature_mask & OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE)
4215+
umode |= S_IRUSR | S_IRGRP | S_IROTH;
4216+
4217+
if (adev->pm.od_feature_mask & OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET)
4218+
umode |= S_IWUSR;
4219+
4220+
return umode;
4221+
}
4222+
41664223
static struct od_feature_set amdgpu_od_set = {
41674224
.containers = {
41684225
[0] = {
@@ -4216,6 +4273,14 @@ static struct od_feature_set amdgpu_od_set = {
42164273
.store = fan_zero_rpm_enable_store,
42174274
},
42184275
},
4276+
[6] = {
4277+
.name = "fan_zero_rpm_stop_temperature",
4278+
.ops = {
4279+
.is_visible = fan_zero_rpm_stop_temp_visible,
4280+
.show = fan_zero_rpm_stop_temp_show,
4281+
.store = fan_zero_rpm_stop_temp_store,
4282+
},
4283+
},
42194284
},
42204285
},
42214286
},

drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ struct config_table_setting
330330
#define OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET BIT(9)
331331
#define OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE BIT(10)
332332
#define OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET BIT(11)
333+
#define OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE BIT(12)
334+
#define OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET BIT(13)
333335

334336
struct amdgpu_pm {
335337
struct mutex mutex;

drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2897,6 +2897,8 @@ static enum smu_clk_type smu_convert_to_smuclk(enum pp_clock_type type)
28972897
clk_type = SMU_OD_FAN_MINIMUM_PWM; break;
28982898
case OD_FAN_ZERO_RPM_ENABLE:
28992899
clk_type = SMU_OD_FAN_ZERO_RPM_ENABLE; break;
2900+
case OD_FAN_ZERO_RPM_STOP_TEMP:
2901+
clk_type = SMU_OD_FAN_ZERO_RPM_STOP_TEMP; break;
29002902
default:
29012903
clk_type = SMU_CLK_COUNT; break;
29022904
}

drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ enum smu_clk_type {
314314
SMU_OD_FAN_TARGET_TEMPERATURE,
315315
SMU_OD_FAN_MINIMUM_PWM,
316316
SMU_OD_FAN_ZERO_RPM_ENABLE,
317+
SMU_OD_FAN_ZERO_RPM_STOP_TEMP,
317318
SMU_CLK_COUNT,
318319
};
319320

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
#define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9
109109
#define PP_OD_FEATURE_FAN_MINIMUM_PWM 10
110110
#define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11
111+
#define PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP 12
111112

112113
#define LINK_SPEED_MAX 3
113114

@@ -1135,6 +1136,10 @@ static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
11351136
od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable;
11361137
od_max_setting = overdrive_upperlimits->FanZeroRpmEnable;
11371138
break;
1139+
case PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP:
1140+
od_min_setting = overdrive_lowerlimits->FanZeroRpmStopTemp;
1141+
od_max_setting = overdrive_upperlimits->FanZeroRpmStopTemp;
1142+
break;
11381143
default:
11391144
od_min_setting = od_max_setting = INT_MAX;
11401145
break;
@@ -1473,6 +1478,24 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
14731478
min_value, max_value);
14741479
break;
14751480

1481+
case SMU_OD_FAN_ZERO_RPM_STOP_TEMP:
1482+
if (!smu_v13_0_0_is_od_feature_supported(smu,
1483+
PP_OD_FEATURE_ZERO_FAN_BIT))
1484+
break;
1485+
1486+
size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_STOP_TEMPERATURE:\n");
1487+
size += sysfs_emit_at(buf, size, "%d\n",
1488+
(int)od_table->OverDriveTable.FanZeroRpmStopTemp);
1489+
1490+
size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
1491+
smu_v13_0_0_get_od_setting_limits(smu,
1492+
PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
1493+
&min_value,
1494+
&max_value);
1495+
size += sysfs_emit_at(buf, size, "ZERO_RPM_STOP_TEMPERATURE: %u %u\n",
1496+
min_value, max_value);
1497+
break;
1498+
14761499
case SMU_OD_RANGE:
14771500
if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) &&
14781501
!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) &&
@@ -1575,6 +1598,11 @@ static int smu_v13_0_0_od_restore_table_single(struct smu_context *smu, long inp
15751598
boot_overdrive_table->OverDriveTable.FanZeroRpmEnable;
15761599
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
15771600
break;
1601+
case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP:
1602+
od_table->OverDriveTable.FanZeroRpmStopTemp =
1603+
boot_overdrive_table->OverDriveTable.FanZeroRpmStopTemp;
1604+
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
1605+
break;
15781606
default:
15791607
dev_info(adev->dev, "Invalid table index: %ld\n", input);
15801608
return -EINVAL;
@@ -1889,6 +1917,27 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
18891917
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
18901918
break;
18911919

1920+
case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP:
1921+
if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) {
1922+
dev_warn(adev->dev, "Zero RPM setting not supported!\n");
1923+
return -ENOTSUPP;
1924+
}
1925+
1926+
smu_v13_0_0_get_od_setting_limits(smu,
1927+
PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
1928+
&minimum,
1929+
&maximum);
1930+
if (input[0] < minimum ||
1931+
input[0] > maximum) {
1932+
dev_info(adev->dev, "zero RPM stop temperature setting(%ld) must be within [%d, %d]!\n",
1933+
input[0], minimum, maximum);
1934+
return -EINVAL;
1935+
}
1936+
1937+
od_table->OverDriveTable.FanZeroRpmStopTemp = input[0];
1938+
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
1939+
break;
1940+
18921941
case PP_OD_RESTORE_DEFAULT_TABLE:
18931942
if (size == 1) {
18941943
ret = smu_v13_0_0_od_restore_table_single(smu, input[0]);
@@ -2161,7 +2210,9 @@ static void smu_v13_0_0_set_supported_od_feature_mask(struct smu_context *smu)
21612210
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE |
21622211
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET |
21632212
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE |
2164-
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET;
2213+
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET |
2214+
OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE |
2215+
OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET;
21652216
}
21662217

21672218
static int smu_v13_0_0_set_default_od_settings(struct smu_context *smu)
@@ -2229,6 +2280,8 @@ static int smu_v13_0_0_set_default_od_settings(struct smu_context *smu)
22292280
user_od_table_bak.OverDriveTable.FanMinimumPwm;
22302281
user_od_table->OverDriveTable.FanZeroRpmEnable =
22312282
user_od_table_bak.OverDriveTable.FanZeroRpmEnable;
2283+
user_od_table->OverDriveTable.FanZeroRpmStopTemp =
2284+
user_od_table_bak.OverDriveTable.FanZeroRpmStopTemp;
22322285
}
22332286

22342287
smu_v13_0_0_set_supported_od_feature_mask(smu);

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
#define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9
8585
#define PP_OD_FEATURE_FAN_MINIMUM_PWM 10
8686
#define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11
87+
#define PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP 12
8788

8889
#define LINK_SPEED_MAX 3
8990

@@ -1124,6 +1125,10 @@ static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
11241125
od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable;
11251126
od_max_setting = overdrive_upperlimits->FanZeroRpmEnable;
11261127
break;
1128+
case PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP:
1129+
od_min_setting = overdrive_lowerlimits->FanZeroRpmStopTemp;
1130+
od_max_setting = overdrive_upperlimits->FanZeroRpmStopTemp;
1131+
break;
11271132
default:
11281133
od_min_setting = od_max_setting = INT_MAX;
11291134
break;
@@ -1462,6 +1467,24 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
14621467
min_value, max_value);
14631468
break;
14641469

1470+
case SMU_OD_FAN_ZERO_RPM_STOP_TEMP:
1471+
if (!smu_v13_0_7_is_od_feature_supported(smu,
1472+
PP_OD_FEATURE_ZERO_FAN_BIT))
1473+
break;
1474+
1475+
size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_STOP_TEMPERATURE:\n");
1476+
size += sysfs_emit_at(buf, size, "%d\n",
1477+
(int)od_table->OverDriveTable.FanZeroRpmStopTemp);
1478+
1479+
size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
1480+
smu_v13_0_7_get_od_setting_limits(smu,
1481+
PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
1482+
&min_value,
1483+
&max_value);
1484+
size += sysfs_emit_at(buf, size, "ZERO_RPM_STOP_TEMPERATURE: %u %u\n",
1485+
min_value, max_value);
1486+
break;
1487+
14651488
case SMU_OD_RANGE:
14661489
if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) &&
14671490
!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) &&
@@ -1563,6 +1586,11 @@ static int smu_v13_0_7_od_restore_table_single(struct smu_context *smu, long inp
15631586
boot_overdrive_table->OverDriveTable.FanZeroRpmEnable;
15641587
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
15651588
break;
1589+
case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP:
1590+
od_table->OverDriveTable.FanZeroRpmStopTemp =
1591+
boot_overdrive_table->OverDriveTable.FanZeroRpmStopTemp;
1592+
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
1593+
break;
15661594
default:
15671595
dev_info(adev->dev, "Invalid table index: %ld\n", input);
15681596
return -EINVAL;
@@ -1877,6 +1905,27 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
18771905
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
18781906
break;
18791907

1908+
case PP_OD_EDIT_FAN_ZERO_RPM_STOP_TEMP:
1909+
if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) {
1910+
dev_warn(adev->dev, "Zero RPM setting not supported!\n");
1911+
return -ENOTSUPP;
1912+
}
1913+
1914+
smu_v13_0_7_get_od_setting_limits(smu,
1915+
PP_OD_FEATURE_FAN_ZERO_RPM_STOP_TEMP,
1916+
&minimum,
1917+
&maximum);
1918+
if (input[0] < minimum ||
1919+
input[0] > maximum) {
1920+
dev_info(adev->dev, "zero RPM stop temperature setting(%ld) must be within [%d, %d]!\n",
1921+
input[0], minimum, maximum);
1922+
return -EINVAL;
1923+
}
1924+
1925+
od_table->OverDriveTable.FanZeroRpmStopTemp = input[0];
1926+
od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
1927+
break;
1928+
18801929
case PP_OD_RESTORE_DEFAULT_TABLE:
18811930
if (size == 1) {
18821931
ret = smu_v13_0_7_od_restore_table_single(smu, input[0]);
@@ -2145,7 +2194,9 @@ static void smu_v13_0_7_set_supported_od_feature_mask(struct smu_context *smu)
21452194
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE |
21462195
OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET |
21472196
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE |
2148-
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET;
2197+
OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET |
2198+
OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_RETRIEVE |
2199+
OD_OPS_SUPPORT_FAN_ZERO_RPM_STOP_TEMP_SET;
21492200
}
21502201

21512202
static int smu_v13_0_7_set_default_od_settings(struct smu_context *smu)
@@ -2213,6 +2264,8 @@ static int smu_v13_0_7_set_default_od_settings(struct smu_context *smu)
22132264
user_od_table_bak.OverDriveTable.FanMinimumPwm;
22142265
user_od_table->OverDriveTable.FanZeroRpmEnable =
22152266
user_od_table_bak.OverDriveTable.FanZeroRpmEnable;
2267+
user_od_table->OverDriveTable.FanZeroRpmStopTemp =
2268+
user_od_table_bak.OverDriveTable.FanZeroRpmStopTemp;
22162269
}
22172270

22182271
smu_v13_0_7_set_supported_od_feature_mask(smu);

0 commit comments

Comments
 (0)