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

drm/amdgpu:/navi10: use the ODCAP enum to index the caps array

Rather than the FEATURE_ID flags. Avoids a possible reading past
the end of the array.

Reviewed-by: Evan Quan <evan.quan@amd.com>
Reported-by: Aleksandr Mezin <mezin.alexander@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org # 5.5.x

+11 -11
+11 -11
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
··· 736 736 return dpm_desc->SnapToDiscrete == 0 ? true : false; 737 737 } 738 738 739 - static inline bool navi10_od_feature_is_supported(struct smu_11_0_overdrive_table *od_table, enum SMU_11_0_ODFEATURE_ID feature) 739 + static inline bool navi10_od_feature_is_supported(struct smu_11_0_overdrive_table *od_table, enum SMU_11_0_ODFEATURE_CAP cap) 740 740 { 741 - return od_table->cap[feature]; 741 + return od_table->cap[cap]; 742 742 } 743 743 744 744 static void navi10_od_setting_get_range(struct smu_11_0_overdrive_table *od_table, ··· 846 846 case SMU_OD_SCLK: 847 847 if (!smu->od_enabled || !od_table || !od_settings) 848 848 break; 849 - if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_GFXCLK_LIMITS)) 849 + if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_GFXCLK_LIMITS)) 850 850 break; 851 851 size += sprintf(buf + size, "OD_SCLK:\n"); 852 852 size += sprintf(buf + size, "0: %uMhz\n1: %uMhz\n", od_table->GfxclkFmin, od_table->GfxclkFmax); ··· 854 854 case SMU_OD_MCLK: 855 855 if (!smu->od_enabled || !od_table || !od_settings) 856 856 break; 857 - if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_UCLK_MAX)) 857 + if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_UCLK_MAX)) 858 858 break; 859 859 size += sprintf(buf + size, "OD_MCLK:\n"); 860 860 size += sprintf(buf + size, "1: %uMHz\n", od_table->UclkFmax); ··· 862 862 case SMU_OD_VDDC_CURVE: 863 863 if (!smu->od_enabled || !od_table || !od_settings) 864 864 break; 865 - if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_GFXCLK_CURVE)) 865 + if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_GFXCLK_CURVE)) 866 866 break; 867 867 size += sprintf(buf + size, "OD_VDDC_CURVE:\n"); 868 868 for (i = 0; i < 3; i++) { ··· 887 887 break; 888 888 size = sprintf(buf, "%s:\n", "OD_RANGE"); 889 889 890 - if (navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_GFXCLK_LIMITS)) { 890 + if (navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_GFXCLK_LIMITS)) { 891 891 navi10_od_setting_get_range(od_settings, SMU_11_0_ODSETTING_GFXCLKFMIN, 892 892 &min_value, NULL); 893 893 navi10_od_setting_get_range(od_settings, SMU_11_0_ODSETTING_GFXCLKFMAX, ··· 896 896 min_value, max_value); 897 897 } 898 898 899 - if (navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_UCLK_MAX)) { 899 + if (navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_UCLK_MAX)) { 900 900 navi10_od_setting_get_range(od_settings, SMU_11_0_ODSETTING_UCLKFMAX, 901 901 &min_value, &max_value); 902 902 size += sprintf(buf + size, "MCLK: %7uMhz %10uMhz\n", 903 903 min_value, max_value); 904 904 } 905 905 906 - if (navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_GFXCLK_CURVE)) { 906 + if (navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_GFXCLK_CURVE)) { 907 907 navi10_od_setting_get_range(od_settings, SMU_11_0_ODSETTING_VDDGFXCURVEFREQ_P1, 908 908 &min_value, &max_value); 909 909 size += sprintf(buf + size, "VDDC_CURVE_SCLK[0]: %7uMhz %10uMhz\n", ··· 2056 2056 2057 2057 switch (type) { 2058 2058 case PP_OD_EDIT_SCLK_VDDC_TABLE: 2059 - if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_GFXCLK_LIMITS)) { 2059 + if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_GFXCLK_LIMITS)) { 2060 2060 pr_warn("GFXCLK_LIMITS not supported!\n"); 2061 2061 return -ENOTSUPP; 2062 2062 } ··· 2102 2102 } 2103 2103 break; 2104 2104 case PP_OD_EDIT_MCLK_VDDC_TABLE: 2105 - if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_UCLK_MAX)) { 2105 + if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_UCLK_MAX)) { 2106 2106 pr_warn("UCLK_MAX not supported!\n"); 2107 2107 return -ENOTSUPP; 2108 2108 } ··· 2143 2143 } 2144 2144 break; 2145 2145 case PP_OD_EDIT_VDDC_CURVE: 2146 - if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODFEATURE_GFXCLK_CURVE)) { 2146 + if (!navi10_od_feature_is_supported(od_settings, SMU_11_0_ODCAP_GFXCLK_CURVE)) { 2147 2147 pr_warn("GFXCLK_CURVE not supported!\n"); 2148 2148 return -ENOTSUPP; 2149 2149 }