@@ -1854,6 +1854,86 @@ static ssize_t vangogh_get_gpu_metrics_v2_3(struct smu_context *smu,
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
{
@@ -1923,23 +2003,34 @@ static ssize_t vangogh_common_get_gpu_metrics(struct smu_context *smu,
1923
2003
{
1924
2004
uint32_t if_version ;
1925
2005
uint32_t smu_version ;
2006
+ uint32_t smu_program ;
2007
+ uint32_t fw_version ;
1926
2008
int ret = 0 ;
1927
2009
1928
2010
ret = smu_cmn_get_smc_version (smu , & if_version , & smu_version );
1929
- if (ret ) {
2011
+ if (ret )
1930
2012
return ret ;
1931
- }
1932
2013
1933
- if (smu_version >= 0x043F3E00 ) {
1934
- if (if_version < 0x3 )
1935
- ret = vangogh_get_legacy_gpu_metrics_v2_3 (smu , table );
2014
+ smu_program = (smu_version >> 24 ) & 0xff ;
2015
+ fw_version = smu_version & 0xffffff ;
2016
+ if (smu_program == 6 ) {
2017
+ if (fw_version >= 0x3F0800 )
2018
+ ret = vangogh_get_gpu_metrics_v2_4 (smu , table );
1936
2019
else
1937
2020
ret = vangogh_get_gpu_metrics_v2_3 (smu , table );
2021
+
1938
2022
} else {
1939
- if (if_version < 0x3 )
1940
- ret = vangogh_get_legacy_gpu_metrics (smu , table );
1941
- else
1942
- ret = vangogh_get_gpu_metrics (smu , table );
2023
+ if (smu_version >= 0x043F3E00 ) {
2024
+ if (if_version < 0x3 )
2025
+ ret = vangogh_get_legacy_gpu_metrics_v2_3 (smu , table );
2026
+ else
2027
+ ret = vangogh_get_gpu_metrics_v2_3 (smu , table );
2028
+ } else {
2029
+ if (if_version < 0x3 )
2030
+ ret = vangogh_get_legacy_gpu_metrics (smu , table );
2031
+ else
2032
+ ret = vangogh_get_gpu_metrics (smu , table );
2033
+ }
1943
2034
}
1944
2035
1945
2036
return ret ;
0 commit comments