Skip to content

Commit 12b2cc2

Browse files
softwareckilgirdwood
authored andcommitted
lib_manager: Simplyfy module instance allocate functions
Extend the lib_manager_get_instance_bss_address function to also return the size of the bss section. This simplify the lib_manager_allocate_module_instance and lib_manager_free_module_instance functions. Signed-off-by: Adrian Warecki <adrian.warecki@intel.com>
1 parent 426c5f0 commit 12b2cc2

1 file changed

Lines changed: 26 additions & 32 deletions

File tree

src/library_manager/lib_manager.c

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -280,31 +280,27 @@ static int lib_manager_unload_libcode_modules(const uint32_t module_id)
280280
}
281281
#endif /* CONFIG_LIBCODE_MODULE_SUPPORT */
282282

283-
static void __sparse_cache *lib_manager_get_instance_bss_address(uint32_t module_id,
284-
uint32_t instance_id,
285-
const struct sof_man_module *mod)
283+
static void lib_manager_get_instance_bss_address(uint32_t instance_id,
284+
const struct sof_man_module *mod,
285+
void __sparse_cache **va_addr, size_t *size)
286286
{
287-
uint32_t instance_bss_size =
288-
mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count;
289-
uint32_t inst_offset = instance_bss_size * PAGE_SZ * instance_id;
290-
void __sparse_cache *va_base =
291-
(void __sparse_cache *)(mod->segment[SOF_MAN_SEGMENT_BSS].v_base_addr +
292-
inst_offset);
293-
294-
tr_dbg(&lib_manager_tr, "instance_bss_size: %#x, pointer: %p",
295-
instance_bss_size, (__sparse_force void *)va_base);
296-
297-
return va_base;
287+
*size = mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count *
288+
PAGE_SZ;
289+
size_t inst_offset = *size * instance_id;
290+
*va_addr = (void __sparse_cache *)(mod->segment[SOF_MAN_SEGMENT_BSS].v_base_addr +
291+
inst_offset);
292+
293+
tr_dbg(&lib_manager_tr, "instance_bss_size: %#zx, pointer: %p", *size,
294+
(__sparse_force void *)*va_addr);
298295
}
299296

300-
static int lib_manager_allocate_module_instance(uint32_t module_id, uint32_t instance_id,
301-
uint32_t is_pages, const struct sof_man_module *mod)
297+
static int lib_manager_allocate_module_instance(uint32_t instance_id, uint32_t is_pages,
298+
const struct sof_man_module *mod)
302299
{
303-
uint32_t bss_size =
304-
(mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count)
305-
* PAGE_SZ;
306-
void __sparse_cache *va_base = lib_manager_get_instance_bss_address(module_id,
307-
instance_id, mod);
300+
size_t bss_size;
301+
void __sparse_cache *va_base;
302+
303+
lib_manager_get_instance_bss_address(instance_id, mod, &va_base, &bss_size);
308304

309305
if ((is_pages * PAGE_SZ) > bss_size) {
310306
tr_err(&lib_manager_tr, "invalid is_pages: %u, required: %u",
@@ -324,14 +320,12 @@ static int lib_manager_allocate_module_instance(uint32_t module_id, uint32_t ins
324320
return 0;
325321
}
326322

327-
static int lib_manager_free_module_instance(uint32_t module_id, uint32_t instance_id,
328-
const struct sof_man_module *mod)
323+
static int lib_manager_free_module_instance(uint32_t instance_id, const struct sof_man_module *mod)
329324
{
330-
uint32_t bss_size =
331-
(mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count)
332-
* PAGE_SZ;
333-
void __sparse_cache *va_base = lib_manager_get_instance_bss_address(module_id,
334-
instance_id, mod);
325+
size_t bss_size;
326+
void __sparse_cache *va_base;
327+
328+
lib_manager_get_instance_bss_address(instance_id, mod, &va_base, &bss_size);
335329
/*
336330
* Unmap bss memory.
337331
*/
@@ -343,8 +337,8 @@ uintptr_t lib_manager_allocate_module(const struct comp_ipc_config *ipc_config,
343337
{
344338
const struct sof_man_module *mod;
345339
const struct ipc4_base_module_cfg *base_cfg = ipc_specific_config;
340+
const uint32_t module_id = IPC4_MOD_ID(ipc_config->id);
346341
int ret;
347-
uint32_t module_id = IPC4_MOD_ID(ipc_config->id);
348342

349343
tr_dbg(&lib_manager_tr, "mod_id: %#x", ipc_config->id);
350344

@@ -367,8 +361,8 @@ uintptr_t lib_manager_allocate_module(const struct comp_ipc_config *ipc_config,
367361
goto err;
368362
#endif /* CONFIG_LIBCODE_MODULE_SUPPORT */
369363

370-
ret = lib_manager_allocate_module_instance(module_id, IPC4_INST_ID(ipc_config->id),
371-
base_cfg->is_pages, mod);
364+
ret = lib_manager_allocate_module_instance(IPC4_INST_ID(ipc_config->id), base_cfg->is_pages,
365+
mod);
372366
if (ret < 0) {
373367
tr_err(&lib_manager_tr, "module allocation failed: %d", ret);
374368
#ifdef CONFIG_LIBCODE_MODULE_SUPPORT
@@ -406,7 +400,7 @@ int lib_manager_free_module(const uint32_t component_id)
406400
return ret;
407401
#endif /* CONFIG_LIBCODE_MODULE_SUPPORT */
408402

409-
ret = lib_manager_free_module_instance(module_id, IPC4_INST_ID(component_id), mod);
403+
ret = lib_manager_free_module_instance(IPC4_INST_ID(component_id), mod);
410404
if (ret < 0) {
411405
tr_err(&lib_manager_tr, "free module instance failed: %d", ret);
412406
return ret;

0 commit comments

Comments
 (0)