Skip to content

Commit 2a238b0

Browse files
kunliu13alexdeucher
authored andcommitted
drm/amd/pm: fix BUG: scheduling while atomic
atomic scheduling will be triggered in interrupt handler for AC/DC mode switch as following backtrace. Call Trace: <IRQ> dump_stack_lvl __schedule_bug __schedule schedule schedule_preempt_disabled __mutex_lock smu_cmn_send_smc_msg_with_param smu_v13_0_irq_process amdgpu_irq_dispatch amdgpu_ih_process amdgpu_irq_handler __handle_irq_event_percpu handle_irq_event handle_edge_irq __common_interrupt common_interrupt </IRQ> <TASK> asm_common_interrupt Reviewed-by: Lijo Lazar <[email protected]> Reviewed-by: Kenneth Feng <[email protected]> Signed-off-by: Kun Liu <[email protected]> Signed-off-by: Alex Deucher <[email protected]> (cherry picked from commit 03cc84b) Cc: [email protected]
1 parent a993d31 commit 2a238b0

File tree

4 files changed

+10
-6
lines changed

4 files changed

+10
-6
lines changed

drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,5 +303,7 @@ int smu_v13_0_set_wbrf_exclusion_ranges(struct smu_context *smu,
303303
int smu_v13_0_get_boot_freq_by_index(struct smu_context *smu,
304304
enum smu_clk_type clk_type,
305305
uint32_t *value);
306+
307+
void smu_v13_0_interrupt_work(struct smu_context *smu);
306308
#endif
307309
#endif

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,11 +1320,11 @@ static int smu_v13_0_set_irq_state(struct amdgpu_device *adev,
13201320
return 0;
13211321
}
13221322

1323-
static int smu_v13_0_ack_ac_dc_interrupt(struct smu_context *smu)
1323+
void smu_v13_0_interrupt_work(struct smu_context *smu)
13241324
{
1325-
return smu_cmn_send_smc_msg(smu,
1326-
SMU_MSG_ReenableAcDcInterrupt,
1327-
NULL);
1325+
smu_cmn_send_smc_msg(smu,
1326+
SMU_MSG_ReenableAcDcInterrupt,
1327+
NULL);
13281328
}
13291329

13301330
#define THM_11_0__SRCID__THM_DIG_THERM_L2H 0 /* ASIC_TEMP > CG_THERMAL_INT.DIG_THERM_INTH */
@@ -1377,12 +1377,12 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,
13771377
switch (ctxid) {
13781378
case SMU_IH_INTERRUPT_CONTEXT_ID_AC:
13791379
dev_dbg(adev->dev, "Switched to AC mode!\n");
1380-
smu_v13_0_ack_ac_dc_interrupt(smu);
1380+
schedule_work(&smu->interrupt_work);
13811381
adev->pm.ac_power = true;
13821382
break;
13831383
case SMU_IH_INTERRUPT_CONTEXT_ID_DC:
13841384
dev_dbg(adev->dev, "Switched to DC mode!\n");
1385-
smu_v13_0_ack_ac_dc_interrupt(smu);
1385+
schedule_work(&smu->interrupt_work);
13861386
adev->pm.ac_power = false;
13871387
break;
13881388
case SMU_IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING:

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3219,6 +3219,7 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
32193219
.is_asic_wbrf_supported = smu_v13_0_0_wbrf_support_check,
32203220
.enable_uclk_shadow = smu_v13_0_enable_uclk_shadow,
32213221
.set_wbrf_exclusion_ranges = smu_v13_0_set_wbrf_exclusion_ranges,
3222+
.interrupt_work = smu_v13_0_interrupt_work,
32223223
};
32233224

32243225
void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu)

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2797,6 +2797,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
27972797
.is_asic_wbrf_supported = smu_v13_0_7_wbrf_support_check,
27982798
.enable_uclk_shadow = smu_v13_0_enable_uclk_shadow,
27992799
.set_wbrf_exclusion_ranges = smu_v13_0_set_wbrf_exclusion_ranges,
2800+
.interrupt_work = smu_v13_0_interrupt_work,
28002801
};
28012802

28022803
void smu_v13_0_7_set_ppt_funcs(struct smu_context *smu)

0 commit comments

Comments
 (0)