Commit 5e064fc0 authored by Kunkun Jiang's avatar Kunkun Jiang Committed by Zheng Zengkai
Browse files

iommu/arm-smmu-v3: Realize clear_dirty_log iommu ops

virt inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I3ZUKK


CVE: NA

------------------------------

This realizes clear_dirty_log iommu ops based on clear_dirty_log
io-pgtable ops.

Co-developed-by: default avatarKeqian Zhu <zhukeqian1@huawei.com>
Signed-off-by: default avatarKunkun Jiang <jiangkunkun@huawei.com>
Reviewed-by: default avatarKeqian Zhu <zhukeqian1@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent beee685e
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -3183,6 +3183,30 @@ static int arm_smmu_sync_dirty_log(struct iommu_domain *domain,
				   bitmap_pgshift);
}

static int arm_smmu_clear_dirty_log(struct iommu_domain *domain,
				    unsigned long iova, size_t size,
				    unsigned long *bitmap,
				    unsigned long base_iova,
				    unsigned long bitmap_pgshift)
{
	struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
	struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
	struct arm_smmu_device *smmu = smmu_domain->smmu;

	if (!(smmu->features & ARM_SMMU_FEAT_HD))
		return -ENODEV;
	if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1)
		return -EINVAL;

	if (!ops || !ops->clear_dirty_log) {
		pr_err("io-pgtable don't realize clear dirty log\n");
		return -ENODEV;
	}

	return ops->clear_dirty_log(ops, iova, size, bitmap, base_iova,
				    bitmap_pgshift);
}

static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
{
	return iommu_fwspec_add_ids(dev, args->args, 1);
@@ -3422,6 +3446,7 @@ static struct iommu_ops arm_smmu_ops = {
	.domain_set_attr	= arm_smmu_domain_set_attr,
	.switch_dirty_log	= arm_smmu_switch_dirty_log,
	.sync_dirty_log		= arm_smmu_sync_dirty_log,
	.clear_dirty_log	= arm_smmu_clear_dirty_log,
	.of_xlate		= arm_smmu_of_xlate,
	.get_resv_regions	= arm_smmu_get_resv_regions,
	.put_resv_regions	= generic_iommu_put_resv_regions,