Skip to content

Commit b9f0043

Browse files
ssuthiku-amdjoergroedel
authored andcommitted
iommu/amd: Set translation valid bit only when IO page tables are in use
On AMD system with SNP enabled, IOMMU hardware checks the host translation valid (TV) and guest translation valid (GV) bits in the device table entry (DTE) before accessing the corresponded page tables. However, current IOMMU driver sets the TV bit for all devices regardless of whether the host page table is in use. This results in ILLEGAL_DEV_TABLE_ENTRY event for devices, which do not the host page table root pointer set up. Thefore, when SNP is enabled, only set TV bit when DMA remapping is not used, which is when domain ID in the AMD IOMMU device table entry (DTE) is zero. Signed-off-by: Suravee Suthikulpanit <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Joerg Roedel <[email protected]>
1 parent fb2acca commit b9f0043

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

drivers/iommu/amd/init.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2569,7 +2569,8 @@ static void init_device_table_dma(struct amd_iommu_pci_seg *pci_seg)
25692569

25702570
for (devid = 0; devid <= pci_seg->last_bdf; ++devid) {
25712571
__set_dev_entry_bit(dev_table, devid, DEV_ENTRY_VALID);
2572-
__set_dev_entry_bit(dev_table, devid, DEV_ENTRY_TRANSLATION);
2572+
if (!amd_iommu_snp_en)
2573+
__set_dev_entry_bit(dev_table, devid, DEV_ENTRY_TRANSLATION);
25732574
}
25742575
}
25752576

drivers/iommu/amd/iommu.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,7 +1552,15 @@ static void set_dte_entry(struct amd_iommu *iommu, u16 devid,
15521552

15531553
pte_root |= (domain->iop.mode & DEV_ENTRY_MODE_MASK)
15541554
<< DEV_ENTRY_MODE_SHIFT;
1555-
pte_root |= DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_V | DTE_FLAG_TV;
1555+
1556+
pte_root |= DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_V;
1557+
1558+
/*
1559+
* When SNP is enabled, Only set TV bit when IOMMU
1560+
* page translation is in use.
1561+
*/
1562+
if (!amd_iommu_snp_en || (domain->id != 0))
1563+
pte_root |= DTE_FLAG_TV;
15561564

15571565
flags = dev_table[devid].data[1];
15581566

@@ -1612,7 +1620,11 @@ static void clear_dte_entry(struct amd_iommu *iommu, u16 devid)
16121620
struct dev_table_entry *dev_table = get_dev_table(iommu);
16131621

16141622
/* remove entry from the device table seen by the hardware */
1615-
dev_table[devid].data[0] = DTE_FLAG_V | DTE_FLAG_TV;
1623+
dev_table[devid].data[0] = DTE_FLAG_V;
1624+
1625+
if (!amd_iommu_snp_en)
1626+
dev_table[devid].data[0] |= DTE_FLAG_TV;
1627+
16161628
dev_table[devid].data[1] &= DTE_FLAG_MASK;
16171629

16181630
amd_iommu_apply_erratum_63(iommu, devid);

0 commit comments

Comments
 (0)