Fix the dma-range size when the DT attribute is missing. i.e set size to dev->coherent_dma_mask + 1 instead of dev->coherent_dma_mask. Also add code to check invalid values of size configured in DT and log error.
Cc: Joerg Roedel <j...@8bytes.org> Cc: Grant Likely <grant.lik...@linaro.org> Cc: Rob Herring <robh...@kernel.org> Cc: Bjorn Helgaas <bhelg...@google.com> Cc: Will Deacon <will.dea...@arm.com> Cc: Russell King <li...@arm.linux.org.uk> Cc: Arnd Bergmann <a...@arndb.de> Cc: Suravee Suthikulpanit <suravee.suthikulpa...@amd.com> Signed-off-by: Murali Karicheri <m-kariche...@ti.com> --- drivers/of/device.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/of/device.c b/drivers/of/device.c index 2de320d..17504f4 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c @@ -105,12 +105,19 @@ 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; + size = dev->coherent_dma_mask + 1; } else { offset = PFN_DOWN(paddr - dma_addr); dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset); } + if (is_power_of_2(size + 1)) + size = size + 1; + else if (!is_power_of_2(size)) { + dev_err(dev, "invalid size\n"); + return; + } + dev->dma_pfn_offset = offset; coherent = of_dma_is_coherent(np); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html