[PATCH 28/51] DMA-API: sound: fix dma mask handling in a lot of drivers

Takashi Iwai tiwai at suse.de
Thu Sep 26 18:25:13 EST 2013


At Thu, 26 Sep 2013 08:54:25 +0100,
Russell King - ARM Linux wrote:
> 
> On Thu, Sep 26, 2013 at 09:51:23AM +0200, Takashi Iwai wrote:
> > Hi,
> > 
> > sorry for the lat response, as I've been traveling in the last weeks.
> > 
> > At Thu, 19 Sep 2013 22:53:02 +0100,
> > Russell King wrote:
> > > 
> > > This code sequence is unsafe in modules:
> > > 
> > > static u64 mask = DMA_BIT_MASK(something);
> > > ...
> > > 	if (!dev->dma_mask)
> > > 		dev->dma_mask = &mask;
> > > 
> > > as if a module is reloaded, the mask will be pointing at the original
> > > module's mask address, and this can lead to oopses.  Moreover, they
> > > all follow this with:
> > > 
> > > 	if (!dev->coherent_dma_mask)
> > > 		dev->coherent_dma_mask = mask;
> > > 
> > > where 'mask' is the same value as the statically defined mask, and this
> > > bypasses the architecture's check on whether the DMA mask is possible.
> > > 
> > > Fix these issues by using the new dma_coerce_coherent_and_mask()
> > > function.
> > > 
> > > Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
> > 
> > Applied with Mark's ack now.
> 
> Which is a very stupid thing to do because you won't have
> dma_coerce_coherent_and_mask() in your tree, so all these drivers
> will fail to build for you.

Ah, silly me, I missed the very first thing.  Reverted it now...

FWIW, below is the missing piece.  Please apply it in your side if
necessary.


Takashi

---
 sound/soc/fsl/imx-pcm-fiq.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/sound/soc/fsl/imx-pcm-fiq.c b/sound/soc/fsl/imx-pcm-fiq.c
index 34043c5..fd5f2fb 100644
--- a/sound/soc/fsl/imx-pcm-fiq.c
+++ b/sound/soc/fsl/imx-pcm-fiq.c
@@ -272,18 +272,16 @@ static int imx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
 	return 0;
 }
 
-static u64 imx_pcm_dmamask = DMA_BIT_MASK(32);
-
 static int imx_pcm_new(struct snd_soc_pcm_runtime *rtd)
 {
 	struct snd_card *card = rtd->card->snd_card;
 	struct snd_pcm *pcm = rtd->pcm;
-	int ret = 0;
+	int ret;
+
+	ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
+	if (ret)
+		return ret;
 
-	if (!card->dev->dma_mask)
-		card->dev->dma_mask = &imx_pcm_dmamask;
-	if (!card->dev->coherent_dma_mask)
-		card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
 	if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
 		ret = imx_pcm_preallocate_dma_buffer(pcm,
 			SNDRV_PCM_STREAM_PLAYBACK);
-- 
1.8.4


More information about the Linuxppc-dev mailing list