From 1dc6a2836dff13115ac30a150c1616c0a91806e6 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Thu, 29 Jun 2023 18:49:37 +0300 Subject: [PATCH] lib-manager: clean up memory allocations and cache handling. Update the memory allocation and cache handling. Allocate comp_driver and comp_driver_info as uncached to align with other drivers. Signed-off-by: Guennadi Liakhovetski --- src/library_manager/lib_manager.c | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/library_manager/lib_manager.c b/src/library_manager/lib_manager.c index 377c8cec7..5700338a7 100644 --- a/src/library_manager/lib_manager.c +++ b/src/library_manager/lib_manager.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -332,17 +333,16 @@ static void lib_manager_update_sof_ctx(struct sof_man_fw_desc *desc, uint32_t li int lib_manager_register_module(struct sof_man_fw_desc *desc, int module_id) { + uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); /* allocate new comp_driver_info */ struct comp_driver_info *new_drv_info; struct comp_driver *drv = NULL; struct sof_man_module *mod; int ret; - uint32_t align = 4; - uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id); - - new_drv_info = rballoc_align(0, SOF_MEM_CAPS_RAM, - sizeof(struct comp_driver_info), align); + new_drv_info = rmalloc(SOF_MEM_ZONE_RUNTIME_SHARED, 0, + SOF_MEM_CAPS_RAM | SOF_MEM_FLAG_COHERENT, + sizeof(struct comp_driver_info)); if (!new_drv_info) { tr_err(&lib_manager_tr, "lib_manager_register_module(): alloc failed"); @@ -350,8 +350,9 @@ int lib_manager_register_module(struct sof_man_fw_desc *desc, int module_id) goto cleanup; } - drv = rballoc_align(0, SOF_MEM_CAPS_RAM, - sizeof(struct comp_driver), align); + drv = rmalloc(SOF_MEM_ZONE_RUNTIME_SHARED, 0, + SOF_MEM_CAPS_RAM | SOF_MEM_FLAG_COHERENT, + sizeof(struct comp_driver)); if (!drv) { tr_err(&lib_manager_tr, "lib_manager_register_module(): alloc failed"); ret = -ENOMEM; @@ -400,16 +401,17 @@ static void lib_manager_dma_buffer_update(struct lib_manager_dma_buf *buffer, static int lib_manager_dma_buffer_init(struct lib_manager_dma_buf *buffer, uint32_t size, uint32_t align) { - /* allocate new buffer */ + /* + * allocate new buffer: this is the actual DMA buffer but we + * traditionally allocate a cached address for it + */ buffer->addr = (uintptr_t)rballoc_align(0, SOF_MEM_CAPS_DMA, size, align); - if (!buffer->addr) { tr_err(&lib_manager_tr, "dma_buffer_init(): alloc failed"); return -ENOMEM; } - bzero((void *)buffer->addr, size); - dcache_writeback_region((__sparse_force void __sparse_cache *)buffer->addr, size); + dcache_invalidate_region((void __sparse_cache *)buffer->addr, size); tr_dbg(&lib_manager_tr, "lib_manager_dma_buffer_init(): %#lx, %#lx", buffer->addr, buffer->end_addr); @@ -497,7 +499,6 @@ static int lib_manager_load_data_from_host(struct lib_manager_dma_ext *dma_ext, while (avail_bytes < size) { /* get data sizes from DMA */ ret = dma_get_status(dma_ext->chan->dma->z_dev, dma_ext->chan->index, &stat); - if (ret < 0) return ret; @@ -543,8 +544,6 @@ static int lib_manager_store_data(struct lib_manager_dma_ext *dma_ext, copied_bytes += bytes_to_copy; } - dcache_writeback_region(dst_addr, dst_size); - return 0; } @@ -565,10 +564,13 @@ static void __sparse_cache *lib_manager_allocate_store_mem(uint32_t size, local_add = (__sparse_force void __sparse_cache *)rballoc_align(0, caps, size, addr_align); #endif if (!local_add) { - tr_err(&lib_manager_tr, "dma_buffer_init(): alloc failed"); + tr_err(&lib_manager_tr, "lib_manager_allocate_store_mem(): alloc failed"); return NULL; } + sys_cache_data_invd_range(local_add, size); + sys_cache_instr_invd_range(local_add, size); + return local_add; } @@ -593,8 +595,6 @@ static int lib_manager_store_library(struct lib_manager_dma_ext *dma_ext, memcpy_s((__sparse_force void *)library_base_address, MAN_MAX_SIZE_V1_8, (__sparse_force void *)man_buffer, MAN_MAX_SIZE_V1_8); - dcache_writeback_invalidate_region(library_base_address, MAN_MAX_SIZE_V1_8); - /* Copy remaining library part into storage buffer */ ret = lib_manager_store_data(dma_ext, (uint8_t __sparse_cache *)library_base_address + MAN_MAX_SIZE_V1_8, preload_size - MAN_MAX_SIZE_V1_8);