Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amd/pm: Add zero RPM enabled OD setting support for SMU14.0.2

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

Tested on 9070 XT Hellhound

Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org # 6.12.x
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Tomasz Pakuła and committed by
Alex Deucher
b03f1810 7c246a05

+54 -1
+54 -1
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
··· 79 79 #define PP_OD_FEATURE_FAN_ACOUSTIC_TARGET 8 80 80 #define PP_OD_FEATURE_FAN_TARGET_TEMPERATURE 9 81 81 #define PP_OD_FEATURE_FAN_MINIMUM_PWM 10 82 + #define PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE 11 82 83 83 84 static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = { 84 85 MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1), ··· 1053 1052 od_min_setting = overdrive_lowerlimits->FanMinimumPwm; 1054 1053 od_max_setting = overdrive_upperlimits->FanMinimumPwm; 1055 1054 break; 1055 + case PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE: 1056 + od_min_setting = overdrive_lowerlimits->FanZeroRpmEnable; 1057 + od_max_setting = overdrive_upperlimits->FanZeroRpmEnable; 1058 + break; 1056 1059 default: 1057 1060 od_min_setting = od_max_setting = INT_MAX; 1058 1061 break; ··· 1332 1327 &min_value, 1333 1328 &max_value); 1334 1329 size += sysfs_emit_at(buf, size, "MINIMUM_PWM: %u %u\n", 1330 + min_value, max_value); 1331 + break; 1332 + 1333 + case SMU_OD_FAN_ZERO_RPM_ENABLE: 1334 + if (!smu_v14_0_2_is_od_feature_supported(smu, 1335 + PP_OD_FEATURE_ZERO_FAN_BIT)) 1336 + break; 1337 + 1338 + size += sysfs_emit_at(buf, size, "FAN_ZERO_RPM_ENABLE:\n"); 1339 + size += sysfs_emit_at(buf, size, "%d\n", 1340 + (int)od_table->OverDriveTable.FanZeroRpmEnable); 1341 + 1342 + size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE"); 1343 + smu_v14_0_2_get_od_setting_limits(smu, 1344 + PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE, 1345 + &min_value, 1346 + &max_value); 1347 + size += sysfs_emit_at(buf, size, "ZERO_RPM_ENABLE: %u %u\n", 1335 1348 min_value, max_value); 1336 1349 break; 1337 1350 ··· 2293 2270 OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_RETRIEVE | 2294 2271 OD_OPS_SUPPORT_FAN_TARGET_TEMPERATURE_SET | 2295 2272 OD_OPS_SUPPORT_FAN_MINIMUM_PWM_RETRIEVE | 2296 - OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET; 2273 + OD_OPS_SUPPORT_FAN_MINIMUM_PWM_SET | 2274 + OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_RETRIEVE | 2275 + OD_OPS_SUPPORT_FAN_ZERO_RPM_ENABLE_SET; 2297 2276 } 2298 2277 2299 2278 static int smu_v14_0_2_get_overdrive_table(struct smu_context *smu, ··· 2374 2349 user_od_table_bak.OverDriveTable.FanTargetTemperature; 2375 2350 user_od_table->OverDriveTable.FanMinimumPwm = 2376 2351 user_od_table_bak.OverDriveTable.FanMinimumPwm; 2352 + user_od_table->OverDriveTable.FanZeroRpmEnable = 2353 + user_od_table_bak.OverDriveTable.FanZeroRpmEnable; 2377 2354 } 2378 2355 2379 2356 smu_v14_0_2_set_supported_od_feature_mask(smu); ··· 2422 2395 } 2423 2396 od_table->OverDriveTable.FanMode = FAN_MODE_AUTO; 2424 2397 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT); 2398 + break; 2399 + case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE: 2400 + od_table->OverDriveTable.FanZeroRpmEnable = 2401 + boot_overdrive_table->OverDriveTable.FanZeroRpmEnable; 2402 + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 2425 2403 break; 2426 2404 case PP_OD_EDIT_ACOUSTIC_LIMIT: 2427 2405 od_table->OverDriveTable.AcousticLimitRpmThreshold = ··· 2708 2676 od_table->OverDriveTable.FanMinimumPwm = input[0]; 2709 2677 od_table->OverDriveTable.FanMode = FAN_MODE_AUTO; 2710 2678 od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_FAN_CURVE_BIT); 2679 + break; 2680 + 2681 + case PP_OD_EDIT_FAN_ZERO_RPM_ENABLE: 2682 + if (!smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_ZERO_FAN_BIT)) { 2683 + dev_warn(adev->dev, "Zero RPM setting not supported!\n"); 2684 + return -ENOTSUPP; 2685 + } 2686 + 2687 + smu_v14_0_2_get_od_setting_limits(smu, 2688 + PP_OD_FEATURE_FAN_ZERO_RPM_ENABLE, 2689 + &minimum, 2690 + &maximum); 2691 + if (input[0] < minimum || 2692 + input[0] > maximum) { 2693 + dev_info(adev->dev, "zero RPM enable setting(%ld) must be within [%d, %d]!\n", 2694 + input[0], minimum, maximum); 2695 + return -EINVAL; 2696 + } 2697 + 2698 + od_table->OverDriveTable.FanZeroRpmEnable = input[0]; 2699 + od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_ZERO_FAN_BIT); 2711 2700 break; 2712 2701 2713 2702 case PP_OD_RESTORE_DEFAULT_TABLE: