[PATCH 1/2] arm64: dma_mapping: allow PCI host driver to limit DMA mask

Arnd Bergmann
2017-01-04T13:29:01Z

On Wednesday, January 4, 2017 9:24:09 AM CET Nikita Yushchenko wrote:
> > commit 9a57d58d116800a535510053136c6dd7a9c26e25
> > Author: Arnd Bergmann <arnd@arndb.de>
> > Date: Tue Nov 17 14:06:55 2015 +0100
> >
> > [EXPERIMENTAL] ARM64: check implement dma_set_mask
> >
> > Needs work for coherent mask
> >
> > Signed-off-by: Arnd Bergmann <arnd@arndb.de>
>
> Unfortunately this is far incomplete
>
> > @@ -957,6 +983,18 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> > if (!dev->archdata.dma_ops)
> > dev->archdata.dma_ops = &swiotlb_dma_ops;
> >
> > + /*
> > + * we don't yet support buses that have a non-zero mapping.
> > + * Let's hope we won't need it
> > + */
> > + WARN_ON(dma_base != 0);
> > +
> > + /*
> > + * Whatever the parent bus can set. A device must not set
> > + * a DMA mask larger than this.
> > + */
> > + dev->archdata.parent_dma_mask = size;
> > +
>
> ... because size/mask passed here for PCI devices are meaningless.
>
> For OF platforms, this is called via of_dma_configure(), that checks
> dma-ranges of node that is *parent* for host bridge. Host bridge
> currently does not control this at all.

We need to think about this a bit. Is it actually the PCI host
bridge that limits the ranges here, or the bus that it is connected
to. In the latter case, the caller needs to be adapted to handle
both.

> In current device trees no dma-ranges is defined for nodes that are
> parents to pci host bridges. This will make of_dma_configure() to fall
> back to 32-bit size for all devices on all current platforms. Thus
> applying this patch will immediately break 64-bit dma masks on all
> hardware that supports it.

No, it won't break it, it will just fall back to swiotlb for all the
ones that are lacking the dma-ranges property. I think this is correct
behavior.

> Also related: dma-ranges property used by several pci host bridges is
> *not* compatible with "legacy" dma-ranges parsed by of_get_dma_range() -
> former uses additional flags word at beginning.

Can you elaborate? Do we have PCI host bridges that use wrongly formatted
dma-ranges properties?

Arnd