ip: mark IP_ADDRESS_DUMP as mp-safe
[vpp.git] / src / plugins / dev_octeon / roc_helper.c
1 /*
2  * Copyright (c) 2023 Marvell.
3  * SPDX-License-Identifier: Apache-2.0
4  * https://spdx.org/licenses/Apache-2.0.html
5  */
6
7 #include <vnet/vnet.h>
8 #include <vlib/pci/pci.h>
9 #include <vlib/linux/vfio.h>
10 #include <base/roc_api.h>
11 #include <common.h>
12
13 static oct_plt_memzone_list_t memzone_list;
14
15 static inline void
16 oct_plt_log (oct_plt_log_level_t level, oct_plt_log_class_t cls, char *fmt,
17              ...)
18 {
19   vlib_log ((vlib_log_level_t) level, cls, fmt);
20 }
21
22 static inline void
23 oct_plt_spinlock_init (oct_plt_spinlock_t *p)
24 {
25   clib_spinlock_init ((clib_spinlock_t *) p);
26 }
27
28 static void
29 oct_plt_spinlock_lock (oct_plt_spinlock_t *p)
30 {
31   clib_spinlock_lock ((clib_spinlock_t *) p);
32 }
33
34 static void
35 oct_plt_spinlock_unlock (oct_plt_spinlock_t *p)
36 {
37   clib_spinlock_unlock ((clib_spinlock_t *) p);
38 }
39
40 static int
41 oct_plt_spinlock_trylock (oct_plt_spinlock_t *p)
42 {
43   return clib_spinlock_trylock ((clib_spinlock_t *) p);
44 }
45
46 static u64
47 oct_plt_get_thread_index (void)
48 {
49   return __os_thread_index;
50 }
51
52 static u64
53 oct_plt_get_cache_line_size (void)
54 {
55   return CLIB_CACHE_LINE_BYTES;
56 }
57
58 static void
59 oct_drv_physmem_free (vlib_main_t *vm, void *mem)
60 {
61   if (!mem)
62     {
63       clib_warning ("Invalid address %p", mem);
64       return;
65     }
66
67   vlib_physmem_free (vm, mem);
68 }
69
70 static void *
71 oct_drv_physmem_alloc (vlib_main_t *vm, u32 size, u32 align)
72 {
73   clib_error_t *error = NULL;
74   uword *mem = NULL;
75
76   if (align)
77     {
78       /* Force cache line alloc in case alignment is less than cache line */
79       align = align < CLIB_CACHE_LINE_BYTES ? CLIB_CACHE_LINE_BYTES : align;
80       mem = vlib_physmem_alloc_aligned_on_numa (vm, size, align, 0);
81     }
82   else
83     mem =
84       vlib_physmem_alloc_aligned_on_numa (vm, size, CLIB_CACHE_LINE_BYTES, 0);
85   if (!mem)
86     return NULL;
87
88   error = vfio_map_physmem_page (vm, mem);
89   if (error)
90     goto report_error;
91
92   clib_memset (mem, 0, size);
93   return mem;
94
95 report_error:
96   clib_error_report (error);
97   oct_drv_physmem_free (vm, mem);
98
99   return NULL;
100 }
101
102 static void
103 oct_plt_free (void *addr)
104 {
105   vlib_main_t *vm = vlib_get_main ();
106
107   oct_drv_physmem_free ((void *) vm, addr);
108 }
109
110 static void *
111 oct_plt_zmalloc (u32 size, u32 align)
112 {
113   vlib_main_t *vm = vlib_get_main ();
114
115   return oct_drv_physmem_alloc (vm, size, align);
116 }
117
118 static oct_plt_memzone_t *
119 memzone_get (u32 index)
120 {
121   if (index == ((u32) ~0))
122     return 0;
123
124   return pool_elt_at_index (memzone_list.mem_pool, index);
125 }
126
127 static int
128 oct_plt_memzone_free (const oct_plt_memzone_t *name)
129 {
130   uword *p;
131   p = hash_get_mem (memzone_list.memzone_by_name, name);
132
133   if (p[0] == ((u32) ~0))
134     return -EINVAL;
135
136   hash_unset_mem (memzone_list.memzone_by_name, name);
137
138   pool_put_index (memzone_list.mem_pool, p[0]);
139
140   return 0;
141 }
142
143 static oct_plt_memzone_t *
144 oct_plt_memzone_lookup (const char *name)
145 {
146   uword *p;
147   p = hash_get_mem (memzone_list.memzone_by_name, name);
148   if (p)
149     return memzone_get (p[0]);
150
151   return 0;
152 }
153
154 static oct_plt_memzone_t *
155 oct_plt_memzone_reserve_aligned (const char *name, u64 len, u8 socket,
156                                  u32 flags, u32 align)
157 {
158   oct_plt_memzone_t *mem_pool;
159   void *p = NULL;
160
161   pool_get_zero (memzone_list.mem_pool, mem_pool);
162
163   p = oct_plt_zmalloc (len, align);
164   if (!p)
165     return NULL;
166
167   mem_pool->addr = p;
168   mem_pool->index = mem_pool - memzone_list.mem_pool;
169   hash_set_mem (memzone_list.memzone_by_name, name, mem_pool->index);
170
171   return mem_pool;
172 }
173
174 oct_plt_init_param_t oct_plt_init_param = {
175   .oct_plt_log_reg_class = vlib_log_register_class,
176   .oct_plt_log = oct_plt_log,
177   .oct_plt_free = oct_plt_free,
178   .oct_plt_zmalloc = oct_plt_zmalloc,
179   .oct_plt_memzone_free = oct_plt_memzone_free,
180   .oct_plt_memzone_lookup = oct_plt_memzone_lookup,
181   .oct_plt_memzone_reserve_aligned = oct_plt_memzone_reserve_aligned,
182   .oct_plt_spinlock_init = oct_plt_spinlock_init,
183   .oct_plt_spinlock_lock = oct_plt_spinlock_lock,
184   .oct_plt_spinlock_unlock = oct_plt_spinlock_unlock,
185   .oct_plt_spinlock_trylock = oct_plt_spinlock_trylock,
186   .oct_plt_get_thread_index = oct_plt_get_thread_index,
187   .oct_plt_get_cache_line_size = oct_plt_get_cache_line_size,
188 };