diff options
Diffstat (limited to 'drivers/iommu/msm_iommu_pagetable_lpae.c')
-rw-r--r-- | drivers/iommu/msm_iommu_pagetable_lpae.c | 38 |
1 files changed, 5 insertions, 33 deletions
diff --git a/drivers/iommu/msm_iommu_pagetable_lpae.c b/drivers/iommu/msm_iommu_pagetable_lpae.c index a1ef2050f3e1..d3fb2999f731 100644 --- a/drivers/iommu/msm_iommu_pagetable_lpae.c +++ b/drivers/iommu/msm_iommu_pagetable_lpae.c @@ -391,46 +391,18 @@ fail: int msm_iommu_pagetable_map(struct msm_iommu_pt *pt, unsigned long va, phys_addr_t pa, size_t len, int prot) { - u64 *fl_pte; - u32 fl_offset; - u32 sl_offset; - u64 *sl_table; - u64 *sl_pte; - u64 upper_attr; - u64 lower_attr; s32 ret; - u32 redirect = pt->redirect; + struct scatterlist sg; ret = common_error_check(len, pt->fl_table); if (ret) goto fail; - if (!pt->fl_table) { - pr_err("Null page table\n"); - ret = -EINVAL; - goto fail; - } - - __get_attr(prot, &upper_attr, &lower_attr); - - fl_offset = FL_OFFSET(va); - fl_pte = pt->fl_table + fl_offset; - - ret = handle_1st_lvl(fl_pte, pa, upper_attr, lower_attr, len, redirect); - if (ret) - goto fail; + sg_init_table(&sg, 1); + sg_dma_address(&sg) = pa; + sg.length = len; - sl_table = FOLLOW_TO_NEXT_TABLE(fl_pte); - sl_offset = SL_OFFSET(va); - sl_pte = sl_table + sl_offset; - - if (len == SZ_32M) - ret = sl_32m_map(sl_pte, pa, upper_attr, lower_attr, redirect); - else if (len == SZ_2M) - ret = sl_2m_map(sl_pte, pa, upper_attr, lower_attr, redirect); - else if (len == SZ_64K || len == SZ_4K) - ret = handle_3rd_lvl(sl_pte, va, pa, upper_attr, lower_attr, - len, redirect); + ret = msm_iommu_pagetable_map_range(pt, va, &sg, len, prot); fail: return ret; |