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

drm/amd/pm: update the power cap setting

update the power cap setting for smu_v13.0.0/smu_v13.0.7

Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2356
Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Kenneth Feng and committed by
Alex Deucher
bba8200a 42ffb3c3

+104 -4
+52 -2
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
··· 2357 2357 PPTable_t *pptable = table_context->driver_pptable; 2358 2358 SkuTable_t *skutable = &pptable->SkuTable; 2359 2359 uint32_t power_limit, od_percent_upper, od_percent_lower; 2360 + uint32_t msg_limit = skutable->MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC]; 2360 2361 2361 2362 if (smu_v13_0_get_current_power_limit(smu, &power_limit)) 2362 2363 power_limit = smu->adev->pm.ac_power ? ··· 2381 2380 od_percent_upper, od_percent_lower, power_limit); 2382 2381 2383 2382 if (max_power_limit) { 2384 - *max_power_limit = power_limit * (100 + od_percent_upper); 2383 + *max_power_limit = msg_limit * (100 + od_percent_upper); 2385 2384 *max_power_limit /= 100; 2386 2385 } 2387 2386 ··· 2961 2960 } 2962 2961 } 2963 2962 2963 + static int smu_v13_0_0_set_power_limit(struct smu_context *smu, 2964 + enum smu_ppt_limit_type limit_type, 2965 + uint32_t limit) 2966 + { 2967 + PPTable_t *pptable = smu->smu_table.driver_pptable; 2968 + SkuTable_t *skutable = &pptable->SkuTable; 2969 + uint32_t msg_limit = skutable->MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC]; 2970 + struct smu_table_context *table_context = &smu->smu_table; 2971 + OverDriveTableExternal_t *od_table = 2972 + (OverDriveTableExternal_t *)table_context->overdrive_table; 2973 + int ret = 0; 2974 + 2975 + if (limit_type != SMU_DEFAULT_PPT_LIMIT) 2976 + return -EINVAL; 2977 + 2978 + if (limit <= msg_limit) { 2979 + if (smu->current_power_limit > msg_limit) { 2980 + od_table->OverDriveTable.Ppt = 0; 2981 + od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_PPT_BIT; 2982 + 2983 + ret = smu_v13_0_0_upload_overdrive_table(smu, od_table); 2984 + if (ret) { 2985 + dev_err(smu->adev->dev, "Failed to upload overdrive table!\n"); 2986 + return ret; 2987 + } 2988 + } 2989 + return smu_v13_0_set_power_limit(smu, limit_type, limit); 2990 + } else if (smu->od_enabled) { 2991 + ret = smu_v13_0_set_power_limit(smu, limit_type, msg_limit); 2992 + if (ret) 2993 + return ret; 2994 + 2995 + od_table->OverDriveTable.Ppt = (limit * 100) / msg_limit - 100; 2996 + od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_PPT_BIT; 2997 + 2998 + ret = smu_v13_0_0_upload_overdrive_table(smu, od_table); 2999 + if (ret) { 3000 + dev_err(smu->adev->dev, "Failed to upload overdrive table!\n"); 3001 + return ret; 3002 + } 3003 + 3004 + smu->current_power_limit = limit; 3005 + } else { 3006 + return -EINVAL; 3007 + } 3008 + 3009 + return 0; 3010 + } 3011 + 2964 3012 static const struct pptable_funcs smu_v13_0_0_ppt_funcs = { 2965 3013 .get_allowed_feature_mask = smu_v13_0_0_get_allowed_feature_mask, 2966 3014 .set_default_dpm_table = smu_v13_0_0_set_default_dpm_table, ··· 3064 3014 .set_fan_control_mode = smu_v13_0_set_fan_control_mode, 3065 3015 .enable_mgpu_fan_boost = smu_v13_0_0_enable_mgpu_fan_boost, 3066 3016 .get_power_limit = smu_v13_0_0_get_power_limit, 3067 - .set_power_limit = smu_v13_0_set_power_limit, 3017 + .set_power_limit = smu_v13_0_0_set_power_limit, 3068 3018 .set_power_source = smu_v13_0_set_power_source, 3069 3019 .get_power_profile_mode = smu_v13_0_0_get_power_profile_mode, 3070 3020 .set_power_profile_mode = smu_v13_0_0_set_power_profile_mode,
+52 -2
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
··· 2321 2321 PPTable_t *pptable = table_context->driver_pptable; 2322 2322 SkuTable_t *skutable = &pptable->SkuTable; 2323 2323 uint32_t power_limit, od_percent_upper, od_percent_lower; 2324 + uint32_t msg_limit = skutable->MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC]; 2324 2325 2325 2326 if (smu_v13_0_get_current_power_limit(smu, &power_limit)) 2326 2327 power_limit = smu->adev->pm.ac_power ? ··· 2345 2344 od_percent_upper, od_percent_lower, power_limit); 2346 2345 2347 2346 if (max_power_limit) { 2348 - *max_power_limit = power_limit * (100 + od_percent_upper); 2347 + *max_power_limit = msg_limit * (100 + od_percent_upper); 2349 2348 *max_power_limit /= 100; 2350 2349 } 2351 2350 ··· 2546 2545 return smu->smc_fw_version > 0x00524600; 2547 2546 } 2548 2547 2548 + static int smu_v13_0_7_set_power_limit(struct smu_context *smu, 2549 + enum smu_ppt_limit_type limit_type, 2550 + uint32_t limit) 2551 + { 2552 + PPTable_t *pptable = smu->smu_table.driver_pptable; 2553 + SkuTable_t *skutable = &pptable->SkuTable; 2554 + uint32_t msg_limit = skutable->MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC]; 2555 + struct smu_table_context *table_context = &smu->smu_table; 2556 + OverDriveTableExternal_t *od_table = 2557 + (OverDriveTableExternal_t *)table_context->overdrive_table; 2558 + int ret = 0; 2559 + 2560 + if (limit_type != SMU_DEFAULT_PPT_LIMIT) 2561 + return -EINVAL; 2562 + 2563 + if (limit <= msg_limit) { 2564 + if (smu->current_power_limit > msg_limit) { 2565 + od_table->OverDriveTable.Ppt = 0; 2566 + od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_PPT_BIT; 2567 + 2568 + ret = smu_v13_0_7_upload_overdrive_table(smu, od_table); 2569 + if (ret) { 2570 + dev_err(smu->adev->dev, "Failed to upload overdrive table!\n"); 2571 + return ret; 2572 + } 2573 + } 2574 + return smu_v13_0_set_power_limit(smu, limit_type, limit); 2575 + } else if (smu->od_enabled) { 2576 + ret = smu_v13_0_set_power_limit(smu, limit_type, msg_limit); 2577 + if (ret) 2578 + return ret; 2579 + 2580 + od_table->OverDriveTable.Ppt = (limit * 100) / msg_limit - 100; 2581 + od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_PPT_BIT; 2582 + 2583 + ret = smu_v13_0_7_upload_overdrive_table(smu, od_table); 2584 + if (ret) { 2585 + dev_err(smu->adev->dev, "Failed to upload overdrive table!\n"); 2586 + return ret; 2587 + } 2588 + 2589 + smu->current_power_limit = limit; 2590 + } else { 2591 + return -EINVAL; 2592 + } 2593 + 2594 + return 0; 2595 + } 2596 + 2549 2597 static const struct pptable_funcs smu_v13_0_7_ppt_funcs = { 2550 2598 .get_allowed_feature_mask = smu_v13_0_7_get_allowed_feature_mask, 2551 2599 .set_default_dpm_table = smu_v13_0_7_set_default_dpm_table, ··· 2646 2596 .set_fan_control_mode = smu_v13_0_set_fan_control_mode, 2647 2597 .enable_mgpu_fan_boost = smu_v13_0_7_enable_mgpu_fan_boost, 2648 2598 .get_power_limit = smu_v13_0_7_get_power_limit, 2649 - .set_power_limit = smu_v13_0_set_power_limit, 2599 + .set_power_limit = smu_v13_0_7_set_power_limit, 2650 2600 .set_power_source = smu_v13_0_set_power_source, 2651 2601 .get_power_profile_mode = smu_v13_0_7_get_power_profile_mode, 2652 2602 .set_power_profile_mode = smu_v13_0_7_set_power_profile_mode,