If MODE.DST_VGPR_MSB != MODE.SRC0_VGPR_MSB upon trap entry then v1 would be trashed.
Adjust workaround to prefetch random address 0xFFFFFFFFxxxxxxxx. This is unused address space on gfx12.1 besides the TBA and TMA which are harmless to prefetch. Also remove unused WAVE_START exception handler. Signed-off-by: Jay Cornwall <[email protected]> Cc: Joseph Greathouse <[email protected]> Cc: Lancelot Six <[email protected]> Cc: Vladimir Indic <[email protected]> --- .../gpu/drm/amd/amdkfd/cwsr_trap_handler.h | 16 ++++---------- .../amd/amdkfd/cwsr_trap_handler_gfx12.asm | 21 +++---------------- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h index 8cf3527dc156..73889430d2e4 100644 --- a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h +++ b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h @@ -4601,19 +4601,11 @@ static const uint32_t cwsr_trap_gfx9_5_0_hex[] = { }; static const uint32_t cwsr_trap_gfx12_1_0_hex[] = { - 0xbfa00001, 0xbfa003f1, + 0xbfa00001, 0xbfa003e1, 0xb0804009, 0xb8f8f804, - 0xb8faf811, 0xbf0d887a, - 0xbfa10008, 0xb9800211, - 0x00000000, 0xbeee0180, - 0x7e020280, 0xee17406e, - 0x00040000, 0x00000001, - 0xbe804a6c, 0xbefa007e, - 0xbefe0081, 0xd760007b, - 0x00010101, 0xbeee0180, - 0x7e020280, 0xee17406e, - 0x00040000, 0x00000001, - 0xd7610001, 0x0001007b, + 0xbefa007e, 0xbefe0081, + 0xbeee0180, 0xee17406e, + 0x00040000, 0x00000000, 0xbefe007a, 0x9178ff78, 0x00008c00, 0xb8fbf811, 0xbf0c877b, 0xbfa20002, diff --git a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm index 233ed8b6d122..9d54a77da6cd 100644 --- a/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm +++ b/drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm @@ -246,28 +246,13 @@ L_SKIP_RESTORE: s_getreg_b32 s_save_state_priv, hwreg(HW_REG_WAVE_STATE_PRIV) //save STATUS since we will change SCC #if VMEM_ON_TRAP_ENTRY_WA - s_getreg_b32 ttmp14, hwreg(HW_REG_WAVE_EXCP_FLAG_PRIV) - s_bitcmp1_b32 ttmp14, SQ_WAVE_EXCP_FLAG_PRIV_WAVE_START_SHIFT - s_cbranch_scc0 L_NOT_WAVE_START - - s_setreg_imm32_b32 hwreg(HW_REG_WAVE_EXCP_FLAG_PRIV, SQ_WAVE_EXCP_FLAG_PRIV_WAVE_START_SHIFT, 1), 0 - - s_mov_b64 [ttmp2, ttmp3], 0 - v_mov_b32 v1, 0 - global_prefetch_b8 v1, [ttmp2, ttmp3] scope:SCOPE_SE th:TH_LOAD_RT - - s_rfe_b64 [ttmp0, ttmp1] - -L_NOT_WAVE_START: s_mov_b32 ttmp14, exec_lo s_mov_b32 exec_lo, 1 - v_readlane_b32 ttmp15, v1, 0 - s_mov_b64 [ttmp2, ttmp3], 0 - v_mov_b32 v1, 0 - global_prefetch_b8 v1, [ttmp2, ttmp3] scope:SCOPE_SE th:TH_LOAD_RT + // No-op prefetch to random address 0xFFFFFFFFxxxxxxxx, faults or hits TBA/TMA. + s_mov_b64 [ttmp2, ttmp3], 0xFFFFFFFF00000000 + global_prefetch_b8 v0, [ttmp2, ttmp3] scope:SCOPE_SE th:TH_LOAD_RT - v_writelane_b32 v1, ttmp15, 0 s_mov_b32 exec_lo, ttmp14 #endif -- 2.34.1
