alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
From: Russell King <rmk+kernel@arm.linux.org.uk>
To: alsa-devel@alsa-project.org, b43-dev@lists.infradead.org,
	devel@driverdev.osuosl.org, devicetree@vger.kernel.org,
	dri-devel@lists.freedesktop.org,
	e1000-devel@lists.sourceforge.net,
	linux-arm-kernel@lists.infradead.org,
	linux-crypto@vger.kernel.org, linux-doc@vger.kernel.org,
	linux-fbdev@vger.kernel.org, linux-ide@vger.kernel.org,
	linux-media@vger.kernel.org, linux-mmc@vger.kernel.org,
	linux-nvme@lists.infradead.org, linux-omap@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, linux-samsung-soc@vger.kernel.org,
	linux-scsi@vger.kernel.org, linux-tegra@vger.kernel.org,
	linux-usb@vger.kernel.org, linux-wireless@vger.kernel.org,
	netdev@vger.kernel.org,
	Solarflare linux maintainers <linux-net-drivers@solarflare.com>,
	uclinux-dist-devel@blackfin.uclinux.org
Subject: [PATCH 46/51] ARM: DMA-API: better handing of DMA masks for coherent allocations
Date: Fri, 20 Sep 2013 00:39:06 +0100	[thread overview]
Message-ID: <E1VMnoQ-0000QN-2l@rmk-PC.arm.linux.org.uk> (raw)
In-Reply-To: <20130919212235.GD12758@n2100.arm.linux.org.uk>

We need to start treating DMA masks as something which is specific to
the bus that the device resides on, otherwise we're going to hit all
sorts of nasty issues with LPAE and 32-bit DMA controllers in >32-bit
systems, where memory is offset from PFN 0.

In order to start doing this, we convert the DMA mask to a PFN using
the device specific dma_to_pfn() macro.  This is the reverse of the
pfn_to_dma() macro which is used to get the DMA address for the device.

This gives us a PFN mask, which we can then check against the PFN
limit of the DMA zone.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
 arch/arm/mm/dma-mapping.c |   49 ++++++++++++++++++++++++++++++++++++++++----
 arch/arm/mm/init.c        |    2 +
 arch/arm/mm/mm.h          |    2 +
 3 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index f5e1a84..13d55e1 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -173,10 +173,30 @@ static u64 get_coherent_dma_mask(struct device *dev)
 			return 0;
 		}
 
-		if ((~mask) & (u64)arm_dma_limit) {
-			dev_warn(dev, "coherent DMA mask %#llx is smaller "
-				 "than system GFP_DMA mask %#llx\n",
-				 mask, (u64)arm_dma_limit);
+		/*
+		 * If the mask allows for more memory than we can address,
+		 * and we actually have that much memory, then fail the
+		 * allocation.
+		 */
+		if (sizeof(mask) != sizeof(dma_addr_t) &&
+		    mask > (dma_addr_t)~0 &&
+		    dma_to_pfn(dev, ~0) > arm_dma_pfn_limit) {
+			dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n",
+				 mask);
+			dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n");
+			return 0;
+		}
+
+		/*
+		 * Now check that the mask, when translated to a PFN,
+		 * fits within the allowable addresses which we can
+		 * allocate.
+		 */
+		if (dma_to_pfn(dev, mask) < arm_dma_pfn_limit) {
+			dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n",
+				 mask,
+				 dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1,
+				 arm_dma_pfn_limit + 1);
 			return 0;
 		}
 	}
@@ -1007,8 +1027,27 @@ void arm_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
  */
 int dma_supported(struct device *dev, u64 mask)
 {
-	if (mask < (u64)arm_dma_limit)
+	unsigned long limit;
+
+	/*
+	 * If the mask allows for more memory than we can address,
+	 * and we actually have that much memory, then we must
+	 * indicate that DMA to this device is not supported.
+	 */
+	if (sizeof(mask) != sizeof(dma_addr_t) &&
+	    mask > (dma_addr_t)~0 &&
+	    dma_to_pfn(dev, ~0) > arm_dma_pfn_limit)
+		return 0;
+
+	/*
+	 * Translate the device's DMA mask to a PFN limit.  This
+	 * PFN number includes the page which we can DMA to.
+	 */
+	limit = dma_to_pfn(dev, mask);
+
+	if (limit < arm_dma_pfn_limit)
 		return 0;
+
 	return 1;
 }
 EXPORT_SYMBOL(dma_supported);
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index febaee7..8aab24f 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -218,6 +218,7 @@ EXPORT_SYMBOL(arm_dma_zone_size);
  * so a successful GFP_DMA allocation will always satisfy this.
  */
 phys_addr_t arm_dma_limit;
+unsigned long arm_dma_pfn_limit;
 
 static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole,
 	unsigned long dma_size)
@@ -240,6 +241,7 @@ void __init setup_dma_zone(const struct machine_desc *mdesc)
 		arm_dma_limit = PHYS_OFFSET + arm_dma_zone_size - 1;
 	} else
 		arm_dma_limit = 0xffffffff;
+	arm_dma_pfn_limit = arm_dma_limit >> PAGE_SHIFT;
 #endif
 }
 
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h
index d5a4e9a..d5a982d 100644
--- a/arch/arm/mm/mm.h
+++ b/arch/arm/mm/mm.h
@@ -81,8 +81,10 @@ extern __init void add_static_vm_early(struct static_vm *svm);
 
 #ifdef CONFIG_ZONE_DMA
 extern phys_addr_t arm_dma_limit;
+extern unsigned long arm_dma_pfn_limit;
 #else
 #define arm_dma_limit ((phys_addr_t)~0)
+#define arm_dma_pfn_limit (~0ul >> PAGE_SHIFT)
 #endif
 
 extern phys_addr_t arm_lowmem_limit;
-- 
1.7.4.4

  parent reply	other threads:[~2013-09-20  1:18 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-19 21:22 [PATCH 00/51] DMA mask changes Russell King - ARM Linux
2013-09-19 21:25 ` [PATCH 01/51] DMA-API: provide a helper to set both DMA and coherent DMA masks Russell King
     [not found]   ` <E1VMlja-0007fA-HU-eh5Bv4kxaXIANfyc6IWni62ZND6+EDdj@public.gmane.org>
2013-09-20  1:21     ` Ben Hutchings
     [not found]       ` <1379640097.2500.4.camel-/LGg1Z1CJKQ+9kgCwbf1HqK4ta4zdZpAajtMo4Cw6ucAvxtiuMwx3w@public.gmane.org>
2013-09-20 14:12         ` Russell King - ARM Linux
2013-09-19 21:26 ` [PATCH 02/51] DMA-API: net: brocade/bna/bnad.c: fix 32-bit DMA mask handling Russell King
2013-09-19 21:27 ` [PATCH 03/51] DMA-API: net: intel/e1000e: " Russell King
2013-09-20 19:48   ` Jeff Kirsher
2013-09-19 21:30 ` [PATCH 06/51] DMA-API: net: intel/ixgb: " Russell King
2013-09-20 19:50   ` Jeff Kirsher
2013-09-19 21:31 ` [PATCH 07/51] DMA-API: net: intel/ixgbe: " Russell King
2013-09-20 19:51   ` Jeff Kirsher
2013-09-19 21:34 ` [PATCH 10/51] DMA-API: net: broadcom/bnx2x: replace dma_set_mask()+dma_set_coherent_mask() with new helper Russell King
2013-09-19 21:37 ` [PATCH 12/51] DMA-API: net: intel/e1000: " Russell King
2013-09-20 19:45   ` Jeff Kirsher
2013-09-19 21:38 ` [PATCH 13/51] DMA-API: net: sfc/efx.c: " Russell King
2013-09-19 21:39 ` [PATCH 14/51] DMA-API: net: b43: " Russell King
2013-09-19 21:40 ` [PATCH 15/51] DMA-API: net: b43legacy: " Russell King
2013-09-19 21:41 ` [PATCH 16/51] DMA-API: ppc: vio.c: " Russell King
2013-11-15 16:16   ` Cedric Le Goater
2013-09-19 21:42 ` [PATCH 17/51] DMA-API: block: nvme-core: " Russell King
2013-09-19 21:43 ` [PATCH 18/51] DMA-API: staging: et131x: " Russell King
2013-09-19 21:44 ` [PATCH 19/51] DMA-API: media: dt3155v4l: " Russell King
2013-09-30 11:57   ` Hans Verkuil
     [not found]     ` <5249673B.5020705-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2013-10-31 11:46       ` Mauro Carvalho Chehab
2013-10-31 14:49         ` Russell King - ARM Linux
2013-09-19 21:45 ` [PATCH 20/51] DMA-API: usb: bcma: " Russell King
2013-09-19 21:46 ` [PATCH 21/51] DMA-API: usb: ssb-hcd: " Russell King
2013-09-19 21:47 ` [PATCH 22/51] DMA-API: amba: get rid of separate dma_mask Russell King
2013-09-22 12:18   ` Grant Likely
2013-09-19 21:48 ` [PATCH 23/51] DMA-API: dma: pl08x: add dma_set_mask_and_coherent() call Russell King
     [not found]   ` <E1VMm4v-0007hz-RC-eh5Bv4kxaXIANfyc6IWni62ZND6+EDdj@public.gmane.org>
2013-09-23 10:12     ` [alsa-devel] " Vinod Koul
2013-09-19 21:49 ` [PATCH 24/51] DMA-API: dma: pl330: " Russell King
     [not found]   ` <E1VMm5t-0007i5-V7-eh5Bv4kxaXIANfyc6IWni62ZND6+EDdj@public.gmane.org>
2013-09-20 17:26     ` Heiko Stübner
2013-09-21 20:00       ` Russell King - ARM Linux
2013-09-23 10:43         ` [alsa-devel] " Vinod Koul
2013-09-19 21:50 ` [PATCH 25/51] DMA-API: video: clcd: " Russell King
2013-09-19 21:51 ` [PATCH 26/51] DMA-API: usb: ohci-sa1111: add a note about DMA masks Russell King
2013-09-19 21:53 ` [PATCH 28/51] DMA-API: sound: fix dma mask handling in a lot of drivers Russell King
2013-09-20 16:36   ` Mark Brown
2013-09-26  7:51   ` Takashi Iwai
2013-09-26  7:54     ` Russell King - ARM Linux
2013-09-26  8:25       ` Takashi Iwai
2013-09-26  8:29         ` Takashi Iwai
2013-09-19 21:54 ` [PATCH 29/51] DMA-API: ata: pata_octeon_cf: convert to use dma_coerce_mask_and_coherent() Russell King
2013-10-30 19:08   ` Geert Uytterhoeven
2013-09-19 21:55 ` [PATCH 30/51] DMA-API: dma: dw_dmac.c: " Russell King
2013-09-19 21:56 ` [PATCH 31/51] DMA-API: media: omap3isp: " Russell King
     [not found]   ` <E1VMmCg-0007j1-Pi-eh5Bv4kxaXIANfyc6IWni62ZND6+EDdj@public.gmane.org>
2013-09-27  1:56     ` Laurent Pinchart
2013-09-19 21:57 ` [PATCH 32/51] DMA-API: mmc: sdhci-acpi: " Russell King
2013-09-19 21:58 ` [PATCH 33/51] DMA-API: net: nxp/lpc_eth: " Russell King
2013-09-19 21:59 ` [PATCH 34/51] DMA-API: net: octeon: " Russell King
2013-09-19 22:00 ` [PATCH 35/51] DMA-API: parport: parport_pc.c: " Russell King
2013-09-19 22:01 ` [PATCH 36/51] DMA-API: usb: use dma_set_coherent_mask() Russell King
2013-09-20 13:08   ` Felipe Balbi
2013-09-23 12:30   ` Nicolas Ferre
2013-09-23 18:27   ` Alan Stern
     [not found]     ` <Pine.LNX.4.44L0.1309231418030.1348-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-09-23 18:42       ` Russell King - ARM Linux
2013-09-19 22:02 ` [PATCH 37/51] DMA-API: usb: use new dma_coerce_mask_and_coherent() Russell King
2013-09-20 13:10   ` Felipe Balbi
     [not found]   ` <E1VMmIV-0007jw-Gq-eh5Bv4kxaXIANfyc6IWni62ZND6+EDdj@public.gmane.org>
2013-09-23 12:34     ` Nicolas Ferre
2013-09-19 22:03 ` [PATCH 38/51] DMA-API: staging: use dma_set_coherent_mask() Russell King
2013-09-19 23:11 ` [PATCH 39/51] DMA-API: others: " Russell King
2013-09-20 12:16   ` Tejun Heo
2013-09-20 12:18     ` Tejun Heo
2013-09-20 14:00     ` Russell King - ARM Linux
2013-09-20 22:20       ` Tejun Heo
2013-09-26 10:51   ` Archit Taneja
2013-09-19 23:12 ` [PATCH 40/51] DMA-API: crypto: fix ixp4xx crypto platform device support Russell King
2013-09-19 23:13 ` [PATCH 41/51] DMA-API: crypto: remove last references to 'static struct device *dev' Russell King
2013-09-19 23:14 ` [PATCH 42/51] DMA-API: usb: musb: use platform_device_register_full() to avoid directly messing with dma masks Russell King
2013-09-20 13:11   ` Felipe Balbi
2013-09-20 13:49     ` Russell King - ARM Linux
2013-09-20 15:15       ` Felipe Balbi
     [not found] ` <20130919212235.GD12758-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2013-09-19 21:28   ` [PATCH 04/51] DMA-API: net: intel/igb: fix 32-bit DMA mask handling Russell King
2013-09-20 19:49     ` Jeff Kirsher
2013-09-19 21:29   ` [PATCH 05/51] DMA-API: net: intel/igbvf: " Russell King
2013-09-20 19:49     ` Jeff Kirsher
2013-09-19 21:32   ` [PATCH 08/51] DMA-API: net: intel/ixgbevf: " Russell King
2013-09-20 19:51     ` Jeff Kirsher
2013-09-19 21:33   ` [PATCH 09/51] DMA-API: net: broadcom/b44: replace dma_set_mask()+dma_set_coherent_mask() with new helper Russell King
2013-09-19 21:36   ` [PATCH 11/51] DMA-API: net: emulex/benet: " Russell King
2013-09-19 21:52   ` [PATCH 27/51] DMA-API: provide a helper to setup DMA masks Russell King
2013-09-19 23:15   ` [PATCH 43/51] DMA-API: dma: edma.c: no need to explicitly initialize " Russell King
2013-09-23 10:25     ` [alsa-devel] " Vinod Koul
2013-09-23 11:37       ` Russell King - ARM Linux
2013-09-19 23:16   ` [PATCH 44/51] DMA-API: dcdbas: update DMA mask handing Russell King
2013-09-19 23:17 ` [PATCH 45/51] DMA-API: firmware/google/gsmi.c: avoid direct access to DMA masks Russell King
2013-09-19 23:39 ` Russell King [this message]
2013-09-19 23:40 ` [PATCH 47/51] ARM: 7794/1: block: Rename parameter dma_mask to max_addr for blk_queue_bounce_limit() Russell King
2013-09-19 23:41 ` [PATCH 48/51] ARM: 7795/1: mm: dma-mapping: Add dma_max_pfn(dev) helper function Russell King
2013-09-19 23:42 ` [PATCH 49/51] ARM: 7796/1: scsi: Use dma_max_pfn(dev) helper for bounce_limit calculations Russell King
2013-09-19 23:43 ` [PATCH 50/51] ARM: 7797/1: mmc: " Russell King
2013-09-19 23:44 ` [PATCH 51/51] ARM: 7805/1: mm: change max*pfn to include the physical offset of memory Russell King
2013-09-26 20:23 ` [PATCH 00/51] DMA mask changes Rafał Miłecki
2013-09-27  8:27   ` Russell King - ARM Linux

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1VMnoQ-0000QN-2l@rmk-PC.arm.linux.org.uk \
    --to=rmk+kernel@arm.linux.org.uk \
    --cc=alsa-devel@alsa-project.org \
    --cc=b43-dev@lists.infradead.org \
    --cc=devel@driverdev.osuosl.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=e1000-devel@lists.sourceforge.net \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-net-drivers@solarflare.com \
    --cc=linux-nvme@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=netdev@vger.kernel.org \
    --cc=uclinux-dist-devel@blackfin.uclinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).