1 /* SPDX-License-Identifier: Apache-2.0
2 * Copyright (c) 2022 Cisco Systems, Inc.
5 #ifndef included_vlib_dma_h
6 #define included_vlib_dma_h
9 #define dma_log_debug(f, ...) \
10 vlib_log (VLIB_LOG_LEVEL_DEBUG, dma_log.class, "%s: " f, __func__, \
13 #define dma_log_info(f, ...) \
14 vlib_log (VLIB_LOG_LEVEL_INFO, dma_log.class, "%s: " f, __func__, \
17 struct vlib_dma_batch;
18 struct vlib_dma_config_data;
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);
36 u32 barrier_before_last : 1;
42 u32 max_transfer_size;
43 vlib_dma_batch_callback_fn *callback_fn;
46 typedef struct vlib_dma_batch
48 vlib_dma_batch_submit_fn *submit_fn;
49 vlib_dma_batch_callback_fn *callback_fn;
61 vlib_dma_config_add_fn *config_add_fn;
62 vlib_dma_config_del_fn *config_del_fn;
63 format_function_t *info_fn;
66 typedef struct vlib_dma_config_data
68 vlib_dma_config_t cfg;
69 vlib_dma_batch_new_fn *batch_new_fn;
73 } vlib_dma_config_data_t;
77 vlib_dma_backend_t *backends;
78 vlib_dma_config_data_t *configs;
81 extern vlib_dma_main_t vlib_dma_main;
83 clib_error_t *vlib_dma_register_backend (vlib_main_t *vm,
84 vlib_dma_backend_t *b);
86 int vlib_dma_config_add (vlib_main_t *vm, vlib_dma_config_t *b);
87 void vlib_dma_config_del (vlib_main_t *vm, u32 config_index);
88 u8 *vlib_dma_config_info (u8 *s, va_list *args);
90 static_always_inline vlib_dma_batch_t *
91 vlib_dma_batch_new (vlib_main_t *vm, u32 config_index)
93 vlib_dma_main_t *dm = &vlib_dma_main;
94 vlib_dma_config_data_t *cd = pool_elt_at_index (dm->configs, config_index);
96 return cd->batch_new_fn (vm, cd);
99 static_always_inline void
100 vlib_dma_batch_set_cookie (vlib_main_t *vm, vlib_dma_batch_t *batch,
103 batch->cookie = cookie;
106 static_always_inline uword
107 vlib_dma_batch_get_cookie (vlib_main_t *vm, vlib_dma_batch_t *batch)
109 return batch->cookie;
112 static_always_inline void
113 vlib_dma_batch_add (vlib_main_t *vm, vlib_dma_batch_t *batch, void *dst,
116 u8 *p = (u8 *) batch + batch->n_enq * batch->stride;
118 *((void **) (p + batch->dst_ptr_off)) = dst;
119 *((void **) (p + batch->src_ptr_off)) = src;
120 *((u32 *) (p + batch->size_off)) = size;
125 static_always_inline void
126 vlib_dma_batch_submit (vlib_main_t *vm, vlib_dma_batch_t *batch)
128 batch->submit_fn (vm, batch);