[Sound-open-firmware] [RFC PATCH 1/6] ipc: skip host page table set up for hostless tone pipeline
Ranjani Sridharan
ranjani.sridharan at linux.intel.com
Thu Jun 14 08:13:44 CEST 2018
On Thu, 2018-06-14 at 14:08 +0800, zhigangw wrote:
>
> 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);
Oh yes, Thanks Zhigang. The dangers of copy & paste :)
>
> 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