[Sound-open-firmware] [RFC PATCH 1/6] ipc: skip host page table set up for hostless tone pipeline

zhigangw zhigang.wu at linux.intel.com
Thu Jun 14 08:08:16 CEST 2018



On 2018年06月14日 11:29, Ranjani Sridharan wrote:
> Hostless pipelines such as the tone pipeline do not need
> host page table while setting up pcm params. Walk pipeline
> in both directions to ensure it is hostless.
>
> Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>
> ---
>   src/ipc/handler.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++-
>   1 file changed, 75 insertions(+), 1 deletion(-)
>
> diff --git a/src/ipc/handler.c b/src/ipc/handler.c
> index 581ce9e..8c46cc2 100644
> --- a/src/ipc/handler.c
> +++ b/src/ipc/handler.c
> @@ -34,6 +34,7 @@
>    *
>    */
>   
> +#include <stdbool.h>
>   #include <sof/debug.h>
>   #include <sof/timer.h>
>   #include <sof/interrupt.h>
> @@ -83,6 +84,71 @@ static inline struct sof_ipc_hdr *mailbox_validate(void)
>   	return hdr;
>   }
>   
> +/* check if a pipeline is hostless when walking downstream */
> +static bool is_hostless_downstream(struct comp_dev *current)
> +{
> +	struct list_item *clist;
> +
> +	/* check if current is a HOST comp */
> +	if (current->comp.type == SOF_COMP_HOST ||
> +	    current->comp.type == SOF_COMP_SG_HOST)
> +		return false;
> +
> +	/* check if the pipeline has a HOST comp downstream */
> +	list_for_item(clist, &current->bsink_list) {
> +		struct comp_buffer *buffer;
> +
> +		buffer = container_of(clist, struct comp_buffer, source_list);
> +
> +		/* don't go downstream if this component is not connected */
> +		if (!buffer->connected)
> +			continue;
> +
> +		/* dont go downstream if this comp belongs to another pipe */
> +		if (buffer->sink->comp.pipeline_id != current->comp.pipeline_id)
> +			continue;
> +
> +		/* return if there's a host comp downstream */
> +		if (!is_hostless_downstream(buffer->sink))
> +			return false;
> +	}
> +
> +	return true;
> +}
> +
> +/* check if a pipeline is hostless when walking upstream */
> +static bool is_hostless_upstream(struct comp_dev *current)
> +{
> +	struct list_item *clist;
> +
> +	/* check if current is a HOST comp */
> +	if (current->comp.type == SOF_COMP_HOST ||
> +	    current->comp.type == SOF_COMP_SG_HOST)
> +		return false;
> +
> +	/* check if the pipeline has a HOST comp upstream */
> +	list_for_item(clist, &current->bsource_list) {
> +		struct comp_buffer *buffer;
> +
> +		buffer = container_of(clist, struct comp_buffer, source_list);

I think it should be:
buffer = container_of(clist, struct comp_buffer, sink_list);

thanks
~zhigang

> +
> +		/* don't go upstream if this component is not connected */
> +		if (!buffer->connected)
> +			continue;
> +
> +		/* dont go upstream if this comp belongs to another pipeline */
> +		if (buffer->source->comp.pipeline_id !=
> +		    current->comp.pipeline_id)
> +			continue;
> +
> +		/* return if there is a host comp upstream */
> +		if (!is_hostless_upstream(buffer->sink))
> +			return false;
> +	}
> +
> +	return true;
> +}
> +
>   /*
>    * Stream IPC Operations.
>    */
> @@ -125,8 +191,14 @@ static int ipc_stream_pcm_params(uint32_t stream)
>   	cd = pcm_dev->cd;
>   	cd->params = pcm_params->params;
>   
> -#ifdef CONFIG_HOST_PTABLE
> +	/*
> +	 * walk in both directions to check if the pipeline is hostless
> +	 * skip page table set up if it is
> +	 */
> +	if (is_hostless_downstream(cd) && is_hostless_upstream(cd))
> +		goto pipe_params;
>   
> +#ifdef CONFIG_HOST_PTABLE
>   	list_init(&elem_list);
>   
>   	/* use DMA to read in compressed page table ringbuffer from host */
> @@ -163,6 +235,8 @@ static int ipc_stream_pcm_params(uint32_t stream)
>   	}
>   #endif
>   
> +pipe_params:
> +
>   	/* configure pipeline audio params */
>   	err = pipeline_params(pcm_dev->cd->pipeline, pcm_dev->cd, pcm_params);
>   	if (err < 0) {



More information about the Sound-open-firmware mailing list