From b6c308df3e1677b25bea3d5e4a6bb38239377d38 Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Wed, 21 Feb 2024 16:10:38 +0100 Subject: [PATCH 1/5] modules: Remove unnecessary functions from Processing Module Adapter To ensure proper operation of native loadable modules it is necessary to bypass Processing Module Adapter used by IADK modules. This is currently done by overriding the pointer to module_interface used by the Module Adapter. Thanks to this, the Module Adapter directly calls functions provided by native module. As in this case the Processing Module Adapter functions are omitted, support for native libraries are removed from it as it is no longer needed. This leads to remove modules_process_raw and modules_process_audio_stream functions. Signed-off-by: Adrian Warecki --- src/audio/module_adapter/module/modules.c | 46 +++++------------------ 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index 832a0ca8b761..0177f2b277f6 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -199,34 +199,11 @@ static int modules_prepare(struct processing_module *mod, struct sof_sink **sinks, int num_of_sinks) { struct comp_dev *dev = mod->dev; - const struct comp_driver *const drv = dev->drv; - int ret = 0; comp_info(dev, "modules_prepare()"); - /* Call module specific prepare function if exists. */ - if (mod->is_native_sof) { - const struct module_interface *mod_in = drv->adapter_ops; - - ret = mod_in->prepare(mod, sources, num_of_sources, sinks, num_of_sinks); - } else { - ret = iadk_wrapper_prepare(mod->priv.module_adapter); - } - return ret; -} - -static int modules_init_process(struct processing_module *mod) -{ - struct module_data *codec = &mod->priv; - struct comp_dev *dev = mod->dev; - - comp_dbg(dev, "modules_init_process()"); + return iadk_wrapper_prepare(mod->priv.module_adapter); - codec->mpd.produced = 0; - codec->mpd.consumed = 0; - codec->mpd.init_done = 1; - - return 0; } static int modules_process(struct processing_module *mod, @@ -237,7 +214,7 @@ static int modules_process(struct processing_module *mod, return iadk_wrapper_process(mod->priv.module_adapter, sources, num_of_sources, sinks, num_of_sinks); - const struct module_interface *const mod_in = mod->dev->drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; return mod_in->process(mod, sources, num_of_sources, sinks, num_of_sinks); } @@ -251,7 +228,7 @@ static int modules_process_audio_stream(struct processing_module *mod, if (!mod->is_native_sof) return -EOPNOTSUPP; - const struct module_interface *const mod_in = mod->dev->drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; return mod_in->process_audio_stream(mod, input_buffers, num_input_buffers, output_buffers, num_output_buffers); @@ -279,7 +256,7 @@ static int modules_process_raw(struct processing_module *mod, modules_init_process(mod); /* Call module specific process function. */ - const struct module_interface *const mod_in = mod->dev->drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; return mod_in->process_raw_data(mod, input_buffers, num_input_buffers, output_buffers, num_output_buffers); @@ -301,16 +278,13 @@ static int modules_free(struct processing_module *mod) comp_info(dev, "modules_free()"); if (mod->is_native_sof) { - const struct module_interface *mod_in = drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; ret = mod_in->free(mod); } else { ret = iadk_wrapper_free(mod->priv.module_adapter); } - if (ret < 0) - comp_err(dev, "Failed to free a module: %d", ret); - rfree(md->mpd.in_buff); rfree(md->mpd.out_buff); @@ -346,7 +320,7 @@ static int modules_set_configuration(struct processing_module *mod, uint32_t con size_t response_size) { if (mod->is_native_sof) { - const struct module_interface *const mod_in = mod->dev->drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; return mod_in->set_configuration(mod, config_id, pos, data_offset_size, fragment, fragment_size, response, response_size); @@ -373,7 +347,7 @@ static int modules_get_configuration(struct processing_module *mod, uint32_t con size_t fragment_size) { if (mod->is_native_sof) { - const struct module_interface *const mod_in = mod->dev->drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; return mod_in->get_configuration(mod, config_id, data_offset_size, fragment, fragment_size); @@ -394,7 +368,7 @@ static int modules_set_processing_mode(struct processing_module *mod, enum module_processing_mode mode) { if (mod->is_native_sof) { - const struct module_interface *const mod_in = mod->dev->drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; return mod_in->set_processing_mode(mod, mode); } @@ -422,7 +396,7 @@ static enum module_processing_mode modules_get_processing_mode(struct processing static int modules_reset(struct processing_module *mod) { if (mod->is_native_sof) { - const struct module_interface *const mod_in = mod->dev->drv->adapter_ops; + const struct module_interface *mod_in = mod->priv.ops; return mod_in->reset(mod); } @@ -433,9 +407,7 @@ static int modules_reset(struct processing_module *mod) const struct module_interface processing_module_adapter_interface = { .init = modules_init, .prepare = modules_prepare, - .process_raw_data = modules_process_raw, .process = modules_process, - .process_audio_stream = modules_process_audio_stream, .set_processing_mode = modules_set_processing_mode, .get_processing_mode = modules_get_processing_mode, .set_configuration = modules_set_configuration, From febf36694b3e71baecd196c7c91a243b5963909a Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Thu, 22 Feb 2024 14:34:30 +0100 Subject: [PATCH 2/5] modules: Remove unused buffers The code allocating/freeing in_buff and out_buff buffers, which were not used, was removed from the processing module adapter. Signed-off-by: Adrian Warecki --- src/audio/module_adapter/module/modules.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index 0177f2b277f6..60b4bef7f3d5 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -144,20 +144,7 @@ static int modules_init(struct processing_module *mod) return ret; } - /* Allocate module buffers */ - md->mpd.in_buff = rballoc(0, SOF_MEM_CAPS_RAM, src_cfg->ibs); - if (!md->mpd.in_buff) { - comp_err(dev, "modules_init(): Failed to alloc in_buff"); - return -ENOMEM; - } md->mpd.in_buff_size = src_cfg->ibs; - - md->mpd.out_buff = rballoc(0, SOF_MEM_CAPS_RAM, src_cfg->obs); - if (!md->mpd.out_buff) { - comp_err(dev, "modules_init(): Failed to alloc out_buff"); - rfree(md->mpd.in_buff); - return -ENOMEM; - } md->mpd.out_buff_size = src_cfg->obs; /* Call module specific init function if exists. */ @@ -285,8 +272,6 @@ static int modules_free(struct processing_module *mod) ret = iadk_wrapper_free(mod->priv.module_adapter); } - rfree(md->mpd.in_buff); - rfree(md->mpd.out_buff); if (!md->llext || !llext_unload(&md->llext)) { /* Free module resources allocated in L2 memory. */ From d1549cb1033f473be554423b26ff1412b8bba238 Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Tue, 27 Feb 2024 16:01:55 +0100 Subject: [PATCH 3/5] module/base: modules: Remove module_adapter from module_data The value stored by the Processing Module Adapter in the module_adapter field of module_data structure has been moved to an unused private field. This change allowed the module_adapter field to be removed. Signed-off-by: Adrian Warecki --- src/audio/module_adapter/module/modules.c | 112 ++++------------------ src/include/module/module/base.h | 1 - 2 files changed, 19 insertions(+), 94 deletions(-) diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index 60b4bef7f3d5..63b8e07c5430 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -63,6 +63,7 @@ static int modules_new(struct processing_module *mod, const void *buildinfo, /* Connect loadable module interfaces with module adapter entity. */ /* Check if native Zephyr lib is loaded */ struct sof_man_fw_desc *desc = lib_manager_get_library_module_desc(module_id); + void *system_agent; if (!desc) { comp_err(dev, "modules_init(): Failed to load manifest"); @@ -91,9 +92,10 @@ static int modules_new(struct processing_module *mod, const void *buildinfo, /* Check if module is FDK */ if (mod_buildinfo->format == IADK_MODULE_API_BUILD_INFO_FORMAT && mod_buildinfo->api_version_number.full == IADK_MODULE_API_CURRENT_VERSION) { - md->module_adapter = (void *)system_agent_start(module_entry_point, - module_id, instance_id, - 0, log_handle, &mod_cfg); + system_agent = system_agent_start(module_entry_point, module_id, instance_id, 0, + log_handle, &mod_cfg); + + module_set_private_data(mod, system_agent); } else if (mod_buildinfo->format == SOF_MODULE_API_BUILD_INFO_FORMAT && mod_buildinfo->api_version_number.full == SOF_MODULE_API_CURRENT_VERSION) { /* The module is native: start agent for sof loadable */ @@ -106,7 +108,6 @@ static int modules_new(struct processing_module *mod, const void *buildinfo, } md->module_entry_point = module_entry_point; - md->private = mod; return 0; } @@ -137,7 +138,8 @@ static int modules_init(struct processing_module *mod) } comp_info(dev, "modules_init() start"); - if (!md->module_adapter && drv->adapter_ops == &processing_module_adapter_interface) { + if (!module_get_private_data(mod) && + drv->adapter_ops == &processing_module_adapter_interface) { /* First load */ ret = modules_new(mod, buildinfo, module_entry_point); if (ret < 0) @@ -164,7 +166,7 @@ static int modules_init(struct processing_module *mod) ret = mod_in->init(mod); } else { mod->proc_type = MODULE_PROCESS_TYPE_SOURCE_SINK; - ret = iadk_wrapper_init(md->module_adapter); + ret = iadk_wrapper_init(module_get_private_data(mod)); } return ret; @@ -189,64 +191,15 @@ static int modules_prepare(struct processing_module *mod, comp_info(dev, "modules_prepare()"); - return iadk_wrapper_prepare(mod->priv.module_adapter); - + return iadk_wrapper_prepare(module_get_private_data(mod)); } static int modules_process(struct processing_module *mod, struct sof_source **sources, int num_of_sources, struct sof_sink **sinks, int num_of_sinks) { - if (!mod->is_native_sof) - return iadk_wrapper_process(mod->priv.module_adapter, sources, - num_of_sources, sinks, num_of_sinks); - - const struct module_interface *mod_in = mod->priv.ops; - - return mod_in->process(mod, sources, num_of_sources, sinks, num_of_sinks); -} - -static int modules_process_audio_stream(struct processing_module *mod, - struct input_stream_buffer *input_buffers, - int num_input_buffers, - struct output_stream_buffer *output_buffers, - int num_output_buffers) -{ - if (!mod->is_native_sof) - return -EOPNOTSUPP; - - const struct module_interface *mod_in = mod->priv.ops; - - return mod_in->process_audio_stream(mod, input_buffers, num_input_buffers, - output_buffers, num_output_buffers); -} - -/* - * \brief modules_process_raw. - * \param[in] mod - processing module pointer. - * - * \return: zero on success - * error code on failure - */ -static int modules_process_raw(struct processing_module *mod, - struct input_stream_buffer *input_buffers, - int num_input_buffers, - struct output_stream_buffer *output_buffers, - int num_output_buffers) -{ - struct module_data *md = &mod->priv; - - if (!mod->is_native_sof) - return -EOPNOTSUPP; - - if (!md->mpd.init_done) - modules_init_process(mod); - - /* Call module specific process function. */ - const struct module_interface *mod_in = mod->priv.ops; - - return mod_in->process_raw_data(mod, input_buffers, num_input_buffers, - output_buffers, num_output_buffers); + return iadk_wrapper_process(module_get_private_data(mod), sources, + num_of_sources, sinks, num_of_sinks); } /** @@ -260,17 +213,12 @@ static int modules_free(struct processing_module *mod) { struct comp_dev *dev = mod->dev; struct module_data *md = &mod->priv; - const struct comp_driver *const drv = dev->drv; int ret; comp_info(dev, "modules_free()"); - if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; - - ret = mod_in->free(mod); - } else { - ret = iadk_wrapper_free(mod->priv.module_adapter); - } + ret = iadk_wrapper_free(module_get_private_data(mod)); + if (ret) + comp_err(dev, "modules_free(): iadk_wrapper_free failed with error: %d", ret); if (!md->llext || !llext_unload(&md->llext)) { @@ -304,13 +252,7 @@ static int modules_set_configuration(struct processing_module *mod, uint32_t con size_t fragment_size, uint8_t *response, size_t response_size) { - if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; - - return mod_in->set_configuration(mod, config_id, pos, data_offset_size, fragment, - fragment_size, response, response_size); - } - return iadk_wrapper_set_configuration(mod->priv.module_adapter, config_id, pos, + return iadk_wrapper_set_configuration(module_get_private_data(mod), config_id, pos, data_offset_size, fragment, fragment_size, response, response_size); } @@ -331,13 +273,7 @@ static int modules_get_configuration(struct processing_module *mod, uint32_t con uint32_t *data_offset_size, uint8_t *fragment, size_t fragment_size) { - if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; - - return mod_in->get_configuration(mod, config_id, data_offset_size, - fragment, fragment_size); - } - return iadk_wrapper_get_configuration(mod->priv.module_adapter, config_id, + return iadk_wrapper_get_configuration(module_get_private_data(mod), config_id, MODULE_CFG_FRAGMENT_SINGLE, *data_offset_size, fragment, fragment_size); } @@ -352,12 +288,7 @@ static int modules_get_configuration(struct processing_module *mod, uint32_t con static int modules_set_processing_mode(struct processing_module *mod, enum module_processing_mode mode) { - if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; - - return mod_in->set_processing_mode(mod, mode); - } - return iadk_wrapper_set_processing_mode(mod->priv.module_adapter, mode); + return iadk_wrapper_set_processing_mode(module_get_private_data(mod), mode); } /** @@ -368,7 +299,7 @@ static int modules_set_processing_mode(struct processing_module *mod, */ static enum module_processing_mode modules_get_processing_mode(struct processing_module *mod) { - return iadk_wrapper_get_processing_mode(mod->priv.module_adapter); + return iadk_wrapper_get_processing_mode(module_get_private_data(mod)); } /** @@ -380,12 +311,7 @@ static enum module_processing_mode modules_get_processing_mode(struct processing */ static int modules_reset(struct processing_module *mod) { - if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; - - return mod_in->reset(mod); - } - return iadk_wrapper_reset(mod->priv.module_adapter); + return iadk_wrapper_reset(module_get_private_data(mod)); } /* Processing Module Adapter API*/ diff --git a/src/include/module/module/base.h b/src/include/module/module/base.h index e16a1f737fc3..1f1e3d2a14bb 100644 --- a/src/include/module/module/base.h +++ b/src/include/module/module/base.h @@ -60,7 +60,6 @@ struct module_data { void *runtime_params; struct module_memory memory; /**< memory allocated by module */ struct module_processing_data mpd; /**< shared data comp <-> module */ - void *module_adapter; /** Date: Thu, 29 Feb 2024 12:56:13 +0100 Subject: [PATCH 4/5] module_adapter: modules: Remove unused sys_service pointer The unused sys_service field has been removed from the processing_module structure. It was never initialized anywhere, and its value was passed as a parameter to the native_system_agent_start function which did not use it. Signed-off-by: Adrian Warecki --- src/audio/module_adapter/library/native_system_agent.c | 6 ++---- src/audio/module_adapter/module/modules.c | 5 ++--- src/include/module/module/base.h | 3 --- .../sof/audio/module_adapter/library/native_system_agent.h | 3 +-- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/audio/module_adapter/library/native_system_agent.c b/src/audio/module_adapter/library/native_system_agent.c index 58c24fadf31a..9704da50739e 100644 --- a/src/audio/module_adapter/library/native_system_agent.c +++ b/src/audio/module_adapter/library/native_system_agent.c @@ -19,10 +19,8 @@ typedef void* (*native_create_instance_f)(void *mod_cfg, void *parent_ppl, struct native_system_agent native_sys_agent; -void *native_system_agent_start(uint32_t *sys_service, - uint32_t entry_point, uint32_t module_id, - uint32_t instance_id, uint32_t core_id, uint32_t log_handle, - void *mod_cfg) +void *native_system_agent_start(uint32_t entry_point, uint32_t module_id, uint32_t instance_id, + uint32_t core_id, uint32_t log_handle, void *mod_cfg) { native_sys_agent.module_id = module_id; native_sys_agent.instance_id = instance_id; diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index 63b8e07c5430..3d4445993b79 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -100,9 +100,8 @@ static int modules_new(struct processing_module *mod, const void *buildinfo, mod_buildinfo->api_version_number.full == SOF_MODULE_API_CURRENT_VERSION) { /* The module is native: start agent for sof loadable */ mod->is_native_sof = true; - drv->adapter_ops = native_system_agent_start(mod->sys_service, module_entry_point, - module_id, instance_id, - 0, log_handle, &mod_cfg); + drv->adapter_ops = native_system_agent_start(module_entry_point, module_id, + instance_id, 0, log_handle, &mod_cfg); } else { return -ENOEXEC; } diff --git a/src/include/module/module/base.h b/src/include/module/module/base.h index 1f1e3d2a14bb..43765c1da3db 100644 --- a/src/include/module/module/base.h +++ b/src/include/module/module/base.h @@ -183,9 +183,6 @@ struct processing_module { /* flag to insure that module is loadable */ bool is_native_sof; - /* pointer to system services for loadable modules */ - uint32_t *sys_service; - /* total processed data after stream started */ uint64_t total_data_consumed; uint64_t total_data_produced; diff --git a/src/include/sof/audio/module_adapter/library/native_system_agent.h b/src/include/sof/audio/module_adapter/library/native_system_agent.h index 58def6ec67b6..6563ef026975 100644 --- a/src/include/sof/audio/module_adapter/library/native_system_agent.h +++ b/src/include/sof/audio/module_adapter/library/native_system_agent.h @@ -20,8 +20,7 @@ struct native_system_agent { uint32_t module_size; }; -void *native_system_agent_start(uint32_t *sys_service, - uint32_t entry_point, uint32_t module_id, uint32_t instance_id, +void *native_system_agent_start(uint32_t entry_point, uint32_t module_id, uint32_t instance_id, uint32_t core_id, uint32_t log_handle, void *mod_cfg); #endif /* __NATIVE_SYSTEM_AGENT_H__ */ From d5fe8be8d9cfdbbce3f1dd7b9576188ebca6bee8 Mon Sep 17 00:00:00 2001 From: Adrian Warecki Date: Thu, 29 Feb 2024 13:11:35 +0100 Subject: [PATCH 5/5] modules: Remove unused module_entry_point from module_data The value assigned to the module_entry_point field in the module_data structure wasn't used anywhere. This field has been removed. Signed-off-by: Adrian Warecki --- src/audio/module_adapter/module/modules.c | 2 -- src/include/module/module/base.h | 1 - 2 files changed, 3 deletions(-) diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index 3d4445993b79..1e5ef912f0f4 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -106,8 +106,6 @@ static int modules_new(struct processing_module *mod, const void *buildinfo, return -ENOEXEC; } - md->module_entry_point = module_entry_point; - return 0; } diff --git a/src/include/module/module/base.h b/src/include/module/module/base.h index 43765c1da3db..a57c433dc5c3 100644 --- a/src/include/module/module/base.h +++ b/src/include/module/module/base.h @@ -60,7 +60,6 @@ struct module_data { void *runtime_params; struct module_memory memory; /**< memory allocated by module */ struct module_processing_data mpd; /**< shared data comp <-> module */ - uintptr_t module_entry_point; /**