Re: [PATCH v1] iommu: Skip mapping at address 0x0 if it already exists
From: Vasant Hegde
Date: Mon Feb 23 2026 - 01:02:55 EST
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() ?
-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