@@ -1854,6 +1854,86 @@ static ssize_t vangogh_get_gpu_metrics_v2_3(struct smu_context *smu,
18541854 return sizeof (struct gpu_metrics_v2_3 );
18551855}
18561856
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+
18571937static ssize_t vangogh_get_gpu_metrics (struct smu_context * smu ,
18581938 void * * table )
18591939{
@@ -1923,23 +2003,34 @@ static ssize_t vangogh_common_get_gpu_metrics(struct smu_context *smu,
19232003{
19242004 uint32_t if_version ;
19252005 uint32_t smu_version ;
2006+ uint32_t smu_program ;
2007+ uint32_t fw_version ;
19262008 int ret = 0 ;
19272009
19282010 ret = smu_cmn_get_smc_version (smu , & if_version , & smu_version );
1929- if (ret ) {
2011+ if (ret )
19302012 return ret ;
1931- }
19322013
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 );
19362019 else
19372020 ret = vangogh_get_gpu_metrics_v2_3 (smu , table );
2021+
19382022 } 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+ }
19432034 }
19442035
19452036 return ret ;
0 commit comments