2 * Copyright (c) 2023 Marvell.
3 * SPDX-License-Identifier: Apache-2.0
4 * https://spdx.org/licenses/Apache-2.0.html
8 #include <vlib/pci/pci.h>
9 #include <vlib/linux/vfio.h>
10 #include <base/roc_api.h>
13 static oct_plt_memzone_list_t memzone_list;
16 oct_plt_log (oct_plt_log_level_t level, oct_plt_log_class_t cls, char *fmt,
19 vlib_log ((vlib_log_level_t) level, cls, fmt);
23 oct_plt_spinlock_init (oct_plt_spinlock_t *p)
25 clib_spinlock_init ((clib_spinlock_t *) p);
29 oct_plt_spinlock_lock (oct_plt_spinlock_t *p)
31 clib_spinlock_lock ((clib_spinlock_t *) p);
35 oct_plt_spinlock_unlock (oct_plt_spinlock_t *p)
37 clib_spinlock_unlock ((clib_spinlock_t *) p);
41 oct_plt_spinlock_trylock (oct_plt_spinlock_t *p)
43 return clib_spinlock_trylock ((clib_spinlock_t *) p);
47 oct_plt_get_thread_index (void)
49 return __os_thread_index;
53 oct_plt_get_cache_line_size (void)
55 return CLIB_CACHE_LINE_BYTES;
59 oct_drv_physmem_free (vlib_main_t *vm, void *mem)
63 clib_warning ("Invalid address %p", mem);
67 vlib_physmem_free (vm, mem);
71 oct_drv_physmem_alloc (vlib_main_t *vm, u32 size, u32 align)
73 clib_error_t *error = NULL;
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);
84 vlib_physmem_alloc_aligned_on_numa (vm, size, CLIB_CACHE_LINE_BYTES, 0);
88 error = vfio_map_physmem_page (vm, mem);
92 clib_memset (mem, 0, size);
96 clib_error_report (error);
97 oct_drv_physmem_free (vm, mem);
103 oct_plt_free (void *addr)
105 vlib_main_t *vm = vlib_get_main ();
107 oct_drv_physmem_free ((void *) vm, addr);
111 oct_plt_zmalloc (u32 size, u32 align)
113 vlib_main_t *vm = vlib_get_main ();
115 return oct_drv_physmem_alloc (vm, size, align);
118 static oct_plt_memzone_t *
119 memzone_get (u32 index)
121 if (index == ((u32) ~0))
124 return pool_elt_at_index (memzone_list.mem_pool, index);
128 oct_plt_memzone_free (const oct_plt_memzone_t *name)
131 p = hash_get_mem (memzone_list.memzone_by_name, name);
133 if (p[0] == ((u32) ~0))
136 hash_unset_mem (memzone_list.memzone_by_name, name);
138 pool_put_index (memzone_list.mem_pool, p[0]);
143 static oct_plt_memzone_t *
144 oct_plt_memzone_lookup (const char *name)
147 p = hash_get_mem (memzone_list.memzone_by_name, name);
149 return memzone_get (p[0]);
154 static oct_plt_memzone_t *
155 oct_plt_memzone_reserve_aligned (const char *name, u64 len, u8 socket,
156 u32 flags, u32 align)
158 oct_plt_memzone_t *mem_pool;
161 pool_get_zero (memzone_list.mem_pool, mem_pool);
163 p = oct_plt_zmalloc (len, align);
168 mem_pool->index = mem_pool - memzone_list.mem_pool;
169 hash_set_mem (memzone_list.memzone_by_name, name, mem_pool->index);
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,