From patchwork Thu Sep 26 08:25:13 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 2947011 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 09341BFF05 for ; Thu, 26 Sep 2013 08:23:44 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 633D820320 for ; Thu, 26 Sep 2013 08:23:39 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0A86820318 for ; Thu, 26 Sep 2013 08:23:38 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VP6rH-0000yz-33; Thu, 26 Sep 2013 08:23:35 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VP6rE-0006ck-D2; Thu, 26 Sep 2013 08:23:32 +0000 Received: from cantor2.suse.de ([195.135.220.15] helo=mx2.suse.de) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VP6rB-0006b9-F0; Thu, 26 Sep 2013 08:23:30 +0000 Received: from relay1.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C885DA4EB7; Thu, 26 Sep 2013 10:23:06 +0200 (CEST) Date: Thu, 26 Sep 2013 10:25:13 +0200 Message-ID: From: Takashi Iwai To: Russell King - ARM Linux Subject: Re: [PATCH 28/51] DMA-API: sound: fix dma mask handling in a lot of drivers In-Reply-To: <20130926075425.GX25647@n2100.arm.linux.org.uk> References: <20130919212235.GD12758@n2100.arm.linux.org.uk> <20130926075425.GX25647@n2100.arm.linux.org.uk> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/24.2 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130926_042329_748268_7D7E54B4 X-CRM114-Status: GOOD ( 27.56 ) X-Spam-Score: -5.9 (-----) Cc: alsa-devel@alsa-project.org, linux-doc@vger.kernel.org, linux-mmc@vger.kernel.org, linux-fbdev@vger.kernel.org, linux-nvme@lists.infradead.org, Jaroslav Kysela , Peter Ujfalusi , linux-ide@vger.kernel.org, Kukjin Kim , devel@driverdev.osuosl.org, linux-samsung-soc@vger.kernel.org, linux-scsi@vger.kernel.org, e1000-devel@lists.sourceforge.net, b43-dev@lists.infradead.org, linux-media@vger.kernel.org, devicetree@vger.kernel.org, Haojian Zhuang , Timur Tabi , Mark Brown , dri-devel@lists.freedesktop.org, Ben Dooks , linux-tegra@vger.kernel.org, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Solarflare linux maintainers , Eric Miao , Sangbeom Kim , netdev@vger.kernel.org, linux-usb@vger.kernel.org, linux-wireless@vger.kernel.org, Liam Girdwood , linux-crypto@vger.kernel.org, uclinux-dist-devel@blackfin.uclinux.org, linuxppc-dev@lists.ozlabs.org, Jarkko Nikula X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-3.2 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 > > > > 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 Acked-by: Takashi Iwai --- 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);