diff --git a/posix/include/rtos/alloc.h b/posix/include/rtos/alloc.h index b8efac0d3112..6b690ecbc895 100644 --- a/posix/include/rtos/alloc.h +++ b/posix/include/rtos/alloc.h @@ -140,7 +140,6 @@ static inline void k_heap_init(struct k_heap *heap, void *mem, size_t bytes) void *sof_heap_alloc(struct k_heap *heap, uint32_t flags, size_t bytes, size_t alignment); void sof_heap_free(struct k_heap *heap, void *addr); -struct k_heap *sof_sys_heap_get(void); /** * Calculates length of the null-terminated string. diff --git a/src/audio/module_adapter/module/generic.c b/src/audio/module_adapter/module/generic.c index f9bf5d52bef3..d2b86bb40d08 100644 --- a/src/audio/module_adapter/module/generic.c +++ b/src/audio/module_adapter/module/generic.c @@ -12,8 +12,6 @@ */ #include -#include -#include #include #include #include @@ -83,10 +81,10 @@ int module_load_config(struct comp_dev *dev, const void *cfg, size_t size) void mod_resource_init(struct processing_module *mod) { struct module_data *md = &mod->priv; - /* Init memory list */ - list_init(&md->resources.objpool.list); - md->resources.objpool.heap = md->resources.heap; + list_init(&md->resources.res_list); + list_init(&md->resources.free_cont_list); + list_init(&md->resources.cont_chunk_list); md->resources.heap_usage = 0; md->resources.heap_high_water_mark = 0; } @@ -143,14 +141,43 @@ int module_init(struct processing_module *mod) return 0; } +struct container_chunk { + struct list_item chunk_list; + struct module_resource containers[CONFIG_MODULE_MEMORY_API_CONTAINER_CHUNK_SIZE]; +}; + static struct module_resource *container_get(struct processing_module *mod) { - return objpool_alloc(&mod->priv.resources.objpool, sizeof(struct module_resource), 0); + struct module_resources *res = &mod->priv.resources; + struct k_heap *mod_heap = res->heap; + struct module_resource *container; + + if (list_is_empty(&res->free_cont_list)) { + struct container_chunk *chunk = sof_heap_alloc(mod_heap, 0, sizeof(*chunk), 0); + int i; + + if (!chunk) { + comp_err(mod->dev, "allocating more containers failed"); + return NULL; + } + + memset(chunk, 0, sizeof(*chunk)); + + list_item_append(&chunk->chunk_list, &res->cont_chunk_list); + for (i = 0; i < ARRAY_SIZE(chunk->containers); i++) + list_item_append(&chunk->containers[i].list, &res->free_cont_list); + } + + container = list_first_item(&res->free_cont_list, struct module_resource, list); + list_item_del(&container->list); + return container; } static void container_put(struct processing_module *mod, struct module_resource *container) { - objpool_free(&mod->priv.resources.objpool, container); + struct module_resources *res = &mod->priv.resources; + + list_item_append(&container->list, &res->free_cont_list); } #if CONFIG_USERSPACE @@ -208,6 +235,7 @@ void *mod_balloc_align(struct processing_module *mod, size_t size, size_t alignm container->ptr = ptr; container->size = size; container->type = MOD_RES_HEAP; + list_item_prepend(&container->list, &res->res_list); res->heap_usage += size; if (res->heap_usage > res->heap_high_water_mark) @@ -258,6 +286,7 @@ void *z_impl_mod_alloc_ext(struct processing_module *mod, uint32_t flags, size_t container->ptr = ptr; container->size = size; container->type = MOD_RES_HEAP; + list_item_prepend(&container->list, &res->res_list); res->heap_usage += size; if (res->heap_usage > res->heap_high_water_mark) @@ -277,7 +306,7 @@ EXPORT_SYMBOL(z_impl_mod_alloc_ext); #if CONFIG_COMP_BLOB struct comp_data_blob_handler *mod_data_blob_handler_new(struct processing_module *mod) { - struct module_resources * __maybe_unused res = &mod->priv.resources; + struct module_resources *res = &mod->priv.resources; struct comp_data_blob_handler *bhp; struct module_resource *container; @@ -296,6 +325,7 @@ struct comp_data_blob_handler *mod_data_blob_handler_new(struct processing_modul container->bhp = bhp; container->size = 0; container->type = MOD_RES_BLOB_HANDLER; + list_item_prepend(&container->list, &res->res_list); return bhp; } @@ -332,6 +362,7 @@ const void *z_impl_mod_fast_get(struct processing_module *mod, const void * cons container->sram_ptr = ptr; container->size = 0; container->type = MOD_RES_FAST_GET; + list_item_prepend(&container->list, &res->res_list); return ptr; } @@ -363,29 +394,6 @@ static int free_contents(struct processing_module *mod, struct module_resource * return -EINVAL; } -struct mod_res_cb_arg { - struct processing_module *mod; - const void *ptr; -}; - -static bool mod_res_free(void *data, void *arg) -{ - struct mod_res_cb_arg *cb_arg = arg; - struct module_resource *container = data; - - if (cb_arg->ptr && container->ptr != cb_arg->ptr) - return false; - - int ret = free_contents(cb_arg->mod, container); - - if (ret < 0) - comp_err(cb_arg->mod->dev, "Cannot free allocation %p", cb_arg->ptr); - - container_put(cb_arg->mod, container); - - return true; -} - /** * Frees the memory block removes it from module's book keeping. * @param mod Pointer to module this memory block was allocated for. @@ -394,19 +402,28 @@ static bool mod_res_free(void *data, void *arg) int z_impl_mod_free(struct processing_module *mod, const void *ptr) { struct module_resources *res = &mod->priv.resources; + struct module_resource *container; + struct list_item *res_list; MEM_API_CHECK_THREAD(res); if (!ptr) return 0; - /* Find which container holds this memory */ - struct mod_res_cb_arg cb_arg = {mod, ptr}; - int ret = objpool_iterate(&res->objpool, mod_res_free, &cb_arg); + /* Find which container keeps this memory */ + list_for_item(res_list, &res->res_list) { + container = container_of(res_list, struct module_resource, list); + if (container->ptr == ptr) { + int ret = free_contents(mod, container); + + list_item_del(&container->list); + container_put(mod, container); + return ret; + } + } - if (ret < 0) - comp_err(mod->dev, "error: could not find memory pointed by %p", ptr); + comp_err(mod->dev, "error: could not find memory pointed by %p", ptr); - return ret; + return -EINVAL; } EXPORT_SYMBOL(z_impl_mod_free); @@ -667,14 +684,32 @@ int module_reset(struct processing_module *mod) void mod_free_all(struct processing_module *mod) { struct module_resources *res = &mod->priv.resources; + struct k_heap *mod_heap = res->heap; + struct list_item *list; + struct list_item *_list; MEM_API_CHECK_THREAD(res); - /* Free all contents found in used containers */ - struct mod_res_cb_arg cb_arg = {mod, NULL}; + list_for_item(list, &res->res_list) { + struct module_resource *container = + container_of(list, struct module_resource, list); + + free_contents(mod, container); + } - objpool_iterate(&res->objpool, mod_res_free, &cb_arg); - objpool_prune(&res->objpool); + /* + * We do not need to remove the containers from res_list in + * the loop above or go through free_cont_list as all the + * containers are anyway freed in the loop below, and the list + * heads are reinitialized when mod_resource_init() is called. + */ + list_for_item_safe(list, _list, &res->cont_chunk_list) { + struct container_chunk *chunk = + container_of(list, struct container_chunk, chunk_list); + + list_item_del(&chunk->chunk_list); + sof_heap_free(mod_heap, chunk); + } /* Make sure resource lists and accounting are reset */ mod_resource_init(mod); diff --git a/src/audio/module_adapter/module_adapter_ipc4.c b/src/audio/module_adapter/module_adapter_ipc4.c index a6fab69bbd86..37184a5a5587 100644 --- a/src/audio/module_adapter/module_adapter_ipc4.c +++ b/src/audio/module_adapter/module_adapter_ipc4.c @@ -159,7 +159,8 @@ int module_adapter_init_data(struct comp_dev *dev, } } - if (!config->ipc_extended_init) { + if (!config->ipc_extended_init || + (!dst->ext_data->dp_data && !dst->ext_data->module_data)) { dst->init_data = cfg; /* legacy API */ dst->avail = true; } diff --git a/src/include/sof/audio/component_ext.h b/src/include/sof/audio/component_ext.h index f0a1ad7e8512..d2bbf87a7764 100644 --- a/src/include/sof/audio/component_ext.h +++ b/src/include/sof/audio/component_ext.h @@ -158,9 +158,9 @@ static inline int comp_trigger_local(struct comp_dev *dev, int cmd) /* schedule or cancel task */ switch (cmd) { case COMP_TRIGGER_START: - case COMP_TRIGGER_RELEASE: ret = schedule_task(dev->task, 0, dev->period); break; + case COMP_TRIGGER_RELEASE: case COMP_TRIGGER_XRUN: case COMP_TRIGGER_PAUSE: case COMP_TRIGGER_STOP: diff --git a/src/include/sof/audio/module_adapter/module/generic.h b/src/include/sof/audio/module_adapter/module/generic.h index 3334c198b7f3..f23bb602a28e 100644 --- a/src/include/sof/audio/module_adapter/module/generic.h +++ b/src/include/sof/audio/module_adapter/module/generic.h @@ -13,9 +13,8 @@ #ifndef __SOF_AUDIO_MODULE_GENERIC__ #define __SOF_AUDIO_MODULE_GENERIC__ -#include -#include #include +#include #include #include #include "module_interface.h" @@ -129,7 +128,9 @@ struct module_param { * when the module unloads. */ struct module_resources { - struct objpool_head objpool; + struct list_item res_list; /**< Allocad resource containers */ + struct list_item free_cont_list; /**< Unused memory containers */ + struct list_item cont_chunk_list; /**< Memory container chunks */ size_t heap_usage; size_t heap_high_water_mark; struct k_heap *heap; diff --git a/src/lib/objpool.c b/src/lib/objpool.c index 76a5b20a6594..e99825f0ccfa 100644 --- a/src/lib/objpool.c +++ b/src/lib/objpool.c @@ -94,6 +94,7 @@ void *objpool_alloc(struct objpool_head *head, size_t size, uint32_t flags) unsigned int new_n; if (list_is_empty(&head->list)) { + head->flags = flags; new_n = 2; } else { /* Check the last one */ diff --git a/src/platform/library/lib/alloc.c b/src/platform/library/lib/alloc.c index 74cb926e4aff..d733b58f8541 100644 --- a/src/platform/library/lib/alloc.c +++ b/src/platform/library/lib/alloc.c @@ -70,8 +70,3 @@ void heap_trace_all(int force) { heap_trace(NULL, 0); } - -struct k_heap *sof_sys_heap_get(void) -{ - return NULL; -} diff --git a/src/schedule/zephyr_dp_schedule.h b/src/schedule/zephyr_dp_schedule.h index 8c0557ced7fc..2df6f2a83f62 100644 --- a/src/schedule/zephyr_dp_schedule.h +++ b/src/schedule/zephyr_dp_schedule.h @@ -25,7 +25,9 @@ struct scheduler_dp_data { enum sof_dp_part_type { SOF_DP_PART_HEAP, + SOF_DP_PART_HEAP_CACHE, SOF_DP_PART_CFG, + SOF_DP_PART_CFG_CACHE, SOF_DP_PART_TYPE_COUNT, }; diff --git a/src/schedule/zephyr_dp_schedule_application.c b/src/schedule/zephyr_dp_schedule_application.c index 521c32b4af1d..3c063559a9a6 100644 --- a/src/schedule/zephyr_dp_schedule_application.c +++ b/src/schedule/zephyr_dp_schedule_application.c @@ -391,7 +391,9 @@ static void scheduler_dp_domain_free(struct task_dp_pdata *pdata) llext_manager_rm_domain(pmod->dev->ipc_config.id, mdom); k_mem_domain_remove_partition(mdom, pdata->mpart + SOF_DP_PART_HEAP); + k_mem_domain_remove_partition(mdom, pdata->mpart + SOF_DP_PART_HEAP_CACHE); k_mem_domain_remove_partition(mdom, pdata->mpart + SOF_DP_PART_CFG); + k_mem_domain_remove_partition(mdom, pdata->mpart + SOF_DP_PART_CFG_CACHE); pmod->mdom = NULL; objpool_free(&dp_mdom_head, mdom); @@ -516,8 +518,11 @@ int scheduler_dp_task_init(struct task **task, const struct sof_uuid_entry *uid, struct k_mem_domain *mdom = objpool_alloc(&dp_mdom_head, sizeof(*mdom), SOF_MEM_FLAG_COHERENT); - if (!mdom) + if (!mdom) { + tr_err(&dp_tr, "objpool allocation failed"); + ret = -ENOMEM; goto e_thread; + } mod->mdom = mdom; @@ -534,12 +539,22 @@ int scheduler_dp_task_init(struct task **task, const struct sof_uuid_entry *uid, .size = size, .attr = K_MEM_PARTITION_P_RW_U_RW, }; + pdata->mpart[SOF_DP_PART_HEAP_CACHE] = (struct k_mem_partition){ + .start = (uintptr_t)sys_cache_cached_ptr_get((void *)start), + .size = size, + .attr = K_MEM_PARTITION_P_RW_U_RW | XTENSA_MMU_CACHED_WB, + }; /* Host mailbox partition for additional IPC parameters: read-only */ pdata->mpart[SOF_DP_PART_CFG] = (struct k_mem_partition){ - .start = (uintptr_t)MAILBOX_HOSTBOX_BASE, + .start = (uintptr_t)sys_cache_uncached_ptr_get((void *)MAILBOX_HOSTBOX_BASE), .size = 4096, .attr = K_MEM_PARTITION_P_RO_U_RO, }; + pdata->mpart[SOF_DP_PART_CFG_CACHE] = (struct k_mem_partition){ + .start = (uintptr_t)MAILBOX_HOSTBOX_BASE, + .size = 4096, + .attr = K_MEM_PARTITION_P_RO_U_RO | XTENSA_MMU_CACHED_WB, + }; for (pidx = 0; pidx < SOF_DP_PART_TYPE_COUNT; pidx++) { ret = k_mem_domain_add_partition(mdom, pdata->mpart + pidx); diff --git a/test/cmocka/src/audio/eq_fir/CMakeLists.txt b/test/cmocka/src/audio/eq_fir/CMakeLists.txt index 226128b220d2..305a6846966c 100644 --- a/test/cmocka/src/audio/eq_fir/CMakeLists.txt +++ b/test/cmocka/src/audio/eq_fir/CMakeLists.txt @@ -37,7 +37,6 @@ add_library(audio_for_eq_fir STATIC ${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c - ${PROJECT_SOURCE_DIR}/src/lib/objpool.c ${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c ${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-graph.c ${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-params.c diff --git a/test/cmocka/src/audio/eq_iir/CMakeLists.txt b/test/cmocka/src/audio/eq_iir/CMakeLists.txt index b5ff8770eec2..aa704a1af92b 100644 --- a/test/cmocka/src/audio/eq_iir/CMakeLists.txt +++ b/test/cmocka/src/audio/eq_iir/CMakeLists.txt @@ -40,7 +40,6 @@ add_library(audio_for_eq_iir STATIC ${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c - ${PROJECT_SOURCE_DIR}/src/lib/objpool.c ${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c ${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-graph.c ${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-params.c diff --git a/test/cmocka/src/audio/mixer/CMakeLists.txt b/test/cmocka/src/audio/mixer/CMakeLists.txt index c0dbb8a0a4fc..ea8cad0bd79e 100644 --- a/test/cmocka/src/audio/mixer/CMakeLists.txt +++ b/test/cmocka/src/audio/mixer/CMakeLists.txt @@ -10,7 +10,6 @@ cmocka_test(mixer ${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c - ${PROJECT_SOURCE_DIR}/src/lib/objpool.c ${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter.c ${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter_ipc3.c ${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module/generic.c diff --git a/test/cmocka/src/audio/mux/CMakeLists.txt b/test/cmocka/src/audio/mux/CMakeLists.txt index a4a72613fd6b..67b10f77270d 100644 --- a/test/cmocka/src/audio/mux/CMakeLists.txt +++ b/test/cmocka/src/audio/mux/CMakeLists.txt @@ -25,7 +25,6 @@ add_library( ${PROJECT_SOURCE_DIR}/src/math/numbers.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c - ${PROJECT_SOURCE_DIR}/src/lib/objpool.c ${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c ${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter.c ${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter_ipc3.c diff --git a/test/cmocka/src/audio/volume/CMakeLists.txt b/test/cmocka/src/audio/volume/CMakeLists.txt index 0385441e5878..d89927578222 100644 --- a/test/cmocka/src/audio/volume/CMakeLists.txt +++ b/test/cmocka/src/audio/volume/CMakeLists.txt @@ -34,7 +34,6 @@ add_library(audio_for_volume STATIC ${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c ${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c - ${PROJECT_SOURCE_DIR}/src/lib/objpool.c ${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c ${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-graph.c ${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-params.c diff --git a/test/cmocka/src/common_mocks.c b/test/cmocka/src/common_mocks.c index 60b6215c4cd5..ef996b8f3500 100644 --- a/test/cmocka/src/common_mocks.c +++ b/test/cmocka/src/common_mocks.c @@ -124,11 +124,6 @@ int WEAK mod_free(struct processing_module *mod, const void *ptr) return 0; } -struct k_heap * WEAK sof_sys_heap_get(void) -{ - return NULL; -} - void WEAK *sof_heap_alloc(struct k_heap *heap, uint32_t flags, size_t bytes, size_t alignment) { diff --git a/tools/topology/topology2/development/tplg-targets.cmake b/tools/topology/topology2/development/tplg-targets.cmake index 7986eb2bad11..b382dc1b4bc1 100644 --- a/tools/topology/topology2/development/tplg-targets.cmake +++ b/tools/topology/topology2/development/tplg-targets.cmake @@ -60,9 +60,9 @@ NHLT_BIN=nhlt-sof-lnl-nocodec-fpga-4ch.bin,PASSTHROUGH=true,DMIC_IO_CLK=19200000 # HDA topology with passthrough analog codec pipelines using CHAIN_DMA "sof-hda-generic\;sof-hda-passthrough-chain-dma\;HDA_CONFIG=passthrough,CODEC_HDA_CHAIN_DMA=true" -# SSP topology for PTL +# SSP topology for PTL, includes Data Processing SRC "cavs-nocodec\;sof-ptl-nocodec\;PLATFORM=ptl,NUM_DMICS=4,PDM1_MIC_A_ENABLE=1,PDM1_MIC_B_ENABLE=1,\ -PREPROCESS_PLUGINS=nhlt,NHLT_BIN=nhlt-sof-ptl-nocodec.bin" +PREPROCESS_PLUGINS=nhlt,NHLT_BIN=nhlt-sof-ptl-nocodec.bin,SRC_DOMAIN=DP" # SSP topology for PTL with 96 kHz DMIC "cavs-nocodec\;sof-ptl-nocodec-dmic-4ch-96k\;PLATFORM=ptl,NUM_DMICS=4,PDM1_MIC_A_ENABLE=1,PDM1_MIC_B_ENABLE=1,\ @@ -310,9 +310,9 @@ PREPROCESS_PLUGINS=nhlt,NHLT_BIN=nhlt-sof-mtl-nocodec.bin,SRC_DOMAIN=DP" # SSP test topology for Data Processing SRC on LNL "cavs-nocodec\;sof-lnl-nocodec-dp-test\;PLATFORM=lnl,NUM_DMICS=4,PDM1_MIC_A_ENABLE=1,PDM1_MIC_B_ENABLE=1,\ PREPROCESS_PLUGINS=nhlt,NHLT_BIN=nhlt-sof-lnl-nocodec.bin,SRC_DOMAIN=DP" -# SSP test topology for Data Processing SRC on PTL +# SSP test topology for PTL with no DP "cavs-nocodec\;sof-ptl-nocodec-dp-test\;PLATFORM=ptl,NUM_DMICS=4,PDM1_MIC_A_ENABLE=1,PDM1_MIC_B_ENABLE=1,\ -PREPROCESS_PLUGINS=nhlt,NHLT_BIN=nhlt-sof-ptl-nocodec.bin,SRC_DOMAIN=DP" +PREPROCESS_PLUGINS=nhlt,NHLT_BIN=nhlt-sof-ptl-nocodec.bin" # SSP test topology for Data Processing on core 1 SRC for MTL "cavs-nocodec\;sof-mtl-nocodec-dp-core-test\;PLATFORM=mtl,NUM_DMICS=4,PDM1_MIC_A_ENABLE=1,PDM1_MIC_B_ENABLE=1,\ diff --git a/zephyr/lib/alloc.c b/zephyr/lib/alloc.c index f95f66fbdb7f..8a2fed79ee41 100644 --- a/zephyr/lib/alloc.c +++ b/zephyr/lib/alloc.c @@ -9,10 +9,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include