diff --git a/src/include/sof/schedule/schedule.h b/src/include/sof/schedule/schedule.h index 03ce567dc9ea..a68169736ef2 100644 --- a/src/include/sof/schedule/schedule.h +++ b/src/include/sof/schedule/schedule.h @@ -197,6 +197,9 @@ static inline void *scheduler_get_data(uint16_t type) struct schedule_data *sch; struct list_item *slist; + if (!schedulers) + return NULL; + list_for_item(slist, &schedulers->list) { sch = container_of(slist, struct schedule_data, list); if (type == sch->type) diff --git a/src/schedule/schedule.c b/src/schedule/schedule.c index 6dc141834842..519b8f144ba6 100644 --- a/src/schedule/schedule.c +++ b/src/schedule/schedule.c @@ -81,11 +81,13 @@ int schedule_task_init(struct task *task, return 0; } -static void scheduler_register(struct schedule_data *scheduler) +__cold static void scheduler_register(struct schedule_data *scheduler) { struct schedulers **sch = arch_schedulers_get(); struct k_heap *heap = NULL; + assert_can_be_cold(); + if (IS_ENABLED(CONFIG_SOF_USERSPACE_LL) && scheduler_is_user(scheduler->type)) { sch = arch_user_schedulers_get(); heap = sof_sys_user_heap_get(); @@ -105,11 +107,13 @@ static void scheduler_register(struct schedule_data *scheduler) list_item_append(&scheduler->list, &(*sch)->list); } -void scheduler_init(int type, const struct scheduler_ops *ops, void *data) +__cold void scheduler_init(int type, const struct scheduler_ops *ops, void *data) { struct schedule_data *sch; struct k_heap *heap = NULL; + assert_can_be_cold(); + if (IS_ENABLED(CONFIG_SOF_USERSPACE_LL) && scheduler_is_user(type)) heap = sof_sys_user_heap_get(); diff --git a/src/schedule/zephyr_domain.c b/src/schedule/zephyr_domain.c index c878e1972c49..681b0c872f58 100644 --- a/src/schedule/zephyr_domain.c +++ b/src/schedule/zephyr_domain.c @@ -609,7 +609,8 @@ struct ll_schedule_domain *zephyr_domain_init(int clk) /* Check if currently running in the LL scheduler thread context */ bool ll_sch_is_current(void) { - struct zephyr_domain *zephyr_domain = ll_sch_domain_get_pdata(zephyr_ll_domain()); + struct ll_schedule_domain *ll_dom = zephyr_ll_domain(); + struct zephyr_domain *zephyr_domain = ll_dom ? ll_sch_domain_get_pdata(ll_dom) : NULL; if (!zephyr_domain) return false; diff --git a/src/schedule/zephyr_ll.c b/src/schedule/zephyr_ll.c index 33d2d76014bd..2c0bfc1ce0ff 100644 --- a/src/schedule/zephyr_ll.c +++ b/src/schedule/zephyr_ll.c @@ -769,5 +769,5 @@ struct ll_schedule_domain *zephyr_ll_domain(void) { struct zephyr_ll *ll_sch = scheduler_get_data(SOF_SCHEDULE_LL_TIMER); - return ll_sch->ll_domain; + return ll_sch ? ll_sch->ll_domain : NULL; }