drm/amdgpu/swsmu: add interrupt work handler for smu11 parts
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 1 Oct 2020 14:43:28 +0000 (10:43 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 1 Oct 2020 14:43:28 +0000 (10:43 -0400)
We need to schedule the smu AC/DC interrupt ack to avoid
potentially sleeping if the smu message mutex is contended.

Fixes: e1188aacad1730 ("drm/amdgpu/smu11: add support for SMU AC/DC interrupts")
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/inc/smu_v11_0.h
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c

index 03198d2..2d1c3ba 100644 (file)
@@ -280,5 +280,7 @@ int smu_v11_0_gfx_ulv_control(struct smu_context *smu,
 int smu_v11_0_deep_sleep_control(struct smu_context *smu,
                                 bool enablement);
 
+void smu_v11_0_interrupt_work(struct smu_context *smu);
+
 #endif
 #endif
index d298fa6..fc37628 100644 (file)
@@ -2388,6 +2388,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
        .gfx_ulv_control = smu_v11_0_gfx_ulv_control,
        .deep_sleep_control = smu_v11_0_deep_sleep_control,
        .get_fan_parameters = arcturus_get_fan_parameters,
+       .interrupt_work = smu_v11_0_interrupt_work,
 };
 
 void arcturus_set_ppt_funcs(struct smu_context *smu)
index be44cb9..3f1377f 100644 (file)
@@ -2755,6 +2755,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
        .deep_sleep_control = smu_v11_0_deep_sleep_control,
        .get_fan_parameters = navi10_get_fan_parameters,
        .post_init = navi10_post_smu_init,
+       .interrupt_work = smu_v11_0_interrupt_work,
 };
 
 void navi10_set_ppt_funcs(struct smu_context *smu)
index a2cb831..3c8732f 100644 (file)
@@ -2784,6 +2784,7 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
        .gfx_ulv_control = smu_v11_0_gfx_ulv_control,
        .deep_sleep_control = smu_v11_0_deep_sleep_control,
        .get_fan_parameters = sienna_cichlid_get_fan_parameters,
+       .interrupt_work = smu_v11_0_interrupt_work,
 };
 
 void sienna_cichlid_set_ppt_funcs(struct smu_context *smu)
index d8ca6d9..2380759 100644 (file)
@@ -955,6 +955,12 @@ static int smu_v11_0_process_pending_interrupt(struct smu_context *smu)
        return ret;
 }
 
+void smu_v11_0_interrupt_work(struct smu_context *smu)
+{
+       if (smu_v11_0_ack_ac_dc_interrupt(smu))
+               dev_err(smu->adev->dev, "Ack AC/DC interrupt Failed!\n");
+}
+
 int smu_v11_0_enable_thermal_alert(struct smu_context *smu)
 {
        int ret = 0;
@@ -1320,11 +1326,11 @@ static int smu_v11_0_irq_process(struct amdgpu_device *adev,
                        switch (ctxid) {
                        case 0x3:
                                dev_dbg(adev->dev, "Switched to AC mode!\n");
-                               smu_v11_0_ack_ac_dc_interrupt(&adev->smu);
+                               schedule_work(&smu->interrupt_work);
                                break;
                        case 0x4:
                                dev_dbg(adev->dev, "Switched to DC mode!\n");
-                               smu_v11_0_ack_ac_dc_interrupt(&adev->smu);
+                               schedule_work(&smu->interrupt_work);
                                break;
                        case 0x7:
                                /*