Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
rte_dmadev.h(3) 		      DPDK			 rte_dmadev.h(3)

NAME
     rte_dmadev.h

SYNOPSIS
     #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'

   Data Structures
     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

   Macros
     #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
	 struct rte_dma_info::dev_capa

	 #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()

	 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)

   Typedefs
     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_ac-
	 cess_pair_group_event_type event)

   Enumerations
     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_IN-
	 TER_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_MEM-
	 BER_LEFT, RTE_DMA_GROUP_EVENT_GROUP_DESTROYED }
     enum    rte_dma_status_code   {   RTE_DMA_STATUS_SUCCESSFUL,   RTE_DMA_STA-
	 TUS_USER_ABORT,    RTE_DMA_STATUS_NOT_ATTEMPTED,     RTE_DMA_STATUS_IN-
	 VALID_SRC_ADDR,   RTE_DMA_STATUS_INVALID_DST_ADDR,   RTE_DMA_STATUS_IN-
	 VALID_ADDR,  RTE_DMA_STATUS_INVALID_LENGTH,  RTE_DMA_STATUS_INVALID_OP-
	 CODE,	 RTE_DMA_STATUS_BUS_READ_ERROR,  RTE_DMA_STATUS_BUS_WRITE_ERROR,
	 RTE_DMA_STATUS_BUS_ERROR,   RTE_DMA_STATUS_DATA_POISION,   RTE_DMA_STA-
	 TUS_DESCRIPTOR_READ_ERROR,  RTE_DMA_STATUS_DEV_LINK_ERROR, RTE_DMA_STA-
	 TUS_PAGE_FAULT, RTE_DMA_STATUS_ERROR_UNKNOWN = 0x100 }

   Functions
     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_ac-
	 cess_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_ac-
	 cess_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)

Detailed Description
     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:

     * rte_dma_configure()

     * rte_dma_vchan_setup()

     * rte_dma_start()

     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 be-
     fore 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:

     * rte_dma_copy()

     * rte_dma_copy_sg()

     * rte_dma_fill()

     * rte_dma_submit()

     These  APIs  could work with different virtual DMA channels which have dif-
     ferent contexts.

     The first three APIs are used to submit the operation request to  the  vir-
     tual  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
	 RTE_DMA_OP_FLAG_SUBMIT)  parameter of the first three APIs could do the
	 same work.

     Note
	 When enqueuing a set of jobs to the device, having  a	separate  submit
	 outside  a loop makes for clearer code than having a check for the last
	 iteration inside the loop to set a special submit  flag.  However,  for
	 cases	where  one item alone is to be submitted or there is a small set
	 of jobs to be submitted sequentially, having a submit flag  provides  a
	 lower-overhead way of doing the submission while still keeping the code
	 clean.

     The second part is to obtain the result of requests:

     * rte_dma_completed()

       * return the number of operation requests completed successfully.

     * rte_dma_completed_status()

       * return the number of operation requests completed.

     Note
	 If the dmadev works in silent mode (

     See also
	 RTE_DMA_CAPA_SILENT),	application  does  not invoke the above two com-
	 pleted APIs.

     About the ring_idx which enqueue APIs (e.g. rte_dma_copy(), rte_dma_fill())
     return, the rules are as follows:

     * ring_idx for each virtual DMA channel are independent.

     * For a virtual DMA channel, the  ring_idx  is  monotonically  incremented,
       when it reach UINT16_MAX, it wraps back to zero.

     * This ring_idx can be used by applications to track per-operation metadata
       in an application-defined circular ring.

     * The  initial  ring_idx of a virtual DMA channel is zero, after the device
       is stopped, the ring_idx needs to be reset to zero.

     One example:

     * step-1: start one dmadev

     * step-2: enqueue a copy operation, the ring_idx return is 0

     * step-3: enqueue a copy operation again, the ring_idx return is 1

     * ...

     * step-101: stop the dmadev

     * step-102: start the dmadev

     * step-103: enqueue a copy operation, the ring_idx return is 0

     * ...

     * step-x+0: enqueue a fill operation, the ring_idx return is 65535

     * step-x+1: enqueue a copy operation, the ring_idx return is 0

     * ...

     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 ad-
     dress.

     * memory address: the source and destination address of the  memory-to-mem-
       ory transfer type, or the source address of the memory-to-device transfer
       type, or the destination address of the device-to-memory transfer type.

     Note
	 If the device support SVA (

     See also
	 RTE_DMA_CAPA_SVA),  the memory address can be any VA address, otherwise
	 it must be an IOVA address.

     * device address: the source and destination address of  the  device-to-de-
       vice  transfer type, or the source address of the device-to-memory trans-
       fer type, or the destination address  of  the  memory-to-device	transfer
       type.

     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
	 Different virtual DMA channels on the same dmadev DO NOT support paral-
	 lel  invocation  because  these virtual DMA channels share the same HW-
	 DMA-channel.

     Definition in file rte_dmadev.h.

Macro Definition Documentation
   #define RTE_DMADEV_DEFAULT_MAX   64
     Maximum number of devices if rte_dma_dev_max() is not called.

     Definition at line 159 of file rte_dmadev.h.

   #define RTE_DMA_FOREACH_DEV(p)
     Value:.PP
	 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.

   #define RTE_DMA_CAPA_MEM_TO_MEM   RTE_BIT64(0)
     Support memory-to-memory transfer

     Definition at line 228 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_MEM_TO_DEV   RTE_BIT64(1)
     Support memory-to-device transfer.

     Definition at line 230 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_DEV_TO_MEM   RTE_BIT64(2)
     Support device-to-memory transfer.

     Definition at line 232 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_DEV_TO_DEV   RTE_BIT64(3)
     Support device-to-device transfer.

     Definition at line 234 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_SVA   RTE_BIT64(4)
     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  ap-
     plication should pass IOVA address which from rte_malloc(), rte_memzone().

     Definition at line 241 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_SILENT	 RTE_BIT64(5)
     Support  work  in	silent mode. In this mode, application don't required to
     invoke rte_dma_completed*() API.

     See also
	 struct rte_dma_conf::silent_mode

     Definition at line 247 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_HANDLES_ERRORS	 RTE_BIT64(6)
     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  en-
     sure that all memory addresses are valid and accessible by HW.

     Definition at line 255 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_M2D_AUTO_FREE	RTE_BIT64(7)
     Support auto free for source buffer once mem to dev transfer is completed.

     Note
	 Even  though the DMA driver has this capability, it may not support all
	 mempool drivers. If the mempool is not supported  by  the  DMA  driver,
	 rte_dma_vchan_setup() will fail.

     Definition at line 262 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_PRI_POLICY_SP	RTE_BIT64(8)
     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.

   #define RTE_DMA_CAPA_INTER_PROCESS_DOMAIN   RTE_BIT64(9)
     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.

   #define RTE_DMA_CAPA_INTER_OS_DOMAIN   RTE_BIT64(10)
     Support inter-OS domain DMA transfers.

     The DMA device can perform memory transfers across different operating sys-
     tem domains.

     Definition at line 281 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_OPS_COPY   RTE_BIT64(32)
     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.

   #define RTE_DMA_CAPA_OPS_COPY_SG   RTE_BIT64(33)
     Support scatter-gather list copy operation.

     Definition at line 289 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_OPS_FILL   RTE_BIT64(34)
     Support fill operation.

     Definition at line 291 of file rte_dmadev.h.

   #define RTE_DMA_CAPA_OPS_ENQ_DEQ   RTE_BIT64(35)
     Support enqueue and dequeue operations.

     Definition at line 293 of file rte_dmadev.h.

   #define RTE_DMA_CFG_FLAG_SILENT   RTE_BIT64(0)
     DMA device configuration flags.

     See also
	 struct rte_dma_conf::flags Operate in silent mode

	 RTE_DMA_CAPA_SILENT

     Definition at line 302 of file rte_dmadev.h.

   #define RTE_DMA_CFG_FLAG_ENQ_DEQ   RTE_BIT64(1)
     Enable enqueue and dequeue operations

     See also
	 RTE_DMA_CAPA_OPS_ENQ_DEQ

     Definition at line 306 of file rte_dmadev.h.

   #define RTE_DMA_ALL_VCHAN   0xFFFFu
     Special ID, which is used to represent all virtual DMA channels.

     See also
	 rte_dma_stats_get

	 rte_dma_stats_reset

     Definition at line 733 of file rte_dmadev.h.

   #define RTE_DMA_OP_FLAG_FENCE   RTE_BIT64(0)
     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.

   #define RTE_DMA_OP_FLAG_SUBMIT   RTE_BIT64(1)
     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.

   #define RTE_DMA_OP_FLAG_LLC	 RTE_BIT64(2)
     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.

   #define RTE_DMA_OP_FLAG_AUTO_FREE   RTE_BIT64(3)
     Auto free buffer flag. Operation with this flag must issue command to hard-
     ware to free the DMA buffer after DMA transfer is completed.

     See also
	 struct rte_dma_vchan_conf::auto_free

     Definition at line 1148 of file rte_dmadev.h.

Typedef Documentation
   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)
     This  callback  is used to notify interested parties (either the group cre-
     ator or group joiners) about significant events related to the lifecycle of
     a DMA access pair group.

     Warning
	 EXPERIMENTAL: this API may change without prior notice.

     It can be registered by:

     * Group creators or group joiners to be notified when a member  leaves  the
       group.

     * Group joiners to be notified when the group is destroyed.

     Parameters
	 dev_id Identifier of the DMA device.
	 group_id Identifier of the access pair group where the event occurred.
	 domain_id  UUID  of the domain_id associated with the event. For member
	 leave events, this is the domain_id of the member that left. For  group
	 destruction  events,  this may refer to the domain_id of the respective
	 member.
	 event Type of event that occurred.

     See also
	 rte_dma_access_pair_group_event_type

     Definition at line 856 of file rte_dmadev.h.

Enumeration Type Documentation
   enum rte_dma_direction
     DMA transfer direction defines.

     See also
	 struct rte_dma_vchan_conf::direction

     Enumerator

     RTE_DMA_DIR_MEM_TO_MEM
	    DMA transfer direction - from memory to memory. When the device sup-
	    ports inter-process or inter-OS domain transfers, the field type  in
	    struct  rte_dma_vchan_conf::domain specifies the type of domain. For
	    memory-to-memory transfers within the same domain or  process,  type
	    should be set to RTE_DMA_INTER_DOMAIN_NONE.

     See also
	 struct rte_dma_vchan_conf::direction

	 struct rte_dma_inter_domain_param::type

     RTE_DMA_DIR_MEM_TO_DEV
	    DMA  transfer  direction  - from memory to device. In a typical sce-
	    nario, the SoCs are installed on host servers as iNICs  through  the
	    PCIe  interface.  In this case, the SoCs works in EP(endpoint) mode,
	    it could initiate a DMA move request from memory (which is SoCs mem-
	    ory) to device (which is host memory).

     See also
	 struct rte_dma_vchan_conf::direction

     RTE_DMA_DIR_DEV_TO_MEM
	    DMA transfer direction - from device to memory. In	a  typical  sce-
	    nario,  the  SoCs are installed on host servers as iNICs through the
	    PCIe interface. In this case, the SoCs works in  EP(endpoint)  mode,
	    it could initiate a DMA move request from device (which is host mem-
	    ory) to memory (which is SoCs memory).

     See also
	 struct rte_dma_vchan_conf::direction

     RTE_DMA_DIR_DEV_TO_DEV
	    DMA  transfer  direction  - from device to device. In a typical sce-
	    nario, the SoCs are installed on host servers as iNICs  through  the
	    PCIe  interface.  In this case, the SoCs works in EP(endpoint) mode,
	    it could initiate a DMA move request from device (which is host mem-
	    ory) to the device (which is another host memory).

     See also
	 struct rte_dma_vchan_conf::direction

     Definition at line 441 of file rte_dmadev.h.

   enum rte_dma_port_type
     DMA access port type defines.

     See also
	 struct rte_dma_port_param::port_type

     Enumerator

     RTE_DMA_PORT_PCIE
	    The DMA access port is PCIe.

     Definition at line 487 of file rte_dmadev.h.

   enum rte_dma_inter_domain_type
     Inter-DMA transfer domain type.

     Warning
	 EXPERIMENTAL: this API may change without prior notice.

     This enum defines the types of transfer domains applicable  to  DMA  opera-
     tions.  It  helps categorize whether a DMA transfer is occurring within the
     same domain, across different processes, or between distinct operating sys-
     tem domains.

     See also
	 struct rte_dma_inter_domain_param:type

     Enumerator

     RTE_DMA_INTER_DOMAIN_NONE
	    No inter-domain transfer; standard DMA within same domain.

     RTE_DMA_INTER_PROCESS_DOMAIN
	    Transfer occurs between different user-space processes.

     RTE_DMA_INTER_OS_DOMAIN
	    Transfer spans across different operating system domains.

     Definition at line 607 of file rte_dmadev.h.

   enum rte_dma_vchan_status
     device vchannel status

     Enum with the options for the channel status, either idle, active or halted
     due to error

     See also
	 rte_dma_vchan_status

     Enumerator

     RTE_DMA_VCHAN_IDLE
	    not processing, awaiting ops

     RTE_DMA_VCHAN_ACTIVE
	    currently processing jobs

     RTE_DMA_VCHAN_HALTED_ERROR
	    not processing due to error, cannot accept new ops

     Definition at line 773 of file rte_dmadev.h.

   enum rte_dma_access_pair_group_event_type
     Event types for DMA access pair group notifications.

     Warning
	 EXPERIMENTAL: this API may change without prior notice.

     When the event type is RTE_DMA_GROUP_EVENT_MEMBER_LEFT, the handler associ-
     ated 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 oper-
     ations should be initiated using those handlers.

     Enumerator

     RTE_DMA_GROUP_EVENT_MEMBER_LEFT
	    A member left the group (notifies creator and joiners).

     RTE_DMA_GROUP_EVENT_GROUP_DESTROYED
	    Group was destroyed (notifies joiners).

     Definition at line 824 of file rte_dmadev.h.

   enum rte_dma_status_code
     DMA transfer result status code defines.

     See also
	 rte_dma_completed_status

     Enumerator

     RTE_DMA_STATUS_SUCCESSFUL
	    The operation completed successfully.

     RTE_DMA_STATUS_USER_ABORT
	    The operation failed to complete due abort by user. This  is  mainly
	    used  when	processing  dev_stop,  user could modify the descriptors
	    (e.g. change one bit to tell hardware abort  this  job),  it  allows
	    outstanding  requests  to be complete as much as possible, so reduce
	    the time to stop the device.

     RTE_DMA_STATUS_NOT_ATTEMPTED
	    The operation failed to complete due  to  following  scenarios:  The
	    jobs  in  a particular batch are not attempted because they appeared
	    after a fence where a previous job failed. In some HW implementation
	    it's possible for  jobs  from  later  batches  would  be  completed,
	    though,  so report the status from the not attempted jobs before re-
	    porting those newer completed jobs.

     RTE_DMA_STATUS_INVALID_SRC_ADDR
	    The operation failed to complete due invalid source address.

     RTE_DMA_STATUS_INVALID_DST_ADDR
	    The operation failed to complete due invalid destination address.

     RTE_DMA_STATUS_INVALID_ADDR
	    The operation failed to complete due invalid source  or  destination
	    address,  cover  the case that only knows the address error, but not
	    sure which address error.

     RTE_DMA_STATUS_INVALID_LENGTH
	    The operation failed to complete due invalid length.

     RTE_DMA_STATUS_INVALID_OPCODE
	    The operation failed to complete due invalid  opcode.  The	DMA  de-
	    scriptor  could have multiple format, which are distinguished by the
	    opcode field.

     RTE_DMA_STATUS_BUS_READ_ERROR
	    The operation failed to complete due bus read error.

     RTE_DMA_STATUS_BUS_WRITE_ERROR
	    The operation failed to complete due bus write error.

     RTE_DMA_STATUS_BUS_ERROR
	    The operation failed to complete due bus error, cover the case  that
	    only knows the bus error, but not sure which direction error.

     RTE_DMA_STATUS_DATA_POISION
	    The operation failed to complete due data poison.

     RTE_DMA_STATUS_DESCRIPTOR_READ_ERROR
	    The operation failed to complete due descriptor read error.

     RTE_DMA_STATUS_DEV_LINK_ERROR
	    The  operation failed to complete due device link error. Used to in-
	    dicates that the link error in the memory-to-device/  device-to-mem-
	    ory/device-to-device transfer scenario.

     RTE_DMA_STATUS_PAGE_FAULT
	    The operation failed to complete due lookup page fault.

     RTE_DMA_STATUS_ERROR_UNKNOWN
	    The  operation  failed  to	complete due unknown reason. The initial
	    value is 256, which reserves space for future errors.

     Definition at line 983 of file rte_dmadev.h.

Function Documentation
   int rte_dma_dev_max (size_t dev_max)
     Configure the maximum number of dmadevs.

     Note
	 This function can be invoked before the primary process  rte_eal_init()
	 to  change  the  maximum number of dmadevs. If not invoked, the maximum
	 number of dmadevs is

     See also
	 RTE_DMADEV_DEFAULT_MAX

     Parameters
	 dev_max maximum number of dmadevs.

     Returns
	 0 on success. Otherwise negative value is returned.

   int rte_dma_get_dev_id_by_name (const char * name)
     Get the device identifier for the named DMA device.

     Parameters
	 name DMA device name.

     Returns
	 Returns DMA device identifier on success.

	 * <0: Failure to find named DMA device.

   bool rte_dma_is_valid (int16_t dev_id)
     Check whether the dev_id is valid.

     Parameters
	 dev_id DMA device index.

     Returns

	 * If the device index is valid (true) or not (false).

   uint16_t rte_dma_count_avail (void)
     Get the total number of  DMA  devices  that  have	been  successfully  ini-
     tialised.

     Returns
	 The total number of usable DMA devices.

   int16_t rte_dma_next_dev (int16_t start_dev_id)
     Iterates over valid dmadev instances.

     Parameters
	 start_dev_id The id of the next possible dmadev.

     Returns
	 Next valid dmadev, UINT16_MAX if there is none.

   int rte_dma_info_get (int16_t dev_id, struct rte_dma_info * dev_info)
     Retrieve information of a DMA device.

     Parameters
	 dev_id The identifier of the device.
	 dev_info  A  pointer  to  a structure of type rte_dma_info to be filled
	 with the information of the device.

     Returns
	 0 on success. Otherwise negative value is returned.

   int rte_dma_configure (int16_t dev_id, const struct rte_dma_conf * dev_conf)
     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
	 dev_id The identifier of the device to configure.
	 dev_conf  The	DMA  device  configuration  structure  encapsulated into
	 rte_dma_conf object.

     Returns
	 0 on success. Otherwise negative value is returned.

   int rte_dma_start (int16_t dev_id)
     Start a DMA device.

     The device start step is the last one and consists of setting  the  DMA  to
     start accepting jobs.

     Parameters
	 dev_id The identifier of the device.

     Returns
	 0 on success. Otherwise negative value is returned.

   int rte_dma_stop (int16_t dev_id)
     Stop a DMA device.

     The device can be restarted with a call to rte_dma_start().

     Parameters
	 dev_id The identifier of the device.

     Returns
	 0 on success. Otherwise negative value is returned.

   int rte_dma_close (int16_t dev_id)
     Close a DMA device.

     The device cannot be restarted after this call.

     Parameters
	 dev_id The identifier of the device.

     Returns
	 0 on success. Otherwise negative value is returned.

   int	 rte_dma_vchan_setup  (int16_t	dev_id,  uint16_t  vchan,  const  struct
     rte_dma_vchan_conf * conf)
     Allocate and set up a virtual DMA channel.

     Parameters
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel. The value must be  in  the
	 range [0, nb_vchans - 1] previously supplied to rte_dma_configure().
	 conf  The virtual DMA channel configuration structure encapsulated into
	 rte_dma_vchan_conf object.

     Returns
	 0 on success. Otherwise negative value is returned.

   int rte_dma_stats_get (int16_t dev_id, uint16_t vchan, struct rte_dma_stats *
     stats)
     Retrieve basic statistics of a or all virtual DMA channel(s).

     Parameters
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel. If equal RTE_DMA_ALL_VCHAN
	 means all channels.
	 stats The basic statistics structure  encapsulated  into  rte_dma_stats
	 object.

     Returns
	 0 on success. Otherwise negative value is returned.

   int rte_dma_stats_reset (int16_t dev_id, uint16_t vchan)
     Reset basic statistics of a or all virtual DMA channel(s).

     Parameters
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel. If equal RTE_DMA_ALL_VCHAN
	 means all channels.

     Returns
	 0 on success. Otherwise negative value is returned.

   int	  rte_dma_vchan_status	  (int16_t    dev_id,	uint16_t   vchan,   enum
     rte_dma_vchan_status * status)
     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
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 status The vchan status

     Returns
	 0 - call completed successfully < 0 - error code indicating there was a
	 problem calling the API

   int rte_dma_dump (int16_t dev_id, FILE * f)
     Dump DMA device info.

     Parameters
	 dev_id The identifier of the device.
	 f The file to write the output to.

     Returns
	 0 on success. Otherwise negative value is returned.

   __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_ac-
     cess_pair_group_event_cb_t cb)
     Create an access pair group to enable secure DMA transfers between  devices
     across different processes or operating system domains.

     Warning
	 EXPERIMENTAL: this API may change without prior notice.

     Parameters
	 dev_id Identifier of the DMA device initiating the group.
	 domain_id  Unique identifier representing the current process or OS do-
	 main.
	 token Authentication token used to establish the access group.
	 group_id Pointer to store the ID of the newly created access group.
	 cb Callback function to be invoked when a member leaves the group.

     Returns
	 0 on success, negative error code on failure.

   __rte_experimental  int  rte_dma_access_pair_group_destroy  (int16_t  dev_id,
     int16_t group_id)
     Destroy an access pair group if all participating devices have exited.

     Warning
	 EXPERIMENTAL: this API may change without prior notice.

     This  operation is only permitted by the device that originally created the
     group; attempts by other devices will result in failure.

     Parameters
	 dev_id Identifier of the device requesting group destruction.
	 group_id ID of the access group to be destroyed.

     Returns
	 0 on success, negative value on failure indicating the error code.

   __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_ac-
     cess_pair_group_event_cb_t cb)
     Join an existing access group to enable secure DMA  transfers  between  de-
     vices across different processes or OS domains.

     Warning
	 EXPERIMENTAL: this API may change without prior notice.

     Parameters
	 dev_id Identifier of the DMA device attempting to join the group.
	 domain_id  Unique identifier representing the current process or OS do-
	 main.
	 token Authentication token used to validate group membership.
	 group_id ID of the access group to join.
	 cb Callback function to be invoked when the device leaves the group  or
	 when the group is destroyed due to some exception or failure.

     Returns
	 0 on success, negative value on failure indicating the error code.

   __rte_experimental	int   rte_dma_access_pair_group_leave  (int16_t  dev_id,
     int16_t group_id)
     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
	 EXPERIMENTAL: this API may change without prior notice.

     This operation is not permitted for the device that originally created  the
     group.

     Parameters
	 dev_id Identifier of the device requesting to leave the group.
	 group_id ID of the access group to leave.

     Returns
	 0 on success, negative value on failure indicating the error code.

   __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)
     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
	 EXPERIMENTAL: this API may change without prior notice.

     Parameters
	 dev_id Identifier of the DMA device requesting the handler.
	 group_id ID of the access group to query.
	 domain_id Unique identifier of the target process or OS domain.
	 handler Pointer to store the retrieved handler value.

     Returns
	 0 on success, negative value on failure indicating the error code.

   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) [inline],  [static]
     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
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 src The address of the source buffer.
	 dst The address of the destination buffer.
	 length The length of the data to be copied.
	 flags An flags for this operation.

     See also
	 RTE_DMA_OP_FLAG_*

     Returns

	 * 0..UINT16_MAX: index of enqueued job.

	 * -ENOSPC: if no space left to enqueue.

	 * other values < 0 on failure.

     Definition at line 1178 of file rte_dmadev.h.

   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) [inline],	[static]
     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 door-
     bell.

     Parameters
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 src The pointer of source scatter-gather entry array.
	 dst The pointer of destination scatter-gather entry array.
	 nb_src The number of source scatter-gather entry.

     See also
	 struct rte_dma_info::max_sges

     Parameters
	 nb_dst The number of destination scatter-gather entry.

     See also
	 struct rte_dma_info::max_sges

     Parameters
	 flags An flags for this operation.

     See also
	 RTE_DMA_OP_FLAG_*

     Returns

	 * 0..UINT16_MAX: index of enqueued job.

	 * -ENOSPC: if no space left to enqueue.

	 * other values < 0 on failure.

     Definition at line 1228 of file rte_dmadev.h.

   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) [inline],  [static]
     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
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 pattern The pattern to populate the destination buffer with.
	 dst The address of the destination buffer.
	 length The length of the destination buffer.
	 flags An flags for this operation.

     See also
	 RTE_DMA_OP_FLAG_*

     Returns

	 * 0..UINT16_MAX: index of enqueued job.

	 * -ENOSPC: if no space left to enqueue.

	 * other values < 0 on failure.

     Definition at line 1277 of file rte_dmadev.h.

   static int rte_dma_submit (int16_t dev_id, uint16_t vchan)  [inline],   [sta-
     tic]
     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
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.

     Returns
	 0 on success. Otherwise negative value is returned.

     Definition at line 1311 of file rte_dmadev.h.

   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)  [inline],   [sta-
     tic]
     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
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 nb_cpls  The  maximum	number	of  completed  operations  that  can  be
	 processed.
	 last_idx The last completed operation's ring_idx. If not required, NULL
	 can be passed in.
	 has_error  Indicates if there are transfer error. If not required, NULL
	 can be passed in.

     Returns
	 The number of operations that successfully completed. This return value
	 must be less than or equal to the value of nb_cpls.

     Definition at line 1352 of file rte_dmadev.h.

   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) [inline],	[static]
     Return the number of operations that have been completed,	and  the  opera-
     tions  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
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 nb_cpls Indicates the size of status array.
	 last_idx The last completed operation's ring_idx. If not required, NULL
	 can be passed in.
	 status This is a pointer to an array of length 'nb_cpls' that holds the
	 completion status code of each operation.

     See also
	 enum rte_dma_status_code

     Returns
	 The number of operations that completed. This return value must be less
	 than  or  equal to the value of nb_cpls. If this number is greater than
	 zero (assuming n), then n values in the status array are also set.

     Definition at line 1414 of file rte_dmadev.h.

   static uint16_t rte_dma_burst_capacity (int16_t dev_id, uint16_t vchan)  [in-
     line],  [static]
     Check remaining capacity in descriptor ring for the current burst.

     Parameters
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.

     Returns

	 * Remaining space in the descriptor ring for the current burst.

	 * 0 on error

     Definition at line 1451 of file rte_dmadev.h.

   static  uint16_t  rte_dma_enqueue_ops (int16_t dev_id, uint16_t vchan, struct
     rte_dma_op ** ops, uint16_t nb_ops) [inline],  [static]
     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 com-
     pleted ops, calls to rte_dma_submit(), rte_dma_completed() and rte_dma_com-
     pleted_status() are not valid.

     Parameters
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 ops Pointer to rte_dma_op array.
	 nb_ops Number of rte_dma_op in the ops array

     Returns
	 uint16_t Number of successfully submitted ops.

     Definition at line 1489 of file rte_dmadev.h.

   static uint16_t rte_dma_dequeue_ops (int16_t dev_id, uint16_t  vchan,  struct
     rte_dma_op ** ops, uint16_t nb_ops) [inline],  [static]
     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::en-
     able_enq_deq is enabled in rte_dma_configure().

     Parameters
	 dev_id The identifier of the device.
	 vchan The identifier of virtual DMA channel.
	 ops Pointer to rte_dma_op array.
	 nb_ops Size of rte_dma_op array.

     Returns
	 Number of successfully completed  ops.  Should  be  less  or  equal  to
	 nb_ops.

     Definition at line 1524 of file rte_dmadev.h.

Author
     Generated automatically by Doxygen for DPDK from the source code.

Version 25.11.0 		 Thu Aug 27 2026		 rte_dmadev.h(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=RTE_DMA_STATUS_BUS_WRITE_ERROR&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help