aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSricharan R <[email protected]>2017-04-10 16:51:00 +0530
committerJoerg Roedel <[email protected]>2017-04-20 16:31:06 +0200
commitefc8551a276faab19d85079da02c5fb602b0dcbe (patch)
treed4bc742878d00fba40a4b2de45eedbac7ae1aa5c
parent1d9029d440e40b276c0691caed1de10c42d96bef (diff)
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 <[email protected]> Acked-by: Rob Herring <[email protected]> Signed-off-by: Sricharan R <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
-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);