ALSA: pcm: Check mmap capability of runtime dma buffer at first

Currently we check only the substream->dma_buffer as the preset of the
buffer configuration for verifying the availability of mmap.  But a
few drivers rather set up the buffer in the own way without the
standard buffer preallocation using substream->dma_buffer, and they
miss the proper checks.  (Now it's working more or less fine as most
of them are running only on x86).

Actually, they may set up the runtime dma_buffer (referred via
snd_pcm_get_dma_buf()) at the open callback, though.  That is, this
could have been used as the primary source.

This patch changes the hw_support_mmap() function to check the runtime
dma buffer at first.  It's usually NULL with the standard buffer
preallocation, and in that case, we continue checking
substream->dma_buffer as fallback.

Link: https://lore.kernel.org/r/20210809071829.22238-2-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2021-08-09 09:18:27 +02:00
parent 2c86446f8e
commit cbea6e5a77
1 changed files with 7 additions and 2 deletions

View File

@ -243,13 +243,18 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream,
static bool hw_support_mmap(struct snd_pcm_substream *substream) static bool hw_support_mmap(struct snd_pcm_substream *substream)
{ {
struct snd_dma_buffer *dmabuf;
if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP))
return false; return false;
if (substream->ops->mmap || substream->ops->page) if (substream->ops->mmap || substream->ops->page)
return true; return true;
switch (substream->dma_buffer.dev.type) { dmabuf = snd_pcm_get_dma_buf(substream);
if (!dmabuf)
dmabuf = &substream->dma_buffer;
switch (dmabuf->dev.type) {
case SNDRV_DMA_TYPE_UNKNOWN: case SNDRV_DMA_TYPE_UNKNOWN:
/* we can't know the device, so just assume that the driver does /* we can't know the device, so just assume that the driver does
* everything right * everything right
@ -259,7 +264,7 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream)
case SNDRV_DMA_TYPE_VMALLOC: case SNDRV_DMA_TYPE_VMALLOC:
return true; return true;
default: default:
return dma_can_mmap(substream->dma_buffer.dev.dev); return dma_can_mmap(dmabuf->dev.dev);
} }
} }