Visible to Intel only — GUID: wuz1589498866220
Ixiasoft
1. Before You Begin
2. Introduction
3. Functional Description
4. Interface Overview
5. Parameters (H-Tile)
6. Parameters (P-Tile and F-Tile)
7. Designing with the IP Core
8. Software Programming Model
9. Registers
10. Troubleshooting/Debugging
11. Multi Channel DMA Intel FPGA IP for PCI Express User Guide Archives
12. Revision History for Multi Channel DMA Intel FPGA IP for PCI Express User Guide
4.1. Port List
4.2. Clocks
4.3. Resets
4.4. Multi Channel DMA
4.5. Bursting Avalon-MM Master (BAM) Interface
4.6. Bursting Avalon-MM Slave (BAS) Interface
4.7. Config Slave Interface (RP only)
4.8. Hard IP Reconfiguration Interface
4.9. Config TL Interface
4.10. Configuration Intercept Interface (EP Only)
4.11. User Functional Level Reset (FLR)
4.12. User Event MSI-X Request Interface
4.13. Data Mover Interface
4.14. Hard IP Status Interface
8.1.6.1. ifc_api_start
8.1.6.2. ifc_mcdma_port_by_name
8.1.6.3. ifc_qdma_device_get
8.1.6.4. ifc_num_channels_get
8.1.6.5. ifc_qdma_channel_get
8.1.6.6. ifc_qdma_acquire_channels
8.1.6.7. ifc_qdma_release_all_channels
8.1.6.8. ifc_qdma_device_put
8.1.6.9. ifc_qdma_channel_put
8.1.6.10. ifc_qdma_completion_poll
8.1.6.11. ifc_qdma_request_start
8.1.6.12. ifc_qdma_request_prepare
8.1.6.13. ifc_qdma_descq_queue_batch_load
8.1.6.14. ifc_qdma_request_submit
8.1.6.15. ifc_qdma_pio_read32
8.1.6.16. ifc_qdma_pio_write32
8.1.6.17. ifc_qdma_pio_read64
8.1.6.18. ifc_qdma_pio_write64
8.1.6.19. ifc_qdma_pio_read128
8.1.6.20. ifc_qdma_pio_write128
8.1.6.21. ifc_qdma_pio_read256
8.1.6.22. ifc_qdma_pio_write256
8.1.6.23. ifc_request_malloc
8.1.6.24. ifc_request_free
8.1.6.25. ifc_app_stop
8.1.6.26. ifc_qdma_poll_init
8.1.6.27. ifc_qdma_poll_add
8.1.6.28. ifc_qdma_poll_wait
8.1.6.29. ifc_mcdma_port_by_name
Visible to Intel only — GUID: wuz1589498866220
Ixiasoft
8.1.4. Software Flow
Figure 35. Multi Channel 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 if all channels ports are busy thread waits in poll mode
- In the context of thread, libqdma allocates descriptors buffer memory in the host
- libqdma initializes following registers in QCSR associates with queue, which includes Starting address of descriptors, queue size, write back address for 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 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 it goes to step 3. If channel is busy or descriptors ring is full thread retries to initiate the transfer again
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 descriptor ring buffer, the libqdma writes number of descriptor updates into tail register of 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, Multi Channel DMA IP for PCI Express fetches descriptors from host memory starting from the programmed Q_START_ADDR_L/H address
- Multi Channel DMA IP for PCI Express 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 following methods, which can be enabled in each descriptor.
- Either based on MSI-X Interrupt : Multi Channel DMA IP for PCI Express sends MSI-X interrupt to host if enabled in Q_CTRL.
- Writeback: Multi Channel DMA for PCI Express IP updates Q_CONSUMED_HEAD_ADDR_L/H, if writeback is enabled in Q_CTRL.