Whatever it does to initialize dev to alloc coherent memory or map allocated memory to io addr __map_single need be called. So update the related domain information to its DTE entry and alias when __map_single is firstly called.
Signed-off-by: Baoquan He <[email protected]> --- drivers/iommu/amd_iommu.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index b6e669c..0880500 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2529,6 +2529,17 @@ static dma_addr_t __map_single(struct device *dev, unsigned int pages; unsigned long align_mask = 0; int i; + struct iommu_dev_data *dev_data = get_dev_data(dev); + struct protection_domain *domain = get_domain(dev); + u16 alias = amd_iommu_alias_table[dev_data->devid]; + + if (translation_pre_enabled() && !dev_data->domain_updated) { + set_dte_entry(dev_data->devid, domain, dev_data->ats.enabled); + if (alias != dev_data->devid) + set_dte_entry(alias, domain, dev_data->ats.enabled); + device_flush_dte(dev_data); + dev_data->domain_updated = true; + } pages = iommu_num_pages(paddr, size, PAGE_SIZE); paddr &= PAGE_MASK; -- 2.1.0 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
