Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

OF: Don't set default coherent DMA mask

Now that we can track upstream DMA constraints properly with
bus_dma_mask instead of trying (and failing) to maintain it in
coherent_dma_mask, it doesn't make much sense for the firmware code to
be touching the latter at all. It's merely papering over bugs wherein a
driver has failed to call dma_set_coherent_mask() *and* the bus code has
not initialised any default value.

We don't really want to encourage more drivers coercing dma_mask so
we'll continue to fix that up if necessary, but add a warning to help
flush out any such buggy bus code that remains.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>

authored by

Robin Murphy and committed by
Christoph Hellwig
4d8bde88 6757cdae

+10 -10
+10 -10
drivers/of/device.c
··· 127 127 } 128 128 129 129 /* 130 - * Set default coherent_dma_mask to 32 bit. Drivers are expected to 131 - * setup the correct supported mask. 130 + * If @dev is expected to be DMA-capable then the bus code that created 131 + * it should have initialised its dma_mask pointer by this point. For 132 + * now, we'll continue the legacy behaviour of coercing it to the 133 + * coherent mask if not, but we'll no longer do so quietly. 132 134 */ 133 - if (!dev->coherent_dma_mask) 134 - dev->coherent_dma_mask = DMA_BIT_MASK(32); 135 - /* 136 - * Set it to coherent_dma_mask by default if the architecture 137 - * code has not set it. 138 - */ 139 - if (!dev->dma_mask) 135 + if (!dev->dma_mask) { 136 + dev_warn(dev, "DMA mask not set\n"); 140 137 dev->dma_mask = &dev->coherent_dma_mask; 138 + } 141 139 142 - if (!size) 140 + if (!size && dev->coherent_dma_mask) 143 141 size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1); 142 + else if (!size) 143 + size = 1ULL << 32; 144 144 145 145 dev->dma_pfn_offset = offset; 146 146