Lines Matching refs:level

121 /* Returns the LSB number for a PTE on level <level> */
122 static int level2shift(int level)
124 /* Page is 12 bits wide, every level translates 9 bits */
125 return (12 + 9 * (3 - level));
128 static u64 *find_pte(u64 addr, int level)
136 debug("addr=%llx level=%d\n", addr, level);
142 if (level < start_level)
150 debug("idx=%llx PTE %p at level %d: %llx\n", idx, pte, i, *pte);
153 if (i == level)
158 /* Off to the next level */
168 u64 pte, int level, u64 base)
175 u64 end, va = base + i * BIT(level2shift(level));
181 debug("PTE %llx at level %d VA %llx\n", pte, level, va);
187 /* Not a leaf? Recurse on the next level */
189 (level == 3 && type == PTE_TYPE_PAGE))) {
190 __cmo_on_leaves(cmo_fn, pte, level + 1, va);
203 end = va + BIT(level2shift(level)) - 1;
219 debug("Flush PTE %llx at level %d: %llx-%llx\n",
220 pte, level, va, end);
272 static void split_block(u64 *pte, int level)
277 /* level describes the parent level, we need the child ones */
278 int levelshift = level2shift(level + 1);
292 if ((level + 1) == 3)
302 static void map_range(u64 virt, u64 phys, u64 size, int level,
305 u64 map_size = BIT_ULL(level2shift(level));
308 idx = (virt >> level2shift(level)) & (MAX_PTE_ENTRIES - 1);
312 if (level >= 1 &&
314 if (level == 3)
326 /* Going one level down */
330 split_block(&table[i], level);
335 map_range(virt, phys, next_size, level + 1, next_table, attrs);
347 int level = 0;
351 level = 1;
353 map_range(map->virt, map->phys, map->size, level,
357 static void count_range(u64 virt, u64 size, int level, int *cntp)
359 u64 map_size = BIT_ULL(level2shift(level));
362 idx = (virt >> level2shift(level)) & (MAX_PTE_ENTRIES - 1);
366 if (level >= 1 &&
374 /* Going one level down */
378 count_range(virt, next_size, level + 1, cntp);
387 int i, count = 0, level = 0;
392 level = 1;
395 count_range(mem_map[i].virt, mem_map[i].size, level, &count);
432 * Allocate the first level we're on with invalidate entries.
433 * If the starting level is 0 (va_bits >= 39), then this is our
600 static u64 set_one_region(u64 start, u64 size, u64 attrs, bool flag, int level)
602 int levelshift = level2shift(level);
604 u64 *pte = find_pte(start, level);
606 /* Can we can just modify the current level block PTE? */
615 debug("Set attrs=%llx pte=%p level=%d\n", attrs, pte, level);
621 debug("addr=%llx level=%d pte=%p (%llx)\n", start, level, pte, *pte);
625 split_block(pte, level);
632 /* Roll on to the next page table level */
660 int level;
663 for (level = 1; level < 4; level++) {
665 r = set_one_region(start, size, attrs, false, level);
693 int level;
703 for (level = 1; level < 4; level++) {
706 level);
727 for (level = 1; level < 4; level++) {
729 r = set_one_region(start, size, attrs, true, level);