From b963d6c970d8d742b35cabbcad9cb0411ddd8a2f Mon Sep 17 00:00:00 2001 From: Ranjani Sridharan Date: Wed, 28 Apr 2021 12:26:38 -0700 Subject: [PATCH] pipeline: fix pipeline's scheduling comp setting Move the code that sets the scheduling comp for a pipeline to allow setting it in ipc_pipeline_complete(). This removes the restriction that the scheduling comp must be set up before the pipeline widget and provides the flexibility in the kernel to set up the widgets in any order while parsing topology. Signed-off-by: Ranjani Sridharan --- src/audio/pipeline/pipeline-graph.c | 4 +- src/include/sof/audio/pipeline.h | 4 +- src/ipc/helper-ipc3.c | 49 ++++++++++--------- test/cmocka/src/audio/pipeline/pipeline_new.c | 3 +- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/audio/pipeline/pipeline-graph.c b/src/audio/pipeline/pipeline-graph.c index 7cb83c4a2571..a5a7e30d8a86 100644 --- a/src/audio/pipeline/pipeline-graph.c +++ b/src/audio/pipeline/pipeline-graph.c @@ -103,8 +103,7 @@ void pipeline_posn_init(struct sof *sof) } /* create new pipeline - returns pipeline id or negative error */ -struct pipeline *pipeline_new(struct comp_dev *cd, uint32_t pipeline_id, - uint32_t priority, uint32_t comp_id) +struct pipeline *pipeline_new(uint32_t pipeline_id, uint32_t priority, uint32_t comp_id) { struct sof_ipc_stream_posn posn; struct pipeline *p; @@ -121,7 +120,6 @@ struct pipeline *pipeline_new(struct comp_dev *cd, uint32_t pipeline_id, } /* init pipeline */ - p->sched_comp = cd; p->comp_id = comp_id; p->priority = priority; p->pipeline_id = pipeline_id; diff --git a/src/include/sof/audio/pipeline.h b/src/include/sof/audio/pipeline.h index 37e094301ff7..bc3f5fc0e411 100644 --- a/src/include/sof/audio/pipeline.h +++ b/src/include/sof/audio/pipeline.h @@ -110,14 +110,12 @@ struct pipeline_data { /** * \brief Creates a new pipeline. - * \param[in,out] cd Pipeline component device. * \param[in] pipeline_id Pipeline ID number. * \param[in] priority Pipeline scheduling priority. * \param[in] comp_id Pipeline component ID number. * \return New pipeline pointer or NULL. */ -struct pipeline *pipeline_new(struct comp_dev *cd, uint32_t pipeline_id, - uint32_t priority, uint32_t comp_id); +struct pipeline *pipeline_new(uint32_t pipeline_id, uint32_t priority, uint32_t comp_id); /** * \brief Free's a pipeline. diff --git a/src/ipc/helper-ipc3.c b/src/ipc/helper-ipc3.c index 6ade9ac47f51..3d93f6c69938 100644 --- a/src/ipc/helper-ipc3.c +++ b/src/ipc/helper-ipc3.c @@ -281,7 +281,6 @@ int ipc_pipeline_new(struct ipc *ipc, { struct ipc_comp_dev *ipc_pipe; struct pipeline *pipe; - struct ipc_comp_dev *icd; int ret; /* check whether the pipeline already exists */ @@ -301,28 +300,8 @@ int ipc_pipeline_new(struct ipc *ipc, return -EINVAL; } - /* find the scheduling component */ - icd = ipc_get_comp_by_id(ipc, pipe_desc->sched_id); - if (!icd) { - tr_err(&ipc_tr, "ipc_pipeline_new(): cannot find the scheduling component, pipe_desc->sched_id = %u", - pipe_desc->sched_id); - return -EINVAL; - } - - if (icd->type != COMP_TYPE_COMPONENT) { - tr_err(&ipc_tr, "ipc_pipeline_new(): icd->type (%d) != COMP_TYPE_COMPONENT for pipeline scheduling component icd->id %d", - icd->type, icd->id); - return -EINVAL; - } - - if (icd->core != pipe_desc->core) { - tr_err(&ipc_tr, "ipc_pipeline_new(): icd->core (%d) != pipe_desc->core (%d) for pipeline scheduling component icd->id %d", - icd->core, pipe_desc->core, icd->id); - return -EINVAL; - } - /* create the pipeline */ - pipe = pipeline_new(icd->cd, pipe_desc->pipeline_id, pipe_desc->priority, + pipe = pipeline_new(pipe_desc->pipeline_id, pipe_desc->priority, pipe_desc->comp_id); if (!pipe) { tr_err(&ipc_tr, "ipc_pipeline_new(): pipeline_new() failed"); @@ -396,6 +375,8 @@ int ipc_pipeline_free(struct ipc *ipc, uint32_t comp_id) int ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id) { struct ipc_comp_dev *ipc_pipe; + struct ipc_comp_dev *icd; + struct pipeline *p; uint32_t pipeline_id; struct ipc_comp_dev *ipc_ppl_source; struct ipc_comp_dev *ipc_ppl_sink; @@ -413,6 +394,30 @@ int ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id) if (!cpu_is_me(ipc_pipe->core)) return ipc_process_on_core(ipc_pipe->core); + p = ipc_pipe->pipeline; + + /* find the scheduling component */ + icd = ipc_get_comp_by_id(ipc, p->sched_id); + if (!icd) { + tr_err(&ipc_tr, "ipc_pipeline_complete(): cannot find the scheduling component, p->sched_id = %u", + p->sched_id); + return -EINVAL; + } + + if (icd->type != COMP_TYPE_COMPONENT) { + tr_err(&ipc_tr, "ipc_pipeline_complete(): icd->type (%d) != COMP_TYPE_COMPONENT for pipeline scheduling component icd->id %d", + icd->type, icd->id); + return -EINVAL; + } + + if (icd->core != ipc_pipe->core) { + tr_err(&ipc_tr, "ipc_pipeline_complete(): icd->core (%d) != ipc_pipe->core (%d) for pipeline scheduling component icd->id %d", + icd->core, ipc_pipe->core, icd->id); + return -EINVAL; + } + + p->sched_comp = icd->cd; + pipeline_id = ipc_pipe->pipeline->pipeline_id; tr_dbg(&ipc_tr, "ipc: pipe %d -> complete on comp %d", pipeline_id, diff --git a/test/cmocka/src/audio/pipeline/pipeline_new.c b/test/cmocka/src/audio/pipeline/pipeline_new.c index 73a04901bf53..9f713440ad0b 100644 --- a/test/cmocka/src/audio/pipeline/pipeline_new.c +++ b/test/cmocka/src/audio/pipeline/pipeline_new.c @@ -44,8 +44,7 @@ static void test_audio_pipeline_pipeline_new_creation(void **state) struct pipeline_new_setup_data *test_data = *state; /*Testing component*/ - struct pipeline *result = pipeline_new(test_data->comp_data, - test_data->pipe_id, + struct pipeline *result = pipeline_new(test_data->pipe_id, test_data->priority, test_data->comp_id);