On 24/08/18 07:53, Christoph Hellwig wrote:
When a device has a DMA offset the dma capable result will change due
to the difference between the physical and DMA address.  Take that into
account.

The "phys_to_dma(..., DMA_BIT_MASK(...))" idiom always looks like a glaring error at first glance, but this whole function is fairly unintuitive anyway, and ultimately I think the change does work out to be correct.

It might be nicer if we could reference max_zone_pfns[] for a bit more clarity, but I guess that's not arch-independent.

Reviewed-by: Robin Murphy <[email protected]>

Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Benjamin Herrenschmidt <[email protected]>
---
  kernel/dma/direct.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c
index 1c35b7b945d0..de87b0282e74 100644
--- a/kernel/dma/direct.c
+++ b/kernel/dma/direct.c
@@ -168,7 +168,7 @@ int dma_direct_map_sg(struct device *dev, struct 
scatterlist *sgl, int nents,
  int dma_direct_supported(struct device *dev, u64 mask)
  {
  #ifdef CONFIG_ZONE_DMA
-       if (mask < DMA_BIT_MASK(ARCH_ZONE_DMA_BITS))
+       if (mask < phys_to_dma(dev, DMA_BIT_MASK(ARCH_ZONE_DMA_BITS)))
                return 0;
  #else
        /*
@@ -177,7 +177,7 @@ int dma_direct_supported(struct device *dev, u64 mask)
         * memory, or by providing a ZONE_DMA32.  If neither is the case, the
         * architecture needs to use an IOMMU instead of the direct mapping.
         */
-       if (mask < DMA_BIT_MASK(32))
+       if (mask < phys_to_dma(dev, DMA_BIT_MASK(32)))
                return 0;
  #endif
        /*

_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to