How to initiate a DMA transfer from the Intel based host to pcie switch and onto the Jetson AGX Xavier

Hi all — I’m working on a system where an Intel host is connected to a Jetson AGX Xavier that is configured as a PCIe Endpoint via a PCIe switch. I need to perform DMA transfers between the host and Jetson. Two approaches I’m considering:

A) Host programs Jetson DMA engine directly

  • Expose the Jetson’s DMA engine registers in a BAR mapped to host memory space so the host can program DMA descriptors and kick the engine directly.

  • Questions:

    • Is it feasible to map Jetson PCIe EP internal registers (DMA engine) into a BAR visible to the host?

    • What must the Jetson-side EP driver implement to support this (BAR setup, register window, cache / memory coherency considerations, MSI/MSI-X for interrupts)?

    • Any caveats around IOMMU, address translation, or the PCIe switch (address routing / peer-to-peer limitations)?

B) Jetson-controlled DMA (host sends command; Jetson initiates DMA)

  • Host sends a command over a control BAR or side-band channel; Jetson software/driver performs the DMA to/from host memory.

  • Questions:

    • Typical control methods (MMIO command register, mailboxes, vendor-sideband channel, or a lightweight protocol over PCIe) to request Jetson to perform a DMA?

    • Recommended kernel interfaces or existing driver examples for implementing the command/response and handing off DMA to the Jetson DMA engine (e.g., use of DMA APIs, scatter/gather, pinning host memory)?

    • How to coordinate memory mapping from the host side so Jetson can access host buffers (IOMMU setup, mapping windows, and security)?

Additional asks: sample EP driver snippets, kernel module examples, or references to Jetson-specific documentation would be appreciated.