Data Accelerator Offload
Loading...
Searching...
No Matches
dao_dma.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: Marvell-MIT
2 * Copyright (c) 2023 Marvell.
3 */
4
11#ifndef __INCLUDE_DAO_DMA_H__
12#define __INCLUDE_DAO_DMA_H__
13
14#include <rte_eal.h>
15
16#include <rte_dmadev.h>
17#include <rte_lcore.h>
18#include <rte_mempool.h>
19#include <rte_prefetch.h>
20#include <rte_vect.h>
21
22#include <dao_config.h>
23
24#include "dao_log.h"
25
27#define DAO_DMA_MAX_POINTER 15u
28
30#define DAO_DMA_MAX_META_POINTER 48
31
33#define DAO_DMA_MAX_VCHAN_PER_LCORE 64
34
36#define DAO_DMA_MAX_INFLIGHT_MDATA 4096
37
39#define DAO_DMA_DOORBELL_THRESHOLD 1024
40
48 union {
49 uint16_t val[DAO_DMA_MAX_META_POINTER];
50 uint32_t val32[DAO_DMA_MAX_META_POINTER];
51 };
55 uint16_t cnt;
56};
57
61 uint16_t tail;
63 uint16_t head;
65 int16_t devid;
67 uint8_t vchan;
68 uint8_t rsvd;
70 uint16_t src_i;
72 uint16_t dst_i;
74 uint8_t flush_thr;
76 uint8_t auto_free : 1;
77 uint8_t rsvd2 : 7;
79 uint16_t pend_ops;
81 struct rte_dma_sge src[DAO_DMA_MAX_POINTER];
83 struct rte_dma_sge dst[DAO_DMA_MAX_POINTER];
85 uint64_t ptrs;
87 uint64_t ops;
89 uint64_t dbells;
91 uint64_t dma_enq_errs;
95 void *ops_mem;
97 struct rte_dma_op **dma_ops;
99 uint16_t ops_head;
101 uint16_t ops_tail;
103 uint16_t ops_mask;
107
119
123 uint64_t ptrs;
125 uint64_t ops;
127 uint64_t dbells;
129 uint64_t enq_errs;
130};
131
143
146
154
162
170
181int dao_dma_stats_get(uint16_t lcore_id, struct dao_dma_stats *stats);
182
195int dao_dma_lcore_dev2mem_set(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr);
196
211int dao_dma_lcore_dev2mem_set_ops(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr,
212 uint16_t nb_ops);
213
226int dao_dma_lcore_mem2dev_set(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr);
227
242int dao_dma_lcore_mem2dev_set_ops(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr,
243 uint16_t nb_ops);
244
257int dao_dma_lcore_mem2dev_autofree_set(int16_t dma_devid, uint16_t vchan, bool enable);
258
269int dao_dma_ctrl_dev_set(int16_t dev2mem_id, int16_t mem2dev_id);
270
278
286
293void dao_dma_compl_wait_inflight(uint16_t vchan);
294
301static __rte_always_inline int
303{
304#if DAO_DMA_STATS
305 return 1;
306#else
307 return 0;
308#endif
309}
310
319static __rte_always_inline uint16_t
321{
322 return rte_dma_burst_capacity(vchan->devid, vchan->vchan);
323}
324
337static __rte_always_inline bool
338dao_dma_desc_avail_get(struct dao_dma_vchan_state *vchan, uint32_t nb_src, uint32_t nb_dst)
339{
340 int src_avail = vchan->flush_thr - vchan->src_i;
341 int dst_avail = vchan->flush_thr - vchan->dst_i;
342 uint16_t inflight = vchan->tail - vchan->head;
343 uint32_t n_src, n_dst, nb_desc;
344 uint8_t flush_thr;
345
346 if (likely((src_avail >= (int)nb_src || !vchan->src_i) &&
347 (dst_avail >= (int)nb_dst || !vchan->dst_i)))
348 return true;
349
350 flush_thr = vchan->flush_thr;
351 n_src = (nb_src + flush_thr - 1) / flush_thr;
352 n_dst = (nb_dst + flush_thr - 1) / flush_thr;
353 nb_desc = RTE_MAX(n_src, n_dst);
354
355 /* increment by 1 to consider current enqueued pointers
356 */
357 nb_desc++;
358 if (inflight + nb_desc > DAO_DMA_MAX_INFLIGHT_MDATA)
359 return false;
360
361 return dao_dma_burst_capacity(vchan) >= nb_desc;
362}
363
375static __rte_always_inline bool
376dao_dma_op_status(struct dao_dma_vchan_state *vchan, uint16_t op_idx)
377{
378 uint16_t head = vchan->head;
379 uint16_t tail = vchan->tail;
380
381 if (vchan->src_i && (tail == op_idx))
382 return false;
383
384 return head <= tail ? (op_idx < head || op_idx >= tail) : (op_idx < head && op_idx >= tail);
385}
386
397static __rte_always_inline bool
398dao_dma_flush(struct dao_dma_vchan_state *vchan, const uint8_t avail)
399{
400 int src_avail = vchan->flush_thr - vchan->src_i;
401 int dst_avail = vchan->flush_thr - vchan->dst_i;
402 uint64_t flags = (uint64_t)vchan->auto_free << 3;
403 int rc;
404
405 if (likely((src_avail >= (int)avail || !vchan->src_i) &&
406 (dst_avail >= (int)avail || !vchan->dst_i)))
407 goto exit;
408
410 flags |= RTE_DMA_OP_FLAG_SUBMIT;
411
412 rc = rte_dma_copy_sg(vchan->devid, vchan->vchan, vchan->src, vchan->dst, vchan->src_i,
413 vchan->dst_i, flags);
414 if (unlikely(rc < 0)) {
416 vchan->dma_enq_errs++;
417 return false;
418 }
419 vchan->tail++;
420 vchan->pend_ops++;
421
422 if (flags & RTE_DMA_OP_FLAG_SUBMIT)
423 vchan->pend_ops = 0;
424
426 vchan->ptrs += vchan->src_i;
427 vchan->ops++;
428 }
429 vchan->src_i = 0;
430 vchan->dst_i = 0;
431exit:
432 return true;
433}
434
443static __rte_always_inline uint16_t
445{
446 int src_avail = vchan->flush_thr - vchan->src_i;
447
448 return src_avail;
449}
450
459static __rte_always_inline uint16_t
461{
462 int dst_avail = vchan->flush_thr - vchan->dst_i;
463
464 return dst_avail;
465}
466
475static __rte_always_inline struct rte_dma_sge *
477{
478 return &vchan->src[vchan->src_i];
479}
480
489static __rte_always_inline struct rte_dma_sge *
491{
492 return &vchan->dst[vchan->dst_i];
493}
494
512static __rte_always_inline void
513dao_dma_enq_x1(struct dao_dma_vchan_state *vchan, rte_iova_t src, uint32_t src_len, rte_iova_t dst,
514 uint32_t dst_len)
515{
516 uint16_t src_i = vchan->src_i;
517 uint16_t dst_i = vchan->dst_i;
518
519 vchan->dst[dst_i].addr = dst;
520 vchan->dst[dst_i].length = dst_len;
521 vchan->src[src_i].addr = src;
522 vchan->src[src_i].length = src_len;
523
524 vchan->src_i = src_i + 1;
525 vchan->dst_i = dst_i + 1;
526}
527
541static __rte_always_inline void
542dao_dma_enq_dst_x1(struct dao_dma_vchan_state *vchan, rte_iova_t dst, uint32_t dst_len)
543{
544 uint16_t dst_i = vchan->dst_i;
545
546 vchan->dst[dst_i].addr = dst;
547 vchan->dst[dst_i].length = dst_len;
548
549 vchan->dst_i = dst_i + 1;
550}
551
565static __rte_always_inline void
566dao_dma_enq_src_x1(struct dao_dma_vchan_state *vchan, rte_iova_t src, uint32_t src_len)
567{
568 uint16_t src_i = vchan->src_i;
569
570 vchan->src[src_i].addr = src;
571 vchan->src[src_i].length = src_len;
572
573 vchan->src_i = src_i + 1;
574}
575
588static __rte_always_inline uint16_t
589dao_dma_enq_x4(struct dao_dma_vchan_state *vchan, uint64x2_t *vsrc, uint64x2_t *vdst)
590{
591 struct rte_dma_sge *src, *dst;
592 uint16_t src_i = vchan->src_i;
593 uint16_t dst_i = vchan->dst_i;
594 int src_avail = vchan->flush_thr - src_i;
595 int i;
596
597 src = vchan->src + src_i;
598 dst = vchan->dst + dst_i;
599 if (src_avail >= 4) {
600 vst1q_u64((uint64_t *)&src[0], vsrc[0]);
601 vst1q_u64((uint64_t *)&src[1], vsrc[1]);
602 vst1q_u64((uint64_t *)&src[2], vsrc[2]);
603 vst1q_u64((uint64_t *)&src[3], vsrc[3]);
604
605 vst1q_u64((uint64_t *)&dst[0], vdst[0]);
606 vst1q_u64((uint64_t *)&dst[1], vdst[1]);
607 vst1q_u64((uint64_t *)&dst[2], vdst[2]);
608 vst1q_u64((uint64_t *)&dst[3], vdst[3]);
609
610 vchan->src_i = src_i + 4;
611 vchan->dst_i = dst_i + 4;
612 return 4;
613 }
614
615 i = 0;
616 while (i < 4 && src_avail > 0) {
617 vst1q_u64((uint64_t *)src, vsrc[i]);
618 vst1q_u64((uint64_t *)dst, vdst[i]);
619 src++;
620 dst++;
621 i++;
622 src_avail--;
623 };
624 vchan->src_i = src_i + i;
625 vchan->dst_i = dst_i + i;
626
627 /* Flush enqueued pointers */
628 dao_dma_flush(vchan, 4);
629
630 src_i = vchan->src_i;
631 dst_i = vchan->dst_i;
632 src = vchan->src + src_i;
633 dst = vchan->dst + dst_i;
634 src_avail = vchan->flush_thr - src_i;
635
636 while (i < 4 && src_avail > 0) {
637 vst1q_u64((uint64_t *)src, vsrc[i]);
638 vst1q_u64((uint64_t *)dst, vdst[i]);
639 i++;
640 src++;
641 dst++;
642 src_avail--;
643 vchan->src_i++;
644 vchan->dst_i++;
645 };
646 return i;
647}
648
655static __rte_always_inline void
657{
658 uint16_t cmpl;
659 bool has_err = 0;
660
661 /* Fetch all DMA completed status */
662 cmpl = rte_dma_completed(vchan->devid, vchan->vchan, 128, NULL, &has_err);
663 if (unlikely(has_err)) {
664 vchan->dma_compl_errs++;
665 cmpl += 1;
666 }
667 vchan->head += cmpl;
668}
669
678static __rte_always_inline uint16_t
680{
681 return vchan->ops_head - vchan->ops_tail;
682}
683
694static __rte_always_inline struct rte_dma_op **
695dao_dma_ops_get(struct dao_dma_vchan_state *vchan, uint16_t n)
696{
697 uint16_t tail = vchan->ops_tail;
698
699 vchan->ops_tail = tail + n;
700 return &vchan->dma_ops[tail & vchan->ops_mask];
701}
702
711static __rte_always_inline void
712dao_dma_ops_put(struct dao_dma_vchan_state *vchan, uint16_t n)
713{
714 vchan->ops_head += n;
715}
716
725static __rte_always_inline void
726dao_dma_ops_release(struct dao_dma_vchan_state *vchan, uint16_t n)
727{
728 vchan->ops_tail -= n;
729}
730
739static __rte_always_inline void
740dao_dma_op_set_cmpl(struct rte_dma_op *op, uint16_t *ptr, uint16_t val, uint16_t *pend_ptr,
741 uint16_t pend_val)
742{
743 op->user_meta = (uint64_t)(uintptr_t)ptr;
744 op->event_meta = (uint64_t)(uintptr_t)pend_ptr;
745 op->rsvd = ((uint32_t)val << 16) | pend_val;
746}
747
757static __rte_always_inline void
758dao_dma_check_meta_compl(struct dao_dma_vchan_state *vchan, const int mem_order)
759{
760 uint32_t cmpl, i, j, idx = 0;
761 bool has_err = 0;
762
763 /* Fetch all DMA completed status */
764 cmpl = rte_dma_completed(vchan->devid, vchan->vchan, 128, NULL, &has_err);
765 if (unlikely(has_err)) {
766 vchan->dma_compl_errs++;
767 cmpl += 1;
768 }
769 for (i = vchan->head; i < vchan->head + cmpl; i++) {
771 for (j = 0; j < vchan->mdata[idx].cnt; j++) {
772 if (mem_order)
773 __atomic_store_n(vchan->mdata[idx].ptr[j], vchan->mdata[idx].val[j],
774 __ATOMIC_RELEASE);
775 else
776 *vchan->mdata[idx].ptr[j] = vchan->mdata[idx].val[j];
777 *vchan->mdata[idx].pend_ptr[j] -= vchan->mdata[idx].pend_val[j];
778 }
779 vchan->mdata[idx].cnt = 0;
780 }
781 vchan->head += cmpl;
782}
783
793static __rte_always_inline void
794dao_dma_check_meta_compl_ops(struct dao_dma_vchan_state *vchan, const int mem_order)
795{
796#define DEQ_SZ 128
797 uint32_t cmpl, i;
798 struct rte_dma_op *deq_ops[DEQ_SZ];
799
800 /* Skip costly dequeue call when no ops are inflight */
801 if (vchan->head == vchan->tail)
802 return;
803
804 cmpl = rte_dma_dequeue_ops(vchan->devid, vchan->vchan, deq_ops, DEQ_SZ);
805 if (!cmpl)
806 return;
807
808 for (i = 0; i < cmpl; i++) {
809 struct rte_dma_op *op = deq_ops[i];
810
811 if (unlikely(op->status != RTE_DMA_STATUS_SUCCESSFUL))
812 vchan->dma_compl_errs++;
813
814 if (op->rsvd) {
815 uint16_t *ptr = (uint16_t *)(uintptr_t)op->user_meta;
816 uint16_t *pend_ptr = (uint16_t *)(uintptr_t)op->event_meta;
817 uint16_t val = op->rsvd >> 16;
818 uint16_t pend_val = op->rsvd & 0xFFFF;
819
820 if (mem_order)
821 __atomic_store_n(ptr, val, __ATOMIC_RELEASE);
822 else
823 *ptr = val;
824 *pend_ptr -= pend_val;
825 op->rsvd = 0;
826 }
827 }
828
829 /* Return ops to ring buffer */
830 dao_dma_ops_put(vchan, cmpl);
831 vchan->head += cmpl;
832}
833
850static __rte_always_inline void
851dao_dma_update_cmpl_meta(struct dao_dma_vchan_state *vchan, uint16_t *ptr, uint16_t val,
852 uint16_t *pend_ptr, uint16_t pend_val, uint16_t tail)
853{
854 uint16_t idx = tail % DAO_DMA_MAX_INFLIGHT_MDATA;
855 uint16_t j = vchan->mdata[idx].cnt;
856
857 vchan->mdata[idx].ptr[j] = ptr;
858 vchan->mdata[idx].val[j] = val;
859 vchan->mdata[idx].pend_ptr[j] = pend_ptr;
860 vchan->mdata[idx].pend_val[j] = pend_val;
861 vchan->mdata[idx].cnt = j + 1;
862}
863
873static __rte_always_inline void
874dao_dma_check_meta_compl_v2(struct dao_dma_vchan_state *vchan, const int mem_order)
875{
876 uint32_t cmpl, i, j, idx = 0;
877 bool has_err = 0;
878 uint32_t *ptr;
879
880 /* Fetch all DMA completed status */
881 cmpl = rte_dma_completed(vchan->devid, vchan->vchan, 128, NULL, &has_err);
882 if (unlikely(has_err)) {
883 vchan->dma_compl_errs++;
884 cmpl += 1;
885 }
886 for (i = vchan->head; i < vchan->head + cmpl; i++) {
888 for (j = 0; j < vchan->mdata[idx].cnt; j++) {
889 ptr = (uint32_t *)vchan->mdata[idx].ptr[j];
890 if (mem_order)
891 __atomic_store_n(ptr, vchan->mdata[idx].val32[j], __ATOMIC_RELEASE);
892 else
893 *ptr = vchan->mdata[idx].val32[j];
894 }
895 vchan->mdata[idx].cnt = 0;
896 }
897 vchan->head += cmpl;
898}
899
912static __rte_always_inline void
913dao_dma_update_cmpl_meta_v2(struct dao_dma_vchan_state *vchan, uint32_t *ptr, uint32_t val,
914 uint16_t tail)
915{
916 uint16_t idx = tail % DAO_DMA_MAX_INFLIGHT_MDATA;
917 uint16_t j = vchan->mdata[idx].cnt;
918
919 vchan->mdata[idx].ptr[j] = (uint16_t *)ptr;
920 vchan->mdata[idx].val32[j] = val;
921 vchan->mdata[idx].cnt = j + 1;
922}
923
924#endif /* __INCLUDE_DAO_DMA_H__ */
static __rte_always_inline void dao_dma_enq_src_x1(struct dao_dma_vchan_state *vchan, rte_iova_t src, uint32_t src_len)
Definition dao_dma.h:566
static __rte_always_inline int dao_dma_has_stats_feature(void)
Definition dao_dma.h:302
static __rte_always_inline struct rte_dma_sge * dao_dma_sge_dst(struct dao_dma_vchan_state *vchan)
Definition dao_dma.h:490
static __rte_always_inline void dao_dma_check_meta_compl(struct dao_dma_vchan_state *vchan, const int mem_order)
Definition dao_dma.h:758
static __rte_always_inline uint16_t dao_dma_burst_capacity(struct dao_dma_vchan_state *vchan)
Definition dao_dma.h:320
#define DAO_DMA_DOORBELL_THRESHOLD
Definition dao_dma.h:39
int dao_dma_lcore_mem2dev_autofree_set(int16_t dma_devid, uint16_t vchan, bool enable)
static __rte_always_inline void dao_dma_ops_release(struct dao_dma_vchan_state *vchan, uint16_t n)
Definition dao_dma.h:726
#define DAO_DMA_MAX_INFLIGHT_MDATA
Definition dao_dma.h:36
static __rte_always_inline struct rte_dma_op ** dao_dma_ops_get(struct dao_dma_vchan_state *vchan, uint16_t n)
Definition dao_dma.h:695
static __rte_always_inline void dao_dma_ops_put(struct dao_dma_vchan_state *vchan, uint16_t n)
Definition dao_dma.h:712
int16_t dao_dma_ctrl_mem2dev(void)
void dao_dma_compl_wait_inflight(uint16_t vchan)
static __rte_always_inline void dao_dma_check_compl(struct dao_dma_vchan_state *vchan)
Definition dao_dma.h:656
int dao_dma_lcore_mem2dev_set(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr)
static __rte_always_inline bool dao_dma_desc_avail_get(struct dao_dma_vchan_state *vchan, uint32_t nb_src, uint32_t nb_dst)
Definition dao_dma.h:338
static __rte_always_inline void dao_dma_enq_x1(struct dao_dma_vchan_state *vchan, rte_iova_t src, uint32_t src_len, rte_iova_t dst, uint32_t dst_len)
Definition dao_dma.h:513
int dao_dma_lcore_dev2mem_set_ops(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr, uint16_t nb_ops)
int dao_dma_stats_get(uint16_t lcore_id, struct dao_dma_stats *stats)
static __rte_always_inline void dao_dma_check_meta_compl_ops(struct dao_dma_vchan_state *vchan, const int mem_order)
Definition dao_dma.h:794
int dao_dma_flush_submit_ops(void)
#define DAO_DMA_MAX_VCHAN_PER_LCORE
Definition dao_dma.h:33
#define DAO_DMA_MAX_META_POINTER
Definition dao_dma.h:30
static __rte_always_inline uint16_t dao_dma_src_avail(struct dao_dma_vchan_state *vchan)
Definition dao_dma.h:444
int dao_dma_flush_submit(void)
RTE_DECLARE_PER_LCORE(struct dao_dma_vchan_info *, dao_dma_vchan_info)
static __rte_always_inline void dao_dma_enq_dst_x1(struct dao_dma_vchan_state *vchan, rte_iova_t dst, uint32_t dst_len)
Definition dao_dma.h:542
static __rte_always_inline void dao_dma_check_meta_compl_v2(struct dao_dma_vchan_state *vchan, const int mem_order)
Definition dao_dma.h:874
static __rte_always_inline void dao_dma_op_set_cmpl(struct rte_dma_op *op, uint16_t *ptr, uint16_t val, uint16_t *pend_ptr, uint16_t pend_val)
Definition dao_dma.h:740
static __rte_always_inline uint16_t dao_dma_dst_avail(struct dao_dma_vchan_state *vchan)
Definition dao_dma.h:460
static __rte_always_inline void dao_dma_update_cmpl_meta_v2(struct dao_dma_vchan_state *vchan, uint32_t *ptr, uint32_t val, uint16_t tail)
Definition dao_dma.h:913
static __rte_always_inline bool dao_dma_flush(struct dao_dma_vchan_state *vchan, const uint8_t avail)
Definition dao_dma.h:398
static __rte_always_inline struct rte_dma_sge * dao_dma_sge_src(struct dao_dma_vchan_state *vchan)
Definition dao_dma.h:476
static __rte_always_inline void dao_dma_update_cmpl_meta(struct dao_dma_vchan_state *vchan, uint16_t *ptr, uint16_t val, uint16_t *pend_ptr, uint16_t pend_val, uint16_t tail)
Definition dao_dma.h:851
int dao_dma_flush_submit_v2(void)
static __rte_always_inline bool dao_dma_op_status(struct dao_dma_vchan_state *vchan, uint16_t op_idx)
Definition dao_dma.h:376
static __rte_always_inline uint16_t dao_dma_ops_avail(struct dao_dma_vchan_state *vchan)
Definition dao_dma.h:679
int dao_dma_lcore_mem2dev_set_ops(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr, uint16_t nb_ops)
int16_t dao_dma_ctrl_dev2mem(void)
static __rte_always_inline uint16_t dao_dma_enq_x4(struct dao_dma_vchan_state *vchan, uint64x2_t *vsrc, uint64x2_t *vdst)
Definition dao_dma.h:589
int dao_dma_ctrl_dev_set(int16_t dev2mem_id, int16_t mem2dev_id)
int dao_dma_lcore_dev2mem_set(int16_t dma_devid, uint16_t nb_vchans, uint16_t flush_thr)
#define DAO_DMA_MAX_POINTER
Definition dao_dma.h:27
uint16_t * pend_ptr[DAO_DMA_MAX_META_POINTER]
Definition dao_dma.h:44
uint16_t * ptr[DAO_DMA_MAX_META_POINTER]
Definition dao_dma.h:53
uint16_t pend_val[DAO_DMA_MAX_META_POINTER]
Definition dao_dma.h:46
uint16_t nb_mem2dev
Definition dao_dma.h:137
struct dao_dma_vchan_stats dev2mem[DAO_DMA_MAX_VCHAN_PER_LCORE]
Definition dao_dma.h:139
struct dao_dma_vchan_stats mem2dev[DAO_DMA_MAX_VCHAN_PER_LCORE]
Definition dao_dma.h:141
uint16_t nb_dev2mem
Definition dao_dma.h:135
struct dao_dma_vchan_state mem2dev[DAO_DMA_MAX_VCHAN_PER_LCORE]
Definition dao_dma.h:117
uint16_t nb_mem2dev
Definition dao_dma.h:113
struct dao_dma_vchan_state dev2mem[DAO_DMA_MAX_VCHAN_PER_LCORE]
Definition dao_dma.h:115
uint16_t nb_dev2mem
Definition dao_dma.h:111
uint64_t dma_enq_errs
Definition dao_dma.h:91
uint16_t ops_head
Definition dao_dma.h:99
uint16_t ops_tail
Definition dao_dma.h:101
uint16_t ops_mask
Definition dao_dma.h:103
uint8_t flush_thr
Definition dao_dma.h:74
struct rte_dma_sge dst[DAO_DMA_MAX_POINTER]
Definition dao_dma.h:83
struct rte_dma_op ** dma_ops
Definition dao_dma.h:97
uint8_t auto_free
Definition dao_dma.h:76
uint16_t pend_ops
Definition dao_dma.h:79
uint64_t dma_compl_errs
Definition dao_dma.h:93
uint64_t dbells
Definition dao_dma.h:89
struct rte_dma_sge src[DAO_DMA_MAX_POINTER]
Definition dao_dma.h:81
struct dao_dma_cmpl_mdata mdata[DAO_DMA_MAX_INFLIGHT_MDATA]
Definition dao_dma.h:105
uint64_t enq_errs
Definition dao_dma.h:129