summaryrefslogtreecommitdiff
path: root/drivers/iommu/msm_iommu_pagetable_lpae.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iommu/msm_iommu_pagetable_lpae.c')
-rw-r--r--drivers/iommu/msm_iommu_pagetable_lpae.c38
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;