[Sound-open-firmware] [RFC PATCH v2 18/29] Change macro definition and trace calling for pipeline.
yan.wang at linux.intel.com
yan.wang at linux.intel.com
Fri May 11 08:36:00 CEST 2018
From: Yan Wang <yan.wang at linux.intel.com>
It will use PIPE trace class and component DMA trace API.
NULL will be passed into trace API when pipeline hasn't been
initialized.
Signed-off-by: Yan Wang <yan.wang at linux.intel.com>
---
Test with:
CNL nocodec
SOF master: c1f2682c210201bbbc96fce7b382b25b90d19775
SOF-Tool master: 86fe688a2b4f68a1ce87e0951686be12a00f1a3c
https://github.com/plbossart/sound/tree/topic/sof-v4.14:
d09db67c5a9d6dfc85f700669fa2e43c678c8d51
---
src/audio/pipeline.c | 190 ++++++++++++++++++++-------------------
src/audio/pipeline_static.c | 2 +-
src/include/sof/audio/pipeline.h | 15 +++-
3 files changed, 113 insertions(+), 94 deletions(-)
diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c
index 0ed6b95..805a686 100644
--- a/src/audio/pipeline.c
+++ b/src/audio/pipeline.c
@@ -67,7 +67,7 @@ static void connect_upstream(struct pipeline *p, struct comp_dev *start,
{
struct list_item *clist;
- tracev_value(current->comp.id);
+ tracev_pipe_value(p, current->comp.id);
/* complete component init */
current->pipeline = p;
@@ -107,7 +107,7 @@ static void connect_downstream(struct pipeline *p, struct comp_dev *start,
{
struct list_item *clist;
- tracev_value(current->comp.id);
+ tracev_pipe_value(p, current->comp.id);
/* complete component init */
current->pipeline = p;
@@ -139,7 +139,7 @@ static void disconnect_upstream(struct pipeline *p, struct comp_dev *start,
{
struct list_item *clist;
- tracev_value(current->comp.id);
+ tracev_pipe_value(p, current->comp.id);
/* complete component init */
current->pipeline = NULL;
@@ -168,7 +168,7 @@ static void disconnect_downstream(struct pipeline *p, struct comp_dev *start,
{
struct list_item *clist;
- tracev_value(current->comp.id);
+ tracev_pipe_value(p, current->comp.id);
/* complete component init */
current->pipeline = NULL;
@@ -237,12 +237,12 @@ struct pipeline *pipeline_new(struct sof_ipc_pipe_new *pipe_desc,
{
struct pipeline *p;
- trace_pipe("new");
+ trace_pipe(NULL, "new");
/* allocate new pipeline */
p = rzalloc(RZONE_RUNTIME, SOF_MEM_CAPS_RAM, sizeof(*p));
if (p == NULL) {
- trace_pipe_error("ePN");
+ trace_pipe_error(NULL, "ePN");
return NULL;
}
@@ -264,11 +264,11 @@ struct pipeline *pipeline_new(struct sof_ipc_pipe_new *pipe_desc,
/* pipelines must be inactive */
int pipeline_free(struct pipeline *p)
{
- trace_pipe("fre");
+ trace_pipe(p, "fre");
/* make sure we are not in use */
if (p->sched_comp->state > COMP_STATE_READY) {
- trace_pipe_error("epb");
+ trace_pipe_error(p, "epb");
return -EBUSY;
}
@@ -290,12 +290,12 @@ int pipeline_complete(struct pipeline *p)
/* now walk downstream and upstream form "start" component and
complete component task and pipeline init */
- trace_pipe("com");
- trace_value(p->ipc_pipe.pipeline_id);
+ trace_pipe(p, "com");
+ trace_pipe_value(p, p->ipc_pipe.pipeline_id);
/* check whether pipeline is already complete */
if (p->status != COMP_STATE_INIT) {
- trace_pipe_error("epc");
+ trace_pipe_error(p, "epc");
return -EINVAL;
}
@@ -309,7 +309,7 @@ int pipeline_complete(struct pipeline *p)
int pipeline_comp_connect(struct pipeline *p, struct comp_dev *source_comp,
struct comp_buffer *sink_buffer)
{
- trace_pipe("cnc");
+ trace_pipe(p, "cnc");
/* connect source to buffer */
spin_lock(&source_comp->lock);
@@ -321,7 +321,7 @@ int pipeline_comp_connect(struct pipeline *p, struct comp_dev *source_comp,
if (sink_buffer->source && sink_buffer->sink)
sink_buffer->connected = 1;
- tracev_value((source_comp->comp.id << 16) |
+ tracev_pipe_value(p, (source_comp->comp.id << 16) |
sink_buffer->ipc_buffer.comp.id);
return 0;
}
@@ -330,7 +330,7 @@ int pipeline_comp_connect(struct pipeline *p, struct comp_dev *source_comp,
int pipeline_buffer_connect(struct pipeline *p,
struct comp_buffer *source_buffer, struct comp_dev *sink_comp)
{
- trace_pipe("cbc");
+ trace_pipe(p, "cbc");
/* connect sink to buffer */
spin_lock(&sink_comp->lock);
@@ -342,7 +342,7 @@ int pipeline_buffer_connect(struct pipeline *p,
if (source_buffer->source && source_buffer->sink)
source_buffer->connected = 1;
- tracev_value((source_buffer->ipc_buffer.comp.id << 16) |
+ tracev_pipe_value(p, (source_buffer->ipc_buffer.comp.id << 16) |
sink_comp->comp.id);
return 0;
}
@@ -352,15 +352,16 @@ int pipeline_buffer_connect(struct pipeline *p,
* returning an error ( < 0) and returns immediately. Components returning a
* positive error code also stop the graph walk on that branch causing the
* walk to return to a shallower level in the graph. */
-static int component_op_downstream(struct op_data *op_data,
- struct comp_dev *start, struct comp_dev *current,
- struct comp_dev *previous)
+static int component_op_downstream(struct pipeline *p, struct op_data *op_data,
+ struct comp_dev *start,
+ struct comp_dev *current,
+ struct comp_dev *previous)
{
struct list_item *clist;
int err = 0;
- tracev_pipe("CO-");
- tracev_value(current->comp.id);
+ tracev_pipe(p, "CO-");
+ tracev_pipe_value(p, current->comp.id);
/* do operation on this component */
switch (op_data->op) {
@@ -392,20 +393,20 @@ static int component_op_downstream(struct op_data *op_data,
break;
case COMP_OPS_BUFFER: /* handled by other API call */
default:
- trace_pipe_error("eOi");
- trace_error_value(op_data->op);
+ trace_pipe_error(p, "eOi");
+ trace_pipe_error_value(p, op_data->op);
return -EINVAL;
}
/* don't walk the graph any further if this component fails */
if (err < 0) {
- trace_pipe_error("eOp");
+ trace_pipe_error(p, "eOp");
return err;
} else if (err > 0 || (current != start && current->is_endpoint)) {
/* we finish walking the graph if we reach the DAI or component is
* currently active and configured already (err > 0).
*/
- tracev_pipe("C-D");
+ tracev_pipe(p, "C-D");
return err;
}
@@ -419,8 +420,8 @@ static int component_op_downstream(struct op_data *op_data,
if (!buffer->connected)
continue;
- err = component_op_downstream(op_data, start, buffer->sink,
- current);
+ err = component_op_downstream(p, op_data, start, buffer->sink,
+ current);
if (err < 0)
break;
}
@@ -433,15 +434,16 @@ static int component_op_downstream(struct op_data *op_data,
* returning an error ( < 0) and returns immediately. Components returning a
* positive error code also stop the graph walk on that branch causing the
* walk to return to a shallower level in the graph. */
-static int component_op_upstream(struct op_data *op_data,
- struct comp_dev *start, struct comp_dev *current,
- struct comp_dev *previous)
+static int component_op_upstream(struct pipeline *p, struct op_data *op_data,
+ struct comp_dev *start,
+ struct comp_dev *current,
+ struct comp_dev *previous)
{
struct list_item *clist;
int err = 0;
- tracev_pipe("CO+");
- tracev_value(current->comp.id);
+ tracev_pipe(p, "CO+");
+ tracev_pipe_value(p, current->comp.id);
/* do operation on this component */
switch (op_data->op) {
@@ -473,17 +475,17 @@ static int component_op_upstream(struct op_data *op_data,
break;
case COMP_OPS_BUFFER: /* handled by other API call */
default:
- trace_pipe_error("eOi");
- trace_error_value(op_data->op);
+ trace_pipe_error(p, "eOi");
+ trace_pipe_error_value(p, op_data->op);
return -EINVAL;
}
/* don't walk the graph any further if this component fails */
if (err < 0) {
- trace_pipe_error("eOp");
+ trace_pipe_error(p, "eOp");
return err;
} else if (err > 0 || (current != start && current->is_endpoint)) {
- tracev_pipe("C+D");
+ tracev_pipe(p, "C+D");
return 0;
}
@@ -497,8 +499,8 @@ static int component_op_upstream(struct op_data *op_data,
if (!buffer->connected)
continue;
- err = component_op_upstream(op_data, start, buffer->source,
- current);
+ err = component_op_upstream(p, op_data, start, buffer->source,
+ current);
if (err < 0)
break;
}
@@ -508,8 +510,10 @@ static int component_op_upstream(struct op_data *op_data,
/* walk the graph upstream from start component in any pipeline and prepare
* the buffer context for each inactive component */
-static int component_prepare_buffers_upstream(struct comp_dev *start,
- struct comp_dev *current, struct comp_buffer *buffer)
+static int component_prepare_buffers_upstream(struct pipeline *p,
+ struct comp_dev *start,
+ struct comp_dev *current,
+ struct comp_buffer *buffer)
{
struct list_item *clist;
int err = 0;
@@ -534,10 +538,11 @@ static int component_prepare_buffers_upstream(struct comp_dev *start,
continue;
/* continue downstream */
- err = component_prepare_buffers_upstream(start, buffer->source,
- buffer);
+ err = component_prepare_buffers_upstream(p, start,
+ buffer->source,
+ buffer);
if (err < 0) {
- trace_pipe_error("eBD");
+ trace_pipe_error(p, "eBD");
break;
}
}
@@ -548,8 +553,10 @@ static int component_prepare_buffers_upstream(struct comp_dev *start,
/* walk the graph downstream from start component in any pipeline and prepare
* the buffer context for each inactive component */
-static int component_prepare_buffers_downstream(struct comp_dev *start,
- struct comp_dev *current, struct comp_buffer *buffer)
+static int component_prepare_buffers_downstream(struct pipeline *p,
+ struct comp_dev *start,
+ struct comp_dev *current,
+ struct comp_buffer *buffer)
{
struct list_item *clist;
int err = 0;
@@ -574,10 +581,11 @@ static int component_prepare_buffers_downstream(struct comp_dev *start,
continue;
/* continue downstream */
- err = component_prepare_buffers_downstream(start, buffer->sink,
- buffer);
+ err = component_prepare_buffers_downstream(p, start,
+ buffer->sink,
+ buffer);
if (err < 0) {
- trace_pipe_error("eBD");
+ trace_pipe_error(p, "eBD");
break;
}
}
@@ -592,7 +600,7 @@ int pipeline_prepare(struct pipeline *p, struct comp_dev *dev)
struct op_data op_data;
int ret = -1;
- trace_pipe("pre");
+ trace_pipe(p, "pre");
op_data.p = p;
op_data.op = COMP_OPS_PREPARE;
@@ -602,19 +610,19 @@ int pipeline_prepare(struct pipeline *p, struct comp_dev *dev)
/* playback pipelines can be preloaded from host before trigger */
if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
- ret = component_op_downstream(&op_data, dev, dev, NULL);
+ ret = component_op_downstream(p, &op_data, dev, dev, NULL);
if (ret < 0)
goto out;
/* set up reader and writer positions */
- component_prepare_buffers_downstream(dev, dev, NULL);
+ component_prepare_buffers_downstream(p, dev, dev, NULL);
} else {
- ret = component_op_upstream(&op_data, dev, dev, NULL);
+ ret = component_op_upstream(p, &op_data, dev, dev, NULL);
if (ret < 0)
goto out;
/* set up reader and writer positions */
- component_prepare_buffers_upstream(dev, dev, NULL);
+ component_prepare_buffers_upstream(p, dev, dev, NULL);
}
out:
@@ -629,7 +637,7 @@ int pipeline_trigger(struct pipeline *p, struct comp_dev *host, int cmd)
int ret;
uint32_t flags;
- trace_pipe("cmd");
+ trace_pipe(p, "cmd");
op_data.p = p;
op_data.op = COMP_OPS_TRIGGER;
@@ -639,16 +647,16 @@ int pipeline_trigger(struct pipeline *p, struct comp_dev *host, int cmd)
if (host->params.direction == SOF_IPC_STREAM_PLAYBACK) {
/* send cmd downstream from host to DAI */
- ret = component_op_downstream(&op_data, host, host, NULL);
+ ret = component_op_downstream(p, &op_data, host, host, NULL);
} else {
/* send cmd upstream from host to DAI */
- ret = component_op_upstream(&op_data, host, host, NULL);
+ ret = component_op_upstream(p, &op_data, host, host, NULL);
}
if (ret < 0) {
trace_ipc_error("pc0");
- trace_error_value(host->comp.id);
- trace_error_value(cmd);
+ trace_pipe_error_value(p, host->comp.id);
+ trace_pipe_error_value(p, cmd);
}
spin_unlock_irq(&p->lock, flags);
@@ -674,7 +682,7 @@ int pipeline_params(struct pipeline *p, struct comp_dev *host,
struct op_data op_data;
int ret;
- trace_pipe("Par");
+ trace_pipe(p, "Par");
op_data.p = p;
op_data.op = COMP_OPS_PARAMS;
@@ -685,15 +693,15 @@ int pipeline_params(struct pipeline *p, struct comp_dev *host,
if (host->params.direction == SOF_IPC_STREAM_PLAYBACK) {
/* send params downstream from host to DAI */
- ret = component_op_downstream(&op_data, host, host, NULL);
+ ret = component_op_downstream(p, &op_data, host, host, NULL);
} else {
/* send params upstream from host to DAI */
- ret = component_op_upstream(&op_data, host, host, NULL);
+ ret = component_op_upstream(p, &op_data, host, host, NULL);
}
if (ret < 0) {
trace_ipc_error("pp0");
- trace_error_value(host->comp.id);
+ trace_pipe_error_value(p, host->comp.id);
}
spin_unlock(&p->lock);
@@ -706,7 +714,7 @@ int pipeline_reset(struct pipeline *p, struct comp_dev *host)
struct op_data op_data;
int ret;
- trace_pipe("PRe");
+ trace_pipe(p, "PRe");
op_data.p = p;
op_data.op = COMP_OPS_RESET;
@@ -715,15 +723,15 @@ int pipeline_reset(struct pipeline *p, struct comp_dev *host)
if (host->params.direction == SOF_IPC_STREAM_PLAYBACK) {
/* send reset downstream from host to DAI */
- ret = component_op_downstream(&op_data, host, host, NULL);
+ ret = component_op_downstream(p, &op_data, host, host, NULL);
} else {
/* send reset upstream from host to DAI */
- ret = component_op_upstream(&op_data, host, host, NULL);
+ ret = component_op_upstream(p, &op_data, host, host, NULL);
}
if (ret < 0) {
trace_ipc_error("pr0");
- trace_error_value(host->comp.id);
+ trace_pipe_error_value(p, host->comp.id);
}
spin_unlock(&p->lock);
@@ -743,14 +751,15 @@ int pipeline_reset(struct pipeline *p, struct comp_dev *host)
* individually) and it stops at pipeline endpoints (where a component has no
* source or sink components) or where this pipeline joins another pipeline.
*/
-static int pipeline_copy_from_upstream(struct comp_dev *start,
- struct comp_dev *current)
+static int pipeline_copy_from_upstream(struct pipeline *p,
+ struct comp_dev *start,
+ struct comp_dev *current)
{
struct list_item *clist;
int err = 0;
- tracev_pipe("CP+");
- tracev_value(current->comp.id);
+ tracev_pipe(p, "CP+");
+ tracev_pipe_value(p, current->comp.id);
/* stop going upstream if we reach an end point in this pipeline */
if (current->is_endpoint && current != start)
@@ -771,10 +780,10 @@ static int pipeline_copy_from_upstream(struct comp_dev *start,
continue;
/* continue upstream */
- err = pipeline_copy_from_upstream(start, buffer->source);
+ err = pipeline_copy_from_upstream(p, start, buffer->source);
if (err < 0) {
- trace_pipe_error("ePU");
- trace_error_value(current->comp.id);
+ trace_pipe_error(p, "ePU");
+ trace_pipe_error_value(p, current->comp.id);
return err;
}
}
@@ -784,7 +793,7 @@ copy:
err = comp_copy(current);
/* return back downstream */
- tracev_pipe("CD+");
+ tracev_pipe(p, "CD+");
return err;
}
@@ -801,14 +810,15 @@ copy:
* individually) and it stops at pipeline endpoints (where a component has no
* source or sink components) or where this pipeline joins another pipeline.
*/
-static int pipeline_copy_to_downstream(struct comp_dev *start,
- struct comp_dev *current)
+static int pipeline_copy_to_downstream(struct pipeline *p,
+ struct comp_dev *start,
+ struct comp_dev *current)
{
struct list_item *clist;
int err = 0;
- tracev_pipe("CP-");
- tracev_value(current->comp.id);
+ tracev_pipe(p, "CP-");
+ tracev_pipe_value(p, current->comp.id);
/* component copy/process to downstream */
if (current != start) {
@@ -834,17 +844,17 @@ static int pipeline_copy_to_downstream(struct comp_dev *start,
continue;
/* continue downstream */
- err = pipeline_copy_to_downstream(start, buffer->sink);
+ err = pipeline_copy_to_downstream(p, start, buffer->sink);
if (err < 0) {
- trace_pipe_error("ePD");
- trace_error_value(current->comp.id);
+ trace_pipe_error(p, "ePD");
+ trace_pipe_error_value(p, current->comp.id);
return err;
}
}
out:
/* return back upstream */
- tracev_pipe("CD-");
+ tracev_pipe(p, "CD-");
return err;
}
@@ -1052,12 +1062,12 @@ static int pipeline_xrun_recover(struct pipeline *p)
{
int ret;
- trace_pipe_error("pxr");
+ trace_pipe_error(p, "pxr");
/* notify all pipeline comps we are in XRUN */
ret = pipeline_trigger(p, p->source_comp, COMP_TRIGGER_XRUN);
if (ret < 0) {
- trace_pipe_error("px0");
+ trace_pipe_error(p, "px0");
return ret;
}
p->xrun_bytes = 0;
@@ -1065,14 +1075,14 @@ static int pipeline_xrun_recover(struct pipeline *p)
/* prepare the pipeline */
ret = pipeline_prepare(p, p->source_comp);
if (ret < 0) {
- trace_pipe_error("px1");
+ trace_pipe_error(p, "px1");
return ret;
}
/* restart pipeline comps */
ret = pipeline_trigger(p, p->source_comp, COMP_TRIGGER_START);
if (ret < 0) {
- trace_pipe_error("px2");
+ trace_pipe_error(p, "px2");
return ret;
}
@@ -1105,7 +1115,7 @@ static void pipeline_task(void *arg)
struct comp_dev *dev = p->sched_comp;
int err;
- tracev_pipe("PWs");
+ tracev_pipe(p, "PWs");
/* are we in xrun ? */
if (p->xrun_bytes) {
@@ -1116,7 +1126,7 @@ static void pipeline_task(void *arg)
}
/* copy data from upstream source endpoints to downstream endpoints */
- err = pipeline_copy_from_upstream(dev, dev);
+ err = pipeline_copy_from_upstream(p, dev, dev);
if (err < 0) {
err = pipeline_xrun_recover(p);
if (err < 0)
@@ -1124,7 +1134,7 @@ static void pipeline_task(void *arg)
goto sched;
}
- err = pipeline_copy_to_downstream(dev, dev);
+ err = pipeline_copy_to_downstream(p, dev, dev);
if (err < 0) {
err = pipeline_xrun_recover(p);
if (err < 0)
@@ -1133,7 +1143,7 @@ static void pipeline_task(void *arg)
}
sched:
- tracev_pipe("PWe");
+ tracev_pipe(p, "PWe");
/* now reschedule the task */
/* TODO: add in scheduling cost and any timer drift */
@@ -1144,7 +1154,7 @@ sched:
/* init pipeline */
int pipeline_init(void)
{
- trace_pipe("PIn");
+ trace_pipe(NULL, "PIn");
pipe_data = rzalloc(RZONE_RUNTIME, SOF_MEM_CAPS_RAM,
sizeof(*pipe_data));
diff --git a/src/audio/pipeline_static.c b/src/audio/pipeline_static.c
index cf71a36..3de0025 100644
--- a/src/audio/pipeline_static.c
+++ b/src/audio/pipeline_static.c
@@ -423,7 +423,7 @@ int init_static_pipeline(struct ipc *ipc)
return 0;
error:
- trace_pipe_error("ePS");
+ trace_pipe_error(NULL, "ePS");
for (i = 0; i < ARRAY_SIZE(pipeline); i++) {
diff --git a/src/include/sof/audio/pipeline.h b/src/include/sof/audio/pipeline.h
index 1ef53e5..b83c320 100644
--- a/src/include/sof/audio/pipeline.h
+++ b/src/include/sof/audio/pipeline.h
@@ -43,9 +43,18 @@
#include <uapi/ipc.h>
/* pipeline tracing */
-#define trace_pipe(__e) trace_event(TRACE_CLASS_PIPE, __e)
-#define trace_pipe_error(__e) trace_error(TRACE_CLASS_PIPE, __e)
-#define tracev_pipe(__e) tracev_event(TRACE_CLASS_PIPE, __e)
+#define trace_pipe(cp, __e) \
+ trace_pipeline_event(cp, NORMAL_LEVEL, TRACE_CLASS_PIPE, __e)
+#define tracev_pipe(cp, __e) \
+ trace_pipeline_event(cp, VERBOSE_LEVEL, TRACE_CLASS_PIPE, __e)
+#define trace_pipe_error(cp, __e) \
+ trace_pipeline_event_atomic(cp, ERROR_LEVEL, TRACE_CLASS_PIPE, __e)
+#define trace_pipe_value(cp, x) \
+ trace_pipeline_value(cp, NORMAL_LEVEL, x)
+#define tracev_pipe_value(cp, x) \
+ trace_pipeline_value(cp, VERBOSE_LEVEL, x)
+#define trace_pipe_error_value(cp, x) \
+ trace_pipeline_value_atomic(cp, ERROR_LEVEL, x)
struct ipc_pipeline_dev;
struct ipc;
--
2.14.3
More information about the Sound-open-firmware
mailing list