[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, ¤t->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, ¤t->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