[alsa-devel] [PATCH] ALSA: hda: Reset stream if DMA RUN bit not cleared

Takashi Iwai tiwai at suse.de
Tue Jan 28 10:50:09 CET 2020


On Tue, 28 Jan 2020 06:15:08 +0100,
Mohan Kumar wrote:
> 
> Tegra HDA has FIFO size which can hold upto 10 audio frames to support
> DVFS. When HDA DMA RUN bit is set to 0 to stop the stream, the DMA RUN
> bit will be cleared to 0 only after transferring all the remaining audio
> frames queued up in the fifo. This is not in sync with spec which states
> the controller will stop transmitting(output) in the beginning of the
> next frame for the relevant stream.
> 
> The above behavior with Tegra HDA was resulting in machine check error
> during the system suspend flow with active audio playback with below kernel
> error logs.
> [ 33.524583] mc-err: [mcerr] (hda) csr_hdar: EMEM address decode error
> [ 33.531088] mc-err: [mcerr] status = 0x20000015; addr = 0x00000000
> [ 33.537431] mc-err: [mcerr] secure: no, access-type: read, SMMU fault: none
> 
> This was due to the fifo has more than one audio frame when the DMA
> RUN bit is set to 0 during system suspend flow and the timeout handling in
> snd_hdac_stream_sync() was not designed to handle this scenario. So the
> DMA will continue running even after timeout hit until all remaining
> audio frames in the fifo are transferred, but the suspend flow will try
> to reset the controller and turn off the hda clocks without the knowledge
> of the DMA is still running and could result in mc-err.
> 
> The above issue can be resolved by doing stream reset with the help of
> snd_hdac_stream_reset() which would ensure the DMA RUN bit is cleared
> if the timeout was hit in snd_hdac_stream_sync().
> 
> Signed-off-by: Mohan Kumar <mkumard at nvidia.com>

Applied now.  Thanks.


Takashi


More information about the Alsa-devel mailing list