From ee3450132b6b4b9309fe1b7fc639a4adcd42aaf5 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Mon, 30 Sep 2019 08:01:37 +0200 Subject: [PATCH 1/7] task: change IPC and IDC tasks' priority Changes priority of IPC and IDC tasks. They are always scheduled as EDF tasks, where order of scheduling is based on deadline and priority is meant for special tasks e.g. IDLE or ALMOST_IDLE. Signed-off-by: Tomasz Lauda --- src/include/sof/schedule/task.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/sof/schedule/task.h b/src/include/sof/schedule/task.h index fc6cac132b32..be5372ceb605 100644 --- a/src/include/sof/schedule/task.h +++ b/src/include/sof/schedule/task.h @@ -20,8 +20,8 @@ struct sof; #define SOF_TASK_PRI_IDLE INT16_MAX /* lowest possible priority */ #define SOF_TASK_PRI_ALMOST_IDLE (SOF_TASK_PRI_IDLE - 1) -#define SOF_TASK_PRI_IPC SOF_TASK_PRI_LOW -#define SOF_TASK_PRI_IDC SOF_TASK_PRI_LOW +#define SOF_TASK_PRI_IPC SOF_TASK_PRI_HIGH +#define SOF_TASK_PRI_IDC SOF_TASK_PRI_HIGH /* task default stack size in bytes */ #define SOF_TASK_DEFAULT_STACK_SIZE 2048 From e5d5097ce6facfaa7bc923e101ea3ecb2f932625 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Mon, 30 Sep 2019 08:08:44 +0200 Subject: [PATCH 2/7] task: rename func to run Renames task's func to run to better show intention of this callback. Signed-off-by: Tomasz Lauda --- src/include/sof/schedule/schedule.h | 2 +- src/include/sof/schedule/task.h | 2 +- src/schedule/edf_schedule.c | 4 ++-- src/schedule/ll_schedule.c | 2 +- src/schedule/schedule.c | 4 ++-- test/cmocka/src/audio/kpb/kpb_mock.c | 2 +- test/cmocka/src/audio/pipeline/pipeline_connection_mocks.h | 2 +- test/cmocka/src/audio/pipeline/pipeline_free.c | 2 +- test/cmocka/src/audio/pipeline/pipeline_mocks.c | 4 ++-- tools/testbench/edf_schedule.c | 6 +++--- tools/testbench/schedule.c | 4 ++-- 11 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/include/sof/schedule/schedule.h b/src/include/sof/schedule/schedule.h index d3da65dc205a..465d1bb5b71f 100644 --- a/src/include/sof/schedule/schedule.h +++ b/src/include/sof/schedule/schedule.h @@ -171,7 +171,7 @@ static inline void schedule(void) } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*func)(void *data), void *data, + enum task_state (*run)(void *data), void *data, uint16_t core, uint32_t flags); void scheduler_init(int type, const struct scheduler_ops *ops, void *data); diff --git a/src/include/sof/schedule/task.h b/src/include/sof/schedule/task.h index be5372ceb605..97ea09a41055 100644 --- a/src/include/sof/schedule/task.h +++ b/src/include/sof/schedule/task.h @@ -47,7 +47,7 @@ struct task { uint16_t flags; enum task_state state; void *data; - enum task_state (*func)(void *data); + enum task_state (*run)(void *data); struct list_item list; void *private; }; diff --git a/src/schedule/edf_schedule.c b/src/schedule/edf_schedule.c index 2073cbfb1d69..706f823b5650 100644 --- a/src/schedule/edf_schedule.c +++ b/src/schedule/edf_schedule.c @@ -37,10 +37,10 @@ static void schedule_edf(void *data); static void schedule_edf_task_run(struct task *task, void *data) { while (1) { - /* execute task function and remove task from the list + /* execute task run function and remove task from the list * only if completed */ - if (task->func(task->data) == SOF_TASK_STATE_COMPLETED) + if (task->run(task->data) == SOF_TASK_STATE_COMPLETED) schedule_edf_task_complete(data, task); /* find new task for execution */ diff --git a/src/schedule/ll_schedule.c b/src/schedule/ll_schedule.c index 1b87d95237e7..20530606d03c 100644 --- a/src/schedule/ll_schedule.c +++ b/src/schedule/ll_schedule.c @@ -83,7 +83,7 @@ static void schedule_ll_tasks_execute(struct ll_schedule_data *sch) /* run task if its pending and remove from the list */ if (task->state == SOF_TASK_STATE_PENDING) { - task->state = task->func(task->data); + task->state = task->run(task->data); /* do we need to reschedule this task */ if (task->state == SOF_TASK_STATE_COMPLETED) { diff --git a/src/schedule/schedule.c b/src/schedule/schedule.c index bab7ef6427a3..a5d6f95c3a39 100644 --- a/src/schedule/schedule.c +++ b/src/schedule/schedule.c @@ -19,7 +19,7 @@ #include int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*func)(void *data), void *data, + enum task_state (*run)(void *data), void *data, uint16_t core, uint32_t flags) { struct schedulers *schedulers = *arch_schedulers_get(); @@ -39,7 +39,7 @@ int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, task->core = core; task->flags = flags; task->state = SOF_TASK_STATE_INIT; - task->func = func; + task->run = run; task->data = data; list_for_item(slist, &schedulers->list) { diff --git a/test/cmocka/src/audio/kpb/kpb_mock.c b/test/cmocka/src/audio/kpb/kpb_mock.c index 267a44ecf1a8..2b66966f64b5 100644 --- a/test/cmocka/src/audio/kpb/kpb_mock.c +++ b/test/cmocka/src/audio/kpb/kpb_mock.c @@ -68,7 +68,7 @@ void notifier_unregister(struct notifier *notifier) } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*func)(void *data), void *data, + enum task_state (*run)(void *data), void *data, uint16_t core, uint32_t xflags) { return 0; diff --git a/test/cmocka/src/audio/pipeline/pipeline_connection_mocks.h b/test/cmocka/src/audio/pipeline/pipeline_connection_mocks.h index fa0e92d28525..7993105943e7 100644 --- a/test/cmocka/src/audio/pipeline/pipeline_connection_mocks.h +++ b/test/cmocka/src/audio/pipeline/pipeline_connection_mocks.h @@ -33,6 +33,6 @@ void cleanup_test_data(struct pipeline_connect_data *data); static inline void schedule_task_mock_free(void *data, struct task *task) { task->state = SOF_TASK_STATE_FREE; - task->func = NULL; + task->run = NULL; task->data = NULL; } diff --git a/test/cmocka/src/audio/pipeline/pipeline_free.c b/test/cmocka/src/audio/pipeline/pipeline_free.c index 552dcc52eec0..3409fc8f4105 100644 --- a/test/cmocka/src/audio/pipeline/pipeline_free.c +++ b/test/cmocka/src/audio/pipeline/pipeline_free.c @@ -75,7 +75,7 @@ static void test_audio_pipeline_free_sheduler_task_free(void **state) assert_int_equal(result.pipe_task.state, SOF_TASK_STATE_FREE); assert_ptr_equal(NULL, result.pipe_task.data); - assert_ptr_equal(NULL, result.pipe_task.func); + assert_ptr_equal(NULL, result.pipe_task.run); } static void test_audio_pipeline_free_disconnect_full(void **state) diff --git a/test/cmocka/src/audio/pipeline/pipeline_mocks.c b/test/cmocka/src/audio/pipeline/pipeline_mocks.c index a75effb36491..c5281da6cfcc 100644 --- a/test/cmocka/src/audio/pipeline/pipeline_mocks.c +++ b/test/cmocka/src/audio/pipeline/pipeline_mocks.c @@ -27,13 +27,13 @@ void platform_dai_timestamp(struct comp_dev *dai, } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*func)(void *data), void *data, + enum task_state (*run)(void *data), void *data, uint16_t core, uint32_t xflags) { (void)task; (void)type; (void)priority; - (void)func; + (void)run; (void)data; (void)core; (void)xflags; diff --git a/tools/testbench/edf_schedule.c b/tools/testbench/edf_schedule.c index f992776673eb..44f63529fb3f 100644 --- a/tools/testbench/edf_schedule.c +++ b/tools/testbench/edf_schedule.c @@ -37,8 +37,8 @@ static void schedule_edf_task(void *data, struct task *task, uint64_t start, list_item_prepend(&task->list, &sch->list); task->state = SOF_TASK_STATE_QUEUED; - if (task->func) - task->func(task->data); + if (task->run) + task->run(task->data); schedule_edf_task_complete(task); } @@ -87,7 +87,7 @@ static void schedule_edf_task_cancel(void *data, struct task *task) static void schedule_edf_task_free(void *data, struct task *task) { task->state = SOF_TASK_STATE_FREE; - task->func = NULL; + task->run = NULL; task->data = NULL; free(edf_sch_get_pdata(task)); diff --git a/tools/testbench/schedule.c b/tools/testbench/schedule.c index 754aa69ea5e8..87abe3c84af6 100644 --- a/tools/testbench/schedule.c +++ b/tools/testbench/schedule.c @@ -21,7 +21,7 @@ struct schedulers **arch_schedulers_get(void) } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*func)(void *data), void *data, + enum task_state (*run)(void *data), void *data, uint16_t core, uint32_t flags) { struct schedulers *schedulers = *arch_schedulers_get(); @@ -39,7 +39,7 @@ int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, task->core = core; task->flags = flags; task->state = SOF_TASK_STATE_INIT; - task->func = func; + task->run = run; task->data = data; list_for_item(slist, &schedulers->list) { From 7bfe441ea1af00f1ba56dd6d5dfff70a8573f322 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Mon, 30 Sep 2019 08:21:46 +0200 Subject: [PATCH 3/7] task: add complete callback Adds complete callback to task. Some EDF tasks will need to have additional callback on task completion, which will be executed in critical section along the setting task state to complete. Doing it during regular execution is not enough, because it's done on passive level and we want to avoid any race condition. Signed-off-by: Tomasz Lauda --- src/audio/kpb.c | 1 + src/audio/pipeline.c | 2 +- src/audio/volume/volume.c | 2 +- src/drivers/dw/ssi-spi.c | 2 +- src/drivers/imx/ipc.c | 2 +- src/drivers/intel/baytrail/ipc.c | 3 ++- src/drivers/intel/cavs/dmic.c | 2 +- src/drivers/intel/cavs/idc.c | 3 ++- src/drivers/intel/cavs/ipc.c | 2 +- src/drivers/intel/cavs/sue-ipc.c | 2 +- src/drivers/intel/haswell/ipc.c | 3 ++- src/include/sof/lib/wait.h | 3 ++- src/include/sof/schedule/schedule.h | 5 +++-- src/include/sof/schedule/task.h | 1 + src/lib/agent.c | 3 ++- src/schedule/edf_schedule.c | 4 ++++ src/schedule/schedule.c | 6 ++++-- src/schedule/task.c | 3 ++- src/trace/dma-trace.c | 2 +- test/cmocka/src/audio/kpb/kpb_mock.c | 5 +++-- test/cmocka/src/audio/pipeline/pipeline_mocks.c | 6 ++++-- tools/testbench/schedule.c | 6 ++++-- 22 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/audio/kpb.c b/src/audio/kpb.c index 8f57eba57564..635d52e1741e 100644 --- a/src/audio/kpb.c +++ b/src/audio/kpb.c @@ -402,6 +402,7 @@ static int kpb_prepare(struct comp_dev *dev) SOF_SCHEDULE_EDF, /* utilize EDF scheduler */ SOF_TASK_PRI_ALMOST_IDLE, /* almost idle priority */ kpb_draining_task, /* task function */ + NULL, /* no complete function */ &kpb->draining_task_data, /* task private data */ 0, /* core on which we should run */ SOF_SCHEDULE_FLAG_IDLE); diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c index a052c745d03e..1942294d1e6e 100644 --- a/src/audio/pipeline.c +++ b/src/audio/pipeline.c @@ -66,7 +66,7 @@ struct pipeline *pipeline_new(struct sof_ipc_pipe_new *pipe_desc, type = pipeline_is_timer_driven(p) ? SOF_SCHEDULE_LL : SOF_SCHEDULE_EDF; schedule_task_init(&p->pipe_task, type, pipe_desc->priority, - pipeline_task, p, pipe_desc->core, 0); + pipeline_task, NULL, p, pipe_desc->core, 0); return p; } diff --git a/src/audio/volume/volume.c b/src/audio/volume/volume.c index f1b734545ce3..cb80545a4c15 100644 --- a/src/audio/volume/volume.c +++ b/src/audio/volume/volume.c @@ -164,7 +164,7 @@ static struct comp_dev *volume_new(struct sof_ipc_comp *comp) comp_set_drvdata(dev, cd); schedule_task_init(&cd->volwork, SOF_SCHEDULE_LL, SOF_TASK_PRI_MED, - vol_work, dev, 0, 0); + vol_work, NULL, dev, 0, 0); /* Set the default volumes. If IPC sets min_value or max_value to * not-zero, use them. Otherwise set to internal limits and notify diff --git a/src/drivers/dw/ssi-spi.c b/src/drivers/dw/ssi-spi.c index b122d15ab6c6..109d2b09e53d 100644 --- a/src/drivers/dw/ssi-spi.c +++ b/src/drivers/dw/ssi-spi.c @@ -414,7 +414,7 @@ static int spi_slave_init(struct spi *spi) spi->completion.private = NULL; return schedule_task_init(&spi->completion, SOF_SCHEDULE_EDF, - SOF_TASK_PRI_MED, spi_completion_work, spi, 0, 0); + SOF_TASK_PRI_MED, spi_completion_work, NULL, spi, 0, 0); } int spi_probe(struct spi *spi) diff --git a/src/drivers/imx/ipc.c b/src/drivers/imx/ipc.c index 9508b202a70e..54b12fe1b949 100644 --- a/src/drivers/imx/ipc.c +++ b/src/drivers/imx/ipc.c @@ -169,7 +169,7 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, _ipc, 0, 0); + ipc_process_task, NULL, _ipc, 0, 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/drivers/intel/baytrail/ipc.c b/src/drivers/intel/baytrail/ipc.c index 9cef3d5f5c4e..638838423424 100644 --- a/src/drivers/intel/baytrail/ipc.c +++ b/src/drivers/intel/baytrail/ipc.c @@ -18,6 +18,7 @@ #include #include #include +#include #include extern struct ipc *_ipc; @@ -186,7 +187,7 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, _ipc, 0, 0); + ipc_process_task, NULL, _ipc, 0, 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/drivers/intel/cavs/dmic.c b/src/drivers/intel/cavs/dmic.c index dab056354c66..a8be891d142d 100644 --- a/src/drivers/intel/cavs/dmic.c +++ b/src/drivers/intel/cavs/dmic.c @@ -1068,7 +1068,7 @@ static int dmic_set_config(struct dai *dai, struct sof_ipc_dai_config *config) /* Initialize start sequence handler */ schedule_task_init(&dmic->dmicwork, SOF_SCHEDULE_LL, - SOF_TASK_PRI_MED, dmic_work, dai, 0, + SOF_TASK_PRI_MED, dmic_work, NULL, dai, 0, SOF_SCHEDULE_FLAG_ASYNC); diff --git a/src/drivers/intel/cavs/idc.c b/src/drivers/intel/cavs/idc.c index 6144d7023b7e..12c9435162b2 100644 --- a/src/drivers/intel/cavs/idc.c +++ b/src/drivers/intel/cavs/idc.c @@ -27,6 +27,7 @@ #include #include #include +#include #include extern struct ipc *_ipc; @@ -371,7 +372,7 @@ int idc_init(void) /* process task */ schedule_task_init(&(*idc)->idc_task, SOF_SCHEDULE_EDF, - SOF_TASK_PRI_IDC, idc_do_cmd, *idc, core, 0); + SOF_TASK_PRI_IDC, idc_do_cmd, NULL, *idc, core, 0); /* configure interrupt */ (*idc)->irq = interrupt_get_irq(PLATFORM_IDC_INTERRUPT, diff --git a/src/drivers/intel/cavs/ipc.c b/src/drivers/intel/cavs/ipc.c index 0c5fc15e6270..07b4f37d6465 100644 --- a/src/drivers/intel/cavs/ipc.c +++ b/src/drivers/intel/cavs/ipc.c @@ -230,7 +230,7 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, _ipc, 0, 0); + ipc_process_task, NULL, _ipc, 0, 0); /* configure interrupt */ irq = interrupt_get_irq(PLATFORM_IPC_INTERRUPT, diff --git a/src/drivers/intel/cavs/sue-ipc.c b/src/drivers/intel/cavs/sue-ipc.c index e5171ce19192..b067cbd14027 100644 --- a/src/drivers/intel/cavs/sue-ipc.c +++ b/src/drivers/intel/cavs/sue-ipc.c @@ -81,7 +81,7 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_MED, - ipc_process_task, _ipc, 0, 0); + ipc_process_task, NULL, _ipc, 0, 0); return 0; } diff --git a/src/drivers/intel/haswell/ipc.c b/src/drivers/intel/haswell/ipc.c index 013d36f75752..aacabc2bf124 100644 --- a/src/drivers/intel/haswell/ipc.c +++ b/src/drivers/intel/haswell/ipc.c @@ -18,6 +18,7 @@ #include #include #include +#include #include extern struct ipc *_ipc; @@ -176,7 +177,7 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, _ipc, 0, 0); + ipc_process_task, NULL, _ipc, 0, 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/include/sof/lib/wait.h b/src/include/sof/lib/wait.h index eb67f7f7de0c..05a1620c5038 100644 --- a/src/include/sof/lib/wait.h +++ b/src/include/sof/lib/wait.h @@ -20,6 +20,7 @@ #include #include #include +#include #include typedef struct { @@ -69,7 +70,7 @@ static inline void wait_init(completion_t *comp) c->complete = 0; schedule_task_init(&comp->work, SOF_SCHEDULE_LL, SOF_TASK_PRI_MED, - _wait_cb, comp, 0, 0); + _wait_cb, NULL, comp, 0, 0); } static inline void wait_clear(completion_t *comp) diff --git a/src/include/sof/schedule/schedule.h b/src/include/sof/schedule/schedule.h index 465d1bb5b71f..e8f6eccf1eaf 100644 --- a/src/include/sof/schedule/schedule.h +++ b/src/include/sof/schedule/schedule.h @@ -171,8 +171,9 @@ static inline void schedule(void) } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*run)(void *data), void *data, - uint16_t core, uint32_t flags); + enum task_state (*run)(void *data), + void (*complete)(void *data), void *data, uint16_t core, + uint32_t flags); void scheduler_init(int type, const struct scheduler_ops *ops, void *data); diff --git a/src/include/sof/schedule/task.h b/src/include/sof/schedule/task.h index 97ea09a41055..07861053c93b 100644 --- a/src/include/sof/schedule/task.h +++ b/src/include/sof/schedule/task.h @@ -48,6 +48,7 @@ struct task { enum task_state state; void *data; enum task_state (*run)(void *data); + void (*complete)(void *data); struct list_item list; void *private; }; diff --git a/src/lib/agent.c b/src/lib/agent.c index cc53ddde4b08..12af04f464b8 100644 --- a/src/lib/agent.c +++ b/src/lib/agent.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #define trace_sa(__e, ...) \ @@ -83,7 +84,7 @@ void sa_init(struct sof *sof) sa->is_active = true; schedule_task_init(&sa->work, SOF_SCHEDULE_LL, SOF_TASK_PRI_HIGH, - validate, sa, 0, 0); + validate, NULL, sa, 0, 0); schedule_task(&sa->work, PLATFORM_IDLE_TIME, PLATFORM_IDLE_TIME); } diff --git a/src/schedule/edf_schedule.c b/src/schedule/edf_schedule.c index 706f823b5650..d196faad979c 100644 --- a/src/schedule/edf_schedule.c +++ b/src/schedule/edf_schedule.c @@ -215,6 +215,10 @@ static void schedule_edf_task_complete(void *data, struct task *task) irq_local_disable(flags); + /* execute task complete function if exists */ + if (task->complete) + task->complete(task->data); + task->state = SOF_TASK_STATE_COMPLETED; list_item_del(&task->list); diff --git a/src/schedule/schedule.c b/src/schedule/schedule.c index a5d6f95c3a39..34797f51e19f 100644 --- a/src/schedule/schedule.c +++ b/src/schedule/schedule.c @@ -19,8 +19,9 @@ #include int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*run)(void *data), void *data, - uint16_t core, uint32_t flags) + enum task_state (*run)(void *data), + void (*complete)(void *data), void *data, uint16_t core, + uint32_t flags) { struct schedulers *schedulers = *arch_schedulers_get(); struct schedule_data *sch; @@ -40,6 +41,7 @@ int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, task->flags = flags; task->state = SOF_TASK_STATE_INIT; task->run = run; + task->complete = complete; task->data = data; list_for_item(slist, &schedulers->list) { diff --git a/src/schedule/task.c b/src/schedule/task.c index e301d3134a28..71ffca9e48a9 100644 --- a/src/schedule/task.c +++ b/src/schedule/task.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #if STATIC_PIPE @@ -65,7 +66,7 @@ void task_main_init(struct sof *sof) *main_task = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, sizeof(**main_task)); assert(!schedule_task_init(*main_task, SOF_SCHEDULE_EDF, - SOF_TASK_PRI_IDLE, main_main, sof, cpu, + SOF_TASK_PRI_IDLE, main_main, NULL, sof, cpu, SOF_SCHEDULE_FLAG_IDLE)); } diff --git a/src/trace/dma-trace.c b/src/trace/dma-trace.c index c0e02a47e16f..07044d1b9994 100644 --- a/src/trace/dma-trace.c +++ b/src/trace/dma-trace.c @@ -139,7 +139,7 @@ int dma_trace_init_complete(struct dma_trace_data *d) } schedule_task_init(&d->dmat_work, SOF_SCHEDULE_LL, - SOF_TASK_PRI_MED, trace_work, d, 0, 0); + SOF_TASK_PRI_MED, trace_work, NULL, d, 0, 0); return 0; } diff --git a/test/cmocka/src/audio/kpb/kpb_mock.c b/test/cmocka/src/audio/kpb/kpb_mock.c index 2b66966f64b5..9590d8e0ad1e 100644 --- a/test/cmocka/src/audio/kpb/kpb_mock.c +++ b/test/cmocka/src/audio/kpb/kpb_mock.c @@ -68,8 +68,9 @@ void notifier_unregister(struct notifier *notifier) } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*run)(void *data), void *data, - uint16_t core, uint32_t xflags) + enum task_state (*run)(void *data), + void (*complete)(void *data), void *data, uint16_t core, + uint32_t xflags) { return 0; } diff --git a/test/cmocka/src/audio/pipeline/pipeline_mocks.c b/test/cmocka/src/audio/pipeline/pipeline_mocks.c index c5281da6cfcc..04633c00506e 100644 --- a/test/cmocka/src/audio/pipeline/pipeline_mocks.c +++ b/test/cmocka/src/audio/pipeline/pipeline_mocks.c @@ -27,13 +27,15 @@ void platform_dai_timestamp(struct comp_dev *dai, } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*run)(void *data), void *data, - uint16_t core, uint32_t xflags) + enum task_state (*run)(void *data), + void (*complete)(void *data), void *data, uint16_t core, + uint32_t xflags) { (void)task; (void)type; (void)priority; (void)run; + (void)complete; (void)data; (void)core; (void)xflags; diff --git a/tools/testbench/schedule.c b/tools/testbench/schedule.c index 87abe3c84af6..bb1ec4bd4c84 100644 --- a/tools/testbench/schedule.c +++ b/tools/testbench/schedule.c @@ -21,8 +21,9 @@ struct schedulers **arch_schedulers_get(void) } int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, - enum task_state (*run)(void *data), void *data, - uint16_t core, uint32_t flags) + enum task_state (*run)(void *data), + void (*complete)(void *data), void *data, uint16_t core, + uint32_t flags) { struct schedulers *schedulers = *arch_schedulers_get(); struct schedule_data *sch; @@ -40,6 +41,7 @@ int schedule_task_init(struct task *task, uint16_t type, uint16_t priority, task->flags = flags; task->state = SOF_TASK_STATE_INIT; task->run = run; + task->complete = complete; task->data = data; list_for_item(slist, &schedulers->list) { From 9c329583b67411bd4e8cd695e6b4b04120e1f551 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Mon, 30 Sep 2019 16:17:47 +0200 Subject: [PATCH 4/7] wait: panic only if we're lowering irq level Change the waiti implementation to panic only if we're lowering current interrupt level. In some rare cases (like entering D3 for some platforms) we don't care, because DSP will be disabled anyway. Signed-off-by: Tomasz Lauda --- src/arch/xtensa/include/arch/lib/wait.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/arch/xtensa/include/arch/lib/wait.h b/src/arch/xtensa/include/arch/lib/wait.h index e43bbecbddae..abecf0ce86d5 100644 --- a/src/arch/xtensa/include/arch/lib/wait.h +++ b/src/arch/xtensa/include/arch/lib/wait.h @@ -20,8 +20,8 @@ static inline void arch_wait_for_interrupt(int level) { int i; - /* can only enter WFI when at run level 0 i.e. not IRQ level */ - if (arch_interrupt_get_level() > 0) + /* need to make sure the interrupt level won't be lowered */ + if (arch_interrupt_get_level() > level) panic(SOF_IPC_PANIC_WFI); /* this sequence must be atomic on LX6 */ @@ -43,8 +43,8 @@ static inline void arch_wait_for_interrupt(int level) static inline void arch_wait_for_interrupt(int level) { - /* can only enter WFI when at run level 0 i.e. not IRQ level */ - if (arch_interrupt_get_level() > 0) + /* need to make sure the interrupt level won't be lowered */ + if (arch_interrupt_get_level() > level) panic(SOF_IPC_PANIC_WFI); asm volatile("waiti 0"); From 8d30759e4da1ee57ec177001dacbe476ab06d76e Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Mon, 30 Sep 2019 11:37:32 +0200 Subject: [PATCH 5/7] ipc: add complete task callback Changes ipc task implementation, so it accepts new messages from host in a complete task callback. This way we will avoid the situation, where host will send another message before we truly complete current ipc task. Signed-off-by: Tomasz Lauda --- src/drivers/imx/ipc.c | 8 +++++++- src/drivers/intel/baytrail/ipc.c | 11 ++++++++--- src/drivers/intel/cavs/ipc.c | 10 +++++++++- src/drivers/intel/haswell/ipc.c | 9 +++++++-- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/drivers/imx/ipc.c b/src/drivers/imx/ipc.c index 54b12fe1b949..073461cf244a 100644 --- a/src/drivers/imx/ipc.c +++ b/src/drivers/imx/ipc.c @@ -112,6 +112,11 @@ void ipc_platform_do_cmd(struct ipc *ipc) ipc_cmd(hdr); ipc->host_pending = 0; +} + +static void ipc_platform_complete_cmd(void *data) +{ + struct ipc *ipc = data; /* enable GP interrupt #0 - accept new messages */ imx_mu_xcr_rmw(IMX_MU_xCR_GIEn(0), 0); @@ -169,7 +174,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, NULL, _ipc, 0, 0); + ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, + 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/drivers/intel/baytrail/ipc.c b/src/drivers/intel/baytrail/ipc.c index 638838423424..6e5ceb2f26f1 100644 --- a/src/drivers/intel/baytrail/ipc.c +++ b/src/drivers/intel/baytrail/ipc.c @@ -18,7 +18,6 @@ #include #include #include -#include #include extern struct ipc *_ipc; @@ -106,13 +105,18 @@ void ipc_platform_do_cmd(struct ipc *ipc) { struct sof_ipc_cmd_hdr *hdr; /* Use struct ipc_data *iipc = ipc_get_drvdata(ipc); if needed */ - uint32_t ipcxh; /* perform command */ hdr = mailbox_validate(); ipc_cmd(hdr); ipc->host_pending = 0; +} + +static void ipc_platform_complete_cmd(void *data) +{ + struct ipc *ipc = data; + uint32_t ipcxh; /* clear BUSY bit and set DONE bit - accept new messages */ ipcxh = shim_read(SHIM_IPCXH); @@ -187,7 +191,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, NULL, _ipc, 0, 0); + ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, + 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/drivers/intel/cavs/ipc.c b/src/drivers/intel/cavs/ipc.c index 07b4f37d6465..00ececf6553b 100644 --- a/src/drivers/intel/cavs/ipc.c +++ b/src/drivers/intel/cavs/ipc.c @@ -151,6 +151,13 @@ void ipc_platform_do_cmd(struct ipc *ipc) platform_pm_runtime_power_off(); } #endif +} + +static void ipc_platform_complete_cmd(void *data) +{ +#if CAVS_VERSION >= CAVS_VERSION_2_0 + struct ipc *ipc = data; +#endif /* write 1 to clear busy, and trigger interrupt to host*/ #if CAVS_VERSION == CAVS_VERSION_1_5 @@ -230,7 +237,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, NULL, _ipc, 0, 0); + ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, + 0); /* configure interrupt */ irq = interrupt_get_irq(PLATFORM_IPC_INTERRUPT, diff --git a/src/drivers/intel/haswell/ipc.c b/src/drivers/intel/haswell/ipc.c index aacabc2bf124..f94dfddb6c44 100644 --- a/src/drivers/intel/haswell/ipc.c +++ b/src/drivers/intel/haswell/ipc.c @@ -18,7 +18,6 @@ #include #include #include -#include #include extern struct ipc *_ipc; @@ -107,6 +106,11 @@ void ipc_platform_do_cmd(struct ipc *ipc) ipc_cmd(hdr); ipc->host_pending = 0; +} + +static void ipc_platform_complete_cmd(void *data) +{ + struct ipc *ipc = data; /* clear BUSY bit and set DONE bit - accept new messages */ shim_write(SHIM_IPCX, SHIM_IPCX_DONE); @@ -177,7 +181,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, NULL, _ipc, 0, 0); + ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, + 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ From 43dc24ef4a95847addb19bbc6b65a2f6d4c26e5d Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Mon, 30 Sep 2019 11:53:43 +0200 Subject: [PATCH 6/7] ipc: remove host_pending as it not needed Removes host_pending from ipc structure, because it's no longer needed. Scheduler will automatically throw an error, when we'll try to run not completed task. Signed-off-by: Tomasz Lauda --- src/drivers/dw/ssi-spi.c | 1 - src/drivers/imx/ipc.c | 17 ++--------------- src/drivers/intel/baytrail/ipc.c | 14 +------------- src/drivers/intel/cavs/ipc.c | 19 +------------------ src/drivers/intel/cavs/sue-ipc.c | 2 -- src/drivers/intel/haswell/ipc.c | 14 +------------- src/include/sof/drivers/ipc.h | 1 - src/ipc/handler.c | 3 +-- 8 files changed, 6 insertions(+), 65 deletions(-) diff --git a/src/drivers/dw/ssi-spi.c b/src/drivers/dw/ssi-spi.c index 109d2b09e53d..385dae03a665 100644 --- a/src/drivers/dw/ssi-spi.c +++ b/src/drivers/dw/ssi-spi.c @@ -303,7 +303,6 @@ static enum task_state spi_completion_work(void *data) dcache_invalidate_region(spi->rx_buffer, SPI_BUFFER_SIZE); mailbox_hostbox_write(0, spi->rx_buffer, hdr->size); - _ipc->host_pending = 1; ipc_schedule_process(_ipc); break; diff --git a/src/drivers/imx/ipc.c b/src/drivers/imx/ipc.c index 073461cf244a..059e57cb210a 100644 --- a/src/drivers/imx/ipc.c +++ b/src/drivers/imx/ipc.c @@ -57,12 +57,9 @@ static void do_notify(void) static void irq_handler(void *arg) { - uint32_t ctrl; uint32_t status; - uint32_t msg = 0; /* Interrupt arrived, check src */ - ctrl = imx_mu_read(IMX_MU_xCR); status = imx_mu_read(IMX_MU_xSR); tracev_ipc("ipc: irq isr 0x%x", status); @@ -89,16 +86,8 @@ static void irq_handler(void *arg) imx_mu_xsr_rmw(IMX_MU_xSR_GIPn(0), 0); interrupt_clear(PLATFORM_IPC_INTERRUPT); - /* TODO: place message in Q and process later */ - /* It's not Q ATM, may overwrite */ - if (_ipc->host_pending) { - trace_ipc_error("ipc: dropping msg 0x%x", msg); - trace_ipc_error(" isr 0x%x ctrl 0x%x ipcxh 0x%x", - status, ctrl); - } else { - _ipc->host_pending = 1; - ipc_schedule_process(_ipc); - } + + ipc_schedule_process(_ipc); } } @@ -110,8 +99,6 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command */ hdr = mailbox_validate(); ipc_cmd(hdr); - - ipc->host_pending = 0; } static void ipc_platform_complete_cmd(void *data) diff --git a/src/drivers/intel/baytrail/ipc.c b/src/drivers/intel/baytrail/ipc.c index 6e5ceb2f26f1..07a69dc0faf5 100644 --- a/src/drivers/intel/baytrail/ipc.c +++ b/src/drivers/intel/baytrail/ipc.c @@ -87,17 +87,7 @@ static void irq_handler(void *arg) /* Mask Busy interrupt before return */ shim_write(SHIM_IMRD, shim_read(SHIM_IMRD) | SHIM_IMRD_BUSY); - /* TODO: place message in Q and process later */ - /* It's not Q ATM, may overwrite */ - if (_ipc->host_pending) { - trace_ipc_error("ipc: dropping msg"); - trace_ipc_error(" isr 0x%x imrd 0x%x ipcxh 0x%x", - isr, shim_read(SHIM_IMRD), - shim_read(SHIM_IPCXH)); - } else { - _ipc->host_pending = 1; - ipc_schedule_process(_ipc); - } + ipc_schedule_process(_ipc); } } @@ -109,8 +99,6 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command */ hdr = mailbox_validate(); ipc_cmd(hdr); - - ipc->host_pending = 0; } static void ipc_platform_complete_cmd(void *data) diff --git a/src/drivers/intel/cavs/ipc.c b/src/drivers/intel/cavs/ipc.c index 00ececf6553b..6ef72e9c20ea 100644 --- a/src/drivers/intel/cavs/ipc.c +++ b/src/drivers/intel/cavs/ipc.c @@ -86,22 +86,7 @@ static void ipc_irq_handler(void *arg) increment_ipc_received_counter(); #endif - /* TODO: place message in Q and process later */ - /* It's not Q ATM, may overwrite */ - if (_ipc->host_pending) { - trace_ipc_error("ipc: dropping msg"); -#if CAVS_VERSION == CAVS_VERSION_1_5 - trace_ipc_error(" dipct 0x%x dipcie 0x%x dipcctl 0x%x", - dipct, dipcie, ipc_read(IPC_DIPCCTL)); -#else - trace_ipc_error(" dipctdr 0x%x dipcida 0x%x " - "dipcctl 0x%x", dipctdr, dipcida, - ipc_read(IPC_DIPCCTL)); -#endif - } else { - _ipc->host_pending = 1; - ipc_schedule_process(_ipc); - } + ipc_schedule_process(_ipc); } /* reply message(done) from host */ @@ -142,8 +127,6 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command */ ipc_cmd(hdr); - ipc->host_pending = 0; - /* are we about to enter D3 ? */ #if CAVS_VERSION < CAVS_VERSION_2_0 if (ipc->pm_prepare_D3) { diff --git a/src/drivers/intel/cavs/sue-ipc.c b/src/drivers/intel/cavs/sue-ipc.c index b067cbd14027..cf6b038502eb 100644 --- a/src/drivers/intel/cavs/sue-ipc.c +++ b/src/drivers/intel/cavs/sue-ipc.c @@ -34,8 +34,6 @@ void ipc_platform_do_cmd(struct ipc *ipc) 0, sizeof(reply)); spi_push(spi_get(SOF_SPI_INTEL_SLAVE), &reply, sizeof(reply)); - ipc->host_pending = 0; - // TODO: signal audio work to enter D3 in normal context /* are we about to enter D3 ? */ if (ipc->pm_prepare_D3) { diff --git a/src/drivers/intel/haswell/ipc.c b/src/drivers/intel/haswell/ipc.c index f94dfddb6c44..73979bda6579 100644 --- a/src/drivers/intel/haswell/ipc.c +++ b/src/drivers/intel/haswell/ipc.c @@ -82,17 +82,7 @@ static void irq_handler(void *arg) /* Mask Busy interrupt before return */ shim_write(SHIM_IMRD, shim_read(SHIM_IMRD) | SHIM_IMRD_BUSY); - /* TODO: place message in Q and process later */ - /* It's not Q ATM, may overwrite */ - if (_ipc->host_pending) { - trace_ipc_error("ipc: dropping msg"); - trace_ipc_error(" isr 0x%x imrd 0x%x ipcx 0x%x", - isr, shim_read(SHIM_IMRD), - shim_read(SHIM_IPCX)); - } else { - _ipc->host_pending = 1; - ipc_schedule_process(_ipc); - } + ipc_schedule_process(_ipc); } } @@ -104,8 +94,6 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command */ hdr = mailbox_validate(); ipc_cmd(hdr); - - ipc->host_pending = 0; } static void ipc_platform_complete_cmd(void *data) diff --git a/src/include/sof/drivers/ipc.h b/src/include/sof/drivers/ipc.h index a4d23e52458c..5adc1a90b6a4 100644 --- a/src/include/sof/drivers/ipc.h +++ b/src/include/sof/drivers/ipc.h @@ -95,7 +95,6 @@ struct ipc_shared_context { }; struct ipc { - uint32_t host_pending; spinlock_t *lock; /* locking mechanism */ void *comp_data; diff --git a/src/ipc/handler.c b/src/ipc/handler.c index 7a7eac465cde..6ba4836d26fb 100644 --- a/src/ipc/handler.c +++ b/src/ipc/handler.c @@ -1292,8 +1292,7 @@ int ipc_process_msg_queue(void) enum task_state ipc_process_task(void *data) { - if (_ipc->host_pending) - ipc_platform_do_cmd(_ipc); + ipc_platform_do_cmd(_ipc); return SOF_TASK_STATE_COMPLETED; } From 417f77153ec1d84807f925ade22277fc6ea4f705 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Mon, 30 Sep 2019 12:07:59 +0200 Subject: [PATCH 7/7] ipc: cleanup ipc functions Cleanups ipc functions, so we don't have many not needed layers of execution. Signed-off-by: Tomasz Lauda --- src/drivers/imx/ipc.c | 8 +++++--- src/drivers/intel/baytrail/ipc.c | 8 +++++--- src/drivers/intel/cavs/ipc.c | 11 ++++++++--- src/drivers/intel/cavs/sue-ipc.c | 7 +++++-- src/drivers/intel/haswell/ipc.c | 8 +++++--- src/include/sof/drivers/ipc.h | 2 -- src/ipc/handler.c | 7 ------- 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/drivers/imx/ipc.c b/src/drivers/imx/ipc.c index 059e57cb210a..3bb5da3dd024 100644 --- a/src/drivers/imx/ipc.c +++ b/src/drivers/imx/ipc.c @@ -91,7 +91,7 @@ static void irq_handler(void *arg) } } -void ipc_platform_do_cmd(struct ipc *ipc) +static enum task_state ipc_platform_do_cmd(void *data) { struct sof_ipc_cmd_hdr *hdr; /* Use struct ipc_data *iipc = ipc_get_drvdata(ipc); if needed */ @@ -99,6 +99,8 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command */ hdr = mailbox_validate(); ipc_cmd(hdr); + + return SOF_TASK_STATE_COMPLETED; } static void ipc_platform_complete_cmd(void *data) @@ -161,8 +163,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, - 0); + ipc_platform_do_cmd, ipc_platform_complete_cmd, _ipc, + 0, 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/drivers/intel/baytrail/ipc.c b/src/drivers/intel/baytrail/ipc.c index 07a69dc0faf5..248c0d148f92 100644 --- a/src/drivers/intel/baytrail/ipc.c +++ b/src/drivers/intel/baytrail/ipc.c @@ -91,7 +91,7 @@ static void irq_handler(void *arg) } } -void ipc_platform_do_cmd(struct ipc *ipc) +static enum task_state ipc_platform_do_cmd(void *data) { struct sof_ipc_cmd_hdr *hdr; /* Use struct ipc_data *iipc = ipc_get_drvdata(ipc); if needed */ @@ -99,6 +99,8 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command */ hdr = mailbox_validate(); ipc_cmd(hdr); + + return SOF_TASK_STATE_COMPLETED; } static void ipc_platform_complete_cmd(void *data) @@ -179,8 +181,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, - 0); + ipc_platform_do_cmd, ipc_platform_complete_cmd, _ipc, + 0, 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/drivers/intel/cavs/ipc.c b/src/drivers/intel/cavs/ipc.c index 6ef72e9c20ea..37085ae4b2e5 100644 --- a/src/drivers/intel/cavs/ipc.c +++ b/src/drivers/intel/cavs/ipc.c @@ -118,8 +118,11 @@ static void ipc_irq_handler(void *arg) } } -void ipc_platform_do_cmd(struct ipc *ipc) +static enum task_state ipc_platform_do_cmd(void *data) { +#if CAVS_VERSION < CAVS_VERSION_2_0 + struct ipc *ipc = data; +#endif struct sof_ipc_cmd_hdr *hdr; hdr = mailbox_validate(); @@ -134,6 +137,8 @@ void ipc_platform_do_cmd(struct ipc *ipc) platform_pm_runtime_power_off(); } #endif + + return SOF_TASK_STATE_COMPLETED; } static void ipc_platform_complete_cmd(void *data) @@ -220,8 +225,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, - 0); + ipc_platform_do_cmd, ipc_platform_complete_cmd, _ipc, + 0, 0); /* configure interrupt */ irq = interrupt_get_irq(PLATFORM_IPC_INTERRUPT, diff --git a/src/drivers/intel/cavs/sue-ipc.c b/src/drivers/intel/cavs/sue-ipc.c index cf6b038502eb..2fb78d7c12ca 100644 --- a/src/drivers/intel/cavs/sue-ipc.c +++ b/src/drivers/intel/cavs/sue-ipc.c @@ -21,8 +21,9 @@ extern struct ipc *_ipc; /* No private data for IPC */ -void ipc_platform_do_cmd(struct ipc *ipc) +static enum task_state ipc_platform_do_cmd(void *data) { + struct ipc *ipc = data; struct sof_ipc_cmd_hdr *hdr; struct sof_ipc_reply reply; @@ -40,6 +41,8 @@ void ipc_platform_do_cmd(struct ipc *ipc) while (1) wait_for_interrupt(0); } + + return SOF_TASK_STATE_COMPLETED; } void ipc_platform_send_msg(struct ipc *ipc) @@ -79,7 +82,7 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_MED, - ipc_process_task, NULL, _ipc, 0, 0); + ipc_platform_do_cmd, NULL, _ipc, 0, 0); return 0; } diff --git a/src/drivers/intel/haswell/ipc.c b/src/drivers/intel/haswell/ipc.c index 73979bda6579..89438ca25746 100644 --- a/src/drivers/intel/haswell/ipc.c +++ b/src/drivers/intel/haswell/ipc.c @@ -86,7 +86,7 @@ static void irq_handler(void *arg) } } -void ipc_platform_do_cmd(struct ipc *ipc) +static enum task_state ipc_platform_do_cmd(void *data) { struct sof_ipc_cmd_hdr *hdr; /* Use struct ipc_data *iipc = ipc_get_drvdata(ipc); if needed */ @@ -94,6 +94,8 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command */ hdr = mailbox_validate(); ipc_cmd(hdr); + + return SOF_TASK_STATE_COMPLETED; } static void ipc_platform_complete_cmd(void *data) @@ -169,8 +171,8 @@ int platform_ipc_init(struct ipc *ipc) /* schedule */ schedule_task_init(&_ipc->ipc_task, SOF_SCHEDULE_EDF, SOF_TASK_PRI_IPC, - ipc_process_task, ipc_platform_complete_cmd, _ipc, 0, - 0); + ipc_platform_do_cmd, ipc_platform_complete_cmd, _ipc, + 0, 0); #if CONFIG_HOST_PTABLE /* allocate page table buffer */ diff --git a/src/include/sof/drivers/ipc.h b/src/include/sof/drivers/ipc.h index 5adc1a90b6a4..08b9cf0ec868 100644 --- a/src/include/sof/drivers/ipc.h +++ b/src/include/sof/drivers/ipc.h @@ -146,7 +146,6 @@ int platform_ipc_init(struct ipc *ipc); void ipc_free(struct ipc *ipc); int ipc_process_msg_queue(void); -enum task_state ipc_process_task(void *data); void ipc_schedule_process(struct ipc *ipc); int ipc_stream_send_position(struct comp_dev *cdev, @@ -159,7 +158,6 @@ int ipc_stream_send_xrun(struct comp_dev *cdev, int ipc_queue_host_message(struct ipc *ipc, uint32_t header, void *tx_data, size_t tx_bytes, uint32_t replace); -void ipc_platform_do_cmd(struct ipc *ipc); void ipc_platform_send_msg(struct ipc *ipc); /** diff --git a/src/ipc/handler.c b/src/ipc/handler.c index 6ba4836d26fb..f47b54d7a32e 100644 --- a/src/ipc/handler.c +++ b/src/ipc/handler.c @@ -1290,13 +1290,6 @@ int ipc_process_msg_queue(void) return 0; } -enum task_state ipc_process_task(void *data) -{ - ipc_platform_do_cmd(_ipc); - - return SOF_TASK_STATE_COMPLETED; -} - void ipc_schedule_process(struct ipc *ipc) { schedule_task(&ipc->ipc_task, 0, 100);