Re: [PATCH 18/24] iommu/amd: Introduce helper function for updating device ID mapping table

From: Suthikulpanit, Suravee

Date: Wed Sep 02 2026 - 23:19:53 EST




On 8/10/2026 10:17 PM, Vasant Hegde wrote:


On 7/27/2026 6:59 PM, Suravee Suthikulpanit wrote:
... diff --git a/drivers/iommu/amd/viommu.c b/drivers/iommu/amd/viommu.c
index 708f2c7496a4..eb3f5217d856 100644
--- a/drivers/iommu/amd/viommu.c
+++ b/drivers/iommu/amd/viommu.c
@@ -29,7 +29,6 @@
/*
* Guest Device ID Mapping Table
*/
-#define VIOMMU_MAX_GDEVID 0xFFFF
#define VIOMMU_DEVID_MAPPING_BASE 0x1000000000ULL
#define VIOMMU_DEVID_MAPPING_ENTRY_SIZE (1 << 20)
@@ -40,6 +39,7 @@
#define VIOMMU_DOMID_MAPPING_BASE 0x2000000000ULL
#define VIOMMU_DOMID_MAPPING_ENTRY_SIZE (1 << 19)
+#define VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL0_OFFSET 0x00
#define VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL1_OFFSET 0x08
LIST_HEAD(viommu_devid_map);
@@ -422,6 +422,53 @@ static void __maybe_unused free_private_vm_region(struct amd_iommu *iommu, u64 *
*entry = NULL;
}
+#define DEVID_ENTRY_GDEVID_MASK GENMASK_ULL(61, 46)
+#define DEVID_ENTRY_HDEVID_MASK GENMASK_ULL(29, 14)
+#define DEVID_ENTRY_WRITE BIT_ULL(63)
+#define DEVID_ENTRY_VALID BIT_ULL(0)
+
+/*
+ * Program the DevID via VFCTRL registers
+ * This function will be called during VM init via VFIO.
+ */
+void amd_viommu_set_device_mapping(struct amd_iommu *iommu, u16 hDevId,
+ u16 guestId, u16 gDevId)

Can we avoid CamelCase?


OK.

+{
+ u64 val;
+ u8 __iomem *vfctrl;
+
+ pr_debug("%s: iommu_devid=%#x, gid=%#x, hDevId=%#x, gDevId=%#x\n",
+ __func__, pci_dev_id(iommu->dev), guestId, hDevId, gDevId);
+
+ val = FIELD_PREP(DEVID_ENTRY_GDEVID_MASK, gDevId) |
+ FIELD_PREP(DEVID_ENTRY_HDEVID_MASK, hDevId) |
+ DEVID_ENTRY_WRITE | DEVID_ENTRY_VALID;
+
+ vfctrl = VIOMMU_VFCTRL_MMIO_BASE(iommu, guestId);
+
+ writeq(val, vfctrl + VIOMMU_VFCTRL_GUEST_DID_MAP_CONTROL0_OFFSET);
+}
+
+/*
+ * Clear the DevID via VFCTRL registers
+ * This function will be called during VM destroy via VFIO.
+ */
+static void clear_device_mapping(struct amd_iommu *iommu, u16 guestId, u16 gDevId)
+{
+ u64 val;
+ u8 __iomem *vfctrl;
+
+ /*
+ * Clear the DevID in VFCTRL registers
+ */
+ val = FIELD_PREP(DEVID_ENTRY_GDEVID_MASK, gDevId) |
+ FIELD_PREP(DEVID_ENTRY_HDEVID_MASK, 0) |
+ DEVID_ENTRY_WRITE | DEVID_ENTRY_VALID;

May be just call amd_viommu_set_device_mapping() with appropriate variables/flags?

Ok. I'll update this in V5.

Thanks,
Suravee