13#ifndef __SOF_AUDIO_MODULE_GENERIC__
14#define __SOF_AUDIO_MODULE_GENERIC__
24#include <sof/compiler_attributes.h>
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)
36#elif CONFIG_IPC_MAJOR_3
37#define IPC_MOD_CMD(v) .cmd = v,
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), \
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,\
78 .adapter_ops = &(adapter), \
81static struct comp_driver_info comp_module_##adapter##_info = { \
82 .drv = &comp_##adapter##_module, \
85UT_STATIC void sys_comp_module_##adapter##_init(void) \
87 comp_register(&comp_module_##adapter##_info); \
90DECLARE_MODULE(sys_comp_module_##adapter##_init)
148 struct comp_data_blob_handler *
bhp;
178#define SOF_MODULE_API_PRIVATE
180#include <module/module/base.h>
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);
191#define mod_balloc_align z_impl_mod_balloc_align
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,
198__syscall
int mod_free(
struct processing_module *mod,
const void *ptr);
199__syscall
void 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
219static inline void *
mod_alloc_align(
struct processing_module *mod,
size_t size,
size_t alignment)
224static inline void *
mod_balloc(
struct processing_module *mod,
size_t size)
229static inline void *
mod_alloc(
struct processing_module *mod,
size_t size)
234static inline void *
mod_zalloc(
struct processing_module *mod,
size_t size)
239 memset(ret, 0, size);
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);
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
251void mod_data_blob_handler_free(
struct processing_module *mod,
struct comp_data_blob_handler *dbh);
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,
258const void *z_impl_mod_fast_get(
struct processing_module *mod,
const void *
const dram_ptr,
260#define mod_fast_get z_impl_mod_fast_get
262void mod_fast_put(
struct processing_module *mod,
const void *sram_ptr);
265 struct sof_source **sources,
int num_of_sources,
266 struct sof_sink **sinks,
int num_of_sinks);
270 struct sof_source **sources,
272 struct sof_sink **sinks,
277 for (i = 0; i < num_of_sources; i++)
278 if (source_get_data_available(sources[i]) < source_get_min_available(sources[i]))
281 for (i = 0; i < num_of_sinks; i++)
282 if (sink_get_free_size(sinks[i]) < sink_get_min_free_space(sinks[i]))
290 struct sof_source **sources,
292 struct sof_sink **sinks,
295 const struct module_interface *
const ops = mod->dev->drv->adapter_ops;
301 if (ops->is_ready_to_process)
302 return ops->is_ready_to_process(mod, sources, num_of_sources, sinks, num_of_sinks);
311 struct sof_source **sources,
int num_of_sources,
312 struct sof_sink **sinks,
int num_of_sinks);
314 struct input_stream_buffer *input_buffers,
int num_input_buffers,
315 struct output_stream_buffer *output_buffers,
316 int num_output_buffers);
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);
329struct userspace_context;
332 void *mod_priv,
struct userspace_context *user_ctx,
333 const struct module_interface *ops);
344#if CONFIG_IPC_MAJOR_3
359 bool last_block, uint32_t data_offset,
const char *
data)
366 bool last_block, uint32_t *data_offset,
char *
data)
385 uint32_t stream_no,
bool input)
391 struct input_stream_buffer *input_buffers,
392 int num_input_buffers,
393 struct output_stream_buffer *output_buffers,
394 int num_output_buffers)
397 output_buffers, num_output_buffers);
402 bool last_block, uint32_t data_offset,
const char *
data);
404 bool last_block, uint32_t *data_offset,
char *
data);
410 uint32_t stream_no,
bool input);
413 struct input_stream_buffer *input_buffers,
414 int num_input_buffers,
415 struct output_stream_buffer *output_buffers,
416 int num_output_buffers)
418 const struct module_interface *
const ops = mod->dev->drv->adapter_ops;
420 return ops->process_audio_stream(mod, input_buffers, num_input_buffers,
421 output_buffers, num_output_buffers);
432#if CONFIG_ZEPHYR_NATIVE_DRIVERS
439 struct output_stream_buffer *output_buffers,
441struct module_ext_init_data;
442#if CONFIG_IPC_MAJOR_4
454 struct module_config *dst,
486 return mod->dev->period;
489#if defined(__ZEPHYR__) && defined(CONFIG_SOF_FULL_ZEPHYR_APPLICATION)
490#include <zephyr/syscalls/generic.h>
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
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
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
char value[]
Definition tlv.h:2
uint32_t type
Definition tlv.h:0