[Sound-open-firmware] [PATCH] pipeline: pipeline_complete() now checks pipe status and return errors

Liam Girdwood liam.r.girdwood at linux.intel.com
Sun Sep 24 00:07:21 CEST 2017


pipeline completion should check for valid pipeline status and return
any errors for invalid status (like already completed pipelines).

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 src/audio/pipeline.c              | 13 +++++++++++--
 src/include/reef/audio/pipeline.h |  3 ++-
 src/include/reef/ipc.h            |  2 +-
 src/ipc/intel-ipc.c               |  4 +---
 src/ipc/ipc.c                     |  6 +++---
 5 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c
index 4e830c6..69dcce7 100644
--- a/src/audio/pipeline.c
+++ b/src/audio/pipeline.c
@@ -228,6 +228,7 @@ struct pipeline *pipeline_new(struct sof_ipc_pipe_new *pipe_desc,
 
 	/* init pipeline */
 	p->sched_comp = cd;
+	p->status = COMP_STATE_INIT;
 	schedule_task_init(&p->pipe_task, pipeline_task, p);
 	schedule_task_config(&p->pipe_task, pipe_desc->priority,
 		pipe_desc->core);
@@ -263,16 +264,24 @@ int pipeline_free(struct pipeline *p)
 	return 0;
 }
 
-void pipeline_complete(struct pipeline *p)
+int pipeline_complete(struct pipeline *p)
 {
 	/* now walk downstream and upstream form "start" component and
 	  complete component task and pipeline init */
 
 	trace_pipe("com");
-	tracev_value(p->ipc_pipe.pipeline_id);
+	trace_value(p->ipc_pipe.pipeline_id);
+
+	/* cheeck whether pipeline is already complete */
+	if (p->status != COMP_STATE_INIT) {
+		trace_pipe_error("epc");
+		return -EINVAL;
+	}
 
 	connect_downstream(p, p->sched_comp, p->sched_comp);
 	connect_upstream(p, p->sched_comp, p->sched_comp);
+	p->status = COMP_STATE_READY;
+	return 0;
 }
 
 /* connect component -> buffer */
diff --git a/src/include/reef/audio/pipeline.h b/src/include/reef/audio/pipeline.h
index 909f905..41cfffc 100644
--- a/src/include/reef/audio/pipeline.h
+++ b/src/include/reef/audio/pipeline.h
@@ -59,6 +59,7 @@ struct pipeline {
 
 	/* runtime status */
 	int32_t xrun_bytes;		/* last xrun length */
+	uint32_t status;		/* pipeline status */
 
 	/* lists */
 	struct list_item comp_list;		/* list of components */
@@ -86,7 +87,7 @@ int pipeline_comp_connect(struct pipeline *p, struct comp_dev *source_comp,
 	struct comp_buffer *sink_buffer);
 int pipeline_buffer_connect(struct pipeline *p,
 	struct comp_buffer *source_buffer, struct comp_dev *sink_comp);
-void pipeline_complete(struct pipeline *p);
+int pipeline_complete(struct pipeline *p);
 
 /* pipeline parameters */
 int pipeline_params(struct pipeline *p, struct comp_dev *cd,
diff --git a/src/include/reef/ipc.h b/src/include/reef/ipc.h
index 84a1dc1..a552626 100644
--- a/src/include/reef/ipc.h
+++ b/src/include/reef/ipc.h
@@ -148,7 +148,7 @@ int ipc_buffer_free(struct ipc *ipc, uint32_t buffer_id);
  */
 int ipc_pipeline_new(struct ipc *ipc, struct sof_ipc_pipe_new *pipeline);
 int ipc_pipeline_free(struct ipc *ipc, uint32_t comp_id);
-void ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id);
+int ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id);
 
 /*
  * Pipeline component and buffer connections.
diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c
index 92dfd73..8a4fafd 100644
--- a/src/ipc/intel-ipc.c
+++ b/src/ipc/intel-ipc.c
@@ -787,9 +787,7 @@ static int ipc_glb_tplg_pipe_complete(uint32_t header)
 
 	trace_ipc("Ipc");
 
-	ipc_pipeline_complete(_ipc, ipc_pipeline->comp_id);
-
-	return 0;
+	return ipc_pipeline_complete(_ipc, ipc_pipeline->comp_id);
 }
 
 static int ipc_glb_tplg_comp_connect(uint32_t header)
diff --git a/src/ipc/ipc.c b/src/ipc/ipc.c
index e589d56..966fafd 100644
--- a/src/ipc/ipc.c
+++ b/src/ipc/ipc.c
@@ -293,17 +293,17 @@ int ipc_pipeline_free(struct ipc *ipc, uint32_t comp_id)
 	return 0;
 }
 
-void ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id)
+int ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id)
 {
 	struct ipc_comp_dev *ipc_pipe;
 
 	/* check whether pipeline exists */
 	ipc_pipe = ipc_get_comp(ipc, comp_id);
 	if (ipc_pipe == NULL)
-		return;
+		return -EINVAL;
 
 	/* free buffer and remove from list */
-	pipeline_complete(ipc_pipe->pipeline);
+	return pipeline_complete(ipc_pipe->pipeline);
 }
 
 int ipc_comp_dai_config(struct ipc *ipc, struct sof_ipc_dai_config *config)
-- 
2.11.0



More information about the Sound-open-firmware mailing list