|
54 | 54 |
|
55 | 55 | #define FEATURE_MASK(feature) (1ULL << feature) |
56 | 56 |
|
| 57 | +#define SMU_13_0_4_UMD_PSTATE_GFXCLK 938 |
| 58 | +#define SMU_13_0_4_UMD_PSTATE_SOCCLK 938 |
| 59 | +#define SMU_13_0_4_UMD_PSTATE_FCLK 1875 |
| 60 | + |
57 | 61 | #define SMC_DPM_FEATURE ( \ |
58 | 62 | FEATURE_MASK(FEATURE_CCLK_DPM_BIT) | \ |
59 | 63 | FEATURE_MASK(FEATURE_VCN_DPM_BIT) | \ |
@@ -908,6 +912,50 @@ static int smu_v13_0_4_force_clk_levels(struct smu_context *smu, |
908 | 912 | return ret; |
909 | 913 | } |
910 | 914 |
|
| 915 | +static int smu_v13_0_4_get_dpm_profile_freq(struct smu_context *smu, |
| 916 | + enum amd_dpm_forced_level level, |
| 917 | + enum smu_clk_type clk_type, |
| 918 | + uint32_t *min_clk, |
| 919 | + uint32_t *max_clk) |
| 920 | +{ |
| 921 | + int ret = 0; |
| 922 | + uint32_t clk_limit = 0; |
| 923 | + |
| 924 | + switch (clk_type) { |
| 925 | + case SMU_GFXCLK: |
| 926 | + case SMU_SCLK: |
| 927 | + clk_limit = SMU_13_0_4_UMD_PSTATE_GFXCLK; |
| 928 | + if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) |
| 929 | + smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &clk_limit); |
| 930 | + else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) |
| 931 | + smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, &clk_limit, NULL); |
| 932 | + break; |
| 933 | + case SMU_SOCCLK: |
| 934 | + clk_limit = SMU_13_0_4_UMD_PSTATE_SOCCLK; |
| 935 | + if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) |
| 936 | + smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SOCCLK, NULL, &clk_limit); |
| 937 | + break; |
| 938 | + case SMU_FCLK: |
| 939 | + clk_limit = SMU_13_0_4_UMD_PSTATE_FCLK; |
| 940 | + if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) |
| 941 | + smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &clk_limit); |
| 942 | + else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) |
| 943 | + smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, &clk_limit, NULL); |
| 944 | + break; |
| 945 | + case SMU_VCLK: |
| 946 | + smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_VCLK, NULL, &clk_limit); |
| 947 | + break; |
| 948 | + case SMU_DCLK: |
| 949 | + smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_DCLK, NULL, &clk_limit); |
| 950 | + break; |
| 951 | + default: |
| 952 | + ret = -EINVAL; |
| 953 | + break; |
| 954 | + } |
| 955 | + *min_clk = *max_clk = clk_limit; |
| 956 | + return ret; |
| 957 | +} |
| 958 | + |
911 | 959 | static int smu_v13_0_4_set_performance_level(struct smu_context *smu, |
912 | 960 | enum amd_dpm_forced_level level) |
913 | 961 | { |
@@ -955,7 +1003,11 @@ static int smu_v13_0_4_set_performance_level(struct smu_context *smu, |
955 | 1003 | case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK: |
956 | 1004 | case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK: |
957 | 1005 | case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK: |
958 | | - /* Temporarily do nothing since the optimal clocks haven't been provided yet */ |
| 1006 | + smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_SCLK, &sclk_min, &sclk_max); |
| 1007 | + smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_FCLK, &fclk_min, &fclk_max); |
| 1008 | + smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_SOCCLK, &socclk_min, &socclk_max); |
| 1009 | + smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_VCLK, &vclk_min, &vclk_max); |
| 1010 | + smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_DCLK, &dclk_min, &dclk_max); |
959 | 1011 | break; |
960 | 1012 | case AMD_DPM_FORCED_LEVEL_MANUAL: |
961 | 1013 | case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT: |
|
0 commit comments