summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/pm/powerplay
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2021-03-09 11:29:54 -0500
committerAlex Deucher <alexander.deucher@amd.com>2021-03-23 23:27:50 -0400
commit60d06906cdcdd2127ffd7e6b770ba8ff9d91a5e1 (patch)
tree3d4f185a5ac6cd2bc036fa4f3cfa335c5a4e9830 /drivers/gpu/drm/amd/pm/powerplay
parent1a31474cdb48257bad3edb174a261a27192c2107 (diff)
drm/amdgpu/powerplay/smu10: add support for gpu busy query (v2)
Was added in newer versions of the firmware. Add support for it. v2: return an error in SMU error, drop needless break. Reviewed-by: Evan Quan <evan.quan@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/pm/powerplay')
-rw-r--r--drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
index c932b632ddd4..f5d59fa3a030 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
@@ -1261,9 +1261,21 @@ static int smu10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
void *value, int *size)
{
struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
- uint32_t sclk, mclk;
+ struct amdgpu_device *adev = hwmgr->adev;
+ uint32_t sclk, mclk, activity_percent;
+ bool has_gfx_busy;
int ret = 0;
+ /* GetGfxBusy support was added on RV SMU FW 30.85.00 and PCO 4.30.59 */
+ if ((adev->apu_flags & AMD_APU_IS_PICASSO) &&
+ (hwmgr->smu_version >= 0x41e3b))
+ has_gfx_busy = true;
+ else if ((adev->apu_flags & AMD_APU_IS_RAVEN) &&
+ (hwmgr->smu_version >= 0x1e5500))
+ has_gfx_busy = true;
+ else
+ has_gfx_busy = false;
+
switch (idx) {
case AMDGPU_PP_SENSOR_GFX_SCLK:
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetGfxclkFrequency, &sclk);
@@ -1284,6 +1296,20 @@ static int smu10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
*(uint32_t *)value = smu10_data->vcn_power_gated ? 0 : 1;
*size = 4;
break;
+ case AMDGPU_PP_SENSOR_GPU_LOAD:
+ if (has_gfx_busy) {
+ ret = smum_send_msg_to_smc(hwmgr,
+ PPSMC_MSG_GetGfxBusy,
+ &activity_percent);
+ if (!ret)
+ activity_percent = activity_percent > 100 ? 100 : activity_percent;
+ else
+ return -EIO;
+ *((uint32_t *)value) = activity_percent;
+ return 0;
+ } else {
+ return -EOPNOTSUPP;
+ }
default:
ret = -EOPNOTSUPP;
break;