octeon: add clear counters for port and queues
[vpp.git] / src / vlib / dma / dma.h
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright (c) 2022 Cisco Systems, Inc.
3  */
4
5 #ifndef included_vlib_dma_h
6 #define included_vlib_dma_h
7 #include <vlib/vlib.h>
8
9 #define dma_log_debug(f, ...)                                                 \
10   vlib_log (VLIB_LOG_LEVEL_DEBUG, dma_log.class, "%s: " f, __func__,          \
11             ##__VA_ARGS__)
12
13 #define dma_log_info(f, ...)                                                  \
14   vlib_log (VLIB_LOG_LEVEL_INFO, dma_log.class, "%s: " f, __func__,           \
15             ##__VA_ARGS__)
16
17 struct vlib_dma_batch;
18 struct vlib_dma_config_data;
19
20 typedef int (vlib_dma_config_add_fn) (vlib_main_t *vm,
21                                       struct vlib_dma_config_data *cfg);
22 typedef void (vlib_dma_config_del_fn) (vlib_main_t *vm,
23                                        struct vlib_dma_config_data *cfg);
24 typedef struct vlib_dma_batch *(vlib_dma_batch_new_fn) (
25   vlib_main_t *vm, struct vlib_dma_config_data *);
26 typedef int (vlib_dma_batch_submit_fn) (vlib_main_t *vm,
27                                         struct vlib_dma_batch *b);
28 typedef void (vlib_dma_batch_callback_fn) (vlib_main_t *vm,
29                                            struct vlib_dma_batch *b);
30 typedef struct
31 {
32   union
33   {
34     struct
35     {
36       u32 barrier_before_last : 1;
37       u32 sw_fallback : 1;
38     };
39     u32 features;
40   };
41   u16 max_batches;
42   u16 max_transfers;
43   u32 max_transfer_size;
44   vlib_dma_batch_callback_fn *callback_fn;
45 } vlib_dma_config_t;
46
47 typedef struct vlib_dma_batch
48 {
49   vlib_dma_batch_submit_fn *submit_fn;
50   vlib_dma_batch_callback_fn *callback_fn;
51   uword cookie;
52   u16 src_ptr_off;
53   u16 dst_ptr_off;
54   u16 size_off;
55   u16 stride;
56   u16 n_enq;
57 } vlib_dma_batch_t;
58
59 typedef struct
60 {
61   char *name;
62   vlib_dma_config_add_fn *config_add_fn;
63   vlib_dma_config_del_fn *config_del_fn;
64   format_function_t *info_fn;
65 } vlib_dma_backend_t;
66
67 typedef struct vlib_dma_config_data
68 {
69   vlib_dma_config_t cfg;
70   vlib_dma_batch_new_fn *batch_new_fn;
71   uword private_data;
72   u32 backend_index;
73   u32 config_index;
74 } vlib_dma_config_data_t;
75
76 typedef struct
77 {
78   vlib_dma_backend_t *backends;
79   vlib_dma_config_data_t *configs;
80 } vlib_dma_main_t;
81
82 extern vlib_dma_main_t vlib_dma_main;
83
84 clib_error_t *vlib_dma_register_backend (vlib_main_t *vm,
85                                          vlib_dma_backend_t *b);
86
87 int vlib_dma_config_add (vlib_main_t *vm, vlib_dma_config_t *b);
88 void vlib_dma_config_del (vlib_main_t *vm, u32 config_index);
89 u8 *vlib_dma_config_info (u8 *s, va_list *args);
90
91 static_always_inline vlib_dma_batch_t *
92 vlib_dma_batch_new (vlib_main_t *vm, u32 config_index)
93 {
94   vlib_dma_main_t *dm = &vlib_dma_main;
95   vlib_dma_config_data_t *cd = pool_elt_at_index (dm->configs, config_index);
96
97   return cd->batch_new_fn (vm, cd);
98 }
99
100 static_always_inline void
101 vlib_dma_batch_set_cookie (vlib_main_t *vm, vlib_dma_batch_t *batch,
102                            uword cookie)
103 {
104   batch->cookie = cookie;
105 }
106
107 static_always_inline uword
108 vlib_dma_batch_get_cookie (vlib_main_t *vm, vlib_dma_batch_t *batch)
109 {
110   return batch->cookie;
111 }
112
113 static_always_inline void
114 vlib_dma_batch_add (vlib_main_t *vm, vlib_dma_batch_t *batch, void *dst,
115                     void *src, u32 size)
116 {
117   u8 *p = (u8 *) batch + batch->n_enq * batch->stride;
118
119   *((void **) (p + batch->dst_ptr_off)) = dst;
120   *((void **) (p + batch->src_ptr_off)) = src;
121   *((u32 *) (p + batch->size_off)) = size;
122
123   batch->n_enq++;
124 }
125
126 static_always_inline void
127 vlib_dma_batch_submit (vlib_main_t *vm, vlib_dma_batch_t *batch)
128 {
129   batch->submit_fn (vm, batch);
130 }
131
132 #endif