|
7 | 7 |
|
8 | 8 | #include <asm/memory.h>
|
9 | 9 |
|
| 10 | +#define PTDESC_ORDER 3 |
| 11 | + |
| 12 | +/* Number of VA bits resolved by a single translation table level */ |
| 13 | +#define PTDESC_TABLE_SHIFT (PAGE_SHIFT - PTDESC_ORDER) |
| 14 | + |
10 | 15 | /*
|
11 | 16 | * Number of page-table levels required to address 'va_bits' wide
|
12 | 17 | * address, without section mapping. We resolve the top (va_bits - PAGE_SHIFT)
|
13 |
| - * bits with (PAGE_SHIFT - 3) bits at each page table level. Hence: |
| 18 | + * bits with PTDESC_TABLE_SHIFT bits at each page table level. Hence: |
14 | 19 | *
|
15 |
| - * levels = DIV_ROUND_UP((va_bits - PAGE_SHIFT), (PAGE_SHIFT - 3)) |
| 20 | + * levels = DIV_ROUND_UP((va_bits - PAGE_SHIFT), PTDESC_TABLE_SHIFT) |
16 | 21 | *
|
17 | 22 | * where DIV_ROUND_UP(n, d) => (((n) + (d) - 1) / (d))
|
18 | 23 | *
|
19 | 24 | * We cannot include linux/kernel.h which defines DIV_ROUND_UP here
|
20 | 25 | * due to build issues. So we open code DIV_ROUND_UP here:
|
21 | 26 | *
|
22 |
| - * ((((va_bits) - PAGE_SHIFT) + (PAGE_SHIFT - 3) - 1) / (PAGE_SHIFT - 3)) |
| 27 | + * ((((va_bits) - PAGE_SHIFT) + PTDESC_TABLE_SHIFT - 1) / PTDESC_TABLE_SHIFT) |
23 | 28 | *
|
24 | 29 | * which gets simplified as :
|
25 | 30 | */
|
26 |
| -#define ARM64_HW_PGTABLE_LEVELS(va_bits) (((va_bits) - 4) / (PAGE_SHIFT - 3)) |
| 31 | +#define ARM64_HW_PGTABLE_LEVELS(va_bits) \ |
| 32 | + (((va_bits) - PTDESC_ORDER - 1) / PTDESC_TABLE_SHIFT) |
27 | 33 |
|
28 | 34 | /*
|
29 | 35 | * Size mapped by an entry at level n ( -1 <= n <= 3)
|
30 |
| - * We map (PAGE_SHIFT - 3) at all translation levels and PAGE_SHIFT bits |
| 36 | + * We map PTDESC_TABLE_SHIFT at all translation levels and PAGE_SHIFT bits |
31 | 37 | * in the final page. The maximum number of translation levels supported by
|
32 | 38 | * the architecture is 5. Hence, starting at level n, we have further
|
33 | 39 | * ((4 - n) - 1) levels of translation excluding the offset within the page.
|
34 | 40 | * So, the total number of bits mapped by an entry at level n is :
|
35 | 41 | *
|
36 |
| - * ((4 - n) - 1) * (PAGE_SHIFT - 3) + PAGE_SHIFT |
| 42 | + * ((4 - n) - 1) * PTDESC_TABLE_SHIFT + PAGE_SHIFT |
37 | 43 | *
|
38 | 44 | * Rearranging it a bit we get :
|
39 |
| - * (4 - n) * (PAGE_SHIFT - 3) + 3 |
| 45 | + * (4 - n) * PTDESC_TABLE_SHIFT + PTDESC_ORDER |
40 | 46 | */
|
41 |
| -#define ARM64_HW_PGTABLE_LEVEL_SHIFT(n) ((PAGE_SHIFT - 3) * (4 - (n)) + 3) |
| 47 | +#define ARM64_HW_PGTABLE_LEVEL_SHIFT(n) (PTDESC_TABLE_SHIFT * (4 - (n)) + PTDESC_ORDER) |
42 | 48 |
|
43 |
| -#define PTRS_PER_PTE (1 << (PAGE_SHIFT - 3)) |
| 49 | +#define PTRS_PER_PTE (1 << PTDESC_TABLE_SHIFT) |
44 | 50 |
|
45 | 51 | /*
|
46 | 52 | * PMD_SHIFT determines the size a level 2 page table entry can map.
|
|
49 | 55 | #define PMD_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(2)
|
50 | 56 | #define PMD_SIZE (_AC(1, UL) << PMD_SHIFT)
|
51 | 57 | #define PMD_MASK (~(PMD_SIZE-1))
|
52 |
| -#define PTRS_PER_PMD (1 << (PAGE_SHIFT - 3)) |
| 58 | +#define PTRS_PER_PMD (1 << PTDESC_TABLE_SHIFT) |
53 | 59 | #endif
|
54 | 60 |
|
55 | 61 | /*
|
|
59 | 65 | #define PUD_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(1)
|
60 | 66 | #define PUD_SIZE (_AC(1, UL) << PUD_SHIFT)
|
61 | 67 | #define PUD_MASK (~(PUD_SIZE-1))
|
62 |
| -#define PTRS_PER_PUD (1 << (PAGE_SHIFT - 3)) |
| 68 | +#define PTRS_PER_PUD (1 << PTDESC_TABLE_SHIFT) |
63 | 69 | #endif
|
64 | 70 |
|
65 | 71 | #if CONFIG_PGTABLE_LEVELS > 4
|
66 | 72 | #define P4D_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(0)
|
67 | 73 | #define P4D_SIZE (_AC(1, UL) << P4D_SHIFT)
|
68 | 74 | #define P4D_MASK (~(P4D_SIZE-1))
|
69 |
| -#define PTRS_PER_P4D (1 << (PAGE_SHIFT - 3)) |
| 75 | +#define PTRS_PER_P4D (1 << PTDESC_TABLE_SHIFT) |
70 | 76 | #endif
|
71 | 77 |
|
72 | 78 | /*
|
|
0 commit comments