0001
0002 #ifndef _ASM_POWERPC_PAGE_H
0003 #define _ASM_POWERPC_PAGE_H
0004
0005
0006
0007
0008
0009 #ifndef __ASSEMBLY__
0010 #include <linux/types.h>
0011 #include <linux/kernel.h>
0012 #else
0013 #include <asm/types.h>
0014 #endif
0015 #include <asm/asm-const.h>
0016
0017
0018
0019
0020
0021
0022
0023 #define PAGE_SHIFT CONFIG_PPC_PAGE_SHIFT
0024 #define PAGE_SIZE (ASM_CONST(1) << PAGE_SHIFT)
0025
0026 #ifndef __ASSEMBLY__
0027 #ifndef CONFIG_HUGETLB_PAGE
0028 #define HPAGE_SHIFT PAGE_SHIFT
0029 #elif defined(CONFIG_PPC_BOOK3S_64)
0030 extern unsigned int hpage_shift;
0031 #define HPAGE_SHIFT hpage_shift
0032 #elif defined(CONFIG_PPC_8xx)
0033 #define HPAGE_SHIFT 19
0034 #elif defined(CONFIG_PPC_FSL_BOOK3E)
0035 #define HPAGE_SHIFT 22
0036 #endif
0037 #define HPAGE_SIZE ((1UL) << HPAGE_SHIFT)
0038 #define HPAGE_MASK (~(HPAGE_SIZE - 1))
0039 #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
0040 #define HUGE_MAX_HSTATE (MMU_PAGE_COUNT-1)
0041 #endif
0042
0043
0044
0045
0046
0047
0048 #define PAGE_MASK (~((1 << PAGE_SHIFT) - 1))
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 #define KERNELBASE ASM_CONST(CONFIG_KERNEL_START)
0081 #define PAGE_OFFSET ASM_CONST(CONFIG_PAGE_OFFSET)
0082 #define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_PHYSICAL_START))
0083
0084 #if defined(CONFIG_NONSTATIC_KERNEL)
0085 #ifndef __ASSEMBLY__
0086
0087 extern phys_addr_t memstart_addr;
0088 extern phys_addr_t kernstart_addr;
0089
0090 #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_PPC32)
0091 extern long long virt_phys_offset;
0092 #endif
0093
0094 #endif
0095 #define PHYSICAL_START kernstart_addr
0096
0097 #else
0098 #define PHYSICAL_START ASM_CONST(CONFIG_PHYSICAL_START)
0099 #endif
0100
0101
0102 #if defined(CONFIG_PPC32) && defined(CONFIG_BOOKE)
0103 #ifdef CONFIG_RELOCATABLE
0104 #define VIRT_PHYS_OFFSET virt_phys_offset
0105 #else
0106 #define VIRT_PHYS_OFFSET (KERNELBASE - PHYSICAL_START)
0107 #endif
0108 #endif
0109
0110 #ifdef CONFIG_PPC64
0111 #define MEMORY_START 0UL
0112 #elif defined(CONFIG_NONSTATIC_KERNEL)
0113 #define MEMORY_START memstart_addr
0114 #else
0115 #define MEMORY_START (PHYSICAL_START + PAGE_OFFSET - KERNELBASE)
0116 #endif
0117
0118 #ifdef CONFIG_FLATMEM
0119 #define ARCH_PFN_OFFSET ((unsigned long)(MEMORY_START >> PAGE_SHIFT))
0120 #ifndef __ASSEMBLY__
0121 extern unsigned long max_mapnr;
0122 static inline bool pfn_valid(unsigned long pfn)
0123 {
0124 unsigned long min_pfn = ARCH_PFN_OFFSET;
0125
0126 return pfn >= min_pfn && pfn < max_mapnr;
0127 }
0128 #endif
0129 #endif
0130
0131 #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
0132 #define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
0133 #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
0134
0135 #define virt_addr_valid(vaddr) ({ \
0136 unsigned long _addr = (unsigned long)vaddr; \
0137 _addr >= PAGE_OFFSET && _addr < (unsigned long)high_memory && \
0138 pfn_valid(virt_to_pfn(_addr)); \
0139 })
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 #if defined(CONFIG_PPC32) && defined(CONFIG_BOOKE)
0215 #define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET))
0216 #define __pa(x) ((phys_addr_t)(unsigned long)(x) - VIRT_PHYS_OFFSET)
0217 #else
0218 #ifdef CONFIG_PPC64
0219
0220 #define VIRTUAL_WARN_ON(x) WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && (x))
0221
0222
0223
0224
0225
0226
0227 #define __va(x) \
0228 ({ \
0229 VIRTUAL_WARN_ON((unsigned long)(x) >= PAGE_OFFSET); \
0230 (void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET); \
0231 })
0232
0233 #define __pa(x) \
0234 ({ \
0235 VIRTUAL_WARN_ON((unsigned long)(x) < PAGE_OFFSET); \
0236 (unsigned long)(x) & 0x0fffffffffffffffUL; \
0237 })
0238
0239 #else
0240 #define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))
0241 #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)
0242 #endif
0243 #endif
0244
0245
0246
0247
0248
0249
0250 #define VM_DATA_DEFAULT_FLAGS32 VM_DATA_FLAGS_TSK_EXEC
0251 #define VM_DATA_DEFAULT_FLAGS64 VM_DATA_FLAGS_NON_EXEC
0252
0253 #ifdef __powerpc64__
0254 #include <asm/page_64.h>
0255 #else
0256 #include <asm/page_32.h>
0257 #endif
0258
0259
0260
0261
0262
0263 #ifdef CONFIG_PPC_BOOK3E_64
0264 #define is_kernel_addr(x) ((x) >= 0x8000000000000000ul)
0265 #elif defined(CONFIG_PPC_BOOK3S_64)
0266 #define is_kernel_addr(x) ((x) >= PAGE_OFFSET)
0267 #else
0268 #define is_kernel_addr(x) ((x) >= TASK_SIZE)
0269 #endif
0270
0271 #ifndef CONFIG_PPC_BOOK3S_64
0272
0273
0274
0275
0276
0277
0278 #ifdef CONFIG_PPC64
0279 #define PD_HUGE 0x8000000000000000UL
0280 #else
0281 #define PD_HUGE 0x80000000
0282 #endif
0283
0284 #else
0285
0286
0287
0288
0289 #define HUGEPD_ADDR_MASK (0x0ffffffffffffffful & ~HUGEPD_SHIFT_MASK)
0290 #endif
0291
0292
0293
0294
0295
0296
0297 #ifdef CONFIG_PPC_8xx
0298 #define HUGEPD_SHIFT_MASK 0xfff
0299 #else
0300 #define HUGEPD_SHIFT_MASK 0x3f
0301 #endif
0302
0303 #ifndef __ASSEMBLY__
0304
0305 #ifdef CONFIG_PPC_BOOK3S_64
0306 #include <asm/pgtable-be-types.h>
0307 #else
0308 #include <asm/pgtable-types.h>
0309 #endif
0310
0311
0312 #ifndef CONFIG_HUGETLB_PAGE
0313 #define is_hugepd(pdep) (0)
0314 #define pgd_huge(pgd) (0)
0315 #endif
0316
0317 struct page;
0318 extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
0319 extern void copy_user_page(void *to, void *from, unsigned long vaddr,
0320 struct page *p);
0321 extern int devmem_is_allowed(unsigned long pfn);
0322
0323 #ifdef CONFIG_PPC_SMLPAR
0324 void arch_free_page(struct page *page, int order);
0325 #define HAVE_ARCH_FREE_PAGE
0326 #endif
0327
0328 struct vm_area_struct;
0329
0330 extern unsigned long kernstart_virt_addr;
0331
0332 static inline unsigned long kaslr_offset(void)
0333 {
0334 return kernstart_virt_addr - KERNELBASE;
0335 }
0336
0337 #include <asm-generic/memory_model.h>
0338 #endif
0339
0340 #endif