zephyr: add notifier_register(ipc_send_queued_msg) in task_main_start()

Fixes #4356

In XTOS SOF, ipc_send_queued_msg() is run by task_main_primary_core(),
the initialization of which has a hard and circular dependency with the
initialization of the EDF scheduler. This EDF scheduler is not part of
Zephyr. Because of the circular dependency it does not seem
possible (nor desirable?) to refactor this code and make it compatible
with Zephyr. So schedule ipc_send_queued_msg() differently in Zephyr:
using a notifier triggered by the periodic Low Latency scheduler.

Signed-off-by: Marc Herbert <marc.herbert@intel.com>
This commit is contained in:
Marc Herbert 2021-06-29 09:01:16 +00:00 committed by Liam Girdwood
parent cf3a7d1604
commit c194125b83
1 changed files with 13 additions and 0 deletions

View File

@ -406,6 +406,15 @@ unsigned int _xtos_ints_off(unsigned int mask)
return 0; return 0;
} }
void ipc_send_queued_msg(void);
static void ipc_send_queued_callback(void *private_data, enum notify_id event_type,
void *caller_data)
{
if (!ipc_get()->pm_prepare_D3)
ipc_send_queued_msg();
}
/* /*
* Audio components. * Audio components.
* *
@ -528,6 +537,10 @@ int task_main_start(struct sof *sof)
/* init pipeline position offsets */ /* init pipeline position offsets */
pipeline_posn_init(sof); pipeline_posn_init(sof);
(void)notifier_register(NULL, scheduler_get_data(SOF_SCHEDULE_LL_TIMER),
NOTIFIER_ID_LL_POST_RUN,
ipc_send_queued_callback, 0);
/* let host know DSP boot is complete */ /* let host know DSP boot is complete */
ret = platform_boot_complete(0); ret = platform_boot_complete(0);