aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/si_dpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si_dpm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_dpm.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
index c5dec210d529..eb84c2a6d951 100644
--- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
@@ -7982,6 +7982,46 @@ static int si_check_state_equal(struct amdgpu_device *adev,
7982 return 0; 7982 return 0;
7983} 7983}
7984 7984
7985static int si_dpm_read_sensor(struct amdgpu_device *adev, int idx,
7986 void *value, int *size)
7987{
7988 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
7989 struct amdgpu_ps *rps = &eg_pi->current_rps;
7990 struct si_ps *ps = si_get_ps(rps);
7991 uint32_t sclk, mclk;
7992 u32 pl_index =
7993 (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >>
7994 CURRENT_STATE_INDEX_SHIFT;
7995
7996 /* size must be at least 4 bytes for all sensors */
7997 if (*size < 4)
7998 return -EINVAL;
7999
8000 switch (idx) {
8001 case AMDGPU_PP_SENSOR_GFX_SCLK:
8002 if (pl_index < ps->performance_level_count) {
8003 sclk = ps->performance_levels[pl_index].sclk;
8004 *((uint32_t *)value) = sclk;
8005 *size = 4;
8006 return 0;
8007 }
8008 return -EINVAL;
8009 case AMDGPU_PP_SENSOR_GFX_MCLK:
8010 if (pl_index < ps->performance_level_count) {
8011 mclk = ps->performance_levels[pl_index].mclk;
8012 *((uint32_t *)value) = mclk;
8013 *size = 4;
8014 return 0;
8015 }
8016 return -EINVAL;
8017 case AMDGPU_PP_SENSOR_GPU_TEMP:
8018 *((uint32_t *)value) = si_dpm_get_temp(adev);
8019 *size = 4;
8020 return 0;
8021 default:
8022 return -EINVAL;
8023 }
8024}
7985 8025
7986const struct amd_ip_funcs si_dpm_ip_funcs = { 8026const struct amd_ip_funcs si_dpm_ip_funcs = {
7987 .name = "si_dpm", 8027 .name = "si_dpm",
@@ -8018,6 +8058,7 @@ static const struct amdgpu_dpm_funcs si_dpm_funcs = {
8018 .get_fan_speed_percent = &si_dpm_get_fan_speed_percent, 8058 .get_fan_speed_percent = &si_dpm_get_fan_speed_percent,
8019 .check_state_equal = &si_check_state_equal, 8059 .check_state_equal = &si_check_state_equal,
8020 .get_vce_clock_state = amdgpu_get_vce_clock_state, 8060 .get_vce_clock_state = amdgpu_get_vce_clock_state,
8061 .read_sensor = &si_dpm_read_sensor,
8021}; 8062};
8022 8063
8023static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev) 8064static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev)