Background
----------
An earlier RFC [1] introduced a new ioctl (AMDGPU_VM_OP_SET_L2_TRAP)
to allow userspace to register a second-level trap handler for user
queues. During review, it was noted that RADV on Vega/Navi hardware
uses kernel queues (context-based submission), not user queues, and
therefore cannot benefit from the second-level trap handler without
first-level trap handler support for kernel queue VMIDs.

Problem
-------
On GFX11+ (MES-based hardware), MES programs SQ_SHADER_TBA/TMA for
user queue VMIDs via the ADD_QUEUE packet's trap_handler_addr field.
However, MES maps kernel queues via ADD_QUEUE with map_legacy_kq=1 but
does NOT program the trap handler for those VMIDs.

On GFX10 and earlier (HWS-based), the driver programs trap handler
registers via SRBM select when KFD queues are set up, but no equivalent
programming exists for the driver-managed kernel queue VMIDs.

Key design decisions:
  - MES owns kernel VMIDs but does not program trap handler state
  - The driver must program SQ_SHADER_TBA/TMA directly via SRBM select
    for kernel queue VMIDs
  - Trap handler is a VMID property, not a queue property
  - Only kernel queue VMIDs (1..first_kfd_vmid-1) should be programmed
    here; user queue VMIDs are handled by MES

Use Cases
---------
  - RADV graphics debugging on Vega/Navi/Steam Deck (Valve)
  - Future Navi ray tracing features requiring trap handlers on kernel
    queues
  - Consistent first-level trap handler behavior when userspace switches
    between kernel queues and user queues

Design
------
A new vmhub callback (program_kernel_trap_vmids) is added to
amdgpu_vmhub_funcs. Each gfxhub version implements this callback to
write SQ_SHADER_TBA/TMA registers for kernel queue VMIDs. A device-level
TMA BO (kq_tma_bo) is created at trap_init time as the scratch buffer
for kernel queue trap context.

The registers are programmed at two points:
  1. amdgpu_trap_init() — on first boot, after ISA and TMA BOs are ready
  2. setup_vmid_config() — on GPU resume, after GART registers are restored

GFX versions covered:
  - GFX10   (gfxhub_v2_0):    mm-prefixed registers, single XCC
  - GFX11   (gfxhub_v3_0):    reg-prefixed registers, single XCC
  - GFX11.5 (gfxhub_v11_5_0): reg-prefixed registers, single XCC
  - GFX12   (gfxhub_v12_0):   reg-prefixed registers, single XCC
  - GFX12.1 (gfxhub_v12_1):   reg-prefixed registers, multi-XCC

Open Questions
--------------
  1. XCP partitioning: gfxhub_v12_1 programs all XCC instances on each
     call. For XCP partition suspend/resume, only a subset of XCCs may
     need reprogramming. This will be addressed in a follow-up.

  2. MES firmware: ideally MES should honor trap_en regardless of queue
     type, but MES APIs are frozen. The driver-side SRBM approach in
     this series is the agreed workaround.

This series depends on [1] (second-level trap handler RFC) for the
amdgpu_trap infrastructure (isa_bo, amdgpu_trap_init, amdgpu_trap_alloc).

[1] https://patchwork.freedesktop.org/series/172489/

Srinivasan Shanmugam (2):
  drm/amdgpu: Add kernel VMID trap handler infrastructure
  drm/amdgpu: Implement kernel VMID trap handler for GFX10/11/12

 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h     |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_trap.c    | 37 ++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_trap.h    |  2 +
 drivers/gpu/drm/amd/amdgpu/gfxhub_v11_5_0.c | 43 +++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/gfxhub_v12_0.c   | 34 ++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/gfxhub_v12_1.c   | 37 ++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c    | 34 ++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c    | 34 ++++++++++++++++
 8 files changed, 222 insertions(+)

-- 
2.34.1

Reply via email to