Skip to content

Commit a857d4a

Browse files
kunliu13mehmetb0
authored andcommitted
drm/amd/pm: fix BUG: scheduling while atomic
BugLink: https://bugs.launchpad.net/bugs/2106770 commit 2a238b09bfd04e8155a7a323364bce1c38b28c0f upstream. 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 <lijo.lazar@amd.com> Reviewed-by: Kenneth Feng <kenneth.feng@amd.com> Signed-off-by: Kun Liu <Kun.Liu2@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit 03cc84b102d1a832e8dfc59344346dedcebcdf42) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Manuel Diewald <manuel.diewald@canonical.com> Signed-off-by: Mehmet Basaran <mehmet.basaran@canonical.com>
1 parent 0f774ce commit a857d4a

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
@@ -302,5 +302,7 @@ int smu_v13_0_set_wbrf_exclusion_ranges(struct smu_context *smu,
302302
int smu_v13_0_get_boot_freq_by_index(struct smu_context *smu,
303303
enum smu_clk_type clk_type,
304304
uint32_t *value);
305+
306+
void smu_v13_0_interrupt_work(struct smu_context *smu);
305307
#endif
306308
#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
@@ -1321,11 +1321,11 @@ static int smu_v13_0_set_irq_state(struct amdgpu_device *adev,
13211321
return 0;
13221322
}
13231323

1324-
static int smu_v13_0_ack_ac_dc_interrupt(struct smu_context *smu)
1324+
void smu_v13_0_interrupt_work(struct smu_context *smu)
13251325
{
1326-
return smu_cmn_send_smc_msg(smu,
1327-
SMU_MSG_ReenableAcDcInterrupt,
1328-
NULL);
1326+
smu_cmn_send_smc_msg(smu,
1327+
SMU_MSG_ReenableAcDcInterrupt,
1328+
NULL);
13291329
}
13301330

13311331
#define THM_11_0__SRCID__THM_DIG_THERM_L2H 0 /* ASIC_TEMP > CG_THERMAL_INT.DIG_THERM_INTH */
@@ -1378,12 +1378,12 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,
13781378
switch (ctxid) {
13791379
case 0x3:
13801380
dev_dbg(adev->dev, "Switched to AC mode!\n");
1381-
smu_v13_0_ack_ac_dc_interrupt(smu);
1381+
schedule_work(&smu->interrupt_work);
13821382
adev->pm.ac_power = true;
13831383
break;
13841384
case 0x4:
13851385
dev_dbg(adev->dev, "Switched to DC mode!\n");
1386-
smu_v13_0_ack_ac_dc_interrupt(smu);
1386+
schedule_work(&smu->interrupt_work);
13871387
adev->pm.ac_power = false;
13881388
break;
13891389
case 0x7:

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
@@ -3096,6 +3096,7 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
30963096
.is_asic_wbrf_supported = smu_v13_0_0_wbrf_support_check,
30973097
.enable_uclk_shadow = smu_v13_0_enable_uclk_shadow,
30983098
.set_wbrf_exclusion_ranges = smu_v13_0_set_wbrf_exclusion_ranges,
3099+
.interrupt_work = smu_v13_0_interrupt_work,
30993100
};
31003101

31013102
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
@@ -2667,6 +2667,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
26672667
.is_asic_wbrf_supported = smu_v13_0_7_wbrf_support_check,
26682668
.enable_uclk_shadow = smu_v13_0_enable_uclk_shadow,
26692669
.set_wbrf_exclusion_ranges = smu_v13_0_set_wbrf_exclusion_ranges,
2670+
.interrupt_work = smu_v13_0_interrupt_work,
26702671
};
26712672

26722673
void smu_v13_0_7_set_ppt_funcs(struct smu_context *smu)

0 commit comments

Comments
 (0)