On Tue, 05 Nov 2019 18:58:53 +0100, Ranjani Sridharan wrote:
On Tue, 2019-11-05 at 09:01 +0100, Takashi Iwai wrote:
Currently we pass the artificial device pointer to the allocation helper in the case of SNDRV_DMA_TYPE_CONTINUOUS for passing the GFP flags. But all common cases are the allocations with GFP_KERNEL, and it's messy to put this in each place.
In this patch, the memalloc core helper is changed to accept the NULL device pointer and it treats as the default mode, GFP_KERNEL, so that all callers can omit the complex argument but just leave NULL.
Signed-off-by: Takashi Iwai tiwai@suse.de
Documentation/sound/kernel-api/writing-an-alsa-driver.rst | 14 ++++++++------ sound/core/memalloc.c | 9 ++++++++- 2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/Documentation/sound/kernel-api/writing-an-alsa- driver.rst b/Documentation/sound/kernel-api/writing-an-alsa- driver.rst index 132f5eb9b530..5385618fd881 100644 --- a/Documentation/sound/kernel-api/writing-an-alsa-driver.rst +++ b/Documentation/sound/kernel-api/writing-an-alsa-driver.rst @@ -3523,12 +3523,14 @@ The second argument (type) and the third argument (device pointer) are dependent on the bus. For normal devices, pass the device pointer (typically identical as ``card->dev``) to the third argument with ``SNDRV_DMA_TYPE_DEV`` type. For the continuous buffer unrelated to
Hi Takashi,
I have a question about the usage of snd_dma_alloc_pages() with the SNDRV_DMA_TYPE_DEV type. I am working on adding a platform-device for audio which is a child device of the top-level PCI device in SOF. When I use the handle for the platform-device as the "dev" argument for snd_dma_alloc_pages(), the dma alloc fails on some platforms (ex: Ice Lake). But it works fine if I use the top-level PCI device instead. Why would that be? Are there any restrictions to what devices can be used for dma alloc?
This pretty much depends on the device. Basically the ALSA memalloc stuff simply calls dma_alloc_coherent() if the buffer type is SNDRV_DMA_TYPE_DEV, and the rest goes deeply into the code in kernel/dma/*.
My wild guess is that the significant difference in your case is about the DMA coherence mask set on the device. As default the platform device keeps 32bit DMA while the modern PCI drivers often sets up 64bit DMA mask.
Takashi