aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Quan <[email protected]>2020-05-22 15:42:40 +0800
committerAlex Deucher <[email protected]>2020-05-29 13:55:07 -0400
commitbcdc7c05bd2dd8fa8afbd725110d5ec3075d4b42 (patch)
tree973dd6253d0e225765bd4ced9e3b22fc8e703f0e
parent8c0bba64795fdfa89299aa160887ef3ff85c77d2 (diff)
drm/amd/powerplay: enable thermal throttling logging support V2
Currently this feature is supported on Arcturus only. PMFW will interrupt driver the first time when thermal throttling happened and every one second afterwards if the throttling continuing. On receiving the 1st interrupt, driver logs it the first time. However, if the throttling continues, the logging will be performed every minute to avoid log flooding. V2: simplify the implemention by ratelimited printk Signed-off-by: Evan Quan <[email protected]> Acked-by: Christian König <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
-rw-r--r--drivers/gpu/drm/amd/powerplay/smu_v11_0.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index 415ccb752981..92cb7924524d 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -1524,6 +1524,7 @@ static int smu_v11_0_irq_process(struct amdgpu_device *adev,
struct amdgpu_irq_src *source,
struct amdgpu_iv_entry *entry)
{
+ struct smu_context *smu = &adev->smu;
uint32_t client_id = entry->client_id;
uint32_t src_id = entry->src_id;
/*
@@ -1532,6 +1533,11 @@ static int smu_v11_0_irq_process(struct amdgpu_device *adev,
*/
uint32_t ctxid = entry->src_data[0];
uint32_t data;
+ /*
+ * if the throttling continues, the logging will be performed every
+ * minute to avoid log flooding.
+ */
+ static DEFINE_RATELIMIT_STATE(ratelimit_state, 60 * HZ, 1);
if (client_id == SOC15_IH_CLIENTID_THM) {
switch (src_id) {
@@ -1575,6 +1581,11 @@ static int smu_v11_0_irq_process(struct amdgpu_device *adev,
dev_dbg(adev->dev, "Switched to DC mode!\n");
smu_v11_0_ack_ac_dc_interrupt(&adev->smu);
break;
+ case 0x7:
+ if (__ratelimit(&ratelimit_state))
+ smu_log_thermal_throttling(smu);
+
+ break;
}
}
}