Lines Matching full:level
96 /* Returns the LSB number for a PTE on level <level> */
97 static int level2shift(int level) in level2shift() argument
99 /* Page is 12 bits wide, every level translates 9 bits */ in level2shift()
100 return (12 + 9 * (3 - level)); in level2shift()
103 static u64 *find_pte(u64 addr, int level) in find_pte() argument
111 debug("addr=%llx level=%d\n", addr, level); in find_pte()
117 if (level < start_level) in find_pte()
125 debug("idx=%llx PTE %p at level %d: %llx\n", idx, pte, i, *pte); in find_pte()
128 if (i == level) in find_pte()
133 /* Off to the next level */ in find_pte()
170 static void split_block(u64 *pte, int level) in split_block() argument
175 /* level describes the parent level, we need the child ones */ in split_block()
176 int levelshift = level2shift(level + 1); in split_block()
189 /* Level 3 block PTEs have the table type */ in split_block()
190 if ((level + 1) == 3) in split_block()
209 int level; in add_map() local
220 for (level = 1; level < 4; level++) { in add_map()
221 pte = find_pte(virt, level); in add_map()
225 blocksize = 1ULL << level2shift(level); in add_map()
232 if (level == 3) in add_map()
249 split_block(pte, level); in add_map()
264 * call this with level = -1 you basically get the full 48 bit
267 static int count_required_pts(u64 addr, int level, u64 maxaddr) in count_required_pts() argument
269 int levelshift = level2shift(level); in count_required_pts()
287 /* We need a sub-pt for this level */ in count_required_pts()
294 if (level <= 0) { in count_required_pts()
305 * Block PTEs at this level are already covered by the parent page in count_required_pts()
309 int sublevel = level + 1; in count_required_pts()
371 * Allocate the first level we're on with invalidate entries. in setup_pgtables()
372 * If the starting level is 0 (va_bits >= 39), then this is our in setup_pgtables()
507 static u64 set_one_region(u64 start, u64 size, u64 attrs, bool flag, int level) in set_one_region() argument
509 int levelshift = level2shift(level); in set_one_region()
511 u64 *pte = find_pte(start, level); in set_one_region()
513 /* Can we can just modify the current level block PTE? */ in set_one_region()
522 debug("Set attrs=%llx pte=%p level=%d\n", attrs, pte, level); in set_one_region()
528 debug("addr=%llx level=%d pte=%p (%llx)\n", start, level, pte, *pte); in set_one_region()
532 split_block(pte, level); in set_one_region()
539 /* Roll on to the next page table level */ in set_one_region()
567 int level; in mmu_set_region_dcache_behaviour() local
570 for (level = 1; level < 4; level++) { in mmu_set_region_dcache_behaviour()
572 r = set_one_region(start, size, attrs, false, level); in mmu_set_region_dcache_behaviour()
600 int level; in mmu_change_region_attr() local
610 for (level = 1; level < 4; level++) { in mmu_change_region_attr()
613 level); in mmu_change_region_attr()
634 for (level = 1; level < 4; level++) { in mmu_change_region_attr()
636 r = set_one_region(start, size, attrs, true, level); in mmu_change_region_attr()