[Sound-open-firmware] [PATCH 4/5][RFC] APL/CNL: Implement host DMA setting and position update on APL/CNL.

yanwang yan.wang at linux.intel.com
Wed Mar 14 07:12:30 CET 2018


On Tue, 2018-03-13 at 10:53 +0000, Liam Girdwood wrote:
> On Tue, 2018-03-13 at 18:16 +0800, yan.wang at linux.intel.com wrote:
> > 
> > From: Yan Wang <yan.wang at linux.intel.com>
> > 
> > The host DMA has the different config method:
> > 1. Get DMA channel based on stream tag.
> > 2. Prepare DMA elem list based on local DMA trace buffer which make
> > sure that one trace record data can be transferred at least.
> > 3. Need start DMA on firmware side before trigger start on kernel
> > side.
> > 4. Because no DMA callback in host DMA, add position update
> > calling at the end of trace_work().
> > 
> > Signed-off-by: Yan Wang <yan.wang at linux.intel.com>
> > ---
> >  src/lib/dma-trace.c | 73
> > +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 73 insertions(+)
> > 
> > diff --git a/src/lib/dma-trace.c b/src/lib/dma-trace.c
> > index b08e7fb..51e413c 100644
> > --- a/src/lib/dma-trace.c
> > +++ b/src/lib/dma-trace.c
> > @@ -120,6 +120,10 @@ out:
> >  
> >  	spin_unlock_irq(&d->lock, flags);
> >  
> > +#if defined CONFIG_DMA_GW
> > +	ipc_dma_trace_send_position();
> > +#endif
> 
> Why do we only send trace position to host with GW DMA ? If there is
> a valid
> reason then we need to comment that reason next to the code.

Because GW DMA hasn't dma completion callback for doing this.
I will add comments for this.

> 
> 
> > 
> > +
> >  	/* reschedule the trace copying work */
> >  	return DMA_TRACE_PERIOD;
> >  }
> > @@ -163,7 +167,11 @@ int dma_trace_init_complete(struct
> > dma_trace_data *d)
> >  	trace_buffer("dtn");
> >  
> >  	/* init DMA copy context */
> > +#if defined CONFIG_DMA_GW
> > +	ret = dma_copy_new(&d->dc, DMA_HOST_IN_DMAC);
> > +#else
> >  	ret = dma_copy_new(&d->dc, PLATFORM_TRACE_DMAC);
> > +#endif
> 
> Why not define PLATFORM_TRACE_DMAC as DMA_HOST_IN_DMAC in platform.h
> for APL and
> CNL ?

sure.

> 
> > 
> >  	if (ret < 0) {
> >  		trace_buffer_error("edm");
> >  		rfree(buffer->addr);
> > @@ -195,8 +203,73 @@ int dma_trace_host_buffer(struct
> > dma_trace_data *d,
> > struct dma_sg_elem *elem,
> >  	return 0;
> >  }
> >  
> > +#if defined CONFIG_DMA_GW
> > +
> > +static int dma_trace_start(struct dma_trace_data *d)
> > +{
> > +	struct dma_sg_config config;
> > +	struct dma_sg_elem *e;
> > +	uint32_t elem_size, elem_addr, elem_num;
> > +	int err = 0;
> > +	int i;
> > +
> > +	err = dma_set_channel(&d->dc, d->stream_tag);
> > +	if (err < 0)
> > +		return err;
> > +
> > +	/* size of every trace record */
> > +	elem_size = sizeof(uint64_t) * 2;
> > +
> > +	/* Initialize address of local elem */
> > +	elem_addr = (uint32_t)d->dmatb.addr;
> > +
> > +	/* the number of elem list */
> > +	elem_num = DMA_TRACE_LOCAL_SIZE / elem_size;
> > +
> > +	config.direction = DMA_DIR_LMEM_TO_HMEM;
> > +	config.src_width = sizeof(uint32_t);
> > +	config.dest_width = sizeof(uint32_t);
> > +	config.cyclic = 0;
> > +	list_init(&config.elem_list);
> > +
> > +	/* generate local elem list for local trace buffer */
> > +	e = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, sizeof(*e) *
> > elem_num);
> > +	if (!e)
> > +		return -ENOMEM;
> > +
> > +	for (i = 0; i < elem_num; i++) {
> > +		e[i].dest = 0;
> > +		e[i].src = elem_addr;
> > +		e[i].size = elem_size; /* the minimum size of DMA
> > copy */
> > +
> > +		list_item_append(&e[i].list, &config.elem_list);
> > +		elem_addr += elem_size;
> > +	}
> > +
> > +	err = dma_set_config(d->dc.dmac, d->dc.chan, &config);
> > +	if (err < 0) {
> > +		rfree(e);
> > +		return err;
> > +	}
> > +
> > +	err = dma_start(d->dc.dmac, d->dc.chan);
> > +
> > +	rfree(e);
> > +	return err;
> > +}
> > +
> > +#endif
> > +
> >  int dma_trace_enable(struct dma_trace_data *d)
> >  {
> > +#if defined CONFIG_DMA_GW
> > +	int err;
> > +
> > +	err = dma_trace_start(d);
> > +	if (err < 0)
> > +		return err;
> > +#endif
> 
> Can you comment why we start trace for GW DMA here.

Yes.
Thanks.

Yan Wang

> 
> > 
> > +
> >  	/* validate DMA context */
> >  	if (d->dc.dmac == NULL || d->dc.chan < 0) {
> >  		trace_error_atomic(TRACE_CLASS_BUFFER, "eem");
> ---------------------------------------------------------------------
> Intel Corporation (UK) Limited
> Registered No. 1134945 (England)
> Registered Office: Pipers Way, Swindon SN3 1RJ
> VAT No: 860 2173 47
> 
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
> _______________________________________________
> Sound-open-firmware mailing list
> Sound-open-firmware at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/sound-open-firmware


More information about the Sound-open-firmware mailing list