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

drm/amd/pm: Vangogh: Add new gpu_metrics_v2_4 to acquire gpu_metrics

To acquire the voltage and current info from gpu_metrics interface,
but gpu_metrics_v2_3 doesn't contain them, and to be backward compatible,
add new gpu_metrics_v2_4 structure.

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Acked-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Wenyou Yang <WenYou.Yang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Wenyou Yang and committed by
Alex Deucher
41cec40b 30b59910

+172 -9
+69
drivers/gpu/drm/amd/include/kgd_pp_interface.h
··· 892 892 uint16_t average_temperature_core[8]; // average CPU core temperature on APUs 893 893 uint16_t average_temperature_l3[2]; 894 894 }; 895 + 896 + struct gpu_metrics_v2_4 { 897 + struct metrics_table_header common_header; 898 + 899 + /* Temperature (unit: centi-Celsius) */ 900 + uint16_t temperature_gfx; 901 + uint16_t temperature_soc; 902 + uint16_t temperature_core[8]; 903 + uint16_t temperature_l3[2]; 904 + 905 + /* Utilization (unit: centi) */ 906 + uint16_t average_gfx_activity; 907 + uint16_t average_mm_activity; 908 + 909 + /* Driver attached timestamp (in ns) */ 910 + uint64_t system_clock_counter; 911 + 912 + /* Power/Energy (unit: mW) */ 913 + uint16_t average_socket_power; 914 + uint16_t average_cpu_power; 915 + uint16_t average_soc_power; 916 + uint16_t average_gfx_power; 917 + uint16_t average_core_power[8]; 918 + 919 + /* Average clocks (unit: MHz) */ 920 + uint16_t average_gfxclk_frequency; 921 + uint16_t average_socclk_frequency; 922 + uint16_t average_uclk_frequency; 923 + uint16_t average_fclk_frequency; 924 + uint16_t average_vclk_frequency; 925 + uint16_t average_dclk_frequency; 926 + 927 + /* Current clocks (unit: MHz) */ 928 + uint16_t current_gfxclk; 929 + uint16_t current_socclk; 930 + uint16_t current_uclk; 931 + uint16_t current_fclk; 932 + uint16_t current_vclk; 933 + uint16_t current_dclk; 934 + uint16_t current_coreclk[8]; 935 + uint16_t current_l3clk[2]; 936 + 937 + /* Throttle status (ASIC dependent) */ 938 + uint32_t throttle_status; 939 + 940 + /* Fans */ 941 + uint16_t fan_pwm; 942 + 943 + uint16_t padding[3]; 944 + 945 + /* Throttle status (ASIC independent) */ 946 + uint64_t indep_throttle_status; 947 + 948 + /* Average Temperature (unit: centi-Celsius) */ 949 + uint16_t average_temperature_gfx; 950 + uint16_t average_temperature_soc; 951 + uint16_t average_temperature_core[8]; 952 + uint16_t average_temperature_l3[2]; 953 + 954 + /* Power/Voltage (unit: mV) */ 955 + uint16_t average_cpu_voltage; 956 + uint16_t average_soc_voltage; 957 + uint16_t average_gfx_voltage; 958 + 959 + /* Power/Current (unit: mA) */ 960 + uint16_t average_cpu_current; 961 + uint16_t average_soc_current; 962 + uint16_t average_gfx_current; 963 + }; 895 964 #endif
+100 -9
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
··· 1854 1854 return sizeof(struct gpu_metrics_v2_3); 1855 1855 } 1856 1856 1857 + static ssize_t vangogh_get_gpu_metrics_v2_4(struct smu_context *smu, 1858 + void **table) 1859 + { 1860 + SmuMetrics_t metrics; 1861 + struct smu_table_context *smu_table = &smu->smu_table; 1862 + struct gpu_metrics_v2_4 *gpu_metrics = 1863 + (struct gpu_metrics_v2_4 *)smu_table->gpu_metrics_table; 1864 + int ret = 0; 1865 + 1866 + ret = smu_cmn_get_metrics_table(smu, &metrics, true); 1867 + if (ret) 1868 + return ret; 1869 + 1870 + smu_cmn_init_soft_gpu_metrics(gpu_metrics, 2, 4); 1871 + 1872 + gpu_metrics->temperature_gfx = metrics.Current.GfxTemperature; 1873 + gpu_metrics->temperature_soc = metrics.Current.SocTemperature; 1874 + memcpy(&gpu_metrics->temperature_core[0], 1875 + &metrics.Current.CoreTemperature[0], 1876 + sizeof(uint16_t) * 4); 1877 + gpu_metrics->temperature_l3[0] = metrics.Current.L3Temperature[0]; 1878 + 1879 + gpu_metrics->average_temperature_gfx = metrics.Average.GfxTemperature; 1880 + gpu_metrics->average_temperature_soc = metrics.Average.SocTemperature; 1881 + memcpy(&gpu_metrics->average_temperature_core[0], 1882 + &metrics.Average.CoreTemperature[0], 1883 + sizeof(uint16_t) * 4); 1884 + gpu_metrics->average_temperature_l3[0] = metrics.Average.L3Temperature[0]; 1885 + 1886 + gpu_metrics->average_gfx_activity = metrics.Current.GfxActivity; 1887 + gpu_metrics->average_mm_activity = metrics.Current.UvdActivity; 1888 + 1889 + gpu_metrics->average_socket_power = metrics.Current.CurrentSocketPower; 1890 + gpu_metrics->average_cpu_power = metrics.Current.Power[0]; 1891 + gpu_metrics->average_soc_power = metrics.Current.Power[1]; 1892 + gpu_metrics->average_gfx_power = metrics.Current.Power[2]; 1893 + 1894 + gpu_metrics->average_cpu_voltage = metrics.Current.Voltage[0]; 1895 + gpu_metrics->average_soc_voltage = metrics.Current.Voltage[1]; 1896 + gpu_metrics->average_gfx_voltage = metrics.Current.Voltage[2]; 1897 + 1898 + gpu_metrics->average_cpu_current = metrics.Current.Current[0]; 1899 + gpu_metrics->average_soc_current = metrics.Current.Current[1]; 1900 + gpu_metrics->average_gfx_current = metrics.Current.Current[2]; 1901 + 1902 + memcpy(&gpu_metrics->average_core_power[0], 1903 + &metrics.Average.CorePower[0], 1904 + sizeof(uint16_t) * 4); 1905 + 1906 + gpu_metrics->average_gfxclk_frequency = metrics.Average.GfxclkFrequency; 1907 + gpu_metrics->average_socclk_frequency = metrics.Average.SocclkFrequency; 1908 + gpu_metrics->average_uclk_frequency = metrics.Average.MemclkFrequency; 1909 + gpu_metrics->average_fclk_frequency = metrics.Average.MemclkFrequency; 1910 + gpu_metrics->average_vclk_frequency = metrics.Average.VclkFrequency; 1911 + gpu_metrics->average_dclk_frequency = metrics.Average.DclkFrequency; 1912 + 1913 + gpu_metrics->current_gfxclk = metrics.Current.GfxclkFrequency; 1914 + gpu_metrics->current_socclk = metrics.Current.SocclkFrequency; 1915 + gpu_metrics->current_uclk = metrics.Current.MemclkFrequency; 1916 + gpu_metrics->current_fclk = metrics.Current.MemclkFrequency; 1917 + gpu_metrics->current_vclk = metrics.Current.VclkFrequency; 1918 + gpu_metrics->current_dclk = metrics.Current.DclkFrequency; 1919 + 1920 + memcpy(&gpu_metrics->current_coreclk[0], 1921 + &metrics.Current.CoreFrequency[0], 1922 + sizeof(uint16_t) * 4); 1923 + gpu_metrics->current_l3clk[0] = metrics.Current.L3Frequency[0]; 1924 + 1925 + gpu_metrics->throttle_status = metrics.Current.ThrottlerStatus; 1926 + gpu_metrics->indep_throttle_status = 1927 + smu_cmn_get_indep_throttler_status(metrics.Current.ThrottlerStatus, 1928 + vangogh_throttler_map); 1929 + 1930 + gpu_metrics->system_clock_counter = ktime_get_boottime_ns(); 1931 + 1932 + *table = (void *)gpu_metrics; 1933 + 1934 + return sizeof(struct gpu_metrics_v2_4); 1935 + } 1936 + 1857 1937 static ssize_t vangogh_get_gpu_metrics(struct smu_context *smu, 1858 1938 void **table) 1859 1939 { ··· 2003 1923 { 2004 1924 uint32_t if_version; 2005 1925 uint32_t smu_version; 1926 + uint32_t smu_program; 1927 + uint32_t fw_version; 2006 1928 int ret = 0; 2007 1929 2008 1930 ret = smu_cmn_get_smc_version(smu, &if_version, &smu_version); 2009 - if (ret) { 1931 + if (ret) 2010 1932 return ret; 2011 - } 2012 1933 2013 - if (smu_version >= 0x043F3E00) { 2014 - if (if_version < 0x3) 2015 - ret = vangogh_get_legacy_gpu_metrics_v2_3(smu, table); 1934 + smu_program = (smu_version >> 24) & 0xff; 1935 + fw_version = smu_version & 0xffffff; 1936 + if (smu_program == 6) { 1937 + if (fw_version >= 0x3F0800) 1938 + ret = vangogh_get_gpu_metrics_v2_4(smu, table); 2016 1939 else 2017 1940 ret = vangogh_get_gpu_metrics_v2_3(smu, table); 1941 + 2018 1942 } else { 2019 - if (if_version < 0x3) 2020 - ret = vangogh_get_legacy_gpu_metrics(smu, table); 2021 - else 2022 - ret = vangogh_get_gpu_metrics(smu, table); 1943 + if (smu_version >= 0x043F3E00) { 1944 + if (if_version < 0x3) 1945 + ret = vangogh_get_legacy_gpu_metrics_v2_3(smu, table); 1946 + else 1947 + ret = vangogh_get_gpu_metrics_v2_3(smu, table); 1948 + } else { 1949 + if (if_version < 0x3) 1950 + ret = vangogh_get_legacy_gpu_metrics(smu, table); 1951 + else 1952 + ret = vangogh_get_gpu_metrics(smu, table); 1953 + } 2023 1954 } 2024 1955 2025 1956 return ret;
+3
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
··· 996 996 case METRICS_VERSION(2, 3): 997 997 structure_size = sizeof(struct gpu_metrics_v2_3); 998 998 break; 999 + case METRICS_VERSION(2, 4): 1000 + structure_size = sizeof(struct gpu_metrics_v2_4); 1001 + break; 999 1002 default: 1000 1003 return; 1001 1004 }