forked from Minki/linux
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)
|
||||
{
|
||||
struct snd_dma_buffer *dmabuf;
|
||||
|
||||
if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP))
|
||||
return false;
|
||||
|
||||
if (substream->ops->mmap || substream->ops->page)
|
||||
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:
|
||||
/* we can't know the device, so just assume that the driver does
|
||||
* everything right
|
||||
@ -259,7 +264,7 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream)
|
||||
case SNDRV_DMA_TYPE_VMALLOC:
|
||||
return true;
|
||||
default:
|
||||
return dma_can_mmap(substream->dma_buffer.dev.dev);
|
||||
return dma_can_mmap(dmabuf->dev.dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user