lkml.org 
[lkml]   [2021]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 30/31] ASoC: intel: atom: Fix breakage for PCM buffer address setup
    Date
    From: Takashi Iwai <tiwai@suse.de>

    [ Upstream commit 65ca89c2b12cca0d473f3dd54267568ad3af55cc ]

    The commit 2e6b836312a4 ("ASoC: intel: atom: Fix reference to PCM
    buffer address") changed the reference of PCM buffer address to
    substream->runtime->dma_addr as the buffer address may change
    dynamically. However, I forgot that the dma_addr field is still not
    set up for the CONTINUOUS buffer type (that this driver uses) yet in
    5.14 and earlier kernels, and it resulted in garbage I/O. The problem
    will be fixed in 5.15, but we need to address it quickly for now.

    The fix is to deduce the address again from the DMA pointer with
    virt_to_phys(), but from the right one, substream->runtime->dma_area.

    Fixes: 2e6b836312a4 ("ASoC: intel: atom: Fix reference to PCM buffer address")
    Reported-and-tested-by: Hans de Goede <hdegoede@redhat.com>
    Cc: <stable@vger.kernel.org>
    Acked-by: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/2048c6aa-2187-46bd-6772-36a4fb3c5aeb@redhat.com
    Link: https://lore.kernel.org/r/20210819152945.8510-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/intel/atom/sst-mfld-platform-pcm.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
    index 64079423b298..d0d338533eb6 100644
    --- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c
    +++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
    @@ -134,7 +134,7 @@ static void sst_fill_alloc_params(struct snd_pcm_substream *substream,
    snd_pcm_uframes_t period_size;
    ssize_t periodbytes;
    ssize_t buffer_bytes = snd_pcm_lib_buffer_bytes(substream);
    - u32 buffer_addr = substream->runtime->dma_addr;
    + u32 buffer_addr = virt_to_phys(substream->runtime->dma_area);

    channels = substream->runtime->channels;
    period_size = substream->runtime->period_size;
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-08-24 19:42    [W:3.055 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site