mirror of https://github.com/thesofproject/sof.git
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:
parent
b58e5357f8
commit
1dc6a2836d
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue