diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2017-03-08 18:25:15 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-03-29 23:53:05 -0400 |
commit | 5ebbac4b5c9159130046bf7c56b7f4c71ca7d1b7 (patch) | |
tree | 6255025cf4d226d427c4126724916f74c210d33e /drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |
parent | 3cbc614f2fe7500cf2b0f29bbf941cf516c8b950 (diff) |
drm/amdgpu: expose GPU sensor related information
This includes shader/memory clocks, temperature, GPU load, etc.
v2: - add sub-queries for AMDPGU_INFO_GPU_SENSOR_*
- do not break the ABI
v3: - return -ENOENT when amdgpu_dpm == 0
- expose more sensor queries
v4: - s/GPU_POWER/GPU_AVG_POWER/
- improve VDDNB/VDDGFX query description
- fix amdgpu_dpm check
v5: - agd: fix warning
v6: - agd: bump version
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 49f93ee019e3..027692bf8457 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -240,6 +240,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
240 | uint32_t ui32 = 0; | 240 | uint32_t ui32 = 0; |
241 | uint64_t ui64 = 0; | 241 | uint64_t ui64 = 0; |
242 | int i, found; | 242 | int i, found; |
243 | int ui32_size = sizeof(ui32); | ||
243 | 244 | ||
244 | if (!info->return_size || !info->return_pointer) | 245 | if (!info->return_size || !info->return_pointer) |
245 | return -EINVAL; | 246 | return -EINVAL; |
@@ -596,6 +597,80 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
596 | return -EINVAL; | 597 | return -EINVAL; |
597 | } | 598 | } |
598 | } | 599 | } |
600 | case AMDGPU_INFO_SENSOR: { | ||
601 | struct pp_gpu_power query = {0}; | ||
602 | int query_size = sizeof(query); | ||
603 | |||
604 | if (amdgpu_dpm == 0) | ||
605 | return -ENOENT; | ||
606 | |||
607 | switch (info->sensor_info.type) { | ||
608 | case AMDGPU_INFO_SENSOR_GFX_SCLK: | ||
609 | /* get sclk in Mhz */ | ||
610 | if (amdgpu_dpm_read_sensor(adev, | ||
611 | AMDGPU_PP_SENSOR_GFX_SCLK, | ||
612 | (void *)&ui32, &ui32_size)) { | ||
613 | return -EINVAL; | ||
614 | } | ||
615 | ui32 /= 100; | ||
616 | break; | ||
617 | case AMDGPU_INFO_SENSOR_GFX_MCLK: | ||
618 | /* get mclk in Mhz */ | ||
619 | if (amdgpu_dpm_read_sensor(adev, | ||
620 | AMDGPU_PP_SENSOR_GFX_MCLK, | ||
621 | (void *)&ui32, &ui32_size)) { | ||
622 | return -EINVAL; | ||
623 | } | ||
624 | ui32 /= 100; | ||
625 | break; | ||
626 | case AMDGPU_INFO_SENSOR_GPU_TEMP: | ||
627 | /* get temperature in millidegrees C */ | ||
628 | if (amdgpu_dpm_read_sensor(adev, | ||
629 | AMDGPU_PP_SENSOR_GPU_TEMP, | ||
630 | (void *)&ui32, &ui32_size)) { | ||
631 | return -EINVAL; | ||
632 | } | ||
633 | break; | ||
634 | case AMDGPU_INFO_SENSOR_GPU_LOAD: | ||
635 | /* get GPU load */ | ||
636 | if (amdgpu_dpm_read_sensor(adev, | ||
637 | AMDGPU_PP_SENSOR_GPU_LOAD, | ||
638 | (void *)&ui32, &ui32_size)) { | ||
639 | return -EINVAL; | ||
640 | } | ||
641 | break; | ||
642 | case AMDGPU_INFO_SENSOR_GPU_AVG_POWER: | ||
643 | /* get average GPU power */ | ||
644 | if (amdgpu_dpm_read_sensor(adev, | ||
645 | AMDGPU_PP_SENSOR_GPU_POWER, | ||
646 | (void *)&query, &query_size)) { | ||
647 | return -EINVAL; | ||
648 | } | ||
649 | ui32 = query.average_gpu_power >> 8; | ||
650 | break; | ||
651 | case AMDGPU_INFO_SENSOR_VDDNB: | ||
652 | /* get VDDNB in millivolts */ | ||
653 | if (amdgpu_dpm_read_sensor(adev, | ||
654 | AMDGPU_PP_SENSOR_VDDNB, | ||
655 | (void *)&ui32, &ui32_size)) { | ||
656 | return -EINVAL; | ||
657 | } | ||
658 | break; | ||
659 | case AMDGPU_INFO_SENSOR_VDDGFX: | ||
660 | /* get VDDGFX in millivolts */ | ||
661 | if (amdgpu_dpm_read_sensor(adev, | ||
662 | AMDGPU_PP_SENSOR_VDDGFX, | ||
663 | (void *)&ui32, &ui32_size)) { | ||
664 | return -EINVAL; | ||
665 | } | ||
666 | break; | ||
667 | default: | ||
668 | DRM_DEBUG_KMS("Invalid request %d\n", | ||
669 | info->sensor_info.type); | ||
670 | return -EINVAL; | ||
671 | } | ||
672 | return copy_to_user(out, &ui32, min(size, 4u)) ? -EFAULT : 0; | ||
673 | } | ||
599 | default: | 674 | default: |
600 | DRM_DEBUG_KMS("Invalid request %d\n", info->query); | 675 | DRM_DEBUG_KMS("Invalid request %d\n", info->query); |
601 | return -EINVAL; | 676 | return -EINVAL; |