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

drm/radeon/rv6xx: implement get_current_sclk/mclk

Will be used for exposing current clocks via INFO ioctl.

Tested-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+50
+2
drivers/gpu/drm/radeon/radeon_asic.c
··· 1080 1080 .print_power_state = &rv6xx_dpm_print_power_state, 1081 1081 .debugfs_print_current_performance_level = &rv6xx_dpm_debugfs_print_current_performance_level, 1082 1082 .force_performance_level = &rv6xx_dpm_force_performance_level, 1083 + .get_current_sclk = &rv6xx_dpm_get_current_sclk, 1084 + .get_current_mclk = &rv6xx_dpm_get_current_mclk, 1083 1085 }, 1084 1086 .pflip = { 1085 1087 .page_flip = &rs600_page_flip,
+2
drivers/gpu/drm/radeon/radeon_asic.h
··· 433 433 struct seq_file *m); 434 434 int rv6xx_dpm_force_performance_level(struct radeon_device *rdev, 435 435 enum radeon_dpm_forced_level level); 436 + u32 rv6xx_dpm_get_current_sclk(struct radeon_device *rdev); 437 + u32 rv6xx_dpm_get_current_mclk(struct radeon_device *rdev); 436 438 /* rs780 dpm */ 437 439 int rs780_dpm_init(struct radeon_device *rdev); 438 440 int rs780_dpm_enable(struct radeon_device *rdev);
+46
drivers/gpu/drm/radeon/rv6xx_dpm.c
··· 2050 2050 } 2051 2051 } 2052 2052 2053 + /* get the current sclk in 10 khz units */ 2054 + u32 rv6xx_dpm_get_current_sclk(struct radeon_device *rdev) 2055 + { 2056 + struct radeon_ps *rps = rdev->pm.dpm.current_ps; 2057 + struct rv6xx_ps *ps = rv6xx_get_ps(rps); 2058 + struct rv6xx_pl *pl; 2059 + u32 current_index = 2060 + (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >> 2061 + CURRENT_PROFILE_INDEX_SHIFT; 2062 + 2063 + if (current_index > 2) { 2064 + return 0; 2065 + } else { 2066 + if (current_index == 0) 2067 + pl = &ps->low; 2068 + else if (current_index == 1) 2069 + pl = &ps->medium; 2070 + else /* current_index == 2 */ 2071 + pl = &ps->high; 2072 + return pl->sclk; 2073 + } 2074 + } 2075 + 2076 + /* get the current mclk in 10 khz units */ 2077 + u32 rv6xx_dpm_get_current_mclk(struct radeon_device *rdev) 2078 + { 2079 + struct radeon_ps *rps = rdev->pm.dpm.current_ps; 2080 + struct rv6xx_ps *ps = rv6xx_get_ps(rps); 2081 + struct rv6xx_pl *pl; 2082 + u32 current_index = 2083 + (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >> 2084 + CURRENT_PROFILE_INDEX_SHIFT; 2085 + 2086 + if (current_index > 2) { 2087 + return 0; 2088 + } else { 2089 + if (current_index == 0) 2090 + pl = &ps->low; 2091 + else if (current_index == 1) 2092 + pl = &ps->medium; 2093 + else /* current_index == 2 */ 2094 + pl = &ps->high; 2095 + return pl->mclk; 2096 + } 2097 + } 2098 + 2053 2099 void rv6xx_dpm_fini(struct radeon_device *rdev) 2054 2100 { 2055 2101 int i;