aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/kv_dpm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/kv_dpm.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
index f5a343cb0010..13f323745729 100644
--- a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
@@ -3260,6 +3260,39 @@ static int kv_check_state_equal(struct amdgpu_device *adev,
3260 return 0; 3260 return 0;
3261} 3261}
3262 3262
3263static int kv_dpm_read_sensor(struct amdgpu_device *adev, int idx,
3264 void *value, int *size)
3265{
3266 struct kv_power_info *pi = kv_get_pi(adev);
3267 uint32_t sclk;
3268 u32 pl_index =
3269 (RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX) &
3270 TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX_MASK) >>
3271 TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX__SHIFT;
3272
3273 /* size must be at least 4 bytes for all sensors */
3274 if (*size < 4)
3275 return -EINVAL;
3276
3277 switch (idx) {
3278 case AMDGPU_PP_SENSOR_GFX_SCLK:
3279 if (pl_index < SMU__NUM_SCLK_DPM_STATE) {
3280 sclk = be32_to_cpu(
3281 pi->graphics_level[pl_index].SclkFrequency);
3282 *((uint32_t *)value) = sclk;
3283 *size = 4;
3284 return 0;
3285 }
3286 return -EINVAL;
3287 case AMDGPU_PP_SENSOR_GPU_TEMP:
3288 *((uint32_t *)value) = kv_dpm_get_temp(adev);
3289 *size = 4;
3290 return 0;
3291 default:
3292 return -EINVAL;
3293 }
3294}
3295
3263const struct amd_ip_funcs kv_dpm_ip_funcs = { 3296const struct amd_ip_funcs kv_dpm_ip_funcs = {
3264 .name = "kv_dpm", 3297 .name = "kv_dpm",
3265 .early_init = kv_dpm_early_init, 3298 .early_init = kv_dpm_early_init,
@@ -3292,6 +3325,7 @@ static const struct amdgpu_dpm_funcs kv_dpm_funcs = {
3292 .enable_bapm = &kv_dpm_enable_bapm, 3325 .enable_bapm = &kv_dpm_enable_bapm,
3293 .get_vce_clock_state = amdgpu_get_vce_clock_state, 3326 .get_vce_clock_state = amdgpu_get_vce_clock_state,
3294 .check_state_equal = kv_check_state_equal, 3327 .check_state_equal = kv_check_state_equal,
3328 .read_sensor = &kv_dpm_read_sensor,
3295}; 3329};
3296 3330
3297static void kv_dpm_set_dpm_funcs(struct amdgpu_device *adev) 3331static void kv_dpm_set_dpm_funcs(struct amdgpu_device *adev)