ASoC: SOF: amd: acp-loader: Use GFP_KERNEL for DMA allocations in resume context
authorMuhammad Usama Anjum <usama.anjum@collabora.com>
Fri, 25 Jul 2025 19:02:54 +0000 (00:02 +0500)
committerMark Brown <broonie@kernel.org>
Mon, 28 Jul 2025 17:58:15 +0000 (18:58 +0100)
Replace GFP_ATOMIC with GFP_KERNEL for dma_alloc_coherent() calls. This
change improves memory allocation reliability during firmware loading,
particularly during system resume when memory pressure is high. Because
of using GFP_KERNEL, reclaim can happen which can reduce the probability
of failure.

Fixes memory allocation failures observed during system resume with
fragmented memory conditions.

snd_sof_amd_vangogh 0000:04:00.5: error: failed to load DSP firmware after resume -12

Fixes: 145d7e5ae8f4e ("ASoC: SOF: amd: add option to use sram for data bin loading")
Fixes: 7e51a9e38ab20 ("ASoC: SOF: amd: Add fw loader and renoir dsp ops to load firmware")
Cc: stable@vger.kernel.org
Signed-off-by: Muhammad Usama Anjum <usama.anjum@collabora.com>
Link: https://patch.msgid.link/20250725190254.1081184-1-usama.anjum@collabora.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/amd/acp-loader.c

index ea105227227dc41fb49f4f43793c6cbaf2eb77e3..98324bbade15178ec8cfee706982ee3a88819dcd 100644 (file)
@@ -65,7 +65,7 @@ int acp_dsp_block_write(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_t
                        dma_size = page_count * ACP_PAGE_SIZE;
                        adata->bin_buf = dma_alloc_coherent(&pci->dev, dma_size,
                                                            &adata->sha_dma_addr,
-                                                           GFP_ATOMIC);
+                                                           GFP_KERNEL);
                        if (!adata->bin_buf)
                                return -ENOMEM;
                }
@@ -77,7 +77,7 @@ int acp_dsp_block_write(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_t
                        adata->data_buf = dma_alloc_coherent(&pci->dev,
                                                             ACP_DEFAULT_DRAM_LENGTH,
                                                             &adata->dma_addr,
-                                                            GFP_ATOMIC);
+                                                            GFP_KERNEL);
                        if (!adata->data_buf)
                                return -ENOMEM;
                }
@@ -90,7 +90,7 @@ int acp_dsp_block_write(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_t
                        adata->sram_data_buf = dma_alloc_coherent(&pci->dev,
                                                                  ACP_DEFAULT_SRAM_LENGTH,
                                                                  &adata->sram_dma_addr,
-                                                                 GFP_ATOMIC);
+                                                                 GFP_KERNEL);
                        if (!adata->sram_data_buf)
                                return -ENOMEM;
                }