1
2#ifndef _ASM_POWERPC_BOOK3S_64_HASH_4K_H
3#define _ASM_POWERPC_BOOK3S_64_HASH_4K_H
4
5#define H_PTE_INDEX_SIZE 9
6#define H_PMD_INDEX_SIZE 7
7#define H_PUD_INDEX_SIZE 9
8#define H_PGD_INDEX_SIZE 9
9
10
11
12
13
14#define MAX_EA_BITS_PER_CONTEXT 46
15
16
17
18
19
20
21
22#define REGION_SHIFT (40)
23#define H_KERN_MAP_SIZE (ASM_CONST(1) << REGION_SHIFT)
24
25
26
27
28#define H_MAX_PHYSMEM_BITS 46
29
30
31
32
33#define H_KERN_VIRT_START ASM_CONST(0xc0003d0000000000)
34
35#ifndef __ASSEMBLY__
36#define H_PTE_TABLE_SIZE (sizeof(pte_t) << H_PTE_INDEX_SIZE)
37#define H_PMD_TABLE_SIZE (sizeof(pmd_t) << H_PMD_INDEX_SIZE)
38#define H_PUD_TABLE_SIZE (sizeof(pud_t) << H_PUD_INDEX_SIZE)
39#define H_PGD_TABLE_SIZE (sizeof(pgd_t) << H_PGD_INDEX_SIZE)
40
41#define H_PAGE_F_GIX_SHIFT _PAGE_PA_MAX
42#define H_PAGE_F_SECOND _RPAGE_PKEY_BIT0
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
46
47
48#define _PAGE_HPTEFLAGS (H_PAGE_BUSY | H_PAGE_HASHPTE | \
49 H_PAGE_F_SECOND | H_PAGE_F_GIX)
50
51
52
53#define H_PAGE_4K_PFN 0x0
54#define H_PAGE_THP_HUGE 0x0
55#define H_PAGE_COMBO 0x0
56
57
58#define H_PTE_FRAG_SIZE_SHIFT (H_PTE_INDEX_SIZE + 3)
59#define H_PTE_FRAG_NR (PAGE_SIZE >> H_PTE_FRAG_SIZE_SHIFT)
60#define H_PMD_FRAG_SIZE_SHIFT (H_PMD_INDEX_SIZE + 3)
61#define H_PMD_FRAG_NR (PAGE_SIZE >> H_PMD_FRAG_SIZE_SHIFT)
62
63
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
70
71
72
73
74#define remap_4k_pfn(vma, addr, pfn, prot) \
75 remap_pfn_range((vma), (addr), (pfn), PAGE_SIZE, (prot))
76
77#ifdef CONFIG_HUGETLB_PAGE
78static inline int hash__hugepd_ok(hugepd_t hpd)
79{
80 unsigned long hpdval = hpd_val(hpd);
81
82
83
84
85 if (!(hpdval & _PAGE_PTE) && (hpdval & _PAGE_PRESENT) &&
86 ((hpdval & HUGEPD_SHIFT_MASK) != 0))
87 return true;
88 return false;
89}
90#endif
91
92
93
94
95
96
97
98
99static inline unsigned long pte_set_hidx(pte_t *ptep, real_pte_t rpte,
100 unsigned int subpg_index, unsigned long hidx,
101 int offset)
102{
103 return (hidx << H_PAGE_F_GIX_SHIFT) &
104 (H_PAGE_F_SECOND | H_PAGE_F_GIX);
105}
106
107#ifdef CONFIG_TRANSPARENT_HUGEPAGE
108
109static inline char *get_hpte_slot_array(pmd_t *pmdp)
110{
111 BUG();
112 return NULL;
113}
114
115static inline unsigned int hpte_valid(unsigned char *hpte_slot_array, int index)
116{
117 BUG();
118 return 0;
119}
120
121static inline unsigned int hpte_hash_index(unsigned char *hpte_slot_array,
122 int index)
123{
124 BUG();
125 return 0;
126}
127
128static inline void mark_hpte_slot_valid(unsigned char *hpte_slot_array,
129 unsigned int index, unsigned int hidx)
130{
131 BUG();
132}
133
134static inline int hash__pmd_trans_huge(pmd_t pmd)
135{
136 return 0;
137}
138
139static inline int hash__pmd_same(pmd_t pmd_a, pmd_t pmd_b)
140{
141 BUG();
142 return 0;
143}
144
145static inline pmd_t hash__pmd_mkhuge(pmd_t pmd)
146{
147 BUG();
148 return pmd;
149}
150
151extern unsigned long hash__pmd_hugepage_update(struct mm_struct *mm,
152 unsigned long addr, pmd_t *pmdp,
153 unsigned long clr, unsigned long set);
154extern pmd_t hash__pmdp_collapse_flush(struct vm_area_struct *vma,
155 unsigned long address, pmd_t *pmdp);
156extern void hash__pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
157 pgtable_t pgtable);
158extern pgtable_t hash__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
159extern pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm,
160 unsigned long addr, pmd_t *pmdp);
161extern int hash__has_transparent_hugepage(void);
162#endif
163
164static inline pmd_t hash__pmd_mkdevmap(pmd_t pmd)
165{
166 BUG();
167 return pmd;
168}
169
170#endif
171
172#endif
173