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:
parent
2c86446f8e
commit
cbea6e5a77
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue