]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
sparc: Fix page alignment in dma mapping
authorStian Halseth <stian@itx.no>
Wed, 18 Feb 2026 12:00:24 +0000 (13:00 +0100)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Mon, 23 Feb 2026 07:33:51 +0000 (08:33 +0100)
'phys' may include an offset within the page, while previously used
'base_paddr' was already page-aligned. This caused incorrect DMA mapping
in dma_4u_map_phys and dma_4v_map_phys.

Fix both functions by masking 'phys' with IO_PAGE_MASK, covering both
generic SPARC code and sun4v.

Fixes: 38c0d0ebf520 ("sparc: Use physical address DMA mapping")
Reported-by: Stian Halseth <stian@itx.no>
Closes: https://github.com/sparclinux/issues/issues/75
Suggested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Stian Halseth <stian@itx.no>
Tested-by: Nathaniel Roach <nroach44@nroach44.id.au>
Tested-by: Han Gao <gaohan@iscas.ac.cn> # on SPARC Enterprise T5220
[mszyprow: adjusted commit description a bit]
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20260218120056.3366-2-stian@itx.no
arch/sparc/kernel/iommu.c
arch/sparc/kernel/pci_sun4v.c

index 46ef88bc9c26efe3ce6057cd6d619e5edcc7d9b9..7613ab0ffb89d0c51318fd3d0584724783a7e044 100644 (file)
@@ -312,6 +312,8 @@ static dma_addr_t dma_4u_map_phys(struct device *dev, phys_addr_t phys,
        if (direction != DMA_TO_DEVICE)
                iopte_protection |= IOPTE_WRITE;
 
+       phys &= IO_PAGE_MASK;
+
        for (i = 0; i < npages; i++, base++, phys += IO_PAGE_SIZE)
                iopte_val(*base) = iopte_protection | phys;
 
index 440284cc804eff41c0611fd212d593f911e4ca3e..61f14b4c8f90d76694b760a241be130f71627c95 100644 (file)
@@ -410,6 +410,8 @@ static dma_addr_t dma_4v_map_phys(struct device *dev, phys_addr_t phys,
 
        iommu_batch_start(dev, prot, entry);
 
+       phys &= IO_PAGE_MASK;
+
        for (i = 0; i < npages; i++, phys += IO_PAGE_SIZE) {
                long err = iommu_batch_add(phys, mask);
                if (unlikely(err < 0L))