Thread (13 messages) 13 messages, 5 authors, 2018-11-20

Re: [PATCH 5/5] dma-direct: always allow dma mask <= physiscal memory size

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2018-10-09 05:02:02
Also in: linux-iommu, lkml

On Wed, 2018-10-03 at 16:10 -0700, Alexander Duyck wrote:
quoted
-        * Because 32-bit DMA masks are so common we expect every architecture
-        * to be able to satisfy them - either by not supporting more physical
-        * 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 < phys_to_dma(dev, DMA_BIT_MASK(32)))
+       u64 min_mask;
+
+       if (IS_ENABLED(CONFIG_ZONE_DMA))
+               min_mask = DMA_BIT_MASK(ARCH_ZONE_DMA_BITS);
+       else
+               min_mask = DMA_BIT_MASK(32);
+
+       min_mask = min_t(u64, min_mask, (max_pfn - 1) << PAGE_SHIFT);
+
+       if (mask >= phys_to_dma(dev, min_mask))
                 return 0;
-#endif
         return 1;
  }
So I believe I have run into the same issue that Guenter reported. On
an x86_64 system w/ Intel IOMMU. I wasn't able to complete boot and
all probe attempts for various devices were failing with -EIO errors.

I believe the last mask check should be "if (mask < phys_to_dma(dev,
min_mask))" not a ">=" check.
Right, that test is backwards. I needed to change it here too (powermac
with the rest of the powerpc series).

Cheers,
Ben.

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help