Re: [PATCH v1] iommu: Skip mapping at address 0x0 if it already exists
From: Antheas Kapenekakis
Date: Mon Feb 23 2026 - 02:47:11 EST
On Mon, 23 Feb 2026 at 07:02, Vasant Hegde <vasant.hegde@xxxxxxx> wrote:
>
> Antheas,
>
> On 2/22/2026 5:20 AM, Antheas Kapenekakis wrote:
> > Commit 789a5913b29c ("iommu/amd: Use the generic iommu page table")
> > introduces the shared iommu page table for AMD IOMMU. Some bioses
> > contain an identity mapping for address 0x0, which is not parsed
> > properly (e.g., certain Strix Halo devices). This causes the DMA
> > components of the device to fail to initialize (e.g., the NVMe SSD
> > controller), leading to a failed post.
> >
> > The failure is caused by iommu_create_device_direct_mappings(), which
> > is the new mapping implementation. In it, address aliasing is handled
> > via the following check:
> >
> > ```
> > phys_addr = iommu_iova_to_phys(domain, addr);
> > if (!phys_addr) {
> > map_size += pg_size;
> > continue;
> > }
> > ````
>
> Thanks for debugging and fixing it . Just wondering why can't we replace replace
> above check with pfn_valid() ?
>
Hi Vasant,
I can check later today
>From a cursory glance though, it does not seem very suitable... Can you expand?
Antheas
>
> -Vasant
>
>
> >
> > Obviously, the iommu_iova_to_phys() signature is faulty and aliases
> > unmapped and 0 together, causing the allocation code to try to
> > re-allocate the 0 address per device. However, it has too many
> > instantiations to fix. Therefore, catch ret == -EADDRINUSE only when
> > addr == 0 and, instead of bailing, skip the mapping and print a warning.
> >
> > Closes: https://www.reddit.com/r/cachyos/comments/1r5sgr6/freeze_on_boot_after_kernel_update_to_619_fixed/
> > Fixes: 789a5913b29c ("iommu/amd: Use the generic iommu page table")
> > Signed-off-by: Antheas Kapenekakis <lkml@xxxxxxxxxxx>
> > ---
> > drivers/iommu/iommu.c | 5 +++++
> > 1 file changed, 5 insertions(+)
> >
> > diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> > index 4926a43118e6..d424b7124311 100644
> > --- a/drivers/iommu/iommu.c
> > +++ b/drivers/iommu/iommu.c
> > @@ -1224,6 +1224,11 @@ static int iommu_create_device_direct_mappings(struct iommu_domain *domain,
> > ret = iommu_map(domain, addr - map_size,
> > addr - map_size, map_size,
> > entry->prot, GFP_KERNEL);
> > + if (ret == -EADDRINUSE && addr - map_size == 0) {
> > + dev_warn_once(dev,
> > + "iommu: identity mapping at addr 0x0 already exists, skipping\n");
> > + ret = 0;
> > + }
> > if (ret)
> > goto out;
> > map_size = 0;
> >
> > base-commit: 57d76ceccee4b497eb835831206b50e72915a501
>
>