Re: [PATCH v3] sparc: Fix page alignment in dma mapping

Han Gao <[email protected]>
Newsgroups org.kernel.vger.sparclinux,org.kernel.vger.linux-kernel
Message-ID <[email protected]>

> On Feb 18, 2026, at 20:00, [email protected] wrote:
> 
> From: Stian Halseth <[email protected]>
> 
> 'phys' may include an offset within the page, while 'base_paddr' is 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 or subtracting the
> page offset, covering both generic SPARC code and sun4v.
> 
> Fixes: 38c0d0ebf520 ("sparc: Use physical address DMA mapping")
> Reported-by: Stian Halseth <[email protected]>
> Closes: https://github.com/sparclinux/issues/issues/75
> Suggested-by: Marek Szyprowski <[email protected]>
> Signed-off-by: Stian Halseth <[email protected]>
> ---
> Changelog:
> v3:
> - Use IO_PAGE_MASK for alignment in both dma_4u_map_phys and dma_4v_map_phys
> - Align phys before the loop in pci_sun4v.c
> - Drop masking inside iommu_batch_add()
> 
> v2: https://lore.kernel.org/all/[email protected]/
> - Add Fixes tag
> - Add Closes tag
> - Trim commit message to 80-column lines
> - Remove newlines
> - Subject: Remove the "iommu/pci_sun4v:" (generic sparc patch, not specific to sun4v)
> 
> v1: https://lore.kernel.org/all/[email protected]/ 
> ---
> arch/sparc/kernel/iommu.c     | 2 ++
> arch/sparc/kernel/pci_sun4v.c | 2 ++
> 2 files changed, 4 insertions(+)
> 
> diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c
> index 46ef88bc9c26..7613ab0ffb89 100644
> --- a/arch/sparc/kernel/iommu.c
> +++ b/arch/sparc/kernel/iommu.c
> @@ -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;
> 
> diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c
> index 791f0a76665f..58ca4148f86b 100644
> --- a/arch/sparc/kernel/pci_sun4v.c
> +++ b/arch/sparc/kernel/pci_sun4v.c
> @@ -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))
> -- 
> 2.53.0
> 
> 

Tested-by: Han Gao <[email protected]> # on SPARC Enterprise T5220
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.