Lines Matching refs:lvl
193 static inline bool iopte_leaf(arm_lpae_iopte pte, int lvl, in iopte_leaf() argument
196 if (lvl == (ARM_LPAE_MAX_LEVELS - 1) && fmt != ARM_MALI_LPAE) in iopte_leaf()
197 return iopte_type(pte, lvl) == ARM_LPAE_PTE_TYPE_PAGE; in iopte_leaf()
199 return iopte_type(pte, lvl) == ARM_LPAE_PTE_TYPE_BLOCK; in iopte_leaf()
296 unsigned long iova, size_t size, int lvl,
301 int lvl, arm_lpae_iopte *ptep) in __arm_lpae_init_pte() argument
308 if (data->iop.fmt != ARM_MALI_LPAE && lvl == ARM_LPAE_MAX_LEVELS - 1) in __arm_lpae_init_pte()
323 arm_lpae_iopte prot, int lvl, in arm_lpae_init_pte() argument
328 if (iopte_leaf(pte, lvl, data->iop.fmt)) { in arm_lpae_init_pte()
332 } else if (iopte_type(pte, lvl) == ARM_LPAE_PTE_TYPE_TABLE) { in arm_lpae_init_pte()
338 size_t sz = ARM_LPAE_BLOCK_SIZE(lvl, data); in arm_lpae_init_pte()
340 tblp = ptep - ARM_LPAE_LVL_IDX(iova, lvl, data); in arm_lpae_init_pte()
341 if (__arm_lpae_unmap(data, NULL, iova, sz, lvl, tblp) != sz) { in arm_lpae_init_pte()
347 __arm_lpae_init_pte(data, paddr, prot, lvl, ptep); in arm_lpae_init_pte()
384 int lvl, arm_lpae_iopte *ptep) in __arm_lpae_map() argument
387 size_t block_size = ARM_LPAE_BLOCK_SIZE(lvl, data); in __arm_lpae_map()
392 ptep += ARM_LPAE_LVL_IDX(iova, lvl, data); in __arm_lpae_map()
396 return arm_lpae_init_pte(data, iova, paddr, prot, lvl, ptep); in __arm_lpae_map()
399 if (WARN_ON(lvl >= ARM_LPAE_MAX_LEVELS - 1)) in __arm_lpae_map()
416 if (pte && !iopte_leaf(pte, lvl, data->iop.fmt)) { in __arm_lpae_map()
425 return __arm_lpae_map(data, iova, paddr, size, prot, lvl + 1, cptep); in __arm_lpae_map()
483 int ret, lvl = ARM_LPAE_START_LVL(data); in arm_lpae_map() local
495 ret = __arm_lpae_map(data, iova, paddr, size, prot, lvl, ptep); in arm_lpae_map()
505 static void __arm_lpae_free_pgtable(struct arm_lpae_io_pgtable *data, int lvl, in __arm_lpae_free_pgtable() argument
511 if (lvl == ARM_LPAE_START_LVL(data)) in __arm_lpae_free_pgtable()
519 if (lvl == ARM_LPAE_MAX_LEVELS - 1) in __arm_lpae_free_pgtable()
527 if (!pte || iopte_leaf(pte, lvl, data->iop.fmt)) in __arm_lpae_free_pgtable()
530 __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data)); in __arm_lpae_free_pgtable()
547 arm_lpae_iopte blk_pte, int lvl, in arm_lpae_split_blk_unmap() argument
554 size_t split_sz = ARM_LPAE_BLOCK_SIZE(lvl, data); in arm_lpae_split_blk_unmap()
557 if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS)) in arm_lpae_split_blk_unmap()
565 unmap_idx = ARM_LPAE_LVL_IDX(iova, lvl, data); in arm_lpae_split_blk_unmap()
575 __arm_lpae_init_pte(data, blk_paddr, pte, lvl, &tablep[i]); in arm_lpae_split_blk_unmap()
586 if (iopte_type(pte, lvl - 1) != ARM_LPAE_PTE_TYPE_TABLE) in arm_lpae_split_blk_unmap()
595 return __arm_lpae_unmap(data, gather, iova, size, lvl, tablep); in arm_lpae_split_blk_unmap()
600 unsigned long iova, size_t size, int lvl, in __arm_lpae_unmap() argument
607 if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS)) in __arm_lpae_unmap()
610 ptep += ARM_LPAE_LVL_IDX(iova, lvl, data); in __arm_lpae_unmap()
616 if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) { in __arm_lpae_unmap()
619 if (!iopte_leaf(pte, lvl, iop->fmt)) { in __arm_lpae_unmap()
624 __arm_lpae_free_pgtable(data, lvl + 1, ptep); in __arm_lpae_unmap()
637 } else if (iopte_leaf(pte, lvl, iop->fmt)) { in __arm_lpae_unmap()
643 lvl + 1, ptep); in __arm_lpae_unmap()
648 return __arm_lpae_unmap(data, gather, iova, size, lvl + 1, ptep); in __arm_lpae_unmap()
656 int lvl = ARM_LPAE_START_LVL(data); in arm_lpae_unmap() local
661 return __arm_lpae_unmap(data, gather, iova, size, lvl, ptep); in arm_lpae_unmap()
669 int lvl = ARM_LPAE_START_LVL(data); in arm_lpae_iova_to_phys() local
677 ptep += ARM_LPAE_LVL_IDX(iova, lvl, data); in arm_lpae_iova_to_phys()
685 if (iopte_leaf(pte, lvl, data->iop.fmt)) in arm_lpae_iova_to_phys()
690 } while (++lvl < ARM_LPAE_MAX_LEVELS); in arm_lpae_iova_to_phys()
696 iova &= (ARM_LPAE_BLOCK_SIZE(lvl, data) - 1); in arm_lpae_iova_to_phys()