Skip to content

Commit 0de604d

Browse files
Perry Yuanalexdeucher
authored andcommitted
drm/amd/pm: Disable MMIO access during SMU Mode 1 reset
During Mode 1 reset, the ASIC undergoes a reset cycle and becomes temporarily inaccessible via PCIe. Any attempt to access MMIO registers during this window (e.g., from interrupt handlers or other driver threads) can result in uncompleted PCIe transactions, leading to NMI panics or system hangs. To prevent this, set the `no_hw_access` flag to true immediately after triggering the reset. This signals other driver components to skip register accesses while the device is offline. A memory barrier `smp_mb()` is added to ensure the flag update is globally visible to all cores before the driver enters the sleep/wait state. Signed-off-by: Perry Yuan <perry.yuan@amd.com> Reviewed-by: Yifan Zhang <yifan1.zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit 7edb503)
1 parent 72d7f45 commit 0de604d

3 files changed

Lines changed: 16 additions & 3 deletions

File tree

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5867,6 +5867,9 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
58675867
if (ret)
58685868
goto mode1_reset_failed;
58695869

5870+
/* enable mmio access after mode 1 reset completed */
5871+
adev->no_hw_access = false;
5872+
58705873
amdgpu_device_load_pci_state(adev->pdev);
58715874
ret = amdgpu_psp_wait_for_bootloader(adev);
58725875
if (ret)

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2923,8 +2923,13 @@ static int smu_v13_0_0_mode1_reset(struct smu_context *smu)
29232923
break;
29242924
}
29252925

2926-
if (!ret)
2926+
if (!ret) {
2927+
/* disable mmio access while doing mode 1 reset*/
2928+
smu->adev->no_hw_access = true;
2929+
/* ensure no_hw_access is globally visible before any MMIO */
2930+
smp_mb();
29272931
msleep(SMU13_MODE1_RESET_WAIT_TIME_IN_MS);
2932+
}
29282933

29292934
return ret;
29302935
}

drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,10 +2143,15 @@ static int smu_v14_0_2_mode1_reset(struct smu_context *smu)
21432143

21442144
ret = smu_cmn_send_debug_smc_msg(smu, DEBUGSMC_MSG_Mode1Reset);
21452145
if (!ret) {
2146-
if (amdgpu_emu_mode == 1)
2146+
if (amdgpu_emu_mode == 1) {
21472147
msleep(50000);
2148-
else
2148+
} else {
2149+
/* disable mmio access while doing mode 1 reset*/
2150+
smu->adev->no_hw_access = true;
2151+
/* ensure no_hw_access is globally visible before any MMIO */
2152+
smp_mb();
21492153
msleep(1000);
2154+
}
21502155
}
21512156

21522157
return ret;

0 commit comments

Comments
 (0)