[Sound-open-firmware] [PATCH] sof: Turn IRQs off globally when send command to pipeline component
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Tue Mar 27 17:37:56 CEST 2018
On 3/27/18 4:17 AM, Wu Zhigang wrote:
> When pipeline processing the command, we have to turn off the IRQs.
> If not, the DMA IRQ will interrupt the pipeline state set process,
> when pipeline is scheduled, the states inconsistence will cause xrun.
we disable the irqs but then will walk the graph from host to DAI with
component_op_downstream to pass a COMPS_OPS_CMD with in turn will call
all .cmd callbacks from all components
This could take a significant amount of time and lead to interrupts
unrelated to that specific pipeline not being serviced, leading to xruns.
what am I missing?
>
> Signed-off-by: Wu Zhigang <zhigang.wu at linux.intel.com>
>
> ---
> Tested with
> apl-gpmrb board
>
> kernel: https://github.com/plbossart/sound.git branch: topic/sof-v4.14
> 95d77adbaadc44b28c8975a3714f70824d1a8529
>
> firmware: git://git.alsa-project.org/sound-open-firmware.git branch: 1.1-stable
> 210989dffeea811de2370fccb7cf5d53106b1e6e
>
> tools: branch: 1.1-stable
> cc91c73aa3e91eea35abdeb76d578b97f718feff
> ---
> src/audio/pipeline.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c
> index 1b7f248..23be503 100644
> --- a/src/audio/pipeline.c
> +++ b/src/audio/pipeline.c
> @@ -627,6 +627,7 @@ int pipeline_cmd(struct pipeline *p, struct comp_dev *host, int cmd,
> {
> struct op_data op_data;
> int ret;
> + uint32_t flags;
>
> trace_pipe("cmd");
>
> @@ -635,7 +636,7 @@ int pipeline_cmd(struct pipeline *p, struct comp_dev *host, int cmd,
> op_data.cmd = cmd;
> op_data.cmd_data = data;
>
> - spin_lock(&p->lock);
> + spin_lock_irq(&p->lock, flags);
>
> if (host->params.direction == SOF_IPC_STREAM_PLAYBACK) {
> /* send cmd downstream from host to DAI */
> @@ -651,7 +652,7 @@ int pipeline_cmd(struct pipeline *p, struct comp_dev *host, int cmd,
> trace_error_value(cmd);
> }
>
> - spin_unlock(&p->lock);
> + spin_unlock_irq(&p->lock, flags);
> return ret;
> }
>
>
More information about the Sound-open-firmware
mailing list