aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-09-30 10:27:42 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-03-19 12:26:29 -0400
commitd0a04d3b2ee87e9b74d0283f6af577e6d7763703 (patch)
treec26ebabd78a9e43bacb35a35089b9fb3da76a1ec
parent3c94566ce17d03c3601e78071f893ce028d5a696 (diff)
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>
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h2
-rw-r--r--drivers/gpu/drm/radeon/rv6xx_dpm.c46
3 files changed, 50 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index a73da113e0c1..0e3f7d493c13 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -1080,6 +1080,8 @@ static struct radeon_asic rv6xx_asic = {
1080 .print_power_state = &rv6xx_dpm_print_power_state, 1080 .print_power_state = &rv6xx_dpm_print_power_state,
1081 .debugfs_print_current_performance_level = &rv6xx_dpm_debugfs_print_current_performance_level, 1081 .debugfs_print_current_performance_level = &rv6xx_dpm_debugfs_print_current_performance_level,
1082 .force_performance_level = &rv6xx_dpm_force_performance_level, 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 .pflip = { 1086 .pflip = {
1085 .page_flip = &rs600_page_flip, 1087 .page_flip = &rs600_page_flip,
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 47d9901a7e45..7ae66c0b3bea 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -433,6 +433,8 @@ void rv6xx_dpm_debugfs_print_current_performance_level(struct radeon_device *rde
433 struct seq_file *m); 433 struct seq_file *m);
434int rv6xx_dpm_force_performance_level(struct radeon_device *rdev, 434int rv6xx_dpm_force_performance_level(struct radeon_device *rdev,
435 enum radeon_dpm_forced_level level); 435 enum radeon_dpm_forced_level level);
436u32 rv6xx_dpm_get_current_sclk(struct radeon_device *rdev);
437u32 rv6xx_dpm_get_current_mclk(struct radeon_device *rdev);
436/* rs780 dpm */ 438/* rs780 dpm */
437int rs780_dpm_init(struct radeon_device *rdev); 439int rs780_dpm_init(struct radeon_device *rdev);
438int rs780_dpm_enable(struct radeon_device *rdev); 440int rs780_dpm_enable(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/rv6xx_dpm.c b/drivers/gpu/drm/radeon/rv6xx_dpm.c
index 6a5c233361e9..97e5a6f1ce58 100644
--- a/drivers/gpu/drm/radeon/rv6xx_dpm.c
+++ b/drivers/gpu/drm/radeon/rv6xx_dpm.c
@@ -2050,6 +2050,52 @@ void rv6xx_dpm_debugfs_print_current_performance_level(struct radeon_device *rde
2050 } 2050 }
2051} 2051}
2052 2052
2053/* get the current sclk in 10 khz units */
2054u32 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 */
2077u32 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
2053void rv6xx_dpm_fini(struct radeon_device *rdev) 2099void rv6xx_dpm_fini(struct radeon_device *rdev)
2054{ 2100{
2055 int i; 2101 int i;