From 8f42683b253cf1239a3a937aa7f673f9daf36b46 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Brucker Date: Sat, 18 May 2019 22:09:52 +0800 Subject: [PATCH] iommu/arm-smmu-v3: Hook up ATC invalidation to mm ops hulk inclusion category: feature bugzilla: 14369 CVE: NA ------------------- The core calls us when an mm is modified. Perform the required ATC invalidations. Signed-off-by: Jean-Philippe Brucker Signed-off-by: Fang Lijun Reviewed-by: Hanjun Guo Reviewed-by: Zhen Lei Signed-off-by: Yang Yingliang --- drivers/iommu/arm-smmu-v3.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index 7cb67efc9d14..7be8be353feb 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -1872,6 +1872,15 @@ static int arm_smmu_atc_inv_master_all(struct arm_smmu_master_data *master, return arm_smmu_atc_inv_master(master, &cmd); } +static int arm_smmu_atc_inv_master_range(struct arm_smmu_master_data *master, + int ssid, unsigned long iova, size_t size) +{ + struct arm_smmu_cmdq_ent cmd; + + arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd); + return arm_smmu_atc_inv_master(master, &cmd); +} + static size_t arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, unsigned long iova, size_t size) @@ -2544,11 +2553,12 @@ static void arm_smmu_mm_detach(struct iommu_domain *domain, struct device *dev, struct arm_smmu_mm *smmu_mm = to_smmu_mm(io_mm); struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); struct iommu_pasid_table_ops *ops = smmu_domain->s1_cfg.ops; + struct arm_smmu_master_data *master = dev->iommu_fwspec->iommu_priv; if (detach_domain) ops->clear_entry(ops, io_mm->pasid, smmu_mm->cd); - /* TODO: Invalidate ATC. */ + arm_smmu_atc_inv_master_all(master, io_mm->pasid); /* TODO: Invalidate all mappings if last and not DVM. */ } @@ -2556,8 +2566,10 @@ static void arm_smmu_mm_invalidate(struct iommu_domain *domain, struct device *dev, struct io_mm *io_mm, unsigned long iova, size_t size) { + struct arm_smmu_master_data *master = dev->iommu_fwspec->iommu_priv; + + arm_smmu_atc_inv_master_range(master, io_mm->pasid, iova, size); /* - * TODO: Invalidate ATC. * TODO: Invalidate mapping if not DVM */ } -- GitLab