diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si_dpm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si_dpm.c | 41 |
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 | ||
7985 | static 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 | ||
7986 | const struct amd_ip_funcs si_dpm_ip_funcs = { | 8026 | const 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 | ||
8023 | static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev) | 8064 | static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev) |