summaryrefslogtreecommitdiffstats
path: root/drivers/of/device.c
diff options
context:
space:
mode:
authorSricharan R <sricharan@codeaurora.org>2017-04-10 16:51:00 +0530
committerJoerg Roedel <jroedel@suse.de>2017-04-20 16:31:06 +0200
commitefc8551a276faab19d85079da02c5fb602b0dcbe (patch)
treed4bc742878d00fba40a4b2de45eedbac7ae1aa5c /drivers/of/device.c
parent1d9029d440e40b276c0691caed1de10c42d96bef (diff)
downloadlinux-efc8551a276faab19d85079da02c5fb602b0dcbe.tar.gz
linux-efc8551a276faab19d85079da02c5fb602b0dcbe.tar.bz2
linux-efc8551a276faab19d85079da02c5fb602b0dcbe.zip
of: device: Fix overflow of coherent_dma_mask
Size of the dma-range is calculated as coherent_dma_mask + 1 and passed to arch_setup_dma_ops further. It overflows when the coherent_dma_mask is set for full 64 bits 0xFFFFFFFFFFFFFFFF, resulting in size getting passed as 0 wrongly. Fix this by passsing in max(mask, mask + 1). Note that in this case when the mask is set to full 64bits, we will be passing the mask itself to arch_setup_dma_ops instead of the size. The real fix for this should be to make arch_setup_dma_ops receive the mask and handle it, to be done in the future. Reviewed-by: Robin Murphy <robin.murphy@arm.com> Acked-by: Rob Herring <robh@kernel.org> Signed-off-by: Sricharan R <sricharan@codeaurora.org> Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/of/device.c')
-rw-r--r--drivers/of/device.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 0d378c03e1a4..e1ae9e7104a1 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -107,7 +107,7 @@ void of_dma_configure(struct device *dev, struct device_node *np)
ret = of_dma_get_range(np, &dma_addr, &paddr, &size);
if (ret < 0) {
dma_addr = offset = 0;
- size = dev->coherent_dma_mask + 1;
+ size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
} else {
offset = PFN_DOWN(paddr - dma_addr);