6. OCTEON TX2 DMA Driver
OCTEON TX2 has an internal DMA unit which can be used by applications to initiate DMA transaction internally, from/to host when OCTEON TX2 operates in PCIe End Point mode. The DMA PF function supports 8 VFs corresponding to 8 DMA queues. Each DMA queue was exposed as a VF function when SRIOV enabled.
6.1. Features
This DMA PMD supports below 3 modes of memory transfers
- Internal - OCTEON TX2 DRAM to DRAM without core intervention
- Inbound - Host DRAM to OCTEON TX2 DRAM without host/OCTEON TX2 cores involvement
- Outbound - OCTEON TX2 DRAM to Host DRAM without host/OCTEON TX2 cores involvement
6.2. Prerequisites and Compilation procedure
See Marvell OCTEON TX2 Platform Guide for setup information.
6.3. Enabling logs
For enabling logs, use the following EAL parameter:
./your_dma_application <EAL args> --log-level=pmd.raw.octeontx2.dpi,<level>
Using pmd.raw.octeontx2.dpi
as log matching criteria, all Event PMD logs
can be enabled which are lower than logging level
.
6.4. Initialization
The number of DMA VFs (queues) enabled can be controlled by setting sysfs entry, sriov_numvfs for the corresponding PF driver.
echo <num_vfs> > /sys/bus/pci/drivers/octeontx2-dpi/0000\:05\:00.0/sriov_numvfs
Once the required VFs are enabled, to be accessible from DPDK, VFs need to be bound to vfio-pci driver.
6.5. Device Setup
The OCTEON TX2 DPI DMA HW devices will need to be bound to a
user-space IO driver for use. The script dpdk-devbind.py
script
included with DPDK can be used to view the state of the devices and to bind
them to a suitable DPDK-supported kernel driver. When querying the status
of the devices, they will appear under the category of “Misc (rawdev)
devices”, i.e. the command dpdk-devbind.py --status-dev misc
can be
used to see the state of those devices alone.
6.6. Device Configuration
Configuring DMA rawdev device is done using the rte_rawdev_configure()
API, which takes the mempool as parameter. PMD uses this pool to submit DMA
commands to HW.
The following code shows how the device is configured
struct dpi_rawdev_conf_s conf = {0};
struct rte_rawdev_info rdev_info = {.dev_private = &conf};
conf.chunk_pool = (void *)rte_mempool_create_empty(...);
rte_mempool_set_ops_byname(conf.chunk_pool, rte_mbuf_platform_mempool_ops(), NULL);
rte_mempool_populate_default(conf.chunk_pool);
rte_rawdev_configure(dev_id, (rte_rawdev_obj_t)&rdev_info, sizeof(conf));
6.7. Performing Data Transfer
To perform data transfer using OCTEON TX2 DMA rawdev devices use standard
rte_rawdev_enqueue_buffers()
and rte_rawdev_dequeue_buffers()
APIs.
6.8. Self test
On EAL initialization, dma devices will be probed and populated into the raw devices. The rawdev ID of the device can be obtained using
- Invoke
rte_rawdev_get_dev_id("DPI:x")
from the application where x is the VF device’s bus id specified in “bus:device.func” format. Use this index for further rawdev function calls. - This PMD supports driver self test, to test DMA internal mode from test
application one can directly calls
rte_rawdev_selftest(rte_rawdev_get_dev_id("DPI:x"))