Two nitpicks below.

Regards,
Philip

On 2026-08-21 15:33, Alex Deucher wrote:
This adds the core infrastructure for supporting UALink (Ultra Accelerator Link)
connected scale up pods. I've split this into two series, one to add the core
infrastructure, and one to expose the new IOCTL interface and add the
documentation to avoid spamming the larger audience with the implemenation
defails.  This is the first series.

This implements UALoE (UALink over Ethernet). An overview of the complete
solution can be found here:
https://www.amd.com/en/products/rackscale-solutions/helios.html

Overview

Connected GPUs in a pod can directly access the remove memory on another
s/remove/remote/
GPU over UALink.  Unlike RMDA, there is no copy involved; it is direct
loads/stores over the fabric.  Shared memory can only be accessed by
a remote GPU if the memory was exported and the importer has been authorized.
For the memory to be shared, it must be part of a unified physical
address space shared between nodes.  This address space is called NPA (Nework
Physical Address) space.  This address space is partitioned between
the GPUs so that each GPU has it's own segment of the address space in which
to export its memory.  Each GPU maintains a dedicated set of page tables
for their NPA space similar to GPUVM.

Exported memory is not pinned.  The exporter may need to move memory
or make it unavailable to the importers.  This is handled via remote
TLB shootdowns on the exporter in the case of TTM evictions or MMU notifiers and
remote presense checks with retry on the importer.

To access remote memory, the driver can map NPA addresses into its per
process GPUVM page tables just like local memory.  Applications use
opaque handles to represent remote memory.  GPUs in a pod communicate
with eachother directly to exchange NPA addresses between importers
s/eachother/each other/
and exporters.  If a node goes offline or is reset, their peers will
clean up any remaining refrences that are lost when that happens.

User interface

Export Memory

To export memory, a handle must be created for an allocation
that can be shared with another node in the pod.  To do this
the exporter calls the GEM UALink IOCTL with the GEM handle
to the buffer it wants to export.  The IOCTL returns a
unique handle which can be shared with the remote host.

Import Memory

To import the memory, the handle from the remote node must be converted
from a unique handle to a local GEM object which represents the local reference
to the NPA space on the importer.  If the memory has already been
imported, it just returns a new reference to the existing object.  If not,
the importer queries the exporter to get the NPA address.  Once it has that
the importer can create a dma-buf to represent the NPA space used by the
allocation and that is returned to the application.

Alex Sierra (1):
  drm/amdgpu: log remote memory MTYPE for GC 12.1.0

Felix Kuehling (17):
  drm/amdgpu: Add sysfs API for UALink information
  drm/amdgpu: Add sysfs API for UALink physical pod setup
  drm/amdgpu: Add sysfs API for UALink virtual pod config
  drm/amdgpu: Add sysfs API for UALink station configuration
  drm/amdgpu: Implement PSP cmd UAL_GET_CONFIG
  drm/amdgpu: Query initial UALink config from PSP
  drm/amdgpu: Implement PSP cmd UAL_SET_PPOD_CONFIG
  drm/amdgpu: Set physical pod configuration to PSP
  drm/amdgpu: Implement PSP cmd UAL_SET_VPOD_CONFIG
  drm/amdgpu: Set virtual pod configuration to PSP
  drm/amdgpu: Implement PSP cmd UAL_SET_STATION_CONFIG
  drm/amdgpu: Set UALink station config to PSP
  drm/amdgpu: Implement PSP cmd UAL_SET_NPA_CONFIG
  drm/amdgpu: Enable/disable NPA address translation using PSP
  drm/amdgpu: Prevent double-free of drm_exec
  drm/amdgpu: Pin page tables in NPA VMs
  drm/amdgpu: Initialize NPA PT/PDs to noretry

Gangliang Xie (1):
  drm/amdgpu: add handler for nHT error

Harish Kasiviswanathan (2):
  drm/amdgpu: Add helper function to check psp xgmi ta
  drm/amdgpu: Add ual_config_state to ual_get_config

Jinzhou Su (1):
  drm/amdgpu: Fix NULL pointer issue during ualink init

Le Ma (1):
  drm/amdgpu: extend PSP command polling sleep range

Lijo Lazar (15):
  drm/amdgpu: Add psp ualink command interfaces
  drm/amdgpu: Fetch asp ualink interface version
  drm/amdgpu: Separate out ualink init sequences
  drm/amdgpu: Add ualink as separate ip block
  drm/admgpu: Seggregate ualink nht messaging
  drm/amdgpu: Assign accel state based on ASP config
  drm/amdgpu: Drop duplicate vpod check functions
  drm/amdgpu: Add support to send ASP completion
  drm/amdgpu: Add handlers for ualink notifications
  drm/amdgpu: Improve ualink state transitions
  drm/amdgpu: Use uniform logic for inband/sideband
  drm/amdgpu: Add name for ualink ip block
  drm/amdgpu: Move ualink ip version related changes
  drm/amdgpu: Add hw_fini for ualink
  drm/amdgpu: Expose ualink info under each xcp

Mukul Joshi (42):
  drm/amdgpu: Add UALink manager core infrastructure
  drm/amdgpu: Add a new NPA Address space
  drm/amdgpu: Add address allocator for NPA addresses
  drm/amdgpu: Initialize VM for NPA addr management
  drm/amdgpu: Rework VMID reservation logic
  drm/amdgpu: Reserve VMID for NPA VM
  drm/amdgpu: Use reserved VMID for NPA VM
  drm/amdgpu: Enable UALink Manager when pod becomes active
  drm/amdgpu: Create a drm client for UALink NPA BOs
  drm/amdgpu: Control NPA DMA-buf importing
  drm/amdgpu: Add ualink handle to BOs
  drm/amdgpu: Implement UALink handle export
  drm/amdgpu: Add connection state management
  drm/amdgpu: Implement UALink handle import ioctl
  drm/amdgpu: Implement mechanism to revoke exported memory
  drm/amdgpu: lock UALink import invalidation via drm_exec
  drm/amdgpu: Cleanup exported UALink handles
  drm/amdgpu: Cleanup imported UALink handles
  drm/amdgpu: Handle connection reset
  drm/amdgpu: Setup PTE mappings for NPA addresses
  drm/amdgpu: Add handling for remote interrupts
  drm/amdgpu: Send TLB shootdown on exported memory unmap
  drm/amdgpu: Handle local GPUs in UALink import
  drm/amdgpu: Add debugfs to drop UALink protocol messages
  drm/amdgpu: Temporarily disable sending remote TLB shootdowns
  drm/amdgpu: Temporarily Flush TLB on NPA mapping always
  drm/amdgpu: fix NPA-RELEASE race in UALink exporter cleanup
  drm/amdgpu: initialize UALink importer node list head
  drm/amdgpu: Fix initialization flags for UALink XAs
  drm/amdgpu: fix dma_buf leak in UALink exporter cleanup
  drm/amdgpu: Fix uninitialized fence in UALink NPA unmap
  drm/amdgpu: Use vm->last_update fence in UALink NPA unmap paths
  drm/amdgpu: always use MTYPE_UC for remote memory on GFX 12.1
  drm/amdkfd: program compute MQD coherent_aql_mtype on GFX 12.1
  drm/amdgpu: Fix GART and SDMA entity leak on vPod reconfiguration
  drm/amdgpu: Add UALink diagnostic logging for vpod commit/activation
  drm/amdgpu: Handle UALink vPod reconfiguration while ACTIVE
  drm/amdgpu: Cleanup UALink XA entries on manager stop
  drm/amdgpu: Handle concurrent UALINK handle import race
  drm/amdgpu: create UALink NPA import BO directly in the NPA domain
  drm/amdgpu: add mtype_remote module parameter
  drm/amdgpu: Honor mtype overrides for NPA remote memory

Philip Yang (15):
  drm/amdgpu: Fix UALink vPod double-activation
  drm/amdgpu: Add UALink remote state structures and API declarations
  drm/amdgpu: Add UALink NPA address layout helpers
  drm/amdgpu: Add UALink NPA address computation for ring buffers
  drm/amdgpu: Add UALink NPA VM mapping for ring buffers
  drm/amdgpu: Add UALink SDMA scheduler entities
  drm/amdgpu: Add UALink GART helpers for NPA address access
  drm/amdgpu: Add UALink ring buffer allocation and firmware init
  drm/amdgpu: Add UALink remote command packets and SDMA dispatch
  drm/amdgpu: Add UALink firmware writeback address configuration
  drm/amdgpu: Add UALink cross-GPU TLB shootdown and remote interrupt
  drm/amdgpu: Add UALink software init, teardown, and reset
  drm/amdgpu: Add UALink IH ring and enable interrupt
  drm/amdgpu: UALink use LSDMA to send remote interrupt command
  drm/amdgpu: Increase UALink soft ring size

 drivers/gpu/drm/amd/amdgpu/Makefile           |    3 +
 drivers/gpu/drm/amd/amdgpu/amdgpu.h           |    5 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   14 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |    2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c |   21 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c   |    5 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c       |    7 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h       |    1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c       |   33 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h       |   27 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h        |    1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c        |    1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c       |   17 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h       |    7 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c    |   11 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.h    |    5 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c       |  280 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h       |   27 +
 .../gpu/drm/amd/amdgpu/amdgpu_res_cursor.h    |    1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c       |   17 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h       |    4 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c    | 6174 +++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h    |  421 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c        |   44 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h        |    4 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c     |   29 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c       |    6 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h       |    7 +
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c        |    2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c        |    2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c        |    2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c        |   51 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c         |    2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c         |    2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c         |    2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c       |    2 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c        |    4 +
 drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c        |    5 +
 drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c        |   26 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c        |   98 +-
 drivers/gpu/drm/amd/amdgpu/gmc_v12_1.h        |    1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c         |    6 +
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c         |    6 +
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c         |    6 +
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c         |    6 +
 drivers/gpu/drm/amd/amdgpu/ih_v7_0.c          |    8 +
 drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h       |  162 +
 drivers/gpu/drm/amd/amdgpu/psp_v15_0_8.c      |   48 +-
 drivers/gpu/drm/amd/amdgpu/soc_v1_0.c         |    6 -
 drivers/gpu/drm/amd/amdgpu/ualink_v1_0.c      |  143 +
 drivers/gpu/drm/amd/amdgpu/ualink_v1_0.h      |   30 +
 .../drm/amd/amdkfd/kfd_mqd_manager_v12_1.c    |    7 +
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c          |    8 +-
 drivers/gpu/drm/amd/include/amd_shared.h      |    2 +
 .../ivsrcid/mpnht/irqsrcs_mpnht_15_0.h        |   30 +
 drivers/gpu/drm/amd/include/v12_structs.h     |    2 +-
 include/drm/ttm/ttm_resource.h                |    2 +-
 include/uapi/drm/amdgpu_drm.h                 |    6 +
 58 files changed, 7782 insertions(+), 69 deletions(-)
 create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
 create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h
 create mode 100644 drivers/gpu/drm/amd/amdgpu/ualink_v1_0.c
 create mode 100644 drivers/gpu/drm/amd/amdgpu/ualink_v1_0.h
 create mode 100644 drivers/gpu/drm/amd/include/ivsrcid/mpnht/irqsrcs_mpnht_15_0.h