aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2017-03-08 18:25:15 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:53:05 -0400
commit5ebbac4b5c9159130046bf7c56b7f4c71ca7d1b7 (patch)
tree6255025cf4d226d427c4126724916f74c210d33e /drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
parent3cbc614f2fe7500cf2b0f29bbf941cf516c8b950 (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.c75
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;