| .. | .. |
|---|
| 1 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
|---|
| 2 | 2 | #ifndef _ASM_POWERPC_BOOK3S_64_HASH_4K_H |
|---|
| 3 | 3 | #define _ASM_POWERPC_BOOK3S_64_HASH_4K_H |
|---|
| 4 | | -/* |
|---|
| 5 | | - * Entries per page directory level. The PTE level must use a 64b record |
|---|
| 6 | | - * for each page table entry. The PMD and PGD level use a 32b record for |
|---|
| 7 | | - * each entry by assuming that each entry is page aligned. |
|---|
| 8 | | - */ |
|---|
| 9 | | -#define H_PTE_INDEX_SIZE 9 |
|---|
| 10 | | -#define H_PMD_INDEX_SIZE 7 |
|---|
| 11 | | -#define H_PUD_INDEX_SIZE 9 |
|---|
| 12 | | -#define H_PGD_INDEX_SIZE 9 |
|---|
| 4 | + |
|---|
| 5 | +#define H_PTE_INDEX_SIZE 9 // size: 8B << 9 = 4KB, maps: 2^9 x 4KB = 2MB |
|---|
| 6 | +#define H_PMD_INDEX_SIZE 7 // size: 8B << 7 = 1KB, maps: 2^7 x 2MB = 256MB |
|---|
| 7 | +#define H_PUD_INDEX_SIZE 9 // size: 8B << 9 = 4KB, maps: 2^9 x 256MB = 128GB |
|---|
| 8 | +#define H_PGD_INDEX_SIZE 9 // size: 8B << 9 = 4KB, maps: 2^9 x 128GB = 64TB |
|---|
| 13 | 9 | |
|---|
| 14 | 10 | /* |
|---|
| 15 | 11 | * Each context is 512TB. But on 4k we restrict our max TASK size to 64TB |
|---|
| .. | .. |
|---|
| 17 | 13 | */ |
|---|
| 18 | 14 | #define MAX_EA_BITS_PER_CONTEXT 46 |
|---|
| 19 | 15 | |
|---|
| 16 | + |
|---|
| 17 | +/* |
|---|
| 18 | + * Our page table limit us to 64TB. For 64TB physical memory, we only need 64GB |
|---|
| 19 | + * of vmemmap space. To better support sparse memory layout, we use 61TB |
|---|
| 20 | + * linear map range, 1TB of vmalloc, 1TB of I/O and 1TB of vmememmap. |
|---|
| 21 | + */ |
|---|
| 22 | +#define REGION_SHIFT (40) |
|---|
| 23 | +#define H_KERN_MAP_SIZE (ASM_CONST(1) << REGION_SHIFT) |
|---|
| 24 | + |
|---|
| 25 | +/* |
|---|
| 26 | + * Limits the linear mapping range |
|---|
| 27 | + */ |
|---|
| 28 | +#define H_MAX_PHYSMEM_BITS 46 |
|---|
| 29 | + |
|---|
| 30 | +/* |
|---|
| 31 | + * Define the address range of the kernel non-linear virtual area (61TB) |
|---|
| 32 | + */ |
|---|
| 33 | +#define H_KERN_VIRT_START ASM_CONST(0xc0003d0000000000) |
|---|
| 34 | + |
|---|
| 20 | 35 | #ifndef __ASSEMBLY__ |
|---|
| 21 | 36 | #define H_PTE_TABLE_SIZE (sizeof(pte_t) << H_PTE_INDEX_SIZE) |
|---|
| 22 | 37 | #define H_PMD_TABLE_SIZE (sizeof(pmd_t) << H_PMD_INDEX_SIZE) |
|---|
| 23 | 38 | #define H_PUD_TABLE_SIZE (sizeof(pud_t) << H_PUD_INDEX_SIZE) |
|---|
| 24 | 39 | #define H_PGD_TABLE_SIZE (sizeof(pgd_t) << H_PGD_INDEX_SIZE) |
|---|
| 25 | 40 | |
|---|
| 26 | | -#define H_PAGE_F_GIX_SHIFT 53 |
|---|
| 27 | | -#define H_PAGE_F_SECOND _RPAGE_RPN44 /* HPTE is in 2ndary HPTEG */ |
|---|
| 28 | | -#define H_PAGE_F_GIX (_RPAGE_RPN43 | _RPAGE_RPN42 | _RPAGE_RPN41) |
|---|
| 29 | | -#define H_PAGE_BUSY _RPAGE_RSV1 /* software: PTE & hash are busy */ |
|---|
| 30 | | -#define H_PAGE_HASHPTE _RPAGE_RSV2 /* software: PTE & hash are busy */ |
|---|
| 41 | +#define H_PAGE_F_GIX_SHIFT _PAGE_PA_MAX |
|---|
| 42 | +#define H_PAGE_F_SECOND _RPAGE_PKEY_BIT0 /* HPTE is in 2ndary HPTEG */ |
|---|
| 43 | +#define H_PAGE_F_GIX (_RPAGE_RPN43 | _RPAGE_RPN42 | _RPAGE_RPN41) |
|---|
| 44 | +#define H_PAGE_BUSY _RPAGE_RSV1 |
|---|
| 45 | +#define H_PAGE_HASHPTE _RPAGE_PKEY_BIT4 |
|---|
| 31 | 46 | |
|---|
| 32 | 47 | /* PTE flags to conserve for HPTE identification */ |
|---|
| 33 | 48 | #define _PAGE_HPTEFLAGS (H_PAGE_BUSY | H_PAGE_HASHPTE | \ |
|---|
| .. | .. |
|---|
| 46 | 61 | #define H_PMD_FRAG_NR (PAGE_SIZE >> H_PMD_FRAG_SIZE_SHIFT) |
|---|
| 47 | 62 | |
|---|
| 48 | 63 | /* memory key bits, only 8 keys supported */ |
|---|
| 49 | | -#define H_PTE_PKEY_BIT0 0 |
|---|
| 50 | | -#define H_PTE_PKEY_BIT1 0 |
|---|
| 51 | | -#define H_PTE_PKEY_BIT2 _RPAGE_RSV3 |
|---|
| 52 | | -#define H_PTE_PKEY_BIT3 _RPAGE_RSV4 |
|---|
| 53 | | -#define H_PTE_PKEY_BIT4 _RPAGE_RSV5 |
|---|
| 64 | +#define H_PTE_PKEY_BIT4 0 |
|---|
| 65 | +#define H_PTE_PKEY_BIT3 0 |
|---|
| 66 | +#define H_PTE_PKEY_BIT2 _RPAGE_PKEY_BIT3 |
|---|
| 67 | +#define H_PTE_PKEY_BIT1 _RPAGE_PKEY_BIT2 |
|---|
| 68 | +#define H_PTE_PKEY_BIT0 _RPAGE_PKEY_BIT1 |
|---|
| 69 | + |
|---|
| 54 | 70 | |
|---|
| 55 | 71 | /* |
|---|
| 56 | 72 | * On all 4K setups, remap_4k_pfn() equates to remap_pfn_range() |
|---|
| .. | .. |
|---|
| 66 | 82 | * if it is not a pte and have hugepd shift mask |
|---|
| 67 | 83 | * set, then it is a hugepd directory pointer |
|---|
| 68 | 84 | */ |
|---|
| 69 | | - if (!(hpdval & _PAGE_PTE) && |
|---|
| 85 | + if (!(hpdval & _PAGE_PTE) && (hpdval & _PAGE_PRESENT) && |
|---|
| 70 | 86 | ((hpdval & HUGEPD_SHIFT_MASK) != 0)) |
|---|
| 71 | 87 | return true; |
|---|
| 72 | 88 | return false; |
|---|