Re: [PATCH v2 10/26] iommu/amd: Assign IOMMU Private Address domain to IOMMU

From: Jason Gunthorpe

Date: Mon Jun 01 2026 - 09:00:14 EST


On Thu, May 28, 2026 at 05:17:22AM +0000, Suravee Suthikulpanit wrote:
> By setting the domain ID, pagetable mode, and IOMMU v1 page table in the
> IOMMU Device Table Entry (DTE) indexed using the device ID of the
> AMD IOMMU.
>
> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx>
> ---
> drivers/iommu/amd/viommu.c | 31 +++++++++++++++++++++++++++++++
> 1 file changed, 31 insertions(+)
>
> diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c
> index 63360eef6b0d..14426649074f 100644
> --- a/drivers/iommu/amd/viommu.c
> +++ b/drivers/iommu/amd/viommu.c
> @@ -173,6 +173,35 @@ u64 amd_viommu_get_vfmmio_addr(struct amd_iommu *iommu, u16 gid)
> }
> EXPORT_SYMBOL(amd_viommu_get_vfmmio_addr);
>
> +/* Set DTE for IOMMU device */
> +static void set_iommu_dte(struct amd_iommu *iommu)
> +{
> + u64 dte0, dte1;
> + u16 devid = iommu->devid;
> + struct pt_iommu_amdv1_hw_info pt_info;
> + struct protection_domain *pdom = iommu->viommu_pdom;
> + struct dev_table_entry *dev_table = get_dev_table(iommu);
> +
> + pt_iommu_amdv1_hw_info(&pdom->amdv1, &pt_info);
> +
> + pr_debug("%s: host_pt_root=%#llx, mode=%#x\n",
> + __func__, pt_info.host_pt_root, pt_info.mode);
> +
> + dte0 = FIELD_PREP(DTE_HOST_TRP, pt_info.host_pt_root >> 12);
> + dte0 |= (pt_info.mode & DEV_ENTRY_MODE_MASK) << DEV_ENTRY_MODE_SHIFT;
> + dte0 |= DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_V | DTE_FLAG_TV;
> +
> + dte1 = dev_table[devid].data[1];
> + dte1 &= ~DTE_DOMID_MASK;
> + dte1 |= pdom->id;

Why is this editing the DTE in place!?

The special DTE should be entirely deterministic. Call
amd_iommu_make_clear_dte(), and use amd_iommu_update_dte() to write
it like every other DTE.

Jason