linux/drivers/of
Robin Murphy ee7b1f3120 of: fix DMA mask generation
Historically, DMA masks have suffered some ambiguity between whether
they represent the range of physical memory a device can access, or the
address bits a device is capable of driving, particularly since on many
platforms the two are equivalent. Whilst there are some stragglers left
(dma_max_pfn(), I'm looking at you...), the majority of DMA code has
been cleaned up to follow the latter definition, not least since it is
the only one which makes sense once IOMMUs are involved.

In this respect, of_dma_configure() has always done the wrong thing in
how it generates initial masks based on "dma-ranges". Although rounding
down did not affect the TI Keystone platform where dma_addr + size is
already a power of two, in any other case it results in a mask which is
at best unnecessarily constrained and at worst unusable.

BCM2837 illustrates the problem nicely, where we have a DMA base of 3GB
and a size of 1GB - 16MB, giving dma_addr + size = 0xff000000 and a
resultant mask of 0x7fffffff, which is then insufficient to even cover
the necessary offset, effectively making all DMA addresses out-of-range.
This has been hidden until now (mostly because we don't yet prevent
drivers from simply overwriting this initial mask later upon probe), but
due to recent changes elsewhere now shows up as USB being broken on
Raspberry Pi 3.

Make it right by rounding up instead of down, such that the mask
correctly correctly describes all possisble bits the device needs to
emit.

Fixes: 9a6d7298b0 ("of: Calculate device DMA masks based on DT dma-range size")
Reported-by: Stefan Wahren <stefan.wahren@i2se.com>
Reported-by: Andreas Färber <afaerber@suse.de>
Reported-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
2017-08-17 10:23:45 +02:00
..
unittest-data vsprintf: Add %p extension "%pOF" for device tree 2017-06-27 12:36:40 -05:00
address.c of: address.c header comment typo 2017-06-22 11:15:00 -05:00
base.c Merge branch 'dt/property-move' into dt/next 2017-07-05 08:31:52 -05:00
device.c of: fix DMA mask generation 2017-08-17 10:23:45 +02:00
dynamic.c of: make __of_attach_node() static 2017-06-22 11:16:35 -05:00
fdt_address.c
fdt.c DeviceTree for 4.13: 2017-07-07 10:37:54 -07:00
irq.c of: irq: fix of_irq_to_resource() error check 2017-07-21 16:58:55 -05:00
Kconfig
Makefile of: Move OF property and graph API from base.c to property.c 2017-06-01 08:50:45 -05:00
of_mdio.c of_mdio: move of_mdio_parse_addr to header file 2017-06-13 14:00:16 -04:00
of_net.c
of_numa.c of: fix "/cpus" reference leak in of_numa_parse_cpu_nodes() 2017-04-18 11:04:12 -05:00
of_pci_irq.c OF/PCI: Update of_irq_parse_and_map_pci() comment 2017-07-02 16:14:28 -05:00
of_pci.c of/pci: Remove unused MSI controller helpers 2017-03-14 15:10:11 -05:00
of_private.h of: find_node_by_full_name rewrite to compare each level 2017-06-22 12:38:29 -05:00
of_reserved_mem.c Partially Revert "of: fix sparse warnings in fdt, irq, reserved mem, and resolver code" 2017-05-11 10:26:22 -05:00
overlay.c of: detect invalid phandle in overlay 2017-06-22 11:19:09 -05:00
pdt.c
platform.c DeviceTree for 4.13: 2017-07-07 10:37:54 -07:00
property.c device property: Fix usecount for of_graph_get_port_parent() 2017-08-01 15:15:42 +01:00
resolver.c of: find_node_by_full_name rewrite to compare each level 2017-06-22 12:38:29 -05:00
unittest.c vsprintf: Add %p extension "%pOF" for device tree 2017-06-27 12:36:40 -05:00