Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DNM] PR8764 + Fix to module adapter free #8785

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src/audio/module_adapter/module_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ struct comp_dev *module_adapter_new(const struct comp_driver *drv,
struct processing_module *mod;
struct module_config *dst;

comp_cl_dbg(drv, "module_adapter_new() start");
comp_cl_info(drv, "module_adapter_new() start");

if (!config) {
comp_cl_err(drv, "module_adapter_new(), wrong input params! drv = %zx config = %zx",
Expand Down Expand Up @@ -297,7 +297,7 @@ int module_adapter_prepare(struct comp_dev *dev)
uint32_t buff_size; /* size of local buffer */
int i = 0;

comp_dbg(dev, "module_adapter_prepare() start");
comp_info(dev, "module_adapter_prepare() start");

/* Prepare module */
if (IS_PROCESSING_MODE_SINK_SOURCE(mod) &&
Expand Down Expand Up @@ -1338,10 +1338,6 @@ int module_adapter_reset(struct comp_dev *dev)
rfree(mod->stream_params);
mod->stream_params = NULL;

#if CONFIG_IPC_MAJOR_4
rfree(mod->priv.cfg.input_pins);
#endif

comp_dbg(dev, "module_adapter_reset(): done");

return comp_set_state(dev, COMP_TRIGGER_RESET);
Expand All @@ -1354,7 +1350,12 @@ void module_adapter_free(struct comp_dev *dev)
struct processing_module *mod = comp_get_drvdata(dev);
struct list_item *blist, *_blist;

comp_dbg(dev, "module_adapter_free(): start");
comp_info(dev, "module_adapter_free(): start");

#if CONFIG_IPC_MAJOR_4
rfree(mod->priv.cfg.input_pins);
mod->priv.cfg.input_pins = NULL;
#endif

ret = module_free(mod);
if (ret)
Expand Down
5 changes: 2 additions & 3 deletions src/ipc/ipc4/handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -510,13 +510,12 @@ static void ipc_compound_msg_done(uint32_t msg_id, int error)
}
}

/* wait for IPCs to complete on other cores and be nice to any LL work */
static int ipc_wait_for_compound_msg(void)
{
int try_count = 30; /* timeout out is 30 x 10ms so 300ms for IPC */
int try_count = 30;

while (atomic_read(&msg_data.delayed_reply)) {
k_sleep(Z_TIMEOUT_MS(10));
k_sleep(Z_TIMEOUT_US(250));
Copy link
Contributor

@jxstelter jxstelter Jan 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not important, but can we change Z_TIMEOUT_US() to K_USEC()?
This expand to the same, but Z_xxxx definitions, I guess are Zephyr internal.


if (!try_count--) {
atomic_set(&msg_data.delayed_reply, 0);
Expand Down
2 changes: 1 addition & 1 deletion west.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ manifest:

- name: zephyr
repo-path: zephyr
revision: d7af6f371034f31b9440b27c694b0be3c87491d3
revision: 6a0b1da158a4f8bc5f2ca5058637dce26a38660e
remote: zephyrproject

# Import some projects listed in zephyr/west.yml@revision
Expand Down
80 changes: 17 additions & 63 deletions zephyr/lib/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
/* Zephyr includes */
#include <version.h>
#include <zephyr/kernel.h>
#include <zephyr/kernel/smp.h>
#include <zephyr/device.h>
#include <zephyr/drivers/mm/mm_drv_intel_adsp_mtl_tlb.h>

Expand All @@ -27,37 +28,9 @@
extern K_KERNEL_STACK_ARRAY_DEFINE(z_interrupt_stacks, CONFIG_MP_MAX_NUM_CPUS,
CONFIG_ISR_STACK_SIZE);

static atomic_t start_flag;
static atomic_t ready_flag;

/* Zephyr kernel_internal.h interface */
extern void smp_timer_init(void);

static FUNC_NORETURN void secondary_init(void *arg)
static void secondary_init(void *arg)
{
struct k_thread dummy_thread;

/*
* This is an open-coded version of zephyr/kernel/smp.c
* smp_init_top(). We do this so that we can call SOF
* secondary_core_init() for each core.
*/

atomic_set(&ready_flag, 1);
z_smp_thread_init(arg, &dummy_thread);
smp_timer_init();

secondary_core_init(sof_get());

#ifdef CONFIG_THREAD_STACK_INFO
dummy_thread.stack_info.start = (uintptr_t)z_interrupt_stacks +
arch_curr_cpu()->id * Z_KERNEL_STACK_LEN(CONFIG_ISR_STACK_SIZE);
dummy_thread.stack_info.size = Z_KERNEL_STACK_LEN(CONFIG_ISR_STACK_SIZE);
#endif

z_smp_thread_swap();

CODE_UNREACHABLE; /* LCOV_EXCL_LINE */
}

#if CONFIG_ZEPHYR_NATIVE_DRIVERS
Expand Down Expand Up @@ -113,7 +86,6 @@ void cpu_notify_state_exit(enum pm_state state)
/* Notifying primary core that secondary core successfully exit the D3
* state and is back in the Idle thread.
*/
atomic_set(&ready_flag, 1);
return;
}
#endif
Expand Down Expand Up @@ -142,26 +114,17 @@ int cpu_enable_core(int id)
if (arch_cpu_active(id))
return 0;

#if ZEPHYR_VERSION(3, 0, 99) <= ZEPHYR_VERSION_CODE
/* During kernel initialization, the next pm state is set to ACTIVE. By checking this
* value, we determine if this is the first core boot, if not, we need to skip idle thread
* initialization. By reinitializing the idle thread, we would overwrite the kernel structs
* and the idle thread stack.
*/
if (pm_state_next_get(id)->state == PM_STATE_ACTIVE)
z_init_cpu(id);
#endif

atomic_clear(&start_flag);
atomic_clear(&ready_flag);

arch_start_cpu(id, z_interrupt_stacks[id], CONFIG_ISR_STACK_SIZE,
secondary_init, &start_flag);

while (!atomic_get(&ready_flag))
k_busy_wait(100);
if (pm_state_next_get(id)->state == PM_STATE_ACTIVE) {
k_smp_cpu_start(id, secondary_init, NULL);
return 0;
}

atomic_set(&start_flag, 1);
k_smp_cpu_resume(id, secondary_init, NULL, true, false);

return 0;
}
Expand Down Expand Up @@ -239,29 +202,20 @@ int cpu_enable_core(int id)

int cpu_enable_secondary_core(int id)
{
/*
* This is an open-coded version of zephyr/kernel/smp.c
* z_smp_start_cpu(). We do this, so we can use a customized
* secondary_init() for SOF.
*/

if (arch_cpu_active(id))
return 0;

#if ZEPHYR_VERSION(3, 0, 99) <= ZEPHYR_VERSION_CODE
z_init_cpu(id);
#endif

atomic_clear(&start_flag);
atomic_clear(&ready_flag);

arch_start_cpu(id, z_interrupt_stacks[id], CONFIG_ISR_STACK_SIZE,
secondary_init, &start_flag);

while (!atomic_get(&ready_flag))
k_busy_wait(100);
/* During kernel initialization, the next pm state is set to ACTIVE. By checking this
* value, we determine if this is the first core boot, if not, we need to skip idle thread
* initialization. By reinitializing the idle thread, we would overwrite the kernel structs
* and the idle thread stack.
*/
if (pm_state_next_get(id)->state == PM_STATE_ACTIVE) {
k_smp_cpu_start(id, secondary_init, NULL);
return 0;
}

atomic_set(&start_flag, 1);
k_smp_cpu_resume(id, secondary_init, NULL, true, false);

return 0;
}
Expand Down
Loading