Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
mem_blocks.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
13#ifndef ZEPHYR_INCLUDE_SYS_MEM_BLOCKS_H_
14#define ZEPHYR_INCLUDE_SYS_MEM_BLOCKS_H_
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20#include <stddef.h>
21#include <stdint.h>
22
23#include <kernel.h>
24#include <math/ilog2.h>
25#include <sys/bitarray.h>
26
27#define MAX_MULTI_ALLOCATORS 8
28
37struct sys_mem_blocks;
38
42struct sys_multi_mem_blocks;
43
49typedef struct sys_mem_blocks sys_mem_blocks_t;
50
56typedef struct sys_multi_mem_blocks sys_multi_mem_blocks_t;
57
76typedef sys_mem_blocks_t *(*sys_multi_mem_blocks_choice_fn_t)
77 (struct sys_multi_mem_blocks *group, void *cfg);
78
83struct sys_mem_blocks {
84 /* Number of blocks */
85 uint32_t num_blocks;
86
87 /* Bit shift for block size */
88 uint8_t blk_sz_shift;
89
90 /* Memory block buffer */
92
93 /* Bitmap of allocated blocks */
94 sys_bitarray_t *bitmap;
95
96};
97
98struct sys_multi_mem_blocks {
99 /* Number of allocators in this group */
100 int num_allocators;
103};
104
116#define _SYS_MEM_BLOCKS_DEFINE_WITH_EXT_BUF(name, blk_sz, num_blks, buf, mbmod) \
117 _SYS_BITARRAY_DEFINE(_sys_mem_blocks_bitmap_##name, \
118 num_blks, mbmod); \
119 mbmod sys_mem_blocks_t name = { \
120 .num_blocks = num_blks, \
121 .blk_sz_shift = ilog2(blk_sz), \
122 .buffer = buf, \
123 .bitmap = &_sys_mem_blocks_bitmap_##name, \
124 }
125
137#define _SYS_MEM_BLOCKS_DEFINE(name, blk_sz, num_blks, balign, mbmod) \
138 mbmod uint8_t __noinit_named(sys_mem_blocks_buf_##name) \
139 __aligned(WB_UP(balign)) \
140 _sys_mem_blocks_buf_##name[num_blks * WB_UP(blk_sz)]; \
141 _SYS_MEM_BLOCKS_DEFINE_WITH_EXT_BUF(name, blk_sz, num_blks, \
142 _sys_mem_blocks_buf_##name, \
143 mbmod);
144
159#define SYS_MEM_BLOCKS_DEFINE(name, blk_sz, num_blks, buf_align) \
160 _SYS_MEM_BLOCKS_DEFINE(name, blk_sz, num_blks, buf_align,)
161
172#define SYS_MEM_BLOCKS_DEFINE_STATIC(name, blk_sz, num_blks, buf_align) \
173 _SYS_MEM_BLOCKS_DEFINE(name, blk_sz, num_blks, buf_align, static)
174
175
186#define SYS_MEM_BLOCKS_DEFINE_WITH_EXT_BUF(name, blk_sz, num_blks, buf) \
187 _SYS_MEM_BLOCKS_DEFINE_WITH_EXT_BUF(name, blk_sz, num_blks, buf,)
188
199#define SYS_MEM_BLOCKS_DEFINE_STATIC_WITH_EXT_BUF(name, blk_sz, num_blks, buf) \
200 _SYS_MEM_BLOCKS_DEFINE_WITH_EXT_BUF(name, blk_sz, num_blks, buf, static)
201
219 void **out_blocks);
220
236 void **in_blocks);
237
251
262 sys_mem_blocks_t *alloc);
263
286 void *cfg, size_t count,
287 void **out_blocks,
288 size_t *blk_size);
289
306 size_t count, void **in_blocks);
307
310#ifdef __cplusplus
311}
312#endif
313
314#endif /* ZEPHYR_INCLUDE_SYS_MEM_BLOCKS_H_ */
ZTEST_BMEM int count
Definition: main.c:33
static ZTEST_BMEM char buffer[8]
Test mailbox enhance capabilities.
Definition: test_mbox_api.c:566
void sys_multi_mem_blocks_add_allocator(sys_multi_mem_blocks_t *group, sys_mem_blocks_t *alloc)
Add an allocator to an allocator group.
sys_mem_blocks_t *(* sys_multi_mem_blocks_choice_fn_t)(struct sys_multi_mem_blocks *group, void *cfg)
Multi memory blocks allocator choice function.
Definition: mem_blocks.h:77
int sys_mem_blocks_alloc(sys_mem_blocks_t *mem_block, size_t count, void **out_blocks)
Allocate multiple memory blocks.
int sys_multi_mem_blocks_free(sys_multi_mem_blocks_t *group, size_t count, void **in_blocks)
Free memory allocated from multi memory blocks allocator group.
struct sys_mem_blocks sys_mem_blocks_t
Memory Blocks Allocator.
Definition: mem_blocks.h:49
struct sys_multi_mem_blocks sys_multi_mem_blocks_t
Multi Memory Blocks Allocator.
Definition: mem_blocks.h:56
void sys_multi_mem_blocks_init(sys_multi_mem_blocks_t *group, sys_multi_mem_blocks_choice_fn_t choice_fn)
Initialize multi memory blocks allocator group.
int sys_mem_blocks_free(sys_mem_blocks_t *mem_block, size_t count, void **in_blocks)
Free multiple memory blocks.
int sys_multi_mem_blocks_alloc(sys_multi_mem_blocks_t *group, void *cfg, size_t count, void **out_blocks, size_t *blk_size)
Allocate memory from multi memory blocks allocator group.
Provide ilog2() function.
#define MAX_MULTI_ALLOCATORS
Definition: mem_blocks.h:27
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
Definition: test_pipe_contexts.c:43
Definition: bitarray.h:19