Sound Open Firmware
Loading...
Searching...
No Matches
generic.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause */
2/*
3 * Copyright(c) 2020 - 2023 Intel Corporation. All rights reserved.
4 *
5 *
6 * \file generic.h
7 * \brief Generic Module API header file
8 * \author Marcin Rajwa <marcin.rajwa@linux.intel.com>
9 * \author Adrian Warecki <adrian.warecki@intel.com>
10 *
11 */
12
13#ifndef __SOF_AUDIO_MODULE_GENERIC__
14#define __SOF_AUDIO_MODULE_GENERIC__
15
16#include <rtos/mutex.h>
17#include <sof/objpool.h>
18#include <sof/ut.h>
19#include <sof/audio/component.h>
20#include <sof/audio/sink_api.h>
22#include "module_interface.h"
23
24#include <sof/compiler_attributes.h>
25
26/*
27 * helpers to determine processing type
28 * Needed till all the modules use PROCESSING_MODE_SINK_SOURCE
29 */
30#define IS_PROCESSING_MODE_AUDIO_STREAM(mod) ((mod)->proc_type == MODULE_PROCESS_TYPE_STREAM)
31#define IS_PROCESSING_MODE_RAW_DATA(mod) ((mod)->proc_type == MODULE_PROCESS_TYPE_RAW)
32#define IS_PROCESSING_MODE_SINK_SOURCE(mod) ((mod)->proc_type == MODULE_PROCESS_TYPE_SOURCE_SINK)
33
34#if CONFIG_IPC_MAJOR_4
35#define IPC_MOD_CMD(v)
36#elif CONFIG_IPC_MAJOR_3
37#define IPC_MOD_CMD(v) .cmd = v,
38#endif
39
40/*
41 * \brief Macro to declare a module adapter component.
42 * \param adapter - name of the module.
43 * \param uuid - UUID of the module.
44 * \param tr - trace context for the module.
45 *
46 * This macro declares a module component with the specified name, UUID, and trace context.
47 * It initializes the component module structure with the appropriate type, UID, and
48 * struct module_interface operations.
49 */
50#define DECLARE_MODULE_ADAPTER(adapter, uuid, tr) \
51static const struct comp_driver comp_##adapter##_module = { \
52 .type = SOF_COMP_MODULE_ADAPTER, \
53 .uid = SOF_RT_UUID(uuid), \
54 .tctx = &(tr), \
55 .ops = { \
56 .create = module_adapter_new, \
57 .prepare = module_adapter_prepare, \
58 .params = module_adapter_params, \
59 .copy = module_adapter_copy, \
60 IPC_MOD_CMD(module_adapter_cmd) \
61 .trigger = module_adapter_trigger, \
62 .reset = module_adapter_reset, \
63 .free = module_adapter_free, \
64 .set_large_config = module_set_large_config,\
65 .get_large_config = module_get_large_config,\
66 .get_attribute = module_adapter_get_attribute,\
67 .set_attribute = module_adapter_set_attribute,\
68 .bind = module_adapter_bind,\
69 .unbind = module_adapter_unbind,\
70 .get_total_data_processed = module_adapter_get_total_data_processed,\
71 .dai_get_hw_params = module_adapter_get_hw_params,\
72 .position = module_adapter_position,\
73 .dai_ts_config = module_adapter_ts_config_op,\
74 .dai_ts_start = module_adapter_ts_start_op,\
75 .dai_ts_stop = module_adapter_ts_stop_op,\
76 .dai_ts_get = module_adapter_ts_get_op,\
77 }, \
78 .adapter_ops = &(adapter), \
79}; \
80\
81static struct comp_driver_info comp_module_##adapter##_info = { \
82 .drv = &comp_##adapter##_module, \
83}; \
84\
85UT_STATIC void sys_comp_module_##adapter##_init(void) \
86{ \
87 comp_register(&comp_module_##adapter##_info); \
88} \
89\
90DECLARE_MODULE(sys_comp_module_##adapter##_init)
91
102
116 uint32_t id;
117 uint32_t size;
118 int32_t data[];
119};
120
133
140
146 union {
147 void *ptr;
148 struct comp_data_blob_handler *bhp;
149 const void *sram_ptr;
150 };
152 size_t size;
154};
155
161 uint32_t in_buff_size;
162 uint32_t out_buff_size;
163 uint32_t avail;
164 uint32_t produced;
165 uint32_t consumed;
166 uint32_t init_done;
169 void *in_buff;
170 void *out_buff;
171};
172
173/*
174 * Definition used to extend structure definitions to include fields for exclusive use by SOF.
175 * This is a temporary solution used until work on separating a common interface for loadable
176 * modules is completed.
177 */
178#define SOF_MODULE_API_PRIVATE
179
180#include <module/module/base.h>
181
182/*****************************************************************************/
183/* Module generic interfaces */
184/*****************************************************************************/
185int module_load_config(struct comp_dev *dev, const void *cfg, size_t size);
186int module_init(struct processing_module *mod);
187#if defined(__ZEPHYR__) && defined(CONFIG_SOF_FULL_ZEPHYR_APPLICATION)
188__syscall void *mod_balloc_align(struct processing_module *mod, size_t size, size_t alignment);
189#else
190void *z_impl_mod_balloc_align(struct processing_module *mod, size_t size, size_t alignment);
191#define mod_balloc_align z_impl_mod_balloc_align
192#endif
193void mod_resource_init(struct processing_module *mod);
194void mod_heap_info(struct processing_module *mod, size_t *size, uintptr_t *start);
195#if defined(__ZEPHYR__) && defined(CONFIG_SOF_FULL_ZEPHYR_APPLICATION)
196__syscall void *mod_alloc_ext(struct processing_module *mod, uint32_t flags, size_t size,
197 size_t alignment);
198__syscall int mod_free(struct processing_module *mod, const void *ptr);
199__syscall void mod_free_all(struct processing_module *mod);
200#else
201void *z_impl_mod_alloc_ext(struct processing_module *mod, uint32_t flags, size_t size,
202 size_t alignment);
203int z_impl_mod_free(struct processing_module *mod, const void *ptr);
204void z_impl_mod_free_all(struct processing_module *mod);
205#define mod_alloc_ext z_impl_mod_alloc_ext
206#define mod_free z_impl_mod_free
207#define mod_free_all z_impl_mod_free_all
208#endif
209
219static inline void *mod_alloc_align(struct processing_module *mod, size_t size, size_t alignment)
220{
221 return mod_alloc_ext(mod, SOF_MEM_FLAG_USER, size, alignment);
222}
223
224static inline void *mod_balloc(struct processing_module *mod, size_t size)
225{
226 return mod_balloc_align(mod, size, 0);
227}
228
229static inline void *mod_alloc(struct processing_module *mod, size_t size)
230{
231 return mod_alloc_align(mod, size, 0);
232}
233
234static inline void *mod_zalloc(struct processing_module *mod, size_t size)
235{
236 void *ret = mod_alloc(mod, size);
237
238 if (ret)
239 memset(ret, 0, size);
240
241 return ret;
242}
243
244#if CONFIG_COMP_BLOB
245#if defined(__ZEPHYR__) && defined(CONFIG_SOF_FULL_ZEPHYR_APPLICATION)
246__syscall struct comp_data_blob_handler *mod_data_blob_handler_new(struct processing_module *mod);
247#else
248struct comp_data_blob_handler *z_impl_mod_data_blob_handler_new(struct processing_module *mod);
249#define mod_data_blob_handler_new z_impl_mod_data_blob_handler_new
250#endif
251void mod_data_blob_handler_free(struct processing_module *mod, struct comp_data_blob_handler *dbh);
252#endif
253#if CONFIG_FAST_GET
254#if defined(__ZEPHYR__) && defined(CONFIG_SOF_FULL_ZEPHYR_APPLICATION)
255__syscall const void *mod_fast_get(struct processing_module *mod, const void * const dram_ptr,
256 size_t size);
257#else
258const void *z_impl_mod_fast_get(struct processing_module *mod, const void * const dram_ptr,
259 size_t size);
260#define mod_fast_get z_impl_mod_fast_get
261#endif
262void mod_fast_put(struct processing_module *mod, const void *sram_ptr);
263#endif
264int module_prepare(struct processing_module *mod,
265 struct sof_source **sources, int num_of_sources,
266 struct sof_sink **sinks, int num_of_sinks);
267
268static inline
269bool generic_module_is_ready_to_process(struct processing_module *mod,
270 struct sof_source **sources,
271 int num_of_sources,
272 struct sof_sink **sinks,
273 int num_of_sinks)
274{
275 int i;
276
277 for (i = 0; i < num_of_sources; i++)
278 if (source_get_data_available(sources[i]) < source_get_min_available(sources[i]))
279 return false;
280
281 for (i = 0; i < num_of_sinks; i++)
282 if (sink_get_free_size(sinks[i]) < sink_get_min_free_space(sinks[i]))
283 return false;
284
285 return true;
286}
287
288static inline
289bool module_is_ready_to_process(struct processing_module *mod,
290 struct sof_source **sources,
291 int num_of_sources,
292 struct sof_sink **sinks,
293 int num_of_sinks)
294{
295 const struct module_interface *const ops = mod->dev->drv->adapter_ops;
296
297 /* LL module has to be always ready for processing */
298 if (mod->dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_LL)
299 return true;
300
301 if (ops->is_ready_to_process)
302 return ops->is_ready_to_process(mod, sources, num_of_sources, sinks, num_of_sinks);
303 /* default action - the module is ready if there's enough data for processing and enough
304 * space to store result. IBS/OBS as declared in init_instance
305 */
306 return generic_module_is_ready_to_process(mod, sources, num_of_sources, sinks,
307 num_of_sinks);
308}
309
310int module_process_sink_src(struct processing_module *mod,
311 struct sof_source **sources, int num_of_sources,
312 struct sof_sink **sinks, int num_of_sinks);
313int module_process_legacy(struct processing_module *mod,
314 struct input_stream_buffer *input_buffers, int num_input_buffers,
315 struct output_stream_buffer *output_buffers,
316 int num_output_buffers);
317int module_reset(struct processing_module *mod);
318int module_free(struct processing_module *mod);
319int module_set_configuration(struct processing_module *mod,
320 uint32_t config_id,
321 enum module_cfg_fragment_position pos, size_t data_offset_size,
322 const uint8_t *fragment, size_t fragment_size, uint8_t *response,
323 size_t response_size);
324int module_bind(struct processing_module *mod, const struct bind_info *bind_data);
325int module_unbind(struct processing_module *mod, const struct bind_info *unbind_data);
326
328 const struct comp_ipc_config *config, const void *spec);
329struct userspace_context;
331 const struct comp_ipc_config *config, const void *spec,
332 void *mod_priv, struct userspace_context *user_ctx,
333 const struct module_interface *ops);
335int module_adapter_params(struct comp_dev *dev, struct sof_ipc_stream_params *params);
337int module_adapter_cmd(struct comp_dev *dev, int cmd, void *data, int max_data_size);
338int module_adapter_trigger(struct comp_dev *dev, int cmd);
341
342size_t module_adapter_heap_usage(struct processing_module *mod, size_t *hwm);
343
344#if CONFIG_IPC_MAJOR_3
345static inline
346int module_adapter_get_attribute(struct comp_dev *dev, uint32_t type, void *value)
347{
348 return -EINVAL;
349}
350
351static inline
352int module_adapter_set_attribute(struct comp_dev *dev, uint32_t type, void *value)
353{
354 return -EINVAL;
355}
356
357static inline
358int module_set_large_config(struct comp_dev *dev, uint32_t param_id, bool first_block,
359 bool last_block, uint32_t data_offset, const char *data)
360{
361 return 0;
362}
363
364static inline
365int module_get_large_config(struct comp_dev *dev, uint32_t param_id, bool first_block,
366 bool last_block, uint32_t *data_offset, char *data)
367{
368 return 0;
369}
370
371static inline
372int module_adapter_bind(struct comp_dev *dev, const struct bind_info *bind_data)
373{
374 return 0;
375}
376
377static inline
378int module_adapter_unbind(struct comp_dev *dev, const struct bind_info *unbind_data)
379{
380 return 0;
381}
382
383static inline
385 uint32_t stream_no, bool input)
386{
387 return 0;
388}
389
390static inline int module_process_endpoint(struct processing_module *mod,
391 struct input_stream_buffer *input_buffers,
392 int num_input_buffers,
393 struct output_stream_buffer *output_buffers,
394 int num_output_buffers)
395{
396 return module_process_legacy(mod, input_buffers, num_input_buffers,
397 output_buffers, num_output_buffers);
398}
399
400#else
401int module_set_large_config(struct comp_dev *dev, uint32_t param_id, bool first_block,
402 bool last_block, uint32_t data_offset, const char *data);
403int module_get_large_config(struct comp_dev *dev, uint32_t param_id, bool first_block,
404 bool last_block, uint32_t *data_offset, char *data);
405int module_adapter_get_attribute(struct comp_dev *dev, uint32_t type, void *value);
406int module_adapter_set_attribute(struct comp_dev *dev, uint32_t type, void *value);
407int module_adapter_bind(struct comp_dev *dev, const struct bind_info *bind_data);
408int module_adapter_unbind(struct comp_dev *dev, const struct bind_info *unbind_data);
410 uint32_t stream_no, bool input);
411
412static inline int module_process_endpoint(struct processing_module *mod,
413 struct input_stream_buffer *input_buffers,
414 int num_input_buffers,
415 struct output_stream_buffer *output_buffers,
416 int num_output_buffers)
417{
418 const struct module_interface *const ops = mod->dev->drv->adapter_ops;
419
420 return ops->process_audio_stream(mod, input_buffers, num_input_buffers,
421 output_buffers, num_output_buffers);
422}
423
424#endif
425
427 int dir);
432#if CONFIG_ZEPHYR_NATIVE_DRIVERS
433int module_adapter_ts_get_op(struct comp_dev *dev, struct dai_ts_data *tsd);
434#else
435int module_adapter_ts_get_op(struct comp_dev *dev, struct timestamp_data *tsd);
436#endif
437
438void module_update_buffer_position(struct input_stream_buffer *input_buffers,
439 struct output_stream_buffer *output_buffers,
440 uint32_t frames);
441struct module_ext_init_data;
442#if CONFIG_IPC_MAJOR_4
443int module_ext_init_decode(const struct comp_driver *drv, struct module_ext_init_data *ext_data,
444 struct ipc_config_process *spec);
445#else
446static inline
447int module_ext_init_decode(const struct comp_driver *drv, struct module_ext_init_data *ext_data,
448 struct ipc_config_process *spec)
449{
450 return 0;
451}
452#endif
454 struct module_config *dst,
455 const struct comp_ipc_config *config,
456 const void *spec);
457void module_adapter_reset_data(struct module_config *dst);
458void module_adapter_check_data(struct processing_module *mod, struct comp_dev *dev,
459 struct comp_buffer *sink);
460void module_adapter_set_params(struct processing_module *mod, struct sof_ipc_stream_params *params);
461int module_adapter_set_state(struct processing_module *mod, struct comp_dev *dev,
462 int cmd);
464
473uint32_t module_get_deadline(struct processing_module *mod);
474
483static inline uint32_t module_get_lpt(struct processing_module *mod)
484{
485 /* return worst case of LPT - a module period. See zephyr_dp_schedule.c for description */
486 return mod->dev->period;
487}
488
489#if defined(__ZEPHYR__) && defined(CONFIG_SOF_FULL_ZEPHYR_APPLICATION)
490#include <zephyr/syscalls/generic.h>
491#endif
492
493#endif /* __SOF_AUDIO_MODULE_GENERIC__ */
Component API definition.
uint32_t data[]
Definition debug_stream_slot.h:2
size_t module_adapter_heap_usage(struct processing_module *mod, size_t *hwm)
int module_adapter_ts_get_op(struct comp_dev *dev, struct timestamp_data *tsd)
int module_adapter_prepare(struct comp_dev *dev)
int module_adapter_ts_start_op(struct comp_dev *dev)
module_state
Module-specific states.
Definition generic.h:96
@ MODULE_INITIALIZED
Module initialized or reset.
Definition generic.h:98
@ MODULE_PROCESSING
Module is processing samples now.
Definition generic.h:100
@ MODULE_DISABLED
Module isn't initialized yet or has been freed.
Definition generic.h:97
@ MODULE_IDLE
Module is idle now.
Definition generic.h:99
int module_process_legacy(struct processing_module *mod, struct input_stream_buffer *input_buffers, int num_input_buffers, struct output_stream_buffer *output_buffers, int num_output_buffers)
int module_adapter_copy(struct comp_dev *dev)
void * z_impl_mod_balloc_align(struct processing_module *mod, size_t size, size_t alignment)
uint64_t module_adapter_get_total_data_processed(struct comp_dev *dev, uint32_t stream_no, bool input)
int module_adapter_ts_stop_op(struct comp_dev *dev)
static uint32_t module_get_lpt(struct processing_module *mod)
Get a Longest Processing Time estimation for the module, in us It is either.
Definition generic.h:483
int module_unbind(struct processing_module *mod, const struct bind_info *unbind_data)
int module_adapter_set_state(struct processing_module *mod, struct comp_dev *dev, int cmd)
int module_prepare(struct processing_module *mod, struct sof_source **sources, int num_of_sources, struct sof_sink **sinks, int num_of_sinks)
int module_free(struct processing_module *mod)
int module_get_large_config(struct comp_dev *dev, uint32_t param_id, bool first_block, bool last_block, uint32_t *data_offset, char *data)
int module_adapter_get_hw_params(struct comp_dev *dev, struct sof_ipc_stream_params *params, int dir)
int module_set_configuration(struct processing_module *mod, uint32_t config_id, enum module_cfg_fragment_position pos, size_t data_offset_size, const uint8_t *fragment, size_t fragment_size, uint8_t *response, size_t response_size)
#define mod_free
Definition generic.h:206
void module_adapter_free(struct comp_dev *dev)
static int module_ext_init_decode(const struct comp_driver *drv, struct module_ext_init_data *ext_data, struct ipc_config_process *spec)
Definition generic.h:447
#define mod_balloc_align
Definition generic.h:191
void mod_resource_init(struct processing_module *mod)
mod_resource_type
Definition generic.h:134
@ MOD_RES_BLOB_HANDLER
Definition generic.h:137
@ MOD_RES_UNINITIALIZED
Definition generic.h:135
@ MOD_RES_FAST_GET
Definition generic.h:138
@ MOD_RES_HEAP
Definition generic.h:136
int module_adapter_sink_src_prepare(struct comp_dev *dev)
int module_adapter_get_attribute(struct comp_dev *dev, uint32_t type, void *value)
void z_impl_mod_free_all(struct processing_module *mod)
int module_adapter_cmd(struct comp_dev *dev, int cmd, void *data, int max_data_size)
int module_set_large_config(struct comp_dev *dev, uint32_t param_id, bool first_block, bool last_block, uint32_t data_offset, const char *data)
struct comp_dev * module_adapter_new_ext(const struct comp_driver *drv, const struct comp_ipc_config *config, const void *spec, void *mod_priv, struct userspace_context *user_ctx, const struct module_interface *ops)
#define mod_alloc_ext
Definition generic.h:205
int module_adapter_ts_config_op(struct comp_dev *dev)
int module_init(struct processing_module *mod)
int module_adapter_set_attribute(struct comp_dev *dev, uint32_t type, void *value)
struct comp_dev * module_adapter_new(const struct comp_driver *drv, const struct comp_ipc_config *config, const void *spec)
int module_adapter_init_data(struct comp_dev *dev, struct module_config *dst, const struct comp_ipc_config *config, const void *spec)
void module_adapter_reset_data(struct module_config *dst)
int module_process_sink_src(struct processing_module *mod, struct sof_source **sources, int num_of_sources, struct sof_sink **sinks, int num_of_sinks)
static void * mod_balloc(struct processing_module *mod, size_t size)
Definition generic.h:224
void module_adapter_check_data(struct processing_module *mod, struct comp_dev *dev, struct comp_buffer *sink)
static int module_process_endpoint(struct processing_module *mod, struct input_stream_buffer *input_buffers, int num_input_buffers, struct output_stream_buffer *output_buffers, int num_output_buffers)
Definition generic.h:412
int module_reset(struct processing_module *mod)
static void * mod_alloc(struct processing_module *mod, size_t size)
Definition generic.h:229
int module_adapter_trigger(struct comp_dev *dev, int cmd)
static void * mod_alloc_align(struct processing_module *mod, size_t size, size_t alignment)
Allocates aligned memory block for module.
Definition generic.h:219
int module_bind(struct processing_module *mod, const struct bind_info *bind_data)
void module_adapter_set_params(struct processing_module *mod, struct sof_ipc_stream_params *params)
static void * mod_zalloc(struct processing_module *mod, size_t size)
Definition generic.h:234
#define mod_free_all
Definition generic.h:207
void * z_impl_mod_alloc_ext(struct processing_module *mod, uint32_t flags, size_t size, size_t alignment)
static bool generic_module_is_ready_to_process(struct processing_module *mod, struct sof_source **sources, int num_of_sources, struct sof_sink **sinks, int num_of_sinks)
Definition generic.h:269
int module_adapter_reset(struct comp_dev *dev)
int module_adapter_params(struct comp_dev *dev, struct sof_ipc_stream_params *params)
int module_adapter_bind(struct comp_dev *dev, const struct bind_info *bind_data)
void mod_heap_info(struct processing_module *mod, size_t *size, uintptr_t *start)
void module_update_buffer_position(struct input_stream_buffer *input_buffers, struct output_stream_buffer *output_buffers, uint32_t frames)
static bool module_is_ready_to_process(struct processing_module *mod, struct sof_source **sources, int num_of_sources, struct sof_sink **sinks, int num_of_sinks)
Definition generic.h:289
int module_adapter_position(struct comp_dev *dev, struct sof_ipc_stream_posn *posn)
int module_load_config(struct comp_dev *dev, const void *cfg, size_t size)
int module_adapter_unbind(struct comp_dev *dev, const struct bind_info *unbind_data)
uint32_t module_get_deadline(struct processing_module *mod)
Get a deadline based on current LFT reported by all sinks it returns a value >= UINT32_MAX / 2 in cas...
int z_impl_mod_free(struct processing_module *mod, const void *ptr)
#define SOF_MEM_FLAG_USER
Allocate user memory address.
Definition alloc.h:45
#define COMP_PROCESSING_DOMAIN_LL
Definition component.h:607
#define list_item(item, type, member)
Definition list.h:80
Definition component.h:284
Definition buffer.h:130
Audio component base device "class".
Definition component.h:645
const struct comp_driver * drv
driver
Definition component.h:675
struct processing_module * mod
self->mod->dev == self, NULL if component is not using module adapter
Definition component.h:677
Audio component base driver "class".
Definition component.h:587
Audio component base configuration from IPC at creation.
Definition component.h:613
Definition ipc-config.h:139
Definition alloc.h:167
Module TLV parameters container - used for both config types.
Definition generic.h:111
uint32_t size
The size of whole parameter - id + size + data.
Definition generic.h:117
int32_t data[]
A pointer to memory where config is stored.
Definition generic.h:118
uint32_t id
Specifies the unique id of a parameter.
Definition generic.h:116
Processing data shared between particular module & module_adapter.
Definition generic.h:160
uint32_t consumed
Specified how much data the module consumed in its last task.
Definition generic.h:165
uint32_t avail
Specifies how much data is available for module to process.
Definition generic.h:163
uint32_t produced
Specifies how much data the module produced in its last task.
Definition generic.h:164
uint32_t init_done
Specifies if the module initialization is finished.
Definition generic.h:166
uint32_t out_buff_size
Specifies the size of module output buffer.
Definition generic.h:162
void * in_buff
A pointer to module input buffer.
Definition generic.h:169
void * out_buff
A pointer to module output buffer.
Definition generic.h:170
bool eos_notification_sent
EOS notification is sent to host.
Definition generic.h:168
bool eos_reached
End of stream processing is reached.
Definition generic.h:167
uint32_t in_buff_size
Specifies the size of module input buffer.
Definition generic.h:161
module memory container - used for every memory allocated by module
Definition generic.h:145
struct comp_data_blob_handler * bhp
Blob handler ptr.
Definition generic.h:148
size_t size
Size of allocated heap memory, 0 if not from heap.
Definition generic.h:152
struct list_item list
list element
Definition generic.h:151
const void * sram_ptr
SRAM ptr from fast_get().
Definition generic.h:149
enum mod_resource_type type
Resource type.
Definition generic.h:153
void * ptr
Pointer to heap allocated memory.
Definition generic.h:147
module resources block - used for module allocation records The allocations are recorded so that they...
Definition generic.h:127
struct mod_alloc_ctx * alloc
Definition generic.h:131
size_t heap_usage
Definition generic.h:129
size_t heap_high_water_mark
Definition generic.h:130
struct objpool_head objpool
Definition generic.h:128
Definition objpool.h:17
Definition stream.h:71
Definition stream.h:134
char value[]
Definition tlv.h:2
uint32_t type
Definition tlv.h:0