diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 906087017d6a..508953302338 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -1115,39 +1115,35 @@ static const struct iommu_pgtable_ops arm_smmu_pgtable_ops = { .free_pgtable = arm_smmu_free_pages_exact, }; -#define ARM_SMMU_INIT_MSM_TLB_OPS(_tlb_flush_all) \ - {\ - .tlb_ops = { \ - .tlb_flush_all = _tlb_flush_all, \ - .tlb_flush_walk = arm_smmu_tlb_inv_walk, \ - .tlb_flush_leaf = arm_smmu_tlb_inv_leaf, \ - .tlb_add_page = arm_smmu_tlb_add_page, \ - } \ - } - -#define ARM_SMMU_MSM_TLB_OPS_S1 \ - ARM_SMMU_INIT_MSM_TLB_OPS(arm_smmu_tlb_inv_context_s1) - -#define ARM_SMMU_MSM_TLB_OPS_S2_V2 \ - ARM_SMMU_INIT_MSM_TLB_OPS(arm_smmu_tlb_inv_context_s2) - -#define ARM_SMMU_MSM_TLB_OPS_S2_V1 \ - ARM_SMMU_INIT_MSM_TLB_OPS(arm_smmu_tlb_inv_context_s2) - static const struct arm_smmu_flush_ops arm_smmu_s1_tlb_ops = { - .tlb = ARM_SMMU_MSM_TLB_OPS_S1, + .tlb = { + .tlb_flush_all = arm_smmu_tlb_inv_context_s1, + .tlb_flush_walk = arm_smmu_tlb_inv_walk, + .tlb_flush_leaf = arm_smmu_tlb_inv_leaf, + .tlb_add_page = arm_smmu_tlb_add_page, + }, .tlb_inv_range = arm_smmu_tlb_inv_range_s1, .tlb_sync = arm_smmu_tlb_sync_context, }; static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v2 = { - .tlb = ARM_SMMU_MSM_TLB_OPS_S2_V2, + .tlb = { + .tlb_flush_all = arm_smmu_tlb_inv_context_s2, + .tlb_flush_walk = arm_smmu_tlb_inv_walk, + .tlb_flush_leaf = arm_smmu_tlb_inv_leaf, + .tlb_add_page = arm_smmu_tlb_add_page, + }, .tlb_inv_range = arm_smmu_tlb_inv_range_s2, .tlb_sync = arm_smmu_tlb_sync_context, }; static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v1 = { - .tlb = ARM_SMMU_MSM_TLB_OPS_S2_V1, + .tlb = { + .tlb_flush_all = arm_smmu_tlb_inv_context_s2, + .tlb_flush_walk = arm_smmu_tlb_inv_walk, + .tlb_flush_leaf = arm_smmu_tlb_inv_leaf, + .tlb_add_page = arm_smmu_tlb_add_page, + }, .tlb_inv_range = arm_smmu_tlb_inv_vmid_nosync, .tlb_sync = arm_smmu_tlb_sync_vmid, }; @@ -2176,7 +2172,7 @@ static int arm_smmu_init_domain_context(struct iommu_domain *domain, .ias = ias, .oas = oas, .coherent_walk = is_iommu_pt_coherent(smmu_domain), - .tlb = &smmu_domain->flush_ops->tlb.tlb_ops, + .tlb = &smmu_domain->flush_ops->tlb, .iommu_pgtable_ops = &arm_smmu_pgtable_ops, .iommu_dev = smmu->dev, }; @@ -3242,7 +3238,7 @@ static void arm_smmu_flush_iotlb_all(struct iommu_domain *domain) arm_smmu_rpm_put(smmu); return; } - smmu_domain->flush_ops->tlb.tlb_ops.tlb_flush_all(smmu_domain); + smmu_domain->flush_ops->tlb.tlb_flush_all(smmu_domain); arm_smmu_domain_power_off(domain, smmu); arm_smmu_rpm_put(smmu); } diff --git a/drivers/iommu/arm-smmu.h b/drivers/iommu/arm-smmu.h index 1d98e3f5c008..05f79b0e19a9 100644 --- a/drivers/iommu/arm-smmu.h +++ b/drivers/iommu/arm-smmu.h @@ -461,7 +461,7 @@ enum arm_smmu_domain_stage { }; struct arm_smmu_flush_ops { - struct msm_iommu_flush_ops tlb; + struct iommu_flush_ops tlb; void (*tlb_inv_range)(unsigned long iova, size_t size, size_t granule, bool leaf, void *cookie); void (*tlb_sync)(void *cookie); diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c index b44d52e9e59d..207aa29593e7 100644 --- a/drivers/iommu/io-pgtable.c +++ b/drivers/iommu/io-pgtable.c @@ -114,36 +114,6 @@ static void mod_pages_allocated(int nr_pages) } #endif -void *io_pgtable_alloc_pages_exact(struct io_pgtable_cfg *cfg, void *cookie, - size_t size, gfp_t gfp_mask) -{ - void *ret; - struct msm_iommu_flush_ops *ops = to_msm_iommu_flush_ops(cfg->tlb); - - if (ops->alloc_pages_exact) - ret = ops->alloc_pages_exact(cookie, size, gfp_mask); - else - ret = alloc_pages_exact(size, gfp_mask); - - if (likely(ret)) - mod_pages_allocated(1 << get_order(size)); - - return ret; -} - -void io_pgtable_free_pages_exact(struct io_pgtable_cfg *cfg, void *cookie, - void *virt, size_t size) -{ - struct msm_iommu_flush_ops *ops = to_msm_iommu_flush_ops(cfg->tlb); - - if (ops->free_pages_exact) - ops->free_pages_exact(cookie, virt, size); - else - free_pages_exact(virt, size); - - mod_pages_allocated(-(1 << get_order(size))); -} - void *io_pgtable_alloc_pages(struct io_pgtable_cfg *cfg, void *cookie, int order, gfp_t gfp_mask) { diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index a448e2be9205..821a0792b8bd 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h @@ -7,8 +7,6 @@ #include -#define to_msm_iommu_flush_ops(_tlb_ops) \ - container_of(_tlb_ops, struct msm_iommu_flush_ops, tlb_ops) #define to_msm_io_pgtable_info(_cfg) \ container_of(_cfg, struct msm_io_pgtable_info, pgtbl_cfg) @@ -56,21 +54,6 @@ struct iommu_flush_ops { unsigned long iova, size_t granule, void *cookie); }; -/** - * struct msm_iommu_flush_ops - MSM and standard IOMMU callbacks for TLB and - * page table management. - * - * @alloc_pages_exact: Allocate page table memory (optional, defaults to - * alloc_pages_exact) - * @free_pages_exact: Free page table memory (optional, defaults to - * free_pages_exact) - */ -struct msm_iommu_flush_ops { - void *(*alloc_pages_exact)(void *cookie, size_t size, gfp_t gfp_mask); - void (*free_pages_exact)(void *cookie, void *virt, size_t size); - const struct iommu_flush_ops tlb_ops; -}; - /** * struct iommu_pgtable_ops - IOMMU callbacks for page table memory management. *