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 <guennadi.liakhovetski@linux.intel.com>
This commit is contained in:
Guennadi Liakhovetski 2023-06-29 18:49:37 +03:00 committed by Liam Girdwood
parent b58e5357f8
commit 1dc6a2836d
1 changed files with 17 additions and 17 deletions

View File

@ -21,6 +21,7 @@
#include <sof/lib_manager.h>
#include <sof/audio/module_adapter/module/generic.h>
#include <zephyr/cache.h>
#include <zephyr/drivers/mm/system_mm.h>
#include <errno.h>
@ -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);