Skip to content

Commit 66ea3f9

Browse files
ssuthiku-amdjoergroedel
authored andcommitted
iommu/amd: Modify clear_dte_entry() to avoid in-place update
By reusing the make_clear_dte() and update_dte256(). Also, there is no need to set TV bit for non-SNP system when clearing DTE for blocked domain, and no longer need to apply erratum 63 in clear_dte() since it is already stored in struct ivhd_dte_flags and apply in set_dte_entry(). Reviewed-by: Jason Gunthorpe <[email protected]> Signed-off-by: Suravee Suthikulpanit <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Joerg Roedel <[email protected]>
1 parent a2ce608 commit 66ea3f9

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

drivers/iommu/amd/iommu.c

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,19 +2103,16 @@ static void set_dte_entry(struct amd_iommu *iommu,
21032103
}
21042104
}
21052105

2106-
static void clear_dte_entry(struct amd_iommu *iommu, u16 devid)
2106+
/*
2107+
* Clear DMA-remap related flags to block all DMA (blockeded domain)
2108+
*/
2109+
static void clear_dte_entry(struct amd_iommu *iommu, struct iommu_dev_data *dev_data)
21072110
{
2108-
struct dev_table_entry *dev_table = get_dev_table(iommu);
2109-
2110-
/* remove entry from the device table seen by the hardware */
2111-
dev_table[devid].data[0] = DTE_FLAG_V;
2112-
2113-
if (!amd_iommu_snp_en)
2114-
dev_table[devid].data[0] |= DTE_FLAG_TV;
2115-
2116-
dev_table[devid].data[1] &= DTE_FLAG_MASK;
2111+
struct dev_table_entry new = {};
2112+
struct dev_table_entry *dte = &get_dev_table(iommu)[dev_data->devid];
21172113

2118-
amd_iommu_apply_erratum_63(iommu, devid);
2114+
make_clear_dte(dev_data, dte, &new);
2115+
update_dte256(iommu, dev_data, &new);
21192116
}
21202117

21212118
/* Update and flush DTE for the given device */
@@ -2126,7 +2123,7 @@ static void dev_update_dte(struct iommu_dev_data *dev_data, bool set)
21262123
if (set)
21272124
set_dte_entry(iommu, dev_data);
21282125
else
2129-
clear_dte_entry(iommu, dev_data->devid);
2126+
clear_dte_entry(iommu, dev_data);
21302127

21312128
clone_aliases(iommu, dev_data->dev);
21322129
device_flush_dte(dev_data);

0 commit comments

Comments
 (0)