diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-09-02 20:09:36 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-09-02 20:09:36 -0700 | 
| commit | 60c1f89241d49bacf71035470684a8d7b4bb46ea (patch) | |
| tree | f545bc7a0ddd189b956e65353f36661f4fc12ae1 | |
| parent | 57361846b52bc686112da6ca5368d11210796804 (diff) | |
| parent | 8c89ef7b6b64ba093239305f77a485905d03f7bf (diff) | |
| download | blackbird-op-linux-60c1f89241d49bacf71035470684a8d7b4bb46ea.tar.gz blackbird-op-linux-60c1f89241d49bacf71035470684a8d7b4bb46ea.zip  | |
Merge tag 'dma-mapping-4.19-2' of git://git.infradead.org/users/hch/dma-mapping
Pull dma-mapping fixes from Christoph Hellwig:
 "A few fixes for the fallout of being a little more pedantic about dma
  masks"
* tag 'dma-mapping-4.19-2' of git://git.infradead.org/users/hch/dma-mapping:
  of/platform: initialise AMBA default DMA masks
  sparc: set a default 32-bit dma mask for OF devices
  kernel/dma/direct: take DMA offset into account in dma_direct_supported
| -rw-r--r-- | arch/sparc/kernel/of_device_32.c | 4 | ||||
| -rw-r--r-- | arch/sparc/kernel/of_device_64.c | 3 | ||||
| -rw-r--r-- | drivers/of/platform.c | 4 | ||||
| -rw-r--r-- | kernel/dma/direct.c | 4 | 
4 files changed, 13 insertions, 2 deletions
diff --git a/arch/sparc/kernel/of_device_32.c b/arch/sparc/kernel/of_device_32.c index 3641a294ed54..e4abe9b8f97a 100644 --- a/arch/sparc/kernel/of_device_32.c +++ b/arch/sparc/kernel/of_device_32.c @@ -9,6 +9,7 @@  #include <linux/irq.h>  #include <linux/of_device.h>  #include <linux/of_platform.h> +#include <linux/dma-mapping.h>  #include <asm/leon.h>  #include <asm/leon_amba.h> @@ -381,6 +382,9 @@ static struct platform_device * __init scan_one_device(struct device_node *dp,  	else  		dev_set_name(&op->dev, "%08x", dp->phandle); +	op->dev.coherent_dma_mask = DMA_BIT_MASK(32); +	op->dev.dma_mask = &op->dev.coherent_dma_mask; +  	if (of_device_register(op)) {  		printk("%s: Could not register of device.\n",  		       dp->full_name); diff --git a/arch/sparc/kernel/of_device_64.c b/arch/sparc/kernel/of_device_64.c index 44e4d4435bed..6df6086968c6 100644 --- a/arch/sparc/kernel/of_device_64.c +++ b/arch/sparc/kernel/of_device_64.c @@ -2,6 +2,7 @@  #include <linux/string.h>  #include <linux/kernel.h>  #include <linux/of.h> +#include <linux/dma-mapping.h>  #include <linux/init.h>  #include <linux/export.h>  #include <linux/mod_devicetable.h> @@ -675,6 +676,8 @@ static struct platform_device * __init scan_one_device(struct device_node *dp,  		dev_set_name(&op->dev, "root");  	else  		dev_set_name(&op->dev, "%08x", dp->phandle); +	op->dev.coherent_dma_mask = DMA_BIT_MASK(32); +	op->dev.dma_mask = &op->dev.coherent_dma_mask;  	if (of_device_register(op)) {  		printk("%s: Could not register of device.\n", diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 7ba90c290a42..6c59673933e9 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -241,6 +241,10 @@ static struct amba_device *of_amba_device_create(struct device_node *node,  	if (!dev)  		goto err_clear_flag; +	/* AMBA devices only support a single DMA mask */ +	dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); +	dev->dev.dma_mask = &dev->dev.coherent_dma_mask; +  	/* setup generic device info */  	dev->dev.of_node = of_node_get(node);  	dev->dev.fwnode = &node->fwnode; diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index 1c35b7b945d0..de87b0282e74 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -168,7 +168,7 @@ int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents,  int dma_direct_supported(struct device *dev, u64 mask)  {  #ifdef CONFIG_ZONE_DMA -	if (mask < DMA_BIT_MASK(ARCH_ZONE_DMA_BITS)) +	if (mask < phys_to_dma(dev, DMA_BIT_MASK(ARCH_ZONE_DMA_BITS)))  		return 0;  #else  	/* @@ -177,7 +177,7 @@ int dma_direct_supported(struct device *dev, u64 mask)  	 * memory, or by providing a ZONE_DMA32.  If neither is the case, the  	 * architecture needs to use an IOMMU instead of the direct mapping.  	 */ -	if (mask < DMA_BIT_MASK(32)) +	if (mask < phys_to_dma(dev, DMA_BIT_MASK(32)))  		return 0;  #endif  	/*  | 

