DPDK 23.11.6
rte_dmadev.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2021 HiSilicon Limited
3 * Copyright(c) 2021 Intel Corporation
4 * Copyright(c) 2021 Marvell International Ltd
5 * Copyright(c) 2021 SmartShare Systems
6 */
7
8#ifndef RTE_DMADEV_H
9#define RTE_DMADEV_H
10
147#include <stdint.h>
148#include <errno.h>
149
150#include <rte_bitops.h>
151#include <rte_common.h>
152
153#ifdef __cplusplus
154extern "C" {
155#endif
156
158#define RTE_DMADEV_DEFAULT_MAX 64
159
172int rte_dma_dev_max(size_t dev_max);
173
184int rte_dma_get_dev_id_by_name(const char *name);
185
195bool rte_dma_is_valid(int16_t dev_id);
196
204uint16_t rte_dma_count_avail(void);
205
214int16_t rte_dma_next_dev(int16_t start_dev_id);
215
217#define RTE_DMA_FOREACH_DEV(p) \
218 for (p = rte_dma_next_dev(0); \
219 p != -1; \
220 p = rte_dma_next_dev(p + 1))
221
222
227#define RTE_DMA_CAPA_MEM_TO_MEM RTE_BIT64(0)
229#define RTE_DMA_CAPA_MEM_TO_DEV RTE_BIT64(1)
231#define RTE_DMA_CAPA_DEV_TO_MEM RTE_BIT64(2)
233#define RTE_DMA_CAPA_DEV_TO_DEV RTE_BIT64(3)
240#define RTE_DMA_CAPA_SVA RTE_BIT64(4)
246#define RTE_DMA_CAPA_SILENT RTE_BIT64(5)
254#define RTE_DMA_CAPA_HANDLES_ERRORS RTE_BIT64(6)
261#define RTE_DMA_CAPA_M2D_AUTO_FREE RTE_BIT64(7)
262
267#define RTE_DMA_CAPA_OPS_COPY RTE_BIT64(32)
269#define RTE_DMA_CAPA_OPS_COPY_SG RTE_BIT64(33)
271#define RTE_DMA_CAPA_OPS_FILL RTE_BIT64(34)
280 const char *dev_name;
282 uint64_t dev_capa;
284 uint16_t max_vchans;
286 uint16_t max_desc;
288 uint16_t min_desc;
296 uint16_t max_sges;
298 int16_t numa_node;
300 uint16_t nb_vchans;
301};
302
315int rte_dma_info_get(int16_t dev_id, struct rte_dma_info *dev_info);
316
327 uint16_t nb_vchans;
336};
337
354int rte_dma_configure(int16_t dev_id, const struct rte_dma_conf *dev_conf);
355
368int rte_dma_start(int16_t dev_id);
369
381int rte_dma_stop(int16_t dev_id);
382
394int rte_dma_close(int16_t dev_id);
395
434};
435
442 RTE_DMA_PORT_NONE,
444};
445
458 union {
507 __extension__
508 struct {
509 uint64_t coreid : 4;
510 uint64_t pfid : 8;
511 uint64_t vfen : 1;
512 uint64_t vfid : 16;
514 uint64_t pasid : 20;
516 uint64_t attr : 3;
518 uint64_t ph : 2;
520 uint64_t st : 16;
522 };
523 uint64_t reserved[2];
524};
525
530 union {
531 struct {
540 } m2d;
541 };
543 uint64_t reserved[2];
544};
545
558 uint16_t nb_desc;
583};
584
600int rte_dma_vchan_setup(int16_t dev_id, uint16_t vchan,
601 const struct rte_dma_vchan_conf *conf);
602
610 uint64_t submitted;
614 uint64_t completed;
616 uint64_t errors;
617};
618
625#define RTE_DMA_ALL_VCHAN 0xFFFFu
626
642int rte_dma_stats_get(int16_t dev_id, uint16_t vchan,
643 struct rte_dma_stats *stats);
644
657int rte_dma_stats_reset(int16_t dev_id, uint16_t vchan);
658
669};
670
686int
687rte_dma_vchan_status(int16_t dev_id, uint16_t vchan, enum rte_dma_vchan_status *status);
688
700int rte_dma_dump(int16_t dev_id, FILE *f);
701
764};
765
773 uint32_t length;
774};
775
776#include "rte_dmadev_core.h"
777
789#define RTE_DMA_OP_FLAG_FENCE RTE_BIT64(0)
794#define RTE_DMA_OP_FLAG_SUBMIT RTE_BIT64(1)
799#define RTE_DMA_OP_FLAG_LLC RTE_BIT64(2)
806#define RTE_DMA_OP_FLAG_AUTO_FREE RTE_BIT64(3)
835static inline int
836rte_dma_copy(int16_t dev_id, uint16_t vchan, rte_iova_t src, rte_iova_t dst,
837 uint32_t length, uint64_t flags)
838{
839 struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
840
841#ifdef RTE_DMADEV_DEBUG
842 if (!rte_dma_is_valid(dev_id) || length == 0)
843 return -EINVAL;
844 if (*obj->copy == NULL)
845 return -ENOTSUP;
846#endif
847
848 return (*obj->copy)(obj->dev_private, vchan, src, dst, length, flags);
849}
850
881static inline int
882rte_dma_copy_sg(int16_t dev_id, uint16_t vchan, struct rte_dma_sge *src,
883 struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst,
884 uint64_t flags)
885{
886 struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
887
888#ifdef RTE_DMADEV_DEBUG
889 if (!rte_dma_is_valid(dev_id) || src == NULL || dst == NULL ||
890 nb_src == 0 || nb_dst == 0)
891 return -EINVAL;
892 if (*obj->copy_sg == NULL)
893 return -ENOTSUP;
894#endif
895
896 return (*obj->copy_sg)(obj->dev_private, vchan, src, dst, nb_src,
897 nb_dst, flags);
898}
899
926static inline int
927rte_dma_fill(int16_t dev_id, uint16_t vchan, uint64_t pattern,
928 rte_iova_t dst, uint32_t length, uint64_t flags)
929{
930 struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
931
932#ifdef RTE_DMADEV_DEBUG
933 if (!rte_dma_is_valid(dev_id) || length == 0)
934 return -EINVAL;
935 if (*obj->fill == NULL)
936 return -ENOTSUP;
937#endif
938
939 return (*obj->fill)(obj->dev_private, vchan, pattern, dst, length,
940 flags);
941}
942
957static inline int
958rte_dma_submit(int16_t dev_id, uint16_t vchan)
959{
960 struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
961
962#ifdef RTE_DMADEV_DEBUG
963 if (!rte_dma_is_valid(dev_id))
964 return -EINVAL;
965 if (*obj->submit == NULL)
966 return -ENOTSUP;
967#endif
968
969 return (*obj->submit)(obj->dev_private, vchan);
970}
971
994static inline uint16_t
995rte_dma_completed(int16_t dev_id, uint16_t vchan, const uint16_t nb_cpls,
996 uint16_t *last_idx, bool *has_error)
997{
998 struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
999 uint16_t idx;
1000 bool err;
1001
1002#ifdef RTE_DMADEV_DEBUG
1003 if (!rte_dma_is_valid(dev_id) || nb_cpls == 0)
1004 return 0;
1005 if (*obj->completed == NULL)
1006 return 0;
1007#endif
1008
1009 /* Ensure the pointer values are non-null to simplify drivers.
1010 * In most cases these should be compile time evaluated, since this is
1011 * an inline function.
1012 * - If NULL is explicitly passed as parameter, then compiler knows the
1013 * value is NULL
1014 * - If address of local variable is passed as parameter, then compiler
1015 * can know it's non-NULL.
1016 */
1017 if (last_idx == NULL)
1018 last_idx = &idx;
1019 if (has_error == NULL)
1020 has_error = &err;
1021
1022 *has_error = false;
1023 return (*obj->completed)(obj->dev_private, vchan, nb_cpls, last_idx,
1024 has_error);
1025}
1026
1053static inline uint16_t
1054rte_dma_completed_status(int16_t dev_id, uint16_t vchan,
1055 const uint16_t nb_cpls, uint16_t *last_idx,
1056 enum rte_dma_status_code *status)
1057{
1058 struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
1059 uint16_t idx;
1060
1061#ifdef RTE_DMADEV_DEBUG
1062 if (!rte_dma_is_valid(dev_id) || nb_cpls == 0 || status == NULL)
1063 return 0;
1064 if (*obj->completed_status == NULL)
1065 return 0;
1066#endif
1067
1068 if (last_idx == NULL)
1069 last_idx = &idx;
1070
1071 return (*obj->completed_status)(obj->dev_private, vchan, nb_cpls,
1072 last_idx, status);
1073}
1074
1087static inline uint16_t
1088rte_dma_burst_capacity(int16_t dev_id, uint16_t vchan)
1089{
1090 struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
1091
1092#ifdef RTE_DMADEV_DEBUG
1093 if (!rte_dma_is_valid(dev_id))
1094 return 0;
1095 if (*obj->burst_capacity == NULL)
1096 return 0;
1097#endif
1098 return (*obj->burst_capacity)(obj->dev_private, vchan);
1099}
1100
1101#ifdef __cplusplus
1102}
1103#endif
1104
1105#endif /* RTE_DMADEV_H */
uint64_t rte_iova_t
Definition: rte_common.h:556
rte_dma_direction
Definition: rte_dmadev.h:401
@ RTE_DMA_DIR_MEM_TO_DEV
Definition: rte_dmadev.h:415
@ RTE_DMA_DIR_DEV_TO_MEM
Definition: rte_dmadev.h:424
@ RTE_DMA_DIR_MEM_TO_MEM
Definition: rte_dmadev.h:406
@ RTE_DMA_DIR_DEV_TO_DEV
Definition: rte_dmadev.h:433
int rte_dma_start(int16_t dev_id)
int rte_dma_info_get(int16_t dev_id, struct rte_dma_info *dev_info)
int rte_dma_close(int16_t dev_id)
uint16_t rte_dma_count_avail(void)
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)
Definition: rte_dmadev.h:836
int rte_dma_get_dev_id_by_name(const char *name)
int rte_dma_configure(int16_t dev_id, const struct rte_dma_conf *dev_conf)
rte_dma_status_code
Definition: rte_dmadev.h:707
@ RTE_DMA_STATUS_DESCRIPTOR_READ_ERROR
Definition: rte_dmadev.h:752
@ RTE_DMA_STATUS_INVALID_DST_ADDR
Definition: rte_dmadev.h:728
@ RTE_DMA_STATUS_PAGE_FAULT
Definition: rte_dmadev.h:759
@ RTE_DMA_STATUS_INVALID_LENGTH
Definition: rte_dmadev.h:735
@ RTE_DMA_STATUS_NOT_ATTEMPTED
Definition: rte_dmadev.h:724
@ RTE_DMA_STATUS_BUS_READ_ERROR
Definition: rte_dmadev.h:742
@ RTE_DMA_STATUS_INVALID_ADDR
Definition: rte_dmadev.h:733
@ RTE_DMA_STATUS_ERROR_UNKNOWN
Definition: rte_dmadev.h:763
@ RTE_DMA_STATUS_BUS_ERROR
Definition: rte_dmadev.h:748
@ RTE_DMA_STATUS_BUS_WRITE_ERROR
Definition: rte_dmadev.h:744
@ RTE_DMA_STATUS_DATA_POISION
Definition: rte_dmadev.h:750
@ RTE_DMA_STATUS_INVALID_OPCODE
Definition: rte_dmadev.h:740
@ RTE_DMA_STATUS_INVALID_SRC_ADDR
Definition: rte_dmadev.h:726
@ RTE_DMA_STATUS_USER_ABORT
Definition: rte_dmadev.h:716
@ RTE_DMA_STATUS_DEV_LINK_ERROR
Definition: rte_dmadev.h:757
@ RTE_DMA_STATUS_SUCCESSFUL
Definition: rte_dmadev.h:709
static uint16_t rte_dma_burst_capacity(int16_t dev_id, uint16_t vchan)
Definition: rte_dmadev.h:1088
int rte_dma_stats_reset(int16_t dev_id, uint16_t vchan)
int rte_dma_dev_max(size_t dev_max)
int rte_dma_stop(int16_t dev_id)
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)
Definition: rte_dmadev.h:995
int rte_dma_dump(int16_t dev_id, FILE *f)
int rte_dma_vchan_setup(int16_t dev_id, uint16_t vchan, const struct rte_dma_vchan_conf *conf)
int16_t rte_dma_next_dev(int16_t start_dev_id)
static int rte_dma_submit(int16_t dev_id, uint16_t vchan)
Definition: rte_dmadev.h:958
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)
Definition: rte_dmadev.h:1054
int rte_dma_stats_get(int16_t dev_id, uint16_t vchan, struct rte_dma_stats *stats)
bool rte_dma_is_valid(int16_t dev_id)
rte_dma_port_type
Definition: rte_dmadev.h:441
@ RTE_DMA_PORT_PCIE
Definition: rte_dmadev.h:443
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)
Definition: rte_dmadev.h:927
rte_dma_vchan_status
Definition: rte_dmadev.h:665
@ RTE_DMA_VCHAN_HALTED_ERROR
Definition: rte_dmadev.h:668
@ RTE_DMA_VCHAN_ACTIVE
Definition: rte_dmadev.h:667
@ RTE_DMA_VCHAN_IDLE
Definition: rte_dmadev.h:666
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)
Definition: rte_dmadev.h:882
struct rte_mempool * pool
Definition: rte_dmadev.h:539
uint16_t nb_vchans
Definition: rte_dmadev.h:327
bool enable_silent
Definition: rte_dmadev.h:335
uint64_t dev_capa
Definition: rte_dmadev.h:282
uint16_t max_sges
Definition: rte_dmadev.h:296
uint16_t max_vchans
Definition: rte_dmadev.h:284
uint16_t max_desc
Definition: rte_dmadev.h:286
uint16_t min_desc
Definition: rte_dmadev.h:288
const char * dev_name
Definition: rte_dmadev.h:280
uint16_t nb_vchans
Definition: rte_dmadev.h:300
int16_t numa_node
Definition: rte_dmadev.h:298
enum rte_dma_port_type port_type
Definition: rte_dmadev.h:457
__extension__ struct rte_dma_port_param::@112::@114 pcie
uint64_t reserved[2]
Definition: rte_dmadev.h:523
rte_iova_t addr
Definition: rte_dmadev.h:772
uint32_t length
Definition: rte_dmadev.h:773
uint64_t submitted
Definition: rte_dmadev.h:610
uint64_t errors
Definition: rte_dmadev.h:616
uint64_t completed
Definition: rte_dmadev.h:614
enum rte_dma_direction direction
Definition: rte_dmadev.h:556
struct rte_dma_auto_free_param auto_free
Definition: rte_dmadev.h:582
struct rte_dma_port_param src_port
Definition: rte_dmadev.h:566
struct rte_dma_port_param dst_port
Definition: rte_dmadev.h:574