Re: [PATCH v2 10/26] iommu/amd: Assign IOMMU Private Address domain to IOMMU
From: Suthikulpanit, Suravee
Date: Sun Jun 07 2026 - 22:45:55 EST
On 6/1/2026 7:59 PM, Jason Gunthorpe wrote:
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
I missed this one. I'll fix in v3.
Suravee