On Tue, Jul 24, 2018 at 12:16 AM, Robin Murphy <robin.murphy@xxxxxxx> wrote: > Whilst the common firmware code invoked by dma_configure() initialises > devices' DMA masks according to limitations described by the respective > properties ("dma-ranges" for OF and _DMA/IORT for ACPI), the nature of > the dma_set_mask() API leads to that information getting lost when > well-behaved drivers probe and set a 64-bit mask, since in general > there's no way to tell the difference between a firmware-described mask > (which should be respected) and whatever default may have come from the > bus code (which should be replaced outright). This can break DMA on > systems with certain IOMMU topologies (e.g. [1]) where the IOMMU driver > only knows its maximum supported address size, not how many of those > address bits might actually be wired up between any of its input > interfaces and the associated DMA master devices. Similarly, some PCIe > root complexes only have a 32-bit native interface on their host bridge, > which leads to the same DMA-address-truncation problem in systems with a > larger physical memory map and RAM above 4GB (e.g. [2]). > > These patches attempt to deal with this in the simplest way possible by > generalising the specific quirk for 32-bit bridges into an arbitrary > mask which can then also be plumbed into the firmware code. In the > interest of being minimally invasive, I've only included a point fix > for the IOMMU issue as seen on arm64 - there may be further tweaks > needed in DMA ops (e.g. in arch/arm/ and other OF users) to catch all > possible incarnations of this problem, but at least any that I'm not > fixing here have always been broken. It is also noteworthy that > of_dma_get_range() has never worked properly for the way PCI host > bridges are passed into of_dma_configure() - I'll be working on > further patches to sort that out once this part is done. Thanks a lot for working on this, this has bugged me for many years, and I've discussed possible solutions with lots of people over time. I /think/ all your patches are good, but I'm currently travelling and don't have a chance to review the resulting overall implementation. Could you summarize what happens in the following corner cases of DT dma-ranges after your changes (with a driver not setting a mask, setting a 64-bit mask and setting a 24-bit mask, respectively)? a) a device with no dma-ranges property anywhere in its parents b) a device with with a 64-bit dma-ranges translation in its parent but none in its grandparent c) a device with no dma-ranges in its parent but a 64-bit mask in its grandparent d) a device with a 24-bit mask in its parent. Thanks, Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html