GTS AXI Multichannel DMA IP for PCI Express* User Guide
ID
847470
Date
8/25/2025
Public
1. Overview
2. Quick Start Guide
3. Configuring and Generating the GTS AXI Multichannel DMA IP for PCI Express
4. Integrating the IP With Your Application
5. Simulating the IP
6. Validating the IP
7. Known Issues
A. Functional Description
B. Software Programming Model
C. Registers
D. Document Revision History for the GTS AXI Multichannel DMA IP for PCI Express*
2.1.1. Downloading and Installing Quartus® Prime Software
2.1.2. Configuring and Generating the GTS AXI Multichannel DMA IP for PCI Express
2.1.3. Configuring and Generating the GTS AXI Streaming IP for PCI Express
2.1.4. Configuring and Generating the GTS System PLL Clocks IP
2.1.5. Configuring and Generating the GTS Reset Sequencer IP
2.1.6. Configuring and Generating the Reset Release IP
2.1.7. Instantiating and Connecting the IP Interfaces
2.1.8. Simulate, Compile and Validate the Design on Hardware
4.4.1. PCIe AXI-Stream TX Interface (ss_tx_st)
4.4.2. PCIe AXI-Stream RX Interface (ss_rx_st)
4.4.3. Control and Status Register Interface (ss_csr_lite)
4.4.4. Transmit Flow Control Credit Interface (ss_txcrdt)
4.4.5. Configuration Intercept Interface (CII)
4.4.6. Completion Timeout Interface (ss_cplto)
4.4.7. Function Level Reset (FLR) Interface
4.4.8. Control Shadow Interface (ss_ctrlshadow)
4.4.9. Error Interface
4.5.1. H2D AXI-Stream Manager (h2d_st_initatr)
4.5.2. D2H AXI-Stream Subordinate (d2h_st_respndr)
4.5.3. H2D/D2H AXI-MM Manager (dma_mm_initatr)
4.5.4. BAM AXI-MM Manager (bam_mm_initatr)
4.5.5. BAS AXI-MM Subordinate (bas_mm_respndr)
4.5.6. PIO AXI-Lite Manager (pio_lite_initiatr)
4.5.7. HIP Reconfiguration AXI-Lite Subordinate (user_csr_lite)
4.5.8. User Event MSI-X (user_msix)
4.5.9. User Event MSI (user_msi)
4.5.10. User Function Level Reset (user_flr)
4.5.11. User Configuration Intercept Interface
4.5.12. Configuration Slave (cs_lite_respndr)
A.1.1.1. H2D Data Mover
A.1.1.2. D2H Data Mover
A.1.1.3. Descriptors
A.1.1.4. AXI4-Lite PIO Manager
A.1.1.5. AXI-MM Write (H2D) and Read (D2H) Manager
A.1.1.6. AXI-Stream Manager (H2D) and Subordinate (D2H)
A.1.1.7. User MSI-X
A.1.1.8. User Function Level Reset (FLR)
A.1.1.9. Control and Status Registers
B.1.6.1. ifc_api_start
B.1.6.2. ifc_mcdma_port_by_name
B.1.6.3. ifc_qdma_device_get
B.1.6.4. ifc_num_channels_get
B.1.6.5. ifc_qdma_channel_get
B.1.6.6. ifc_qdma_acquire_channels
B.1.6.7. ifc_qdma_release_all_channels
B.1.6.8. ifc_qdma_device_put
B.1.6.9. ifc_qdma_channel_put
B.1.6.10. ifc_qdma_completion_poll
B.1.6.11. ifc_qdma_request_start
B.1.6.12. ifc_qdma_request_prepare
B.1.6.13. ifc_qdma_descq_queue_batch_load
B.1.6.14. ifc_qdma_request_submit
B.1.6.15. ifc_qdma_pio_read32
B.1.6.16. ifc_qdma_pio_write32
B.1.6.17. ifc_qdma_pio_read64
B.1.6.18. ifc_qdma_pio_write64
B.1.6.19. ifc_qdma_pio_read128
B.1.6.20. ifc_qdma_pio_write128
B.1.6.21. ifc_qdma_pio_read256
B.1.6.22. ifc_qdma_pio_write256
B.1.6.23. ifc_request_malloc
B.1.6.24. ifc_request_free
B.1.6.25. ifc_app_stop
B.1.6.26. ifc_qdma_poll_init
B.1.6.27. ifc_qdma_poll_add
B.1.6.28. ifc_qdma_poll_wait
B.1.6.29. ifc_mcdma_port_by_name
B.1.4. Software Flow
Figure 59. GTS AXI Multichannel DMA IP for PCI Express Software Operation Flow
Step 1
- Application creates the thread based on the required port of a channel.
- After spawning the thread, the thread tries to acquire the available channel’s port. In case all the channel's ports are busy, the thread waits in poll mode.
- In the context of the thread, libqdma allocates a descriptor buffer memory in the host.
- libqdma initializes the following registers in the QCSR associated with the queue, (which include the starting address of descriptors, queue size, write back address for the Consumed Head, payload size in D2H descriptors), and then enables the channels.
QCSR registers:
- Q_RESET (offset 8’h48)
- Q_TAIL_POINTER (offset 8’h14) Set to 0
- Q_START_ADDR_L (Offset 8’h08)
- Q_START_ADDR_H (Offset 8’h0C)
- Q_SIZE (Offset 8’h10)
- Q_CONSUMED_HEAD_ADDR_L (Offset 8’h20)
- Q_CONSUMED_HEAD_ADDR_H (Offset 8’h24)
- Q_BATCH_DELAY (Offset 8’h28)
- Set q_en, q_wb/intr_en bits Q_CTRL (Offset 8’h00)
- (Q_PYLD_COUNT) (Offset 8'h44)
GCSR register:
- WB_INTR_DELAY (Offset 8’h08)
Step 2
- Threads continuously try to send/receive the data and library keeps checking if channel is busy or descriptor ring is full.
- If channel is not busy and descriptor ring is not full, the thread goes to step 3. If channel is busy or descriptors ring is full, the thread tries to initiate the transfer again.
Descriptor ring full is identified by checking the Consumed Head and Tail pointer registers.
Step 3
Thread requests for new descriptor to submit the request and updates the required field, i.e. descriptor index, SOF, EOF, Payload, MSI-X enable and writeback enable.
Step 4
After initializing the descriptor ring buffer, the libqdma writes the number of descriptor updates into the tail register of the QCSR region. On every descriptor update the tail pointer is increased by 1.
QCSR tail pointer register: Q_TAIL_POINTER (Offset 8’h14)
Step 5
- Once the tail pointer write happens, GTS AXI MCDMA IP fetches descriptors from host memory starting from the programmed Q_START_ADDR_L/H address.
- GTS AXI MCDMA IP parses the descriptor content to find the sources, destination addresses and length of the data from descriptor and starts DMA operation.
Step 6
Once descriptor processing is completed, IP notifies the completion status based on the following methods, which can be enabled in each descriptor.
- MSI-X Interrupt: GTS AXI MCDMA IP sends MSI-X interrupt to host if enabled in Q_CTRL.
- Writeback: Multichannel DMA IP for PCI Express updates Q_CONSUMED_HEAD_ADDR_L/H, if writeback is enabled in Q_CTRL.