rte_dmadev.h
- Provided by: dpdk-doc (Version: 25.11-2)
- Source: dpdk
- Report a bug
#include <stdint.h>
#include <errno.h>
#include <rte_bitops.h>
#include <rte_common.h>
#include <rte_uuid.h>
#include 'rte_dmadev_core.h'
#include 'rte_dmadev_trace_fp.h'
struct rte_dma_info
struct rte_dma_conf
struct rte_dma_port_param
struct rte_dma_auto_free_param
struct rte_dma_inter_domain_param
struct rte_dma_vchan_conf
struct rte_dma_stats
struct rte_dma_sge
struct rte_dma_op
#define RTE_DMADEV_DEFAULT_MAX 64
#define RTE_DMA_FOREACH_DEV(p)
#define RTE_DMA_CFG_FLAG_SILENT RTE_BIT64(0)
#define RTE_DMA_CFG_FLAG_ENQ_DEQ RTE_BIT64(1)
#define RTE_DMA_ALL_VCHAN 0xFFFFu
DMA capability
See also
#define RTE_DMA_CAPA_MEM_TO_MEM RTE_BIT64(0)
#define RTE_DMA_CAPA_MEM_TO_DEV RTE_BIT64(1)
#define RTE_DMA_CAPA_DEV_TO_MEM RTE_BIT64(2)
#define RTE_DMA_CAPA_DEV_TO_DEV RTE_BIT64(3)
#define RTE_DMA_CAPA_SVA RTE_BIT64(4)
#define RTE_DMA_CAPA_SILENT RTE_BIT64(5)
#define RTE_DMA_CAPA_HANDLES_ERRORS RTE_BIT64(6)
#define RTE_DMA_CAPA_M2D_AUTO_FREE RTE_BIT64(7)
#define RTE_DMA_CAPA_PRI_POLICY_SP RTE_BIT64(8)
#define RTE_DMA_CAPA_INTER_PROCESS_DOMAIN RTE_BIT64(9)
#define RTE_DMA_CAPA_INTER_OS_DOMAIN RTE_BIT64(10)
#define RTE_DMA_CAPA_OPS_COPY RTE_BIT64(32)
#define RTE_DMA_CAPA_OPS_COPY_SG RTE_BIT64(33)
#define RTE_DMA_CAPA_OPS_FILL RTE_BIT64(34)
#define RTE_DMA_CAPA_OPS_ENQ_DEQ RTE_BIT64(35)
DMA operation flag
See also
rte_dma_copy_sg()
rte_dma_fill()
#define RTE_DMA_OP_FLAG_FENCE RTE_BIT64(0)
#define RTE_DMA_OP_FLAG_SUBMIT RTE_BIT64(1)
#define RTE_DMA_OP_FLAG_LLC RTE_BIT64(2)
#define RTE_DMA_OP_FLAG_AUTO_FREE RTE_BIT64(3)
typedef void(* rte_dma_access_pair_group_event_cb_t)
(int16_t dev_id, int16_t group_id, rte_uuid_t domain_id, enum
rte_dma_access_pair_group_event_type event)
enum rte_dma_direction { RTE_DMA_DIR_MEM_TO_MEM,
RTE_DMA_DIR_MEM_TO_DEV, RTE_DMA_DIR_DEV_TO_MEM,
RTE_DMA_DIR_DEV_TO_DEV }
enum rte_dma_port_type { }
enum rte_dma_inter_domain_type { RTE_DMA_INTER_DOMAIN_NONE,
RTE_DMA_INTER_PROCESS_DOMAIN, RTE_DMA_INTER_OS_DOMAIN }
enum rte_dma_vchan_status { RTE_DMA_VCHAN_IDLE,
RTE_DMA_VCHAN_ACTIVE, RTE_DMA_VCHAN_HALTED_ERROR }
enum rte_dma_access_pair_group_event_type {
RTE_DMA_GROUP_EVENT_MEMBER_LEFT,
RTE_DMA_GROUP_EVENT_GROUP_DESTROYED }
enum rte_dma_status_code { RTE_DMA_STATUS_SUCCESSFUL,
RTE_DMA_STATUS_USER_ABORT, RTE_DMA_STATUS_NOT_ATTEMPTED,
RTE_DMA_STATUS_INVALID_SRC_ADDR,
RTE_DMA_STATUS_INVALID_DST_ADDR, RTE_DMA_STATUS_INVALID_ADDR,
RTE_DMA_STATUS_INVALID_LENGTH, RTE_DMA_STATUS_INVALID_OPCODE,
RTE_DMA_STATUS_BUS_READ_ERROR, RTE_DMA_STATUS_BUS_WRITE_ERROR,
RTE_DMA_STATUS_BUS_ERROR, RTE_DMA_STATUS_DATA_POISION,
RTE_DMA_STATUS_DESCRIPTOR_READ_ERROR,
RTE_DMA_STATUS_DEV_LINK_ERROR, RTE_DMA_STATUS_PAGE_FAULT,
RTE_DMA_STATUS_ERROR_UNKNOWN = 0x100 }
int rte_dma_dev_max (size_t dev_max)
int rte_dma_get_dev_id_by_name (const char *name)
bool rte_dma_is_valid (int16_t dev_id)
uint16_t rte_dma_count_avail (void)
int16_t rte_dma_next_dev (int16_t start_dev_id)
int rte_dma_info_get (int16_t dev_id, struct rte_dma_info
*dev_info)
int rte_dma_configure (int16_t dev_id, const struct rte_dma_conf
*dev_conf)
int rte_dma_start (int16_t dev_id)
int rte_dma_stop (int16_t dev_id)
int rte_dma_close (int16_t dev_id)
int rte_dma_vchan_setup (int16_t dev_id, uint16_t vchan, const struct
rte_dma_vchan_conf *conf)
int rte_dma_stats_get (int16_t dev_id, uint16_t vchan, struct
rte_dma_stats *stats)
int rte_dma_stats_reset (int16_t dev_id, uint16_t vchan)
int rte_dma_vchan_status (int16_t dev_id, uint16_t vchan, enum
rte_dma_vchan_status *status)
int rte_dma_dump (int16_t dev_id, FILE *f)
__rte_experimental int rte_dma_access_pair_group_create (int16_t
dev_id, rte_uuid_t domain_id, rte_uuid_t token, int16_t
*group_id, rte_dma_access_pair_group_event_cb_t cb)
__rte_experimental int rte_dma_access_pair_group_destroy (int16_t
dev_id, int16_t group_id)
__rte_experimental int rte_dma_access_pair_group_join (int16_t dev_id,
rte_uuid_t domain_id, rte_uuid_t token, int16_t group_id,
rte_dma_access_pair_group_event_cb_t cb)
__rte_experimental int rte_dma_access_pair_group_leave (int16_t dev_id,
int16_t group_id)
__rte_experimental int rte_dma_access_pair_group_handler_get (int16_t
dev_id, int16_t group_id, rte_uuid_t domain_id, uint16_t *handler)
static int rte_dma_copy (int16_t dev_id, uint16_t vchan,
rte_iova_t src, rte_iova_t dst, uint32_t length, uint64_t
flags)
static int rte_dma_copy_sg (int16_t dev_id, uint16_t vchan, struct
rte_dma_sge *src, struct rte_dma_sge *dst, uint16_t nb_src,
uint16_t nb_dst, uint64_t flags)
static int rte_dma_fill (int16_t dev_id, uint16_t vchan, uint64_t
pattern, rte_iova_t dst, uint32_t length, uint64_t flags)
static int rte_dma_submit (int16_t dev_id, uint16_t vchan)
static uint16_t rte_dma_completed (int16_t dev_id, uint16_t vchan,
const uint16_t nb_cpls, uint16_t *last_idx, bool *has_error)
static uint16_t rte_dma_completed_status (int16_t dev_id, uint16_t
vchan, const uint16_t nb_cpls, uint16_t *last_idx, enum
rte_dma_status_code *status)
static uint16_t rte_dma_burst_capacity (int16_t dev_id, uint16_t vchan)
static uint16_t rte_dma_enqueue_ops (int16_t dev_id, uint16_t vchan,
struct rte_dma_op **ops, uint16_t nb_ops)
static uint16_t rte_dma_dequeue_ops (int16_t dev_id, uint16_t vchan,
struct rte_dma_op **ops, uint16_t nb_ops)
DMA (Direct Memory Access) device API.
The DMA framework is built on the following model:
--------------- --------------- ---------------
| virtual DMA | | virtual DMA | | virtual DMA |
| channel | | channel | | channel |
--------------- --------------- ---------------
| | |
------------------ |
| |
------------ ------------
| dmadev | | dmadev |
------------ ------------
| |
------------------ ------------------
| HW DMA channel | | HW DMA channel |
------------------ ------------------
| |
--------------------------------
|
---------------------
| HW DMA Controller |
---------------------
The DMA controller could have multiple HW-DMA-channels (aka. HW-DMA-queues), each HW-DMA-channel should be represented by a dmadev.
The dmadev could create multiple virtual DMA channels, each virtual DMA channel represents a different transfer context. The DMA operation request must be submitted to the virtual DMA channel. e.g. Application could create virtual DMA channel 0 for memory-to-memory transfer scenario, and create virtual DMA channel 1 for memory-to-device transfer scenario.
This framework uses 'int16_t dev_id' as the device identifier of a dmadev, and 'uint16_t vchan' as the virtual DMA channel identifier in one dmadev.
The functions exported by the dmadev API to setup a device designated by its device identifier must be invoked in the following order:
Then, the application can invoke dataplane functions to process jobs.
If the application wants to change the configuration (i.e. invoke rte_dma_configure() or rte_dma_vchan_setup()), it must invoke rte_dma_stop() first to stop the device and then do the reconfiguration before invoking rte_dma_start() again. The dataplane functions should not be invoked when the device is stopped.
Finally, an application can close a dmadev by invoking the rte_dma_close() function.
The dataplane APIs include two parts: The first part is the submission of operation requests:
These APIs could work with different virtual DMA channels which have different contexts.
The first three APIs are used to submit the operation request to the virtual DMA channel, if the submission is successful, a positive ring_idx <= UINT16_MAX is returned, otherwise a negative number is returned.
The last API is used to issue doorbell to hardware, and also there are flags (
See also
Note
The second part is to obtain the result of requests:
Note
See also
About the ring_idx which enqueue APIs (e.g. rte_dma_copy(), rte_dma_fill()) return, the rules are as follows:
One example:
The DMA operation address used in enqueue APIs (i.e. rte_dma_copy(), rte_dma_copy_sg(), rte_dma_fill()) is defined as rte_iova_t type.
The dmadev supports two types of address: memory address and device address.
Note
See also
About MT-safe, all the functions of the dmadev API implemented by a PMD are lock-free functions which assume to not be invoked in parallel on different logical cores to work on the same target dmadev object.
Note
Definition in file rte_dmadev.h.
Maximum number of devices if rte_dma_dev_max() is not called.
Definition at line 159 of file rte_dmadev.h.
Value:
for (p = rte_dma_next_dev(0); \
p != -1; \
p = rte_dma_next_dev(p + 1))
Utility macro to iterate over all available dmadevs
Definition at line 218 of file rte_dmadev.h.
Support memory-to-memory transfer
Definition at line 228 of file rte_dmadev.h.
Support memory-to-device transfer.
Definition at line 230 of file rte_dmadev.h.
Support device-to-memory transfer.
Definition at line 232 of file rte_dmadev.h.
Support device-to-device transfer.
Definition at line 234 of file rte_dmadev.h.
Support SVA which could use VA as DMA address. If device support SVA then application could pass any VA address like memory from rte_malloc(), rte_memzone(), malloc, stack memory. If device don't support SVA, then application should pass IOVA address which from rte_malloc(), rte_memzone().
Definition at line 241 of file rte_dmadev.h.
Support work in silent mode. In this mode, application don't required to invoke rte_dma_completed*() API.
See also
Definition at line 247 of file rte_dmadev.h.
Supports error handling
With this bit set, invalid input addresses will be reported as operation failures to the user but other operations can continue. Without this bit set, invalid data is not handled by either HW or driver, so user must ensure that all memory addresses are valid and accessible by HW.
Definition at line 255 of file rte_dmadev.h.
Support auto free for source buffer once mem to dev transfer is completed.
Note
Definition at line 262 of file rte_dmadev.h.
Support strict priority scheduling.
Application could assign fixed priority to the DMA device using 'priority' field in struct rte_dma_conf. Number of supported priority levels will be known from 'nb_priorities' field in struct rte_dma_info.
Definition at line 269 of file rte_dmadev.h.
Support inter-process DMA transfers.
When this bit is set, the DMA device can perform memory transfers between different process memory spaces.
Definition at line 275 of file rte_dmadev.h.
Support inter-OS domain DMA transfers.
The DMA device can perform memory transfers across different operating system domains.
Definition at line 281 of file rte_dmadev.h.
Support copy operation. This capability start with index of 32, so that it could leave gap between normal capability and ops capability.
Definition at line 287 of file rte_dmadev.h.
Support scatter-gather list copy operation.
Definition at line 289 of file rte_dmadev.h.
Support fill operation.
Definition at line 291 of file rte_dmadev.h.
Support enqueue and dequeue operations.
Definition at line 293 of file rte_dmadev.h.
DMA device configuration flags.
See also
RTE_DMA_CAPA_SILENT
Definition at line 302 of file rte_dmadev.h.
Enable enqueue and dequeue operations
See also
Definition at line 306 of file rte_dmadev.h.
Special ID, which is used to represent all virtual DMA channels.
See also
rte_dma_stats_reset
Definition at line 733 of file rte_dmadev.h.
Fence flag. It means the operation with this flag must be processed only after all previous operations are completed. If the specify DMA HW works in-order (it means it has default fence between operations), this flag could be NOP.
Definition at line 1131 of file rte_dmadev.h.
Submit flag. It means the operation with this flag must issue doorbell to hardware after enqueued jobs.
Definition at line 1136 of file rte_dmadev.h.
Write data to low level cache hint. Used for performance optimization, this is just a hint, and there is no capability bit for this, driver should not return error if this flag was set.
Definition at line 1141 of file rte_dmadev.h.
Auto free buffer flag. Operation with this flag must issue command to hardware to free the DMA buffer after DMA transfer is completed.
See also
Definition at line 1148 of file rte_dmadev.h.
This callback is used to notify interested parties (either the group creator or group joiners) about significant events related to the lifecycle of a DMA access pair group.
Warning
It can be registered by:
Parameters
See also
Definition at line 856 of file rte_dmadev.h.
DMA transfer direction defines.
See also
Enumerator
See also
struct rte_dma_inter_domain_param::type
See also
See also
See also
Definition at line 441 of file rte_dmadev.h.
DMA access port type defines.
See also
Enumerator
Definition at line 487 of file rte_dmadev.h.
Inter-DMA transfer domain type.
Warning
This enum defines the types of transfer domains applicable to DMA operations. It helps categorize whether a DMA transfer is occurring within the same domain, across different processes, or between distinct operating system domains.
See also
Enumerator
Definition at line 607 of file rte_dmadev.h.
device vchannel status
Enum with the options for the channel status, either idle, active or halted due to error
See also
Enumerator
Definition at line 773 of file rte_dmadev.h.
Event types for DMA access pair group notifications.
Warning
When the event type is RTE_DMA_GROUP_EVENT_MEMBER_LEFT, the handler associated with the departing member's domain is no longer valid. Inter-domain DMA operations targeting that domain should be avoided.
When the event type is RTE_DMA_GROUP_EVENT_GROUP_DESTROYED, all handlers associated with the group become invalid. No further inter-domain DMA operations should be initiated using those handlers.
Enumerator
Definition at line 824 of file rte_dmadev.h.
DMA transfer result status code defines.
See also
Enumerator
Definition at line 983 of file rte_dmadev.h.
Configure the maximum number of dmadevs.
Note
See also
Parameters
Returns
Get the device identifier for the named DMA device.
Parameters
Returns
Check whether the dev_id is valid.
Parameters
Returns
Get the total number of DMA devices that have been successfully initialised.
Returns
Iterates over valid dmadev instances.
Parameters
Returns
Retrieve information of a DMA device.
Parameters
Returns
Configure a DMA device.
This function must be invoked first before any other function in the API. This function can also be re-invoked when a device is in the stopped state.
Parameters
Returns
Start a DMA device.
The device start step is the last one and consists of setting the DMA to start accepting jobs.
Parameters
Returns
Stop a DMA device.
The device can be restarted with a call to rte_dma_start().
Parameters
Returns
Close a DMA device.
The device cannot be restarted after this call.
Parameters
Returns
Allocate and set up a virtual DMA channel.
Parameters
Returns
Retrieve basic statistics of a or all virtual DMA channel(s).
Parameters
Returns
Reset basic statistics of a or all virtual DMA channel(s).
Parameters
Returns
Determine if all jobs have completed on a device channel. This function is primarily designed for testing use, as it allows a process to check if all jobs are completed, without actually gathering completions from those jobs.
Parameters
Returns
Dump DMA device info.
Parameters
Returns
Create an access pair group to enable secure DMA transfers between devices across different processes or operating system domains.
Warning
Parameters
Returns
Destroy an access pair group if all participating devices have exited.
Warning
This operation is only permitted by the device that originally created the group; attempts by other devices will result in failure.
Parameters
Returns
Join an existing access group to enable secure DMA transfers between devices across different processes or OS domains.
Warning
Parameters
Returns
Leave an access group, removing the device's entry from the group table and disabling inter-domain DMA transfers to and from this device.
Warning
This operation is not permitted for the device that originally created the group.
Parameters
Returns
Retrieve the handler associated with a specific domain ID, which is used by the application to query source or destinationin handler to initiate inter-process or inter-OS DMA transfers.
Warning
Parameters
Returns
Enqueue a copy operation onto the virtual DMA channel.
This queues up a copy operation to be performed by hardware, if the 'flags' parameter contains RTE_DMA_OP_FLAG_SUBMIT then trigger doorbell to begin this operation, otherwise do not trigger doorbell.
Parameters
See also
Returns
Definition at line 1178 of file rte_dmadev.h.
Enqueue a scatter-gather list copy operation onto the virtual DMA channel.
This queues up a scatter-gather list copy operation to be performed by hardware, if the 'flags' parameter contains RTE_DMA_OP_FLAG_SUBMIT then trigger doorbell to begin this operation, otherwise do not trigger doorbell.
Parameters
See also
Parameters
See also
Parameters
See also
Returns
Definition at line 1228 of file rte_dmadev.h.
Enqueue a fill operation onto the virtual DMA channel.
This queues up a fill operation to be performed by hardware, if the 'flags' parameter contains RTE_DMA_OP_FLAG_SUBMIT then trigger doorbell to begin this operation, otherwise do not trigger doorbell.
Parameters
See also
Returns
Definition at line 1277 of file rte_dmadev.h.
Trigger hardware to begin performing enqueued operations.
Writes the "doorbell" to the hardware to trigger it to begin the operations previously enqueued by rte_dma_copy/fill().
Parameters
Returns
Definition at line 1311 of file rte_dmadev.h.
Return the number of operations that have been successfully completed. Once an operation has been reported as completed, the results of that operation will be visible to all cores on the system.
Parameters
Returns
Definition at line 1352 of file rte_dmadev.h.
Return the number of operations that have been completed, and the operations result may succeed or fail. Once an operation has been reported as completed successfully, the results of that operation will be visible to all cores on the system.
Parameters
See also
Returns
Definition at line 1414 of file rte_dmadev.h.
Check remaining capacity in descriptor ring for the current burst.
Parameters
Returns
Definition at line 1451 of file rte_dmadev.h.
Enqueue rte_dma_ops to DMA device, can only be used underlying supports RTE_DMA_CAPA_OPS_ENQ_DEQ and rte_dma_conf::enable_enq_deq is enabled in rte_dma_configure(). The ops enqueued will be immediately submitted to the DMA device. The enqueue should be coupled with dequeue to retrieve completed ops, calls to rte_dma_submit(), rte_dma_completed() and rte_dma_completed_status() are not valid.
Parameters
Returns
Definition at line 1489 of file rte_dmadev.h.
Dequeue completed rte_dma_ops submitted to the DMA device, can only be used underlying supports RTE_DMA_CAPA_OPS_ENQ_DEQ and rte_dma_conf::enable_enq_deq is enabled in rte_dma_configure().
Parameters
Returns
Definition at line 1524 of file rte_dmadev.h.
Generated automatically by Doxygen for DPDK from the source code.