[alsa-devel] Underrun with 2 periods on skylake HDA driver

Clemens Ladisch clemens at ladisch.de
Wed Aug 10 08:54:22 CEST 2016


Dharageswari R wrote:
> While doing the validation of Skylake HDA driver using aplay and
> following parameters, we noticed underrun issues.
>
> buffer_size  : 9600
> period_size  : 4800
>
> After doing further debugging, what I found is
>
> 1.DMA complete interrupt occurs for the first period.
> 2.Driver reads DMA position in buffer pointer and gets value of 4784.

The interrupt says that the buffer descriptor list entry has been
completed, but the position in buffer pointer says that the entry has
not yet been completed.

> I checked with HDA architects and they are saying that when the DMA
> completion interrupt occurs there can be slight delay before the DMA
> Position In Buffer Pointer gets updated.

The driver's interrupt handler takes care to read the interrupt status
register first, so that any pending memory writes from the device are
flushed.

Of course, this does not work if the device posts writes _after_ the
interrupt has been raised.  This is a bug in the hardware.

> So driver is expected to refill data based on whatever content is
> reflected in the DMA Position In Buffer.

No, that's not how it works.  The driver waits until all 4800 frames
are available, and the only way to wake it up is with an interrupt.


It appears the driver must work around this bug by scheduling another
interrupt after the delay.  Is there an upper limit (time or frames) for
this delay?


Regards,
Clemens


More information about the Alsa-devel mailing list