DPDK  22.11.11
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 #include <rte_compat.h>
153 
154 #ifdef __cplusplus
155 extern "C" {
156 #endif
157 
159 #define RTE_DMADEV_DEFAULT_MAX 64
160 
176 __rte_experimental
177 int rte_dma_dev_max(size_t dev_max);
178 
192 __rte_experimental
193 int rte_dma_get_dev_id_by_name(const char *name);
194 
207 __rte_experimental
208 bool rte_dma_is_valid(int16_t dev_id);
209 
220 __rte_experimental
221 uint16_t rte_dma_count_avail(void);
222 
231 __rte_experimental
232 int16_t rte_dma_next_dev(int16_t start_dev_id);
233 
235 #define RTE_DMA_FOREACH_DEV(p) \
236  for (p = rte_dma_next_dev(0); \
237  p != -1; \
238  p = rte_dma_next_dev(p + 1))
239 
240 
245 #define RTE_DMA_CAPA_MEM_TO_MEM RTE_BIT64(0)
246 
247 #define RTE_DMA_CAPA_MEM_TO_DEV RTE_BIT64(1)
248 
249 #define RTE_DMA_CAPA_DEV_TO_MEM RTE_BIT64(2)
250 
251 #define RTE_DMA_CAPA_DEV_TO_DEV RTE_BIT64(3)
252 
258 #define RTE_DMA_CAPA_SVA RTE_BIT64(4)
259 
264 #define RTE_DMA_CAPA_SILENT RTE_BIT64(5)
265 
272 #define RTE_DMA_CAPA_HANDLES_ERRORS RTE_BIT64(6)
273 
277 #define RTE_DMA_CAPA_OPS_COPY RTE_BIT64(32)
278 
279 #define RTE_DMA_CAPA_OPS_COPY_SG RTE_BIT64(33)
280 
281 #define RTE_DMA_CAPA_OPS_FILL RTE_BIT64(34)
282 
289 struct rte_dma_info {
290  const char *dev_name;
292  uint64_t dev_capa;
294  uint16_t max_vchans;
296  uint16_t max_desc;
298  uint16_t min_desc;
306  uint16_t max_sges;
308  int16_t numa_node;
310  uint16_t nb_vchans;
311 };
312 
328 __rte_experimental
329 int rte_dma_info_get(int16_t dev_id, struct rte_dma_info *dev_info);
330 
336 struct rte_dma_conf {
341  uint16_t nb_vchans;
350 };
351 
371 __rte_experimental
372 int rte_dma_configure(int16_t dev_id, const struct rte_dma_conf *dev_conf);
373 
389 __rte_experimental
390 int rte_dma_start(int16_t dev_id);
391 
406 __rte_experimental
407 int rte_dma_stop(int16_t dev_id);
408 
423 __rte_experimental
424 int rte_dma_close(int16_t dev_id);
425 
464 };
465 
472  RTE_DMA_PORT_NONE,
474 };
475 
489  union {
538  __extension__
539  struct {
540  uint64_t coreid : 4;
541  uint64_t pfid : 8;
542  uint64_t vfen : 1;
543  uint64_t vfid : 16;
545  uint64_t pasid : 20;
547  uint64_t attr : 3;
549  uint64_t ph : 2;
551  uint64_t st : 16;
552  } pcie;
553  };
554  uint64_t reserved[2];
555 };
556 
569  uint16_t nb_desc;
586 };
587 
606 __rte_experimental
607 int rte_dma_vchan_setup(int16_t dev_id, uint16_t vchan,
608  const struct rte_dma_vchan_conf *conf);
609 
617  uint64_t submitted;
621  uint64_t completed;
623  uint64_t errors;
624 };
625 
632 #define RTE_DMA_ALL_VCHAN 0xFFFFu
633 
652 __rte_experimental
653 int rte_dma_stats_get(int16_t dev_id, uint16_t vchan,
654  struct rte_dma_stats *stats);
655 
671 __rte_experimental
672 int rte_dma_stats_reset(int16_t dev_id, uint16_t vchan);
673 
684 };
685 
704 __rte_experimental
705 int
706 rte_dma_vchan_status(int16_t dev_id, uint16_t vchan, enum rte_dma_vchan_status *status);
707 
722 __rte_experimental
723 int rte_dma_dump(int16_t dev_id, FILE *f);
724 
787 };
788 
794 struct rte_dma_sge {
796  uint32_t length;
797 };
798 
799 #include "rte_dmadev_core.h"
800 
812 #define RTE_DMA_OP_FLAG_FENCE RTE_BIT64(0)
813 
817 #define RTE_DMA_OP_FLAG_SUBMIT RTE_BIT64(1)
818 
822 #define RTE_DMA_OP_FLAG_LLC RTE_BIT64(2)
823 
854 __rte_experimental
855 static inline int
856 rte_dma_copy(int16_t dev_id, uint16_t vchan, rte_iova_t src, rte_iova_t dst,
857  uint32_t length, uint64_t flags)
858 {
859  struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
860 
861 #ifdef RTE_DMADEV_DEBUG
862  if (!rte_dma_is_valid(dev_id) || length == 0)
863  return -EINVAL;
864  if (*obj->copy == NULL)
865  return -ENOTSUP;
866 #endif
867 
868  return (*obj->copy)(obj->dev_private, vchan, src, dst, length, flags);
869 }
870 
904 __rte_experimental
905 static inline int
906 rte_dma_copy_sg(int16_t dev_id, uint16_t vchan, struct rte_dma_sge *src,
907  struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst,
908  uint64_t flags)
909 {
910  struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
911 
912 #ifdef RTE_DMADEV_DEBUG
913  if (!rte_dma_is_valid(dev_id) || src == NULL || dst == NULL ||
914  nb_src == 0 || nb_dst == 0)
915  return -EINVAL;
916  if (*obj->copy_sg == NULL)
917  return -ENOTSUP;
918 #endif
919 
920  return (*obj->copy_sg)(obj->dev_private, vchan, src, dst, nb_src,
921  nb_dst, flags);
922 }
923 
953 __rte_experimental
954 static inline int
955 rte_dma_fill(int16_t dev_id, uint16_t vchan, uint64_t pattern,
956  rte_iova_t dst, uint32_t length, uint64_t flags)
957 {
958  struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
959 
960 #ifdef RTE_DMADEV_DEBUG
961  if (!rte_dma_is_valid(dev_id) || length == 0)
962  return -EINVAL;
963  if (*obj->fill == NULL)
964  return -ENOTSUP;
965 #endif
966 
967  return (*obj->fill)(obj->dev_private, vchan, pattern, dst, length,
968  flags);
969 }
970 
988 __rte_experimental
989 static inline int
990 rte_dma_submit(int16_t dev_id, uint16_t vchan)
991 {
992  struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
993 
994 #ifdef RTE_DMADEV_DEBUG
995  if (!rte_dma_is_valid(dev_id))
996  return -EINVAL;
997  if (*obj->submit == NULL)
998  return -ENOTSUP;
999 #endif
1000 
1001  return (*obj->submit)(obj->dev_private, vchan);
1002 }
1003 
1029 __rte_experimental
1030 static inline uint16_t
1031 rte_dma_completed(int16_t dev_id, uint16_t vchan, const uint16_t nb_cpls,
1032  uint16_t *last_idx, bool *has_error)
1033 {
1034  struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
1035  uint16_t idx;
1036  bool err;
1037 
1038 #ifdef RTE_DMADEV_DEBUG
1039  if (!rte_dma_is_valid(dev_id) || nb_cpls == 0)
1040  return 0;
1041  if (*obj->completed == NULL)
1042  return 0;
1043 #endif
1044 
1045  /* Ensure the pointer values are non-null to simplify drivers.
1046  * In most cases these should be compile time evaluated, since this is
1047  * an inline function.
1048  * - If NULL is explicitly passed as parameter, then compiler knows the
1049  * value is NULL
1050  * - If address of local variable is passed as parameter, then compiler
1051  * can know it's non-NULL.
1052  */
1053  if (last_idx == NULL)
1054  last_idx = &idx;
1055  if (has_error == NULL)
1056  has_error = &err;
1057 
1058  *has_error = false;
1059  return (*obj->completed)(obj->dev_private, vchan, nb_cpls, last_idx,
1060  has_error);
1061 }
1062 
1092 __rte_experimental
1093 static inline uint16_t
1094 rte_dma_completed_status(int16_t dev_id, uint16_t vchan,
1095  const uint16_t nb_cpls, uint16_t *last_idx,
1096  enum rte_dma_status_code *status)
1097 {
1098  struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
1099  uint16_t idx;
1100 
1101 #ifdef RTE_DMADEV_DEBUG
1102  if (!rte_dma_is_valid(dev_id) || nb_cpls == 0 || status == NULL)
1103  return 0;
1104  if (*obj->completed_status == NULL)
1105  return 0;
1106 #endif
1107 
1108  if (last_idx == NULL)
1109  last_idx = &idx;
1110 
1111  return (*obj->completed_status)(obj->dev_private, vchan, nb_cpls,
1112  last_idx, status);
1113 }
1114 
1130 __rte_experimental
1131 static inline uint16_t
1132 rte_dma_burst_capacity(int16_t dev_id, uint16_t vchan)
1133 {
1134  struct rte_dma_fp_object *obj = &rte_dma_fp_objs[dev_id];
1135 
1136 #ifdef RTE_DMADEV_DEBUG
1137  if (!rte_dma_is_valid(dev_id))
1138  return 0;
1139  if (*obj->burst_capacity == NULL)
1140  return 0;
1141 #endif
1142  return (*obj->burst_capacity)(obj->dev_private, vchan);
1143 }
1144 
1145 #ifdef __cplusplus
1146 }
1147 #endif
1148 
1149 #endif /* RTE_DMADEV_H */
__rte_experimental uint16_t rte_dma_count_avail(void)
uint16_t max_desc
Definition: rte_dmadev.h:296
uint16_t nb_vchans
Definition: rte_dmadev.h:341
uint64_t rte_iova_t
Definition: rte_common.h:470
__rte_experimental int rte_dma_dump(int16_t dev_id, FILE *f)
rte_iova_t addr
Definition: rte_dmadev.h:795
struct rte_dma_port_param dst_port
Definition: rte_dmadev.h:585
__rte_experimental bool rte_dma_is_valid(int16_t dev_id)
uint64_t dev_capa
Definition: rte_dmadev.h:292
__rte_experimental int rte_dma_info_get(int16_t dev_id, struct rte_dma_info *dev_info)
static __rte_experimental 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:906
rte_dma_direction
Definition: rte_dmadev.h:431
__rte_experimental int rte_dma_get_dev_id_by_name(const char *name)
bool enable_silent
Definition: rte_dmadev.h:349
rte_dma_port_type
Definition: rte_dmadev.h:471
__rte_experimental int rte_dma_vchan_setup(int16_t dev_id, uint16_t vchan, const struct rte_dma_vchan_conf *conf)
static __rte_experimental 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:1094
__rte_experimental int rte_dma_stats_get(int16_t dev_id, uint16_t vchan, struct rte_dma_stats *stats)
struct rte_dma_port_param src_port
Definition: rte_dmadev.h:577
__rte_experimental int rte_dma_stop(int16_t dev_id)
uint16_t max_sges
Definition: rte_dmadev.h:306
__rte_experimental int16_t rte_dma_next_dev(int16_t start_dev_id)
static __rte_experimental 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:1031
__rte_experimental int rte_dma_close(int16_t dev_id)
const char * dev_name
Definition: rte_dmadev.h:290
uint64_t reserved[2]
Definition: rte_dmadev.h:554
uint64_t errors
Definition: rte_dmadev.h:623
static __rte_experimental 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:856
__rte_experimental int rte_dma_stats_reset(int16_t dev_id, uint16_t vchan)
int16_t numa_node
Definition: rte_dmadev.h:308
enum rte_dma_port_type port_type
Definition: rte_dmadev.h:487
__rte_experimental int rte_dma_start(int16_t dev_id)
rte_dma_status_code
Definition: rte_dmadev.h:730
#define RTE_STD_C11
Definition: rte_common.h:39
uint16_t min_desc
Definition: rte_dmadev.h:298
static __rte_experimental uint16_t rte_dma_burst_capacity(int16_t dev_id, uint16_t vchan)
Definition: rte_dmadev.h:1132
uint16_t max_vchans
Definition: rte_dmadev.h:294
enum rte_dma_direction direction
Definition: rte_dmadev.h:567
rte_dma_vchan_status
Definition: rte_dmadev.h:680
uint64_t completed
Definition: rte_dmadev.h:621
uint64_t submitted
Definition: rte_dmadev.h:617
__rte_experimental int rte_dma_dev_max(size_t dev_max)
__extension__ struct rte_dma_port_param::@108::@110 pcie
static __rte_experimental 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:955
uint16_t nb_vchans
Definition: rte_dmadev.h:310
uint32_t length
Definition: rte_dmadev.h:796
__rte_experimental int rte_dma_configure(int16_t dev_id, const struct rte_dma_conf *dev_conf)
static __rte_experimental int rte_dma_submit(int16_t dev_id, uint16_t vchan)
Definition: rte_dmadev.h:990