aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/include/asm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/include/asm')
-rw-r--r--arch/powerpc/include/asm/Kbuild4
-rw-r--r--arch/powerpc/include/asm/asm-prototypes.h1
-rw-r--r--arch/powerpc/include/asm/book3s/32/hash.h1
-rw-r--r--arch/powerpc/include/asm/book3s/32/mmu-hash.h15
-rw-r--r--arch/powerpc/include/asm/book3s/32/pgalloc.h40
-rw-r--r--arch/powerpc/include/asm/book3s/32/pgtable.h46
-rw-r--r--arch/powerpc/include/asm/book3s/64/hash-4k.h6
-rw-r--r--arch/powerpc/include/asm/book3s/64/mmu.h9
-rw-r--r--arch/powerpc/include/asm/book3s/64/pgalloc.h6
-rw-r--r--arch/powerpc/include/asm/book3s/64/pgtable.h2
-rw-r--r--arch/powerpc/include/asm/cache.h2
-rw-r--r--arch/powerpc/include/asm/code-patching.h23
-rw-r--r--arch/powerpc/include/asm/cputable.h9
-rw-r--r--arch/powerpc/include/asm/dma-mapping.h7
-rw-r--r--arch/powerpc/include/asm/fadump.h7
-rw-r--r--arch/powerpc/include/asm/feature-fixups.h12
-rw-r--r--arch/powerpc/include/asm/hugetlb.h15
-rw-r--r--arch/powerpc/include/asm/io.h13
-rw-r--r--arch/powerpc/include/asm/iommu.h17
-rw-r--r--arch/powerpc/include/asm/ipic.h1
-rw-r--r--arch/powerpc/include/asm/mmu.h49
-rw-r--r--arch/powerpc/include/asm/mmu_context.h32
-rw-r--r--arch/powerpc/include/asm/nohash/32/mmu-40x.h (renamed from arch/powerpc/include/asm/mmu-40x.h)0
-rw-r--r--arch/powerpc/include/asm/nohash/32/mmu-44x.h (renamed from arch/powerpc/include/asm/mmu-44x.h)3
-rw-r--r--arch/powerpc/include/asm/nohash/32/mmu-8xx.h (renamed from arch/powerpc/include/asm/mmu-8xx.h)4
-rw-r--r--arch/powerpc/include/asm/nohash/32/mmu.h25
-rw-r--r--arch/powerpc/include/asm/nohash/32/pgalloc.h27
-rw-r--r--arch/powerpc/include/asm/nohash/32/pgtable.h15
-rw-r--r--arch/powerpc/include/asm/nohash/32/pte-40x.h2
-rw-r--r--arch/powerpc/include/asm/nohash/32/pte-8xx.h3
-rw-r--r--arch/powerpc/include/asm/nohash/64/mmu.h12
-rw-r--r--arch/powerpc/include/asm/nohash/64/pgalloc.h5
-rw-r--r--arch/powerpc/include/asm/nohash/mmu-book3e.h (renamed from arch/powerpc/include/asm/mmu-book3e.h)0
-rw-r--r--arch/powerpc/include/asm/nohash/mmu.h11
-rw-r--r--arch/powerpc/include/asm/nohash/pgtable.h4
-rw-r--r--arch/powerpc/include/asm/opal.h1
-rw-r--r--arch/powerpc/include/asm/page.h18
-rw-r--r--arch/powerpc/include/asm/page_32.h3
-rw-r--r--arch/powerpc/include/asm/pci-bridge.h1
-rw-r--r--arch/powerpc/include/asm/pci.h4
-rw-r--r--arch/powerpc/include/asm/perf_event.h3
-rw-r--r--arch/powerpc/include/asm/perf_event_server.h2
-rw-r--r--arch/powerpc/include/asm/pgtable-types.h4
-rw-r--r--arch/powerpc/include/asm/pgtable.h32
-rw-r--r--arch/powerpc/include/asm/ppc-opcode.h1
-rw-r--r--arch/powerpc/include/asm/ppc_asm.h29
-rw-r--r--arch/powerpc/include/asm/reg.h4
-rw-r--r--arch/powerpc/include/asm/setup.h7
-rw-r--r--arch/powerpc/include/asm/sfp-machine.h92
-rw-r--r--arch/powerpc/include/asm/slice.h14
-rw-r--r--arch/powerpc/include/asm/syscall.h3
-rw-r--r--arch/powerpc/include/asm/systbl.h396
-rw-r--r--arch/powerpc/include/asm/time.h2
-rw-r--r--arch/powerpc/include/asm/tlb.h2
-rw-r--r--arch/powerpc/include/asm/uaccess.h2
-rw-r--r--arch/powerpc/include/asm/unistd.h3
56 files changed, 382 insertions, 669 deletions
diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild
index 3196d227e351..77ff7fb24823 100644
--- a/arch/powerpc/include/asm/Kbuild
+++ b/arch/powerpc/include/asm/Kbuild
@@ -1,3 +1,7 @@
1generated-y += syscall_table_32.h
2generated-y += syscall_table_64.h
3generated-y += syscall_table_c32.h
4generated-y += syscall_table_spu.h
1generic-y += div64.h 5generic-y += div64.h
2generic-y += export.h 6generic-y += export.h
3generic-y += irq_regs.h 7generic-y += irq_regs.h
diff --git a/arch/powerpc/include/asm/asm-prototypes.h b/arch/powerpc/include/asm/asm-prototypes.h
index ec691d489656..6f201b199c02 100644
--- a/arch/powerpc/include/asm/asm-prototypes.h
+++ b/arch/powerpc/include/asm/asm-prototypes.h
@@ -61,7 +61,6 @@ void RunModeException(struct pt_regs *regs);
61void single_step_exception(struct pt_regs *regs); 61void single_step_exception(struct pt_regs *regs);
62void program_check_exception(struct pt_regs *regs); 62void program_check_exception(struct pt_regs *regs);
63void alignment_exception(struct pt_regs *regs); 63void alignment_exception(struct pt_regs *regs);
64void slb_miss_bad_addr(struct pt_regs *regs);
65void StackOverflow(struct pt_regs *regs); 64void StackOverflow(struct pt_regs *regs);
66void kernel_fp_unavailable_exception(struct pt_regs *regs); 65void kernel_fp_unavailable_exception(struct pt_regs *regs);
67void altivec_unavailable_exception(struct pt_regs *regs); 66void altivec_unavailable_exception(struct pt_regs *regs);
diff --git a/arch/powerpc/include/asm/book3s/32/hash.h b/arch/powerpc/include/asm/book3s/32/hash.h
index f2892c7ab73e..2a0a467d2985 100644
--- a/arch/powerpc/include/asm/book3s/32/hash.h
+++ b/arch/powerpc/include/asm/book3s/32/hash.h
@@ -26,6 +26,7 @@
26#define _PAGE_WRITETHRU 0x040 /* W: cache write-through */ 26#define _PAGE_WRITETHRU 0x040 /* W: cache write-through */
27#define _PAGE_DIRTY 0x080 /* C: page changed */ 27#define _PAGE_DIRTY 0x080 /* C: page changed */
28#define _PAGE_ACCESSED 0x100 /* R: page referenced */ 28#define _PAGE_ACCESSED 0x100 /* R: page referenced */
29#define _PAGE_EXEC 0x200 /* software: exec allowed */
29#define _PAGE_RW 0x400 /* software: user write access allowed */ 30#define _PAGE_RW 0x400 /* software: user write access allowed */
30#define _PAGE_SPECIAL 0x800 /* software: Special page */ 31#define _PAGE_SPECIAL 0x800 /* software: Special page */
31 32
diff --git a/arch/powerpc/include/asm/book3s/32/mmu-hash.h b/arch/powerpc/include/asm/book3s/32/mmu-hash.h
index e38c91388c40..0c261ba2c826 100644
--- a/arch/powerpc/include/asm/book3s/32/mmu-hash.h
+++ b/arch/powerpc/include/asm/book3s/32/mmu-hash.h
@@ -1,6 +1,7 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_POWERPC_BOOK3S_32_MMU_HASH_H_ 2#ifndef _ASM_POWERPC_BOOK3S_32_MMU_HASH_H_
3#define _ASM_POWERPC_BOOK3S_32_MMU_HASH_H_ 3#define _ASM_POWERPC_BOOK3S_32_MMU_HASH_H_
4
4/* 5/*
5 * 32-bit hash table MMU support 6 * 32-bit hash table MMU support
6 */ 7 */
@@ -9,6 +10,8 @@
9 * BATs 10 * BATs
10 */ 11 */
11 12
13#include <asm/page.h>
14
12/* Block size masks */ 15/* Block size masks */
13#define BL_128K 0x000 16#define BL_128K 0x000
14#define BL_256K 0x001 17#define BL_256K 0x001
@@ -34,14 +37,20 @@
34#define BAT_PHYS_ADDR(x) ((u32)((x & 0x00000000fffe0000ULL) | \ 37#define BAT_PHYS_ADDR(x) ((u32)((x & 0x00000000fffe0000ULL) | \
35 ((x & 0x0000000e00000000ULL) >> 24) | \ 38 ((x & 0x0000000e00000000ULL) >> 24) | \
36 ((x & 0x0000000100000000ULL) >> 30))) 39 ((x & 0x0000000100000000ULL) >> 30)))
40#define PHYS_BAT_ADDR(x) (((u64)(x) & 0x00000000fffe0000ULL) | \
41 (((u64)(x) << 24) & 0x0000000e00000000ULL) | \
42 (((u64)(x) << 30) & 0x0000000100000000ULL))
37#else 43#else
38#define BAT_PHYS_ADDR(x) (x) 44#define BAT_PHYS_ADDR(x) (x)
45#define PHYS_BAT_ADDR(x) ((x) & 0xfffe0000)
39#endif 46#endif
40 47
41struct ppc_bat { 48struct ppc_bat {
42 u32 batu; 49 u32 batu;
43 u32 batl; 50 u32 batl;
44}; 51};
52
53typedef pte_t *pgtable_t;
45#endif /* !__ASSEMBLY__ */ 54#endif /* !__ASSEMBLY__ */
46 55
47/* 56/*
@@ -83,6 +92,12 @@ typedef struct {
83 unsigned long vdso_base; 92 unsigned long vdso_base;
84} mm_context_t; 93} mm_context_t;
85 94
95/* patch sites */
96extern s32 patch__hash_page_A0, patch__hash_page_A1, patch__hash_page_A2;
97extern s32 patch__hash_page_B, patch__hash_page_C;
98extern s32 patch__flush_hash_A0, patch__flush_hash_A1, patch__flush_hash_A2;
99extern s32 patch__flush_hash_B;
100
86#endif /* !__ASSEMBLY__ */ 101#endif /* !__ASSEMBLY__ */
87 102
88/* We happily ignore the smaller BATs on 601, we don't actually use 103/* We happily ignore the smaller BATs on 601, we don't actually use
diff --git a/arch/powerpc/include/asm/book3s/32/pgalloc.h b/arch/powerpc/include/asm/book3s/32/pgalloc.h
index 82e44b1a00ae..b5b955eb2fb7 100644
--- a/arch/powerpc/include/asm/book3s/32/pgalloc.h
+++ b/arch/powerpc/include/asm/book3s/32/pgalloc.h
@@ -25,10 +25,7 @@
25extern void __bad_pte(pmd_t *pmd); 25extern void __bad_pte(pmd_t *pmd);
26 26
27extern struct kmem_cache *pgtable_cache[]; 27extern struct kmem_cache *pgtable_cache[];
28#define PGT_CACHE(shift) ({ \ 28#define PGT_CACHE(shift) pgtable_cache[shift]
29 BUG_ON(!(shift)); \
30 pgtable_cache[(shift) - 1]; \
31 })
32 29
33static inline pgd_t *pgd_alloc(struct mm_struct *mm) 30static inline pgd_t *pgd_alloc(struct mm_struct *mm)
34{ 31{
@@ -50,8 +47,6 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
50#define __pmd_free_tlb(tlb,x,a) do { } while (0) 47#define __pmd_free_tlb(tlb,x,a) do { } while (0)
51/* #define pgd_populate(mm, pmd, pte) BUG() */ 48/* #define pgd_populate(mm, pmd, pte) BUG() */
52 49
53#ifndef CONFIG_BOOKE
54
55static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, 50static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
56 pte_t *pte) 51 pte_t *pte)
57{ 52{
@@ -61,46 +56,31 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
61static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, 56static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
62 pgtable_t pte_page) 57 pgtable_t pte_page)
63{ 58{
64 *pmdp = __pmd((page_to_pfn(pte_page) << PAGE_SHIFT) | _PMD_PRESENT); 59 *pmdp = __pmd(__pa(pte_page) | _PMD_PRESENT);
65}
66
67#define pmd_pgtable(pmd) pmd_page(pmd)
68#else
69
70static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
71 pte_t *pte)
72{
73 *pmdp = __pmd((unsigned long)pte | _PMD_PRESENT);
74}
75
76static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
77 pgtable_t pte_page)
78{
79 *pmdp = __pmd((unsigned long)lowmem_page_address(pte_page) | _PMD_PRESENT);
80} 60}
81 61
82#define pmd_pgtable(pmd) pmd_page(pmd) 62#define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
83#endif
84 63
85extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); 64extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
86extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); 65extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr);
66void pte_frag_destroy(void *pte_frag);
67pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel);
68void pte_fragment_free(unsigned long *table, int kernel);
87 69
88static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 70static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
89{ 71{
90 free_page((unsigned long)pte); 72 pte_fragment_free((unsigned long *)pte, 1);
91} 73}
92 74
93static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) 75static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
94{ 76{
95 pgtable_page_dtor(ptepage); 77 pte_fragment_free((unsigned long *)ptepage, 0);
96 __free_page(ptepage);
97} 78}
98 79
99static inline void pgtable_free(void *table, unsigned index_size) 80static inline void pgtable_free(void *table, unsigned index_size)
100{ 81{
101 if (!index_size) { 82 if (!index_size) {
102 pgtable_page_dtor(virt_to_page(table)); 83 pte_fragment_free((unsigned long *)table, 0);
103 free_page((unsigned long)table);
104 } else { 84 } else {
105 BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE); 85 BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE);
106 kmem_cache_free(PGT_CACHE(index_size), table); 86 kmem_cache_free(PGT_CACHE(index_size), table);
@@ -138,6 +118,6 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb,
138static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, 118static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,
139 unsigned long address) 119 unsigned long address)
140{ 120{
141 pgtable_free_tlb(tlb, page_address(table), 0); 121 pgtable_free_tlb(tlb, table, 0);
142} 122}
143#endif /* _ASM_POWERPC_BOOK3S_32_PGALLOC_H */ 123#endif /* _ASM_POWERPC_BOOK3S_32_PGALLOC_H */
diff --git a/arch/powerpc/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h
index c21d33704633..49d76adb9bc5 100644
--- a/arch/powerpc/include/asm/book3s/32/pgtable.h
+++ b/arch/powerpc/include/asm/book3s/32/pgtable.h
@@ -10,9 +10,9 @@
10/* And here we include common definitions */ 10/* And here we include common definitions */
11 11
12#define _PAGE_KERNEL_RO 0 12#define _PAGE_KERNEL_RO 0
13#define _PAGE_KERNEL_ROX 0 13#define _PAGE_KERNEL_ROX (_PAGE_EXEC)
14#define _PAGE_KERNEL_RW (_PAGE_DIRTY | _PAGE_RW) 14#define _PAGE_KERNEL_RW (_PAGE_DIRTY | _PAGE_RW)
15#define _PAGE_KERNEL_RWX (_PAGE_DIRTY | _PAGE_RW) 15#define _PAGE_KERNEL_RWX (_PAGE_DIRTY | _PAGE_RW | _PAGE_EXEC)
16 16
17#define _PAGE_HPTEFLAGS _PAGE_HASHPTE 17#define _PAGE_HPTEFLAGS _PAGE_HASHPTE
18 18
@@ -66,11 +66,11 @@ static inline bool pte_user(pte_t pte)
66 */ 66 */
67#define PAGE_NONE __pgprot(_PAGE_BASE) 67#define PAGE_NONE __pgprot(_PAGE_BASE)
68#define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW) 68#define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW)
69#define PAGE_SHARED_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW) 69#define PAGE_SHARED_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW | _PAGE_EXEC)
70#define PAGE_COPY __pgprot(_PAGE_BASE | _PAGE_USER) 70#define PAGE_COPY __pgprot(_PAGE_BASE | _PAGE_USER)
71#define PAGE_COPY_X __pgprot(_PAGE_BASE | _PAGE_USER) 71#define PAGE_COPY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
72#define PAGE_READONLY __pgprot(_PAGE_BASE | _PAGE_USER) 72#define PAGE_READONLY __pgprot(_PAGE_BASE | _PAGE_USER)
73#define PAGE_READONLY_X __pgprot(_PAGE_BASE | _PAGE_USER) 73#define PAGE_READONLY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
74 74
75/* Permission masks used for kernel mappings */ 75/* Permission masks used for kernel mappings */
76#define PAGE_KERNEL __pgprot(_PAGE_BASE | _PAGE_KERNEL_RW) 76#define PAGE_KERNEL __pgprot(_PAGE_BASE | _PAGE_KERNEL_RW)
@@ -318,7 +318,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
318 int psize) 318 int psize)
319{ 319{
320 unsigned long set = pte_val(entry) & 320 unsigned long set = pte_val(entry) &
321 (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW); 321 (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
322 322
323 pte_update(ptep, 0, set); 323 pte_update(ptep, 0, set);
324 324
@@ -328,24 +328,10 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
328#define __HAVE_ARCH_PTE_SAME 328#define __HAVE_ARCH_PTE_SAME
329#define pte_same(A,B) (((pte_val(A) ^ pte_val(B)) & ~_PAGE_HASHPTE) == 0) 329#define pte_same(A,B) (((pte_val(A) ^ pte_val(B)) & ~_PAGE_HASHPTE) == 0)
330 330
331/*
332 * Note that on Book E processors, the pmd contains the kernel virtual
333 * (lowmem) address of the pte page. The physical address is less useful
334 * because everything runs with translation enabled (even the TLB miss
335 * handler). On everything else the pmd contains the physical address
336 * of the pte page. -- paulus
337 */
338#ifndef CONFIG_BOOKE
339#define pmd_page_vaddr(pmd) \ 331#define pmd_page_vaddr(pmd) \
340 ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) 332 ((unsigned long)__va(pmd_val(pmd) & ~(PTE_TABLE_SIZE - 1)))
341#define pmd_page(pmd) \ 333#define pmd_page(pmd) \
342 pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT) 334 pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)
343#else
344#define pmd_page_vaddr(pmd) \
345 ((unsigned long) (pmd_val(pmd) & PAGE_MASK))
346#define pmd_page(pmd) \
347 pfn_to_page((__pa(pmd_val(pmd)) >> PAGE_SHIFT))
348#endif
349 335
350/* to find an entry in a kernel page-table-directory */ 336/* to find an entry in a kernel page-table-directory */
351#define pgd_offset_k(address) pgd_offset(&init_mm, address) 337#define pgd_offset_k(address) pgd_offset(&init_mm, address)
@@ -360,7 +346,8 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
360#define pte_offset_kernel(dir, addr) \ 346#define pte_offset_kernel(dir, addr) \
361 ((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(addr)) 347 ((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(addr))
362#define pte_offset_map(dir, addr) \ 348#define pte_offset_map(dir, addr) \
363 ((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr)) 349 ((pte_t *)(kmap_atomic(pmd_page(*(dir))) + \
350 (pmd_page_vaddr(*(dir)) & ~PAGE_MASK)) + pte_index(addr))
364#define pte_unmap(pte) kunmap_atomic(pte) 351#define pte_unmap(pte) kunmap_atomic(pte)
365 352
366/* 353/*
@@ -384,7 +371,7 @@ static inline int pte_dirty(pte_t pte) { return !!(pte_val(pte) & _PAGE_DIRTY);
384static inline int pte_young(pte_t pte) { return !!(pte_val(pte) & _PAGE_ACCESSED); } 371static inline int pte_young(pte_t pte) { return !!(pte_val(pte) & _PAGE_ACCESSED); }
385static inline int pte_special(pte_t pte) { return !!(pte_val(pte) & _PAGE_SPECIAL); } 372static inline int pte_special(pte_t pte) { return !!(pte_val(pte) & _PAGE_SPECIAL); }
386static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; } 373static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; }
387static inline bool pte_exec(pte_t pte) { return true; } 374static inline bool pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_EXEC; }
388 375
389static inline int pte_present(pte_t pte) 376static inline int pte_present(pte_t pte)
390{ 377{
@@ -451,7 +438,7 @@ static inline pte_t pte_wrprotect(pte_t pte)
451 438
452static inline pte_t pte_exprotect(pte_t pte) 439static inline pte_t pte_exprotect(pte_t pte)
453{ 440{
454 return pte; 441 return __pte(pte_val(pte) & ~_PAGE_EXEC);
455} 442}
456 443
457static inline pte_t pte_mkclean(pte_t pte) 444static inline pte_t pte_mkclean(pte_t pte)
@@ -466,7 +453,7 @@ static inline pte_t pte_mkold(pte_t pte)
466 453
467static inline pte_t pte_mkexec(pte_t pte) 454static inline pte_t pte_mkexec(pte_t pte)
468{ 455{
469 return pte; 456 return __pte(pte_val(pte) | _PAGE_EXEC);
470} 457}
471 458
472static inline pte_t pte_mkpte(pte_t pte) 459static inline pte_t pte_mkpte(pte_t pte)
@@ -524,7 +511,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
524static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr, 511static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
525 pte_t *ptep, pte_t pte, int percpu) 512 pte_t *ptep, pte_t pte, int percpu)
526{ 513{
527#if defined(CONFIG_PPC_STD_MMU_32) && defined(CONFIG_SMP) && !defined(CONFIG_PTE_64BIT) 514#if defined(CONFIG_SMP) && !defined(CONFIG_PTE_64BIT)
528 /* First case is 32-bit Hash MMU in SMP mode with 32-bit PTEs. We use the 515 /* First case is 32-bit Hash MMU in SMP mode with 32-bit PTEs. We use the
529 * helper pte_update() which does an atomic update. We need to do that 516 * helper pte_update() which does an atomic update. We need to do that
530 * because a concurrent invalidation can clear _PAGE_HASHPTE. If it's a 517 * because a concurrent invalidation can clear _PAGE_HASHPTE. If it's a
@@ -537,7 +524,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
537 else 524 else
538 pte_update(ptep, ~_PAGE_HASHPTE, pte_val(pte)); 525 pte_update(ptep, ~_PAGE_HASHPTE, pte_val(pte));
539 526
540#elif defined(CONFIG_PPC32) && defined(CONFIG_PTE_64BIT) 527#elif defined(CONFIG_PTE_64BIT)
541 /* Second case is 32-bit with 64-bit PTE. In this case, we 528 /* Second case is 32-bit with 64-bit PTE. In this case, we
542 * can just store as long as we do the two halves in the right order 529 * can just store as long as we do the two halves in the right order
543 * with a barrier in between. This is possible because we take care, 530 * with a barrier in between. This is possible because we take care,
@@ -560,7 +547,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
560 : "=m" (*ptep), "=m" (*((unsigned char *)ptep+4)) 547 : "=m" (*ptep), "=m" (*((unsigned char *)ptep+4))
561 : "r" (pte) : "memory"); 548 : "r" (pte) : "memory");
562 549
563#elif defined(CONFIG_PPC_STD_MMU_32) 550#else
564 /* Third case is 32-bit hash table in UP mode, we need to preserve 551 /* Third case is 32-bit hash table in UP mode, we need to preserve
565 * the _PAGE_HASHPTE bit since we may not have invalidated the previous 552 * the _PAGE_HASHPTE bit since we may not have invalidated the previous
566 * translation in the hash yet (done in a subsequent flush_tlb_xxx()) 553 * translation in the hash yet (done in a subsequent flush_tlb_xxx())
@@ -568,9 +555,6 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
568 */ 555 */
569 *ptep = __pte((pte_val(*ptep) & _PAGE_HASHPTE) 556 *ptep = __pte((pte_val(*ptep) & _PAGE_HASHPTE)
570 | (pte_val(pte) & ~_PAGE_HASHPTE)); 557 | (pte_val(pte) & ~_PAGE_HASHPTE));
571
572#else
573#error "Not supported "
574#endif 558#endif
575} 559}
576 560
diff --git a/arch/powerpc/include/asm/book3s/64/hash-4k.h b/arch/powerpc/include/asm/book3s/64/hash-4k.h
index 15bc16b1dc9c..cf5ba5254299 100644
--- a/arch/powerpc/include/asm/book3s/64/hash-4k.h
+++ b/arch/powerpc/include/asm/book3s/64/hash-4k.h
@@ -1,11 +1,7 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_POWERPC_BOOK3S_64_HASH_4K_H 2#ifndef _ASM_POWERPC_BOOK3S_64_HASH_4K_H
3#define _ASM_POWERPC_BOOK3S_64_HASH_4K_H 3#define _ASM_POWERPC_BOOK3S_64_HASH_4K_H
4/* 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 5#define H_PTE_INDEX_SIZE 9
10#define H_PMD_INDEX_SIZE 7 6#define H_PMD_INDEX_SIZE 7
11#define H_PUD_INDEX_SIZE 9 7#define H_PUD_INDEX_SIZE 9
diff --git a/arch/powerpc/include/asm/book3s/64/mmu.h b/arch/powerpc/include/asm/book3s/64/mmu.h
index 6328857f259f..1ceee000c18d 100644
--- a/arch/powerpc/include/asm/book3s/64/mmu.h
+++ b/arch/powerpc/include/asm/book3s/64/mmu.h
@@ -2,6 +2,8 @@
2#ifndef _ASM_POWERPC_BOOK3S_64_MMU_H_ 2#ifndef _ASM_POWERPC_BOOK3S_64_MMU_H_
3#define _ASM_POWERPC_BOOK3S_64_MMU_H_ 3#define _ASM_POWERPC_BOOK3S_64_MMU_H_
4 4
5#include <asm/page.h>
6
5#ifndef __ASSEMBLY__ 7#ifndef __ASSEMBLY__
6/* 8/*
7 * Page size definition 9 * Page size definition
@@ -24,6 +26,13 @@ struct mmu_psize_def {
24}; 26};
25extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT]; 27extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT];
26 28
29/*
30 * For BOOK3s 64 with 4k and 64K linux page size
31 * we want to use pointers, because the page table
32 * actually store pfn
33 */
34typedef pte_t *pgtable_t;
35
27#endif /* __ASSEMBLY__ */ 36#endif /* __ASSEMBLY__ */
28 37
29/* 64-bit classic hash table MMU */ 38/* 64-bit classic hash table MMU */
diff --git a/arch/powerpc/include/asm/book3s/64/pgalloc.h b/arch/powerpc/include/asm/book3s/64/pgalloc.h
index 391ed2c3b697..4aba625389c4 100644
--- a/arch/powerpc/include/asm/book3s/64/pgalloc.h
+++ b/arch/powerpc/include/asm/book3s/64/pgalloc.h
@@ -37,10 +37,7 @@ extern struct vmemmap_backing *vmemmap_list;
37#define MAX_PGTABLE_INDEX_SIZE 0xf 37#define MAX_PGTABLE_INDEX_SIZE 0xf
38 38
39extern struct kmem_cache *pgtable_cache[]; 39extern struct kmem_cache *pgtable_cache[];
40#define PGT_CACHE(shift) ({ \ 40#define PGT_CACHE(shift) pgtable_cache[shift]
41 BUG_ON(!(shift)); \
42 pgtable_cache[(shift) - 1]; \
43 })
44 41
45extern pte_t *pte_fragment_alloc(struct mm_struct *, unsigned long, int); 42extern pte_t *pte_fragment_alloc(struct mm_struct *, unsigned long, int);
46extern pmd_t *pmd_fragment_alloc(struct mm_struct *, unsigned long); 43extern pmd_t *pmd_fragment_alloc(struct mm_struct *, unsigned long);
@@ -50,6 +47,7 @@ extern void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift);
50#ifdef CONFIG_SMP 47#ifdef CONFIG_SMP
51extern void __tlb_remove_table(void *_table); 48extern void __tlb_remove_table(void *_table);
52#endif 49#endif
50void pte_frag_destroy(void *pte_frag);
53 51
54static inline pgd_t *radix__pgd_alloc(struct mm_struct *mm) 52static inline pgd_t *radix__pgd_alloc(struct mm_struct *mm)
55{ 53{
diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h
index 6c99e846a8c9..2e6ada28da64 100644
--- a/arch/powerpc/include/asm/book3s/64/pgtable.h
+++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
@@ -1304,7 +1304,7 @@ static inline int pgd_devmap(pgd_t pgd)
1304} 1304}
1305#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ 1305#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
1306 1306
1307static inline const int pud_pfn(pud_t pud) 1307static inline int pud_pfn(pud_t pud)
1308{ 1308{
1309 /* 1309 /*
1310 * Currently all calls to pud_pfn() are gated around a pud_devmap() 1310 * Currently all calls to pud_pfn() are gated around a pud_devmap()
diff --git a/arch/powerpc/include/asm/cache.h b/arch/powerpc/include/asm/cache.h
index 66298461b640..40ea5b3781c6 100644
--- a/arch/powerpc/include/asm/cache.h
+++ b/arch/powerpc/include/asm/cache.h
@@ -71,7 +71,7 @@ extern struct ppc64_caches ppc64_caches;
71#else 71#else
72#define __read_mostly __attribute__((__section__(".data..read_mostly"))) 72#define __read_mostly __attribute__((__section__(".data..read_mostly")))
73 73
74#ifdef CONFIG_6xx 74#ifdef CONFIG_PPC_BOOK3S_32
75extern long _get_L2CR(void); 75extern long _get_L2CR(void);
76extern long _get_L3CR(void); 76extern long _get_L3CR(void);
77extern void _set_L2CR(unsigned long); 77extern void _set_L2CR(unsigned long);
diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h
index 3d5acd2b113a..2074b40f3fb5 100644
--- a/arch/powerpc/include/asm/code-patching.h
+++ b/arch/powerpc/include/asm/code-patching.h
@@ -33,14 +33,33 @@ unsigned int create_cond_branch(const unsigned int *addr,
33int patch_branch(unsigned int *addr, unsigned long target, int flags); 33int patch_branch(unsigned int *addr, unsigned long target, int flags);
34int patch_instruction(unsigned int *addr, unsigned int instr); 34int patch_instruction(unsigned int *addr, unsigned int instr);
35int raw_patch_instruction(unsigned int *addr, unsigned int instr); 35int raw_patch_instruction(unsigned int *addr, unsigned int instr);
36int patch_instruction_site(s32 *addr, unsigned int instr);
37int patch_branch_site(s32 *site, unsigned long target, int flags);
38 36
39static inline unsigned long patch_site_addr(s32 *site) 37static inline unsigned long patch_site_addr(s32 *site)
40{ 38{
41 return (unsigned long)site + *site; 39 return (unsigned long)site + *site;
42} 40}
43 41
42static inline int patch_instruction_site(s32 *site, unsigned int instr)
43{
44 return patch_instruction((unsigned int *)patch_site_addr(site), instr);
45}
46
47static inline int patch_branch_site(s32 *site, unsigned long target, int flags)
48{
49 return patch_branch((unsigned int *)patch_site_addr(site), target, flags);
50}
51
52static inline int modify_instruction(unsigned int *addr, unsigned int clr,
53 unsigned int set)
54{
55 return patch_instruction(addr, (*addr & ~clr) | set);
56}
57
58static inline int modify_instruction_site(s32 *site, unsigned int clr, unsigned int set)
59{
60 return modify_instruction((unsigned int *)patch_site_addr(site), clr, set);
61}
62
44int instr_is_relative_branch(unsigned int instr); 63int instr_is_relative_branch(unsigned int instr);
45int instr_is_relative_link_branch(unsigned int instr); 64int instr_is_relative_link_branch(unsigned int instr);
46int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr); 65int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr);
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h
index 29f49a35d6ee..d05f0c28e515 100644
--- a/arch/powerpc/include/asm/cputable.h
+++ b/arch/powerpc/include/asm/cputable.h
@@ -44,6 +44,7 @@ extern int machine_check_e500(struct pt_regs *regs);
44extern int machine_check_e200(struct pt_regs *regs); 44extern int machine_check_e200(struct pt_regs *regs);
45extern int machine_check_47x(struct pt_regs *regs); 45extern int machine_check_47x(struct pt_regs *regs);
46int machine_check_8xx(struct pt_regs *regs); 46int machine_check_8xx(struct pt_regs *regs);
47int machine_check_83xx(struct pt_regs *regs);
47 48
48extern void cpu_down_flush_e500v2(void); 49extern void cpu_down_flush_e500v2(void);
49extern void cpu_down_flush_e500mc(void); 50extern void cpu_down_flush_e500mc(void);
@@ -296,7 +297,7 @@ static inline void cpu_feature_keys_init(void) { }
296#define CPU_FTRS_PPC601 (CPU_FTR_COMMON | CPU_FTR_601 | \ 297#define CPU_FTRS_PPC601 (CPU_FTR_COMMON | CPU_FTR_601 | \
297 CPU_FTR_COHERENT_ICACHE | CPU_FTR_UNIFIED_ID_CACHE | CPU_FTR_USE_RTC) 298 CPU_FTR_COHERENT_ICACHE | CPU_FTR_UNIFIED_ID_CACHE | CPU_FTR_USE_RTC)
298#define CPU_FTRS_603 (CPU_FTR_COMMON | CPU_FTR_MAYBE_CAN_DOZE | \ 299#define CPU_FTRS_603 (CPU_FTR_COMMON | CPU_FTR_MAYBE_CAN_DOZE | \
299 CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE) 300 CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE | CPU_FTR_NOEXECUTE)
300#define CPU_FTRS_604 (CPU_FTR_COMMON | CPU_FTR_PPC_LE) 301#define CPU_FTRS_604 (CPU_FTR_COMMON | CPU_FTR_PPC_LE)
301#define CPU_FTRS_740_NOTAU (CPU_FTR_COMMON | \ 302#define CPU_FTRS_740_NOTAU (CPU_FTR_COMMON | \
302 CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_L2CR | \ 303 CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_L2CR | \
@@ -367,15 +368,15 @@ static inline void cpu_feature_keys_init(void) { }
367 CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ 368 CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \
368 CPU_FTR_SPEC7450 | CPU_FTR_NAP_DISABLE_L2_PR | \ 369 CPU_FTR_SPEC7450 | CPU_FTR_NAP_DISABLE_L2_PR | \
369 CPU_FTR_PPC_LE | CPU_FTR_NEED_PAIRED_STWCX) 370 CPU_FTR_PPC_LE | CPU_FTR_NEED_PAIRED_STWCX)
370#define CPU_FTRS_82XX (CPU_FTR_COMMON | CPU_FTR_MAYBE_CAN_DOZE) 371#define CPU_FTRS_82XX (CPU_FTR_COMMON | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_NOEXECUTE)
371#define CPU_FTRS_G2_LE (CPU_FTR_COMMON | CPU_FTR_MAYBE_CAN_DOZE | \ 372#define CPU_FTRS_G2_LE (CPU_FTR_COMMON | CPU_FTR_MAYBE_CAN_DOZE | \
372 CPU_FTR_MAYBE_CAN_NAP) 373 CPU_FTR_MAYBE_CAN_NAP)
373#define CPU_FTRS_E300 (CPU_FTR_MAYBE_CAN_DOZE | \ 374#define CPU_FTRS_E300 (CPU_FTR_MAYBE_CAN_DOZE | \
374 CPU_FTR_MAYBE_CAN_NAP | \ 375 CPU_FTR_MAYBE_CAN_NAP | \
375 CPU_FTR_COMMON) 376 CPU_FTR_COMMON | CPU_FTR_NOEXECUTE)
376#define CPU_FTRS_E300C2 (CPU_FTR_MAYBE_CAN_DOZE | \ 377#define CPU_FTRS_E300C2 (CPU_FTR_MAYBE_CAN_DOZE | \
377 CPU_FTR_MAYBE_CAN_NAP | \ 378 CPU_FTR_MAYBE_CAN_NAP | \
378 CPU_FTR_COMMON | CPU_FTR_FPU_UNAVAILABLE) 379 CPU_FTR_COMMON | CPU_FTR_FPU_UNAVAILABLE | CPU_FTR_NOEXECUTE)
379#define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON) 380#define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON)
380#define CPU_FTRS_8XX (CPU_FTR_NOEXECUTE) 381#define CPU_FTRS_8XX (CPU_FTR_NOEXECUTE)
381#define CPU_FTRS_40X (CPU_FTR_NODSISRALIGN | CPU_FTR_NOEXECUTE) 382#define CPU_FTRS_40X (CPU_FTR_NODSISRALIGN | CPU_FTR_NOEXECUTE)
diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
index 8fa394520af6..dacd0f93f2b2 100644
--- a/arch/powerpc/include/asm/dma-mapping.h
+++ b/arch/powerpc/include/asm/dma-mapping.h
@@ -39,9 +39,6 @@ extern int dma_nommu_mmap_coherent(struct device *dev,
39 * to ensure it is consistent. 39 * to ensure it is consistent.
40 */ 40 */
41struct device; 41struct device;
42extern void *__dma_alloc_coherent(struct device *dev, size_t size,
43 dma_addr_t *handle, gfp_t gfp);
44extern void __dma_free_coherent(size_t size, void *vaddr);
45extern void __dma_sync(void *vaddr, size_t size, int direction); 42extern void __dma_sync(void *vaddr, size_t size, int direction);
46extern void __dma_sync_page(struct page *page, unsigned long offset, 43extern void __dma_sync_page(struct page *page, unsigned long offset,
47 size_t size, int direction); 44 size_t size, int direction);
@@ -52,8 +49,6 @@ extern unsigned long __dma_get_coherent_pfn(unsigned long cpu_addr);
52 * Cache coherent cores. 49 * Cache coherent cores.
53 */ 50 */
54 51
55#define __dma_alloc_coherent(dev, gfp, size, handle) NULL
56#define __dma_free_coherent(size, addr) ((void)0)
57#define __dma_sync(addr, size, rw) ((void)0) 52#define __dma_sync(addr, size, rw) ((void)0)
58#define __dma_sync_page(pg, off, sz, rw) ((void)0) 53#define __dma_sync_page(pg, off, sz, rw) ((void)0)
59 54
@@ -112,7 +107,5 @@ extern int dma_set_mask(struct device *dev, u64 dma_mask);
112 107
113extern u64 __dma_get_required_mask(struct device *dev); 108extern u64 __dma_get_required_mask(struct device *dev);
114 109
115#define ARCH_HAS_DMA_MMAP_COHERENT
116
117#endif /* __KERNEL__ */ 110#endif /* __KERNEL__ */
118#endif /* _ASM_DMA_MAPPING_H */ 111#endif /* _ASM_DMA_MAPPING_H */
diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h
index 1e7a33592e29..188776befaf9 100644
--- a/arch/powerpc/include/asm/fadump.h
+++ b/arch/powerpc/include/asm/fadump.h
@@ -48,6 +48,10 @@
48 48
49#define memblock_num_regions(memblock_type) (memblock.memblock_type.cnt) 49#define memblock_num_regions(memblock_type) (memblock.memblock_type.cnt)
50 50
51/* Alignement per CMA requirement. */
52#define FADUMP_CMA_ALIGNMENT (PAGE_SIZE << \
53 max_t(unsigned long, MAX_ORDER - 1, pageblock_order))
54
51/* Firmware provided dump sections */ 55/* Firmware provided dump sections */
52#define FADUMP_CPU_STATE_DATA 0x0001 56#define FADUMP_CPU_STATE_DATA 0x0001
53#define FADUMP_HPTE_REGION 0x0002 57#define FADUMP_HPTE_REGION 0x0002
@@ -141,6 +145,7 @@ struct fw_dump {
141 unsigned long fadump_supported:1; 145 unsigned long fadump_supported:1;
142 unsigned long dump_active:1; 146 unsigned long dump_active:1;
143 unsigned long dump_registered:1; 147 unsigned long dump_registered:1;
148 unsigned long nocma:1;
144}; 149};
145 150
146/* 151/*
@@ -200,7 +205,7 @@ struct fad_crash_memory_ranges {
200 unsigned long long size; 205 unsigned long long size;
201}; 206};
202 207
203extern int is_fadump_boot_memory_area(u64 addr, ulong size); 208extern int is_fadump_memory_area(u64 addr, ulong size);
204extern int early_init_dt_scan_fw_dump(unsigned long node, 209extern int early_init_dt_scan_fw_dump(unsigned long node,
205 const char *uname, int depth, void *data); 210 const char *uname, int depth, void *data);
206extern int fadump_reserve_mem(void); 211extern int fadump_reserve_mem(void);
diff --git a/arch/powerpc/include/asm/feature-fixups.h b/arch/powerpc/include/asm/feature-fixups.h
index 33b6f9c892c8..40a6c9261a6b 100644
--- a/arch/powerpc/include/asm/feature-fixups.h
+++ b/arch/powerpc/include/asm/feature-fixups.h
@@ -221,6 +221,17 @@ label##3: \
221 FTR_ENTRY_OFFSET 953b-954b; \ 221 FTR_ENTRY_OFFSET 953b-954b; \
222 .popsection; 222 .popsection;
223 223
224#define START_BTB_FLUSH_SECTION \
225955: \
226
227#define END_BTB_FLUSH_SECTION \
228956: \
229 .pushsection __btb_flush_fixup,"a"; \
230 .align 2; \
231957: \
232 FTR_ENTRY_OFFSET 955b-957b; \
233 FTR_ENTRY_OFFSET 956b-957b; \
234 .popsection;
224 235
225#ifndef __ASSEMBLY__ 236#ifndef __ASSEMBLY__
226#include <linux/types.h> 237#include <linux/types.h>
@@ -230,6 +241,7 @@ extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;
230extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; 241extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup;
231extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup; 242extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
232extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup; 243extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;
244extern long __start__btb_flush_fixup, __stop__btb_flush_fixup;
233 245
234void apply_feature_fixups(void); 246void apply_feature_fixups(void);
235void setup_feature_keys(void); 247void setup_feature_keys(void);
diff --git a/arch/powerpc/include/asm/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h
index 383da1ab9e23..8d40565ad0c3 100644
--- a/arch/powerpc/include/asm/hugetlb.h
+++ b/arch/powerpc/include/asm/hugetlb.h
@@ -5,8 +5,6 @@
5#ifdef CONFIG_HUGETLB_PAGE 5#ifdef CONFIG_HUGETLB_PAGE
6#include <asm/page.h> 6#include <asm/page.h>
7 7
8extern struct kmem_cache *hugepte_cache;
9
10#ifdef CONFIG_PPC_BOOK3S_64 8#ifdef CONFIG_PPC_BOOK3S_64
11 9
12#include <asm/book3s/64/hugetlb.h> 10#include <asm/book3s/64/hugetlb.h>
@@ -76,7 +74,9 @@ static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
76 unsigned long idx = 0; 74 unsigned long idx = 0;
77 75
78 pte_t *dir = hugepd_page(hpd); 76 pte_t *dir = hugepd_page(hpd);
79#ifndef CONFIG_PPC_FSL_BOOK3E 77#ifdef CONFIG_PPC_8xx
78 idx = (addr & ((1UL << pdshift) - 1)) >> PAGE_SHIFT;
79#elif !defined(CONFIG_PPC_FSL_BOOK3E)
80 idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd); 80 idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd);
81#endif 81#endif
82 82
@@ -129,15 +129,14 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
129static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, 129static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
130 unsigned long addr, pte_t *ptep) 130 unsigned long addr, pte_t *ptep)
131{ 131{
132 pte_t pte; 132 huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
133 pte = huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
134 flush_hugetlb_page(vma, addr); 133 flush_hugetlb_page(vma, addr);
135} 134}
136 135
137#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS 136#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
138extern int huge_ptep_set_access_flags(struct vm_area_struct *vma, 137int huge_ptep_set_access_flags(struct vm_area_struct *vma,
139 unsigned long addr, pte_t *ptep, 138 unsigned long addr, pte_t *ptep,
140 pte_t pte, int dirty); 139 pte_t pte, int dirty);
141 140
142static inline void arch_clear_hugepage_flags(struct page *page) 141static inline void arch_clear_hugepage_flags(struct page *page)
143{ 142{
diff --git a/arch/powerpc/include/asm/io.h b/arch/powerpc/include/asm/io.h
index e746becd9d6f..7f19fbd3ba55 100644
--- a/arch/powerpc/include/asm/io.h
+++ b/arch/powerpc/include/asm/io.h
@@ -29,12 +29,14 @@ extern struct pci_dev *isa_bridge_pcidev;
29 29
30#include <linux/device.h> 30#include <linux/device.h>
31#include <linux/compiler.h> 31#include <linux/compiler.h>
32#include <linux/mm.h>
32#include <asm/page.h> 33#include <asm/page.h>
33#include <asm/byteorder.h> 34#include <asm/byteorder.h>
34#include <asm/synch.h> 35#include <asm/synch.h>
35#include <asm/delay.h> 36#include <asm/delay.h>
36#include <asm/mmu.h> 37#include <asm/mmu.h>
37#include <asm/ppc_asm.h> 38#include <asm/ppc_asm.h>
39#include <asm/pgtable.h>
38 40
39#ifdef CONFIG_PPC64 41#ifdef CONFIG_PPC64
40#include <asm/paca.h> 42#include <asm/paca.h>
@@ -804,6 +806,8 @@ extern void __iounmap_at(void *ea, unsigned long size);
804 */ 806 */
805static inline unsigned long virt_to_phys(volatile void * address) 807static inline unsigned long virt_to_phys(volatile void * address)
806{ 808{
809 WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !virt_addr_valid(address));
810
807 return __pa((unsigned long)address); 811 return __pa((unsigned long)address);
808} 812}
809 813
@@ -827,7 +831,14 @@ static inline void * phys_to_virt(unsigned long address)
827/* 831/*
828 * Change "struct page" to physical address. 832 * Change "struct page" to physical address.
829 */ 833 */
830#define page_to_phys(page) ((phys_addr_t)page_to_pfn(page) << PAGE_SHIFT) 834static inline phys_addr_t page_to_phys(struct page *page)
835{
836 unsigned long pfn = page_to_pfn(page);
837
838 WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !pfn_valid(pfn));
839
840 return PFN_PHYS(pfn);
841}
831 842
832/* 843/*
833 * 32 bits still uses virt_to_bus() for it's implementation of DMA 844 * 32 bits still uses virt_to_bus() for it's implementation of DMA
diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h
index 35db0cbc9222..e847ff69cb2b 100644
--- a/arch/powerpc/include/asm/iommu.h
+++ b/arch/powerpc/include/asm/iommu.h
@@ -215,11 +215,12 @@ struct iommu_table_group {
215 215
216extern void iommu_register_group(struct iommu_table_group *table_group, 216extern void iommu_register_group(struct iommu_table_group *table_group,
217 int pci_domain_number, unsigned long pe_num); 217 int pci_domain_number, unsigned long pe_num);
218extern int iommu_add_device(struct device *dev); 218extern int iommu_add_device(struct iommu_table_group *table_group,
219 struct device *dev);
219extern void iommu_del_device(struct device *dev); 220extern void iommu_del_device(struct device *dev);
220extern int __init tce_iommu_bus_notifier_init(void); 221extern long iommu_tce_xchg(struct mm_struct *mm, struct iommu_table *tbl,
221extern long iommu_tce_xchg(struct iommu_table *tbl, unsigned long entry, 222 unsigned long entry, unsigned long *hpa,
222 unsigned long *hpa, enum dma_data_direction *direction); 223 enum dma_data_direction *direction);
223#else 224#else
224static inline void iommu_register_group(struct iommu_table_group *table_group, 225static inline void iommu_register_group(struct iommu_table_group *table_group,
225 int pci_domain_number, 226 int pci_domain_number,
@@ -227,7 +228,8 @@ static inline void iommu_register_group(struct iommu_table_group *table_group,
227{ 228{
228} 229}
229 230
230static inline int iommu_add_device(struct device *dev) 231static inline int iommu_add_device(struct iommu_table_group *table_group,
232 struct device *dev)
231{ 233{
232 return 0; 234 return 0;
233} 235}
@@ -235,11 +237,6 @@ static inline int iommu_add_device(struct device *dev)
235static inline void iommu_del_device(struct device *dev) 237static inline void iommu_del_device(struct device *dev)
236{ 238{
237} 239}
238
239static inline int __init tce_iommu_bus_notifier_init(void)
240{
241 return 0;
242}
243#endif /* !CONFIG_IOMMU_API */ 240#endif /* !CONFIG_IOMMU_API */
244 241
245int dma_iommu_mapping_error(struct device *dev, dma_addr_t dma_addr); 242int dma_iommu_mapping_error(struct device *dev, dma_addr_t dma_addr);
diff --git a/arch/powerpc/include/asm/ipic.h b/arch/powerpc/include/asm/ipic.h
index fb59829983b8..3dbd47f2bffe 100644
--- a/arch/powerpc/include/asm/ipic.h
+++ b/arch/powerpc/include/asm/ipic.h
@@ -69,7 +69,6 @@ enum ipic_mcp_irq {
69 IPIC_MCP_MU = 7, 69 IPIC_MCP_MU = 7,
70}; 70};
71 71
72extern int ipic_set_priority(unsigned int irq, unsigned int priority);
73extern void ipic_set_highest_priority(unsigned int irq); 72extern void ipic_set_highest_priority(unsigned int irq);
74extern void ipic_set_default_priority(void); 73extern void ipic_set_default_priority(void);
75extern void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq); 74extern void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq);
diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h
index eb20eb3b8fb0..25607604a7a5 100644
--- a/arch/powerpc/include/asm/mmu.h
+++ b/arch/powerpc/include/asm/mmu.h
@@ -48,7 +48,7 @@
48#define MMU_FTR_USE_HIGH_BATS ASM_CONST(0x00010000) 48#define MMU_FTR_USE_HIGH_BATS ASM_CONST(0x00010000)
49 49
50/* Enable >32-bit physical addresses on 32-bit processor, only used 50/* Enable >32-bit physical addresses on 32-bit processor, only used
51 * by CONFIG_6xx currently as BookE supports that from day 1 51 * by CONFIG_PPC_BOOK3S_32 currently as BookE supports that from day 1
52 */ 52 */
53#define MMU_FTR_BIG_PHYS ASM_CONST(0x00020000) 53#define MMU_FTR_BIG_PHYS ASM_CONST(0x00020000)
54 54
@@ -131,16 +131,37 @@ DECLARE_PER_CPU(int, next_tlbcam_idx);
131#endif 131#endif
132 132
133enum { 133enum {
134 MMU_FTRS_POSSIBLE = MMU_FTR_HPTE_TABLE | MMU_FTR_TYPE_8xx | 134 MMU_FTRS_POSSIBLE =
135 MMU_FTR_TYPE_40x | MMU_FTR_TYPE_44x | MMU_FTR_TYPE_FSL_E | 135#ifdef CONFIG_PPC_BOOK3S
136 MMU_FTR_TYPE_47x | MMU_FTR_USE_HIGH_BATS | MMU_FTR_BIG_PHYS | 136 MMU_FTR_HPTE_TABLE |
137 MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_USE_TLBILX | 137#endif
138 MMU_FTR_LOCK_BCAST_INVAL | MMU_FTR_NEED_DTLB_SW_LRU | 138#ifdef CONFIG_PPC_8xx
139 MMU_FTR_TYPE_8xx |
140#endif
141#ifdef CONFIG_40x
142 MMU_FTR_TYPE_40x |
143#endif
144#ifdef CONFIG_44x
145 MMU_FTR_TYPE_44x |
146#endif
147#if defined(CONFIG_E200) || defined(CONFIG_E500)
148 MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | MMU_FTR_USE_TLBILX |
149#endif
150#ifdef CONFIG_PPC_47x
151 MMU_FTR_TYPE_47x | MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL |
152#endif
153#ifdef CONFIG_PPC_BOOK3S_32
154 MMU_FTR_USE_HIGH_BATS | MMU_FTR_NEED_DTLB_SW_LRU |
155#endif
156#ifdef CONFIG_PPC_BOOK3E_64
139 MMU_FTR_USE_TLBRSRV | MMU_FTR_USE_PAIRED_MAS | 157 MMU_FTR_USE_TLBRSRV | MMU_FTR_USE_PAIRED_MAS |
158#endif
159#ifdef CONFIG_PPC_BOOK3S_64
140 MMU_FTR_NO_SLBIE_B | MMU_FTR_16M_PAGE | MMU_FTR_TLBIEL | 160 MMU_FTR_NO_SLBIE_B | MMU_FTR_16M_PAGE | MMU_FTR_TLBIEL |
141 MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_CI_LARGE_PAGE | 161 MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_CI_LARGE_PAGE |
142 MMU_FTR_1T_SEGMENT | MMU_FTR_TLBIE_CROP_VA | 162 MMU_FTR_1T_SEGMENT | MMU_FTR_TLBIE_CROP_VA |
143 MMU_FTR_KERNEL_RO | MMU_FTR_68_BIT_VA | 163 MMU_FTR_KERNEL_RO | MMU_FTR_68_BIT_VA |
164#endif
144#ifdef CONFIG_PPC_RADIX_MMU 165#ifdef CONFIG_PPC_RADIX_MMU
145 MMU_FTR_TYPE_RADIX | 166 MMU_FTR_TYPE_RADIX |
146#endif 167#endif
@@ -338,21 +359,11 @@ static inline void mmu_early_init_devtree(void) { }
338#endif /* __ASSEMBLY__ */ 359#endif /* __ASSEMBLY__ */
339#endif 360#endif
340 361
341#if defined(CONFIG_PPC_STD_MMU_32) 362#if defined(CONFIG_PPC_BOOK3S_32)
342/* 32-bit classic hash table MMU */ 363/* 32-bit classic hash table MMU */
343#include <asm/book3s/32/mmu-hash.h> 364#include <asm/book3s/32/mmu-hash.h>
344#elif defined(CONFIG_40x) 365#elif defined(CONFIG_PPC_MMU_NOHASH)
345/* 40x-style software loaded TLB */ 366#include <asm/nohash/mmu.h>
346# include <asm/mmu-40x.h>
347#elif defined(CONFIG_44x)
348/* 44x-style software loaded TLB */
349# include <asm/mmu-44x.h>
350#elif defined(CONFIG_PPC_BOOK3E_MMU)
351/* Freescale Book-E software loaded TLB or Book-3e (ISA 2.06+) MMU */
352# include <asm/mmu-book3e.h>
353#elif defined (CONFIG_PPC_8xx)
354/* Motorola/Freescale 8xx software loaded TLB */
355# include <asm/mmu-8xx.h>
356#endif 367#endif
357 368
358#endif /* __KERNEL__ */ 369#endif /* __KERNEL__ */
diff --git a/arch/powerpc/include/asm/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h
index 0381394a425b..6ee8195a2ffb 100644
--- a/arch/powerpc/include/asm/mmu_context.h
+++ b/arch/powerpc/include/asm/mmu_context.h
@@ -21,9 +21,12 @@ struct mm_iommu_table_group_mem_t;
21 21
22extern int isolate_lru_page(struct page *page); /* from internal.h */ 22extern int isolate_lru_page(struct page *page); /* from internal.h */
23extern bool mm_iommu_preregistered(struct mm_struct *mm); 23extern bool mm_iommu_preregistered(struct mm_struct *mm);
24extern long mm_iommu_get(struct mm_struct *mm, 24extern long mm_iommu_new(struct mm_struct *mm,
25 unsigned long ua, unsigned long entries, 25 unsigned long ua, unsigned long entries,
26 struct mm_iommu_table_group_mem_t **pmem); 26 struct mm_iommu_table_group_mem_t **pmem);
27extern long mm_iommu_newdev(struct mm_struct *mm, unsigned long ua,
28 unsigned long entries, unsigned long dev_hpa,
29 struct mm_iommu_table_group_mem_t **pmem);
27extern long mm_iommu_put(struct mm_struct *mm, 30extern long mm_iommu_put(struct mm_struct *mm,
28 struct mm_iommu_table_group_mem_t *mem); 31 struct mm_iommu_table_group_mem_t *mem);
29extern void mm_iommu_init(struct mm_struct *mm); 32extern void mm_iommu_init(struct mm_struct *mm);
@@ -32,15 +35,23 @@ extern struct mm_iommu_table_group_mem_t *mm_iommu_lookup(struct mm_struct *mm,
32 unsigned long ua, unsigned long size); 35 unsigned long ua, unsigned long size);
33extern struct mm_iommu_table_group_mem_t *mm_iommu_lookup_rm( 36extern struct mm_iommu_table_group_mem_t *mm_iommu_lookup_rm(
34 struct mm_struct *mm, unsigned long ua, unsigned long size); 37 struct mm_struct *mm, unsigned long ua, unsigned long size);
35extern struct mm_iommu_table_group_mem_t *mm_iommu_find(struct mm_struct *mm, 38extern struct mm_iommu_table_group_mem_t *mm_iommu_get(struct mm_struct *mm,
36 unsigned long ua, unsigned long entries); 39 unsigned long ua, unsigned long entries);
37extern long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t *mem, 40extern long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t *mem,
38 unsigned long ua, unsigned int pageshift, unsigned long *hpa); 41 unsigned long ua, unsigned int pageshift, unsigned long *hpa);
39extern long mm_iommu_ua_to_hpa_rm(struct mm_iommu_table_group_mem_t *mem, 42extern long mm_iommu_ua_to_hpa_rm(struct mm_iommu_table_group_mem_t *mem,
40 unsigned long ua, unsigned int pageshift, unsigned long *hpa); 43 unsigned long ua, unsigned int pageshift, unsigned long *hpa);
41extern void mm_iommu_ua_mark_dirty_rm(struct mm_struct *mm, unsigned long ua); 44extern void mm_iommu_ua_mark_dirty_rm(struct mm_struct *mm, unsigned long ua);
45extern bool mm_iommu_is_devmem(struct mm_struct *mm, unsigned long hpa,
46 unsigned int pageshift, unsigned long *size);
42extern long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t *mem); 47extern long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t *mem);
43extern void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t *mem); 48extern void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t *mem);
49#else
50static inline bool mm_iommu_is_devmem(struct mm_struct *mm, unsigned long hpa,
51 unsigned int pageshift, unsigned long *size)
52{
53 return false;
54}
44#endif 55#endif
45extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm); 56extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm);
46extern void set_context(unsigned long id, pgd_t *pgd); 57extern void set_context(unsigned long id, pgd_t *pgd);
@@ -217,13 +228,7 @@ static inline void enter_lazy_tlb(struct mm_struct *mm,
217#endif 228#endif
218} 229}
219 230
220static inline int arch_dup_mmap(struct mm_struct *oldmm, 231#ifdef CONFIG_PPC_BOOK3E_64
221 struct mm_struct *mm)
222{
223 return 0;
224}
225
226#ifndef CONFIG_PPC_BOOK3S_64
227static inline void arch_exit_mmap(struct mm_struct *mm) 232static inline void arch_exit_mmap(struct mm_struct *mm)
228{ 233{
229} 234}
@@ -247,6 +252,7 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm,
247#ifdef CONFIG_PPC_MEM_KEYS 252#ifdef CONFIG_PPC_MEM_KEYS
248bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write, 253bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write,
249 bool execute, bool foreign); 254 bool execute, bool foreign);
255void arch_dup_pkeys(struct mm_struct *oldmm, struct mm_struct *mm);
250#else /* CONFIG_PPC_MEM_KEYS */ 256#else /* CONFIG_PPC_MEM_KEYS */
251static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, 257static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
252 bool write, bool execute, bool foreign) 258 bool write, bool execute, bool foreign)
@@ -259,6 +265,7 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
259#define thread_pkey_regs_save(thread) 265#define thread_pkey_regs_save(thread)
260#define thread_pkey_regs_restore(new_thread, old_thread) 266#define thread_pkey_regs_restore(new_thread, old_thread)
261#define thread_pkey_regs_init(thread) 267#define thread_pkey_regs_init(thread)
268#define arch_dup_pkeys(oldmm, mm)
262 269
263static inline u64 pte_to_hpte_pkey_bits(u64 pteflags) 270static inline u64 pte_to_hpte_pkey_bits(u64 pteflags)
264{ 271{
@@ -267,5 +274,12 @@ static inline u64 pte_to_hpte_pkey_bits(u64 pteflags)
267 274
268#endif /* CONFIG_PPC_MEM_KEYS */ 275#endif /* CONFIG_PPC_MEM_KEYS */
269 276
277static inline int arch_dup_mmap(struct mm_struct *oldmm,
278 struct mm_struct *mm)
279{
280 arch_dup_pkeys(oldmm, mm);
281 return 0;
282}
283
270#endif /* __KERNEL__ */ 284#endif /* __KERNEL__ */
271#endif /* __ASM_POWERPC_MMU_CONTEXT_H */ 285#endif /* __ASM_POWERPC_MMU_CONTEXT_H */
diff --git a/arch/powerpc/include/asm/mmu-40x.h b/arch/powerpc/include/asm/nohash/32/mmu-40x.h
index 74f4edb5916e..74f4edb5916e 100644
--- a/arch/powerpc/include/asm/mmu-40x.h
+++ b/arch/powerpc/include/asm/nohash/32/mmu-40x.h
diff --git a/arch/powerpc/include/asm/mmu-44x.h b/arch/powerpc/include/asm/nohash/32/mmu-44x.h
index 295b3dbb2698..28aa3b339c5e 100644
--- a/arch/powerpc/include/asm/mmu-44x.h
+++ b/arch/powerpc/include/asm/nohash/32/mmu-44x.h
@@ -111,6 +111,9 @@ typedef struct {
111 unsigned long vdso_base; 111 unsigned long vdso_base;
112} mm_context_t; 112} mm_context_t;
113 113
114/* patch sites */
115extern s32 patch__tlb_44x_hwater_D, patch__tlb_44x_hwater_I;
116
114#endif /* !__ASSEMBLY__ */ 117#endif /* !__ASSEMBLY__ */
115 118
116#ifndef CONFIG_PPC_EARLY_DEBUG_44x 119#ifndef CONFIG_PPC_EARLY_DEBUG_44x
diff --git a/arch/powerpc/include/asm/mmu-8xx.h b/arch/powerpc/include/asm/nohash/32/mmu-8xx.h
index fa05aa566ece..b0f764c827c0 100644
--- a/arch/powerpc/include/asm/mmu-8xx.h
+++ b/arch/powerpc/include/asm/nohash/32/mmu-8xx.h
@@ -190,6 +190,7 @@ typedef struct {
190 struct slice_mask mask_8m; 190 struct slice_mask mask_8m;
191# endif 191# endif
192#endif 192#endif
193 void *pte_frag;
193} mm_context_t; 194} mm_context_t;
194 195
195#define PHYS_IMMR_BASE (mfspr(SPRN_IMMR) & 0xfff80000) 196#define PHYS_IMMR_BASE (mfspr(SPRN_IMMR) & 0xfff80000)
@@ -244,6 +245,9 @@ extern s32 patch__itlbmiss_perf, patch__dtlbmiss_perf;
244#define mmu_virtual_psize MMU_PAGE_4K 245#define mmu_virtual_psize MMU_PAGE_4K
245#elif defined(CONFIG_PPC_16K_PAGES) 246#elif defined(CONFIG_PPC_16K_PAGES)
246#define mmu_virtual_psize MMU_PAGE_16K 247#define mmu_virtual_psize MMU_PAGE_16K
248#define PTE_FRAG_NR 4
249#define PTE_FRAG_SIZE_SHIFT 12
250#define PTE_FRAG_SIZE (1UL << 12)
247#else 251#else
248#error "Unsupported PAGE_SIZE" 252#error "Unsupported PAGE_SIZE"
249#endif 253#endif
diff --git a/arch/powerpc/include/asm/nohash/32/mmu.h b/arch/powerpc/include/asm/nohash/32/mmu.h
new file mode 100644
index 000000000000..7d94a36d57d2
--- /dev/null
+++ b/arch/powerpc/include/asm/nohash/32/mmu.h
@@ -0,0 +1,25 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_POWERPC_NOHASH_32_MMU_H_
3#define _ASM_POWERPC_NOHASH_32_MMU_H_
4
5#include <asm/page.h>
6
7#if defined(CONFIG_40x)
8/* 40x-style software loaded TLB */
9#include <asm/nohash/32/mmu-40x.h>
10#elif defined(CONFIG_44x)
11/* 44x-style software loaded TLB */
12#include <asm/nohash/32/mmu-44x.h>
13#elif defined(CONFIG_PPC_BOOK3E_MMU)
14/* Freescale Book-E software loaded TLB or Book-3e (ISA 2.06+) MMU */
15#include <asm/nohash/mmu-book3e.h>
16#elif defined (CONFIG_PPC_8xx)
17/* Motorola/Freescale 8xx software loaded TLB */
18#include <asm/nohash/32/mmu-8xx.h>
19#endif
20
21#ifndef __ASSEMBLY__
22typedef pte_t *pgtable_t;
23#endif
24
25#endif /* _ASM_POWERPC_NOHASH_32_MMU_H_ */
diff --git a/arch/powerpc/include/asm/nohash/32/pgalloc.h b/arch/powerpc/include/asm/nohash/32/pgalloc.h
index 8825953c225b..17963951bdb0 100644
--- a/arch/powerpc/include/asm/nohash/32/pgalloc.h
+++ b/arch/powerpc/include/asm/nohash/32/pgalloc.h
@@ -25,10 +25,7 @@
25extern void __bad_pte(pmd_t *pmd); 25extern void __bad_pte(pmd_t *pmd);
26 26
27extern struct kmem_cache *pgtable_cache[]; 27extern struct kmem_cache *pgtable_cache[];
28#define PGT_CACHE(shift) ({ \ 28#define PGT_CACHE(shift) pgtable_cache[shift]
29 BUG_ON(!(shift)); \
30 pgtable_cache[(shift) - 1]; \
31 })
32 29
33static inline pgd_t *pgd_alloc(struct mm_struct *mm) 30static inline pgd_t *pgd_alloc(struct mm_struct *mm)
34{ 31{
@@ -61,11 +58,10 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
61static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, 58static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
62 pgtable_t pte_page) 59 pgtable_t pte_page)
63{ 60{
64 *pmdp = __pmd((page_to_pfn(pte_page) << PAGE_SHIFT) | _PMD_USER | 61 *pmdp = __pmd(__pa(pte_page) | _PMD_USER | _PMD_PRESENT);
65 _PMD_PRESENT);
66} 62}
67 63
68#define pmd_pgtable(pmd) pmd_page(pmd) 64#define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
69#else 65#else
70 66
71static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, 67static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
@@ -77,31 +73,32 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
77static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, 73static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
78 pgtable_t pte_page) 74 pgtable_t pte_page)
79{ 75{
80 *pmdp = __pmd((unsigned long)lowmem_page_address(pte_page) | _PMD_PRESENT); 76 *pmdp = __pmd((unsigned long)pte_page | _PMD_PRESENT);
81} 77}
82 78
83#define pmd_pgtable(pmd) pmd_page(pmd) 79#define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
84#endif 80#endif
85 81
86extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); 82extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
87extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); 83extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr);
84void pte_frag_destroy(void *pte_frag);
85pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel);
86void pte_fragment_free(unsigned long *table, int kernel);
88 87
89static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 88static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
90{ 89{
91 free_page((unsigned long)pte); 90 pte_fragment_free((unsigned long *)pte, 1);
92} 91}
93 92
94static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) 93static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
95{ 94{
96 pgtable_page_dtor(ptepage); 95 pte_fragment_free((unsigned long *)ptepage, 0);
97 __free_page(ptepage);
98} 96}
99 97
100static inline void pgtable_free(void *table, unsigned index_size) 98static inline void pgtable_free(void *table, unsigned index_size)
101{ 99{
102 if (!index_size) { 100 if (!index_size) {
103 pgtable_page_dtor(virt_to_page(table)); 101 pte_fragment_free((unsigned long *)table, 0);
104 free_page((unsigned long)table);
105 } else { 102 } else {
106 BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE); 103 BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE);
107 kmem_cache_free(PGT_CACHE(index_size), table); 104 kmem_cache_free(PGT_CACHE(index_size), table);
@@ -140,6 +137,6 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,
140 unsigned long address) 137 unsigned long address)
141{ 138{
142 tlb_flush_pgtable(tlb, address); 139 tlb_flush_pgtable(tlb, address);
143 pgtable_free_tlb(tlb, page_address(table), 0); 140 pgtable_free_tlb(tlb, table, 0);
144} 141}
145#endif /* _ASM_POWERPC_PGALLOC_32_H */ 142#endif /* _ASM_POWERPC_PGALLOC_32_H */
diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h
index 3ffb0ff5a038..bed433358260 100644
--- a/arch/powerpc/include/asm/nohash/32/pgtable.h
+++ b/arch/powerpc/include/asm/nohash/32/pgtable.h
@@ -232,7 +232,13 @@ static inline unsigned long pte_update(pte_t *p,
232 : "cc" ); 232 : "cc" );
233#else /* PTE_ATOMIC_UPDATES */ 233#else /* PTE_ATOMIC_UPDATES */
234 unsigned long old = pte_val(*p); 234 unsigned long old = pte_val(*p);
235 *p = __pte((old & ~clr) | set); 235 unsigned long new = (old & ~clr) | set;
236
237#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
238 p->pte = p->pte1 = p->pte2 = p->pte3 = new;
239#else
240 *p = __pte(new);
241#endif
236#endif /* !PTE_ATOMIC_UPDATES */ 242#endif /* !PTE_ATOMIC_UPDATES */
237 243
238#ifdef CONFIG_44x 244#ifdef CONFIG_44x
@@ -333,12 +339,12 @@ static inline int pte_young(pte_t pte)
333 */ 339 */
334#ifndef CONFIG_BOOKE 340#ifndef CONFIG_BOOKE
335#define pmd_page_vaddr(pmd) \ 341#define pmd_page_vaddr(pmd) \
336 ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) 342 ((unsigned long)__va(pmd_val(pmd) & ~(PTE_TABLE_SIZE - 1)))
337#define pmd_page(pmd) \ 343#define pmd_page(pmd) \
338 pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT) 344 pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)
339#else 345#else
340#define pmd_page_vaddr(pmd) \ 346#define pmd_page_vaddr(pmd) \
341 ((unsigned long) (pmd_val(pmd) & PAGE_MASK)) 347 ((unsigned long)(pmd_val(pmd) & ~(PTE_TABLE_SIZE - 1)))
342#define pmd_page(pmd) \ 348#define pmd_page(pmd) \
343 pfn_to_page((__pa(pmd_val(pmd)) >> PAGE_SHIFT)) 349 pfn_to_page((__pa(pmd_val(pmd)) >> PAGE_SHIFT))
344#endif 350#endif
@@ -357,7 +363,8 @@ static inline int pte_young(pte_t pte)
357 (pmd_bad(*(dir)) ? NULL : (pte_t *)pmd_page_vaddr(*(dir)) + \ 363 (pmd_bad(*(dir)) ? NULL : (pte_t *)pmd_page_vaddr(*(dir)) + \
358 pte_index(addr)) 364 pte_index(addr))
359#define pte_offset_map(dir, addr) \ 365#define pte_offset_map(dir, addr) \
360 ((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr)) 366 ((pte_t *)(kmap_atomic(pmd_page(*(dir))) + \
367 (pmd_page_vaddr(*(dir)) & ~PAGE_MASK)) + pte_index(addr))
361#define pte_unmap(pte) kunmap_atomic(pte) 368#define pte_unmap(pte) kunmap_atomic(pte)
362 369
363/* 370/*
diff --git a/arch/powerpc/include/asm/nohash/32/pte-40x.h b/arch/powerpc/include/asm/nohash/32/pte-40x.h
index 661f4599f2fc..12c6811e344b 100644
--- a/arch/powerpc/include/asm/nohash/32/pte-40x.h
+++ b/arch/powerpc/include/asm/nohash/32/pte-40x.h
@@ -33,7 +33,7 @@
33 * is cleared in the TLB miss handler before the TLB entry is loaded. 33 * is cleared in the TLB miss handler before the TLB entry is loaded.
34 * - All other bits of the PTE are loaded into TLBLO without 34 * - All other bits of the PTE are loaded into TLBLO without
35 * modification, leaving us only the bits 20, 21, 24, 25, 26, 30 for 35 * modification, leaving us only the bits 20, 21, 24, 25, 26, 30 for
36 * software PTE bits. We actually use use bits 21, 24, 25, and 36 * software PTE bits. We actually use bits 21, 24, 25, and
37 * 30 respectively for the software bits: ACCESSED, DIRTY, RW, and 37 * 30 respectively for the software bits: ACCESSED, DIRTY, RW, and
38 * PRESENT. 38 * PRESENT.
39 */ 39 */
diff --git a/arch/powerpc/include/asm/nohash/32/pte-8xx.h b/arch/powerpc/include/asm/nohash/32/pte-8xx.h
index 6bfe041ef59d..c9e4b2d90f65 100644
--- a/arch/powerpc/include/asm/nohash/32/pte-8xx.h
+++ b/arch/powerpc/include/asm/nohash/32/pte-8xx.h
@@ -65,9 +65,6 @@
65 65
66#define _PTE_NONE_MASK 0 66#define _PTE_NONE_MASK 0
67 67
68/* Until my rework is finished, 8xx still needs atomic PTE updates */
69#define PTE_ATOMIC_UPDATES 1
70
71#ifdef CONFIG_PPC_16K_PAGES 68#ifdef CONFIG_PPC_16K_PAGES
72#define _PAGE_PSIZE _PAGE_SPS 69#define _PAGE_PSIZE _PAGE_SPS
73#else 70#else
diff --git a/arch/powerpc/include/asm/nohash/64/mmu.h b/arch/powerpc/include/asm/nohash/64/mmu.h
new file mode 100644
index 000000000000..e6585480dfc4
--- /dev/null
+++ b/arch/powerpc/include/asm/nohash/64/mmu.h
@@ -0,0 +1,12 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_POWERPC_NOHASH_64_MMU_H_
3#define _ASM_POWERPC_NOHASH_64_MMU_H_
4
5/* Freescale Book-E software loaded TLB or Book-3e (ISA 2.06+) MMU */
6#include <asm/nohash/mmu-book3e.h>
7
8#ifndef __ASSEMBLY__
9typedef struct page *pgtable_t;
10#endif
11
12#endif /* _ASM_POWERPC_NOHASH_64_MMU_H_ */
diff --git a/arch/powerpc/include/asm/nohash/64/pgalloc.h b/arch/powerpc/include/asm/nohash/64/pgalloc.h
index e2d62d033708..e95eb499a174 100644
--- a/arch/powerpc/include/asm/nohash/64/pgalloc.h
+++ b/arch/powerpc/include/asm/nohash/64/pgalloc.h
@@ -36,10 +36,7 @@ extern struct vmemmap_backing *vmemmap_list;
36#define MAX_PGTABLE_INDEX_SIZE 0xf 36#define MAX_PGTABLE_INDEX_SIZE 0xf
37 37
38extern struct kmem_cache *pgtable_cache[]; 38extern struct kmem_cache *pgtable_cache[];
39#define PGT_CACHE(shift) ({ \ 39#define PGT_CACHE(shift) pgtable_cache[shift]
40 BUG_ON(!(shift)); \
41 pgtable_cache[(shift) - 1]; \
42 })
43 40
44static inline pgd_t *pgd_alloc(struct mm_struct *mm) 41static inline pgd_t *pgd_alloc(struct mm_struct *mm)
45{ 42{
diff --git a/arch/powerpc/include/asm/mmu-book3e.h b/arch/powerpc/include/asm/nohash/mmu-book3e.h
index e20072972e35..e20072972e35 100644
--- a/arch/powerpc/include/asm/mmu-book3e.h
+++ b/arch/powerpc/include/asm/nohash/mmu-book3e.h
diff --git a/arch/powerpc/include/asm/nohash/mmu.h b/arch/powerpc/include/asm/nohash/mmu.h
new file mode 100644
index 000000000000..a037cb1efb57
--- /dev/null
+++ b/arch/powerpc/include/asm/nohash/mmu.h
@@ -0,0 +1,11 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_POWERPC_NOHASH_MMU_H_
3#define _ASM_POWERPC_NOHASH_MMU_H_
4
5#ifdef CONFIG_PPC64
6#include <asm/nohash/64/mmu.h>
7#else
8#include <asm/nohash/32/mmu.h>
9#endif
10
11#endif /* _ASM_POWERPC_NOHASH_MMU_H_ */
diff --git a/arch/powerpc/include/asm/nohash/pgtable.h b/arch/powerpc/include/asm/nohash/pgtable.h
index 70ff23974b59..1ca1c1864b32 100644
--- a/arch/powerpc/include/asm/nohash/pgtable.h
+++ b/arch/powerpc/include/asm/nohash/pgtable.h
@@ -209,7 +209,11 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
209 /* Anything else just stores the PTE normally. That covers all 64-bit 209 /* Anything else just stores the PTE normally. That covers all 64-bit
210 * cases, and 32-bit non-hash with 32-bit PTEs. 210 * cases, and 32-bit non-hash with 32-bit PTEs.
211 */ 211 */
212#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
213 ptep->pte = ptep->pte1 = ptep->pte2 = ptep->pte3 = pte_val(pte);
214#else
212 *ptep = pte; 215 *ptep = pte;
216#endif
213 217
214 /* 218 /*
215 * With hardware tablewalk, a sync is needed to ensure that 219 * With hardware tablewalk, a sync is needed to ensure that
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index ff3866473afe..a55b01c90bb1 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -347,6 +347,7 @@ extern int opal_async_comp_init(void);
347extern int opal_sensor_init(void); 347extern int opal_sensor_init(void);
348extern int opal_hmi_handler_init(void); 348extern int opal_hmi_handler_init(void);
349extern int opal_event_init(void); 349extern int opal_event_init(void);
350int opal_power_control_init(void);
350 351
351extern int opal_machine_check(struct pt_regs *regs); 352extern int opal_machine_check(struct pt_regs *regs);
352extern bool opal_mce_check_early_recovery(struct pt_regs *regs); 353extern bool opal_mce_check_early_recovery(struct pt_regs *regs);
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
index f6a1265face2..5c5ea2413413 100644
--- a/arch/powerpc/include/asm/page.h
+++ b/arch/powerpc/include/asm/page.h
@@ -289,7 +289,7 @@ static inline bool pfn_valid(unsigned long pfn)
289 * page tables at arbitrary addresses, this breaks and will have to change. 289 * page tables at arbitrary addresses, this breaks and will have to change.
290 */ 290 */
291#ifdef CONFIG_PPC64 291#ifdef CONFIG_PPC64
292#define PD_HUGE 0x8000000000000000 292#define PD_HUGE 0x8000000000000000UL
293#else 293#else
294#define PD_HUGE 0x80000000 294#define PD_HUGE 0x80000000
295#endif 295#endif
@@ -335,23 +335,11 @@ void arch_free_page(struct page *page, int order);
335#endif 335#endif
336 336
337struct vm_area_struct; 337struct vm_area_struct;
338#ifdef CONFIG_PPC_BOOK3S_64
339/*
340 * For BOOK3s 64 with 4k and 64K linux page size
341 * we want to use pointers, because the page table
342 * actually store pfn
343 */
344typedef pte_t *pgtable_t;
345#else
346#if defined(CONFIG_PPC_64K_PAGES) && defined(CONFIG_PPC64)
347typedef pte_t *pgtable_t;
348#else
349typedef struct page *pgtable_t;
350#endif
351#endif
352 338
353#include <asm-generic/memory_model.h> 339#include <asm-generic/memory_model.h>
354#endif /* __ASSEMBLY__ */ 340#endif /* __ASSEMBLY__ */
355#include <asm/slice.h> 341#include <asm/slice.h>
356 342
343#define ARCH_ZONE_DMA_BITS 31
344
357#endif /* _ASM_POWERPC_PAGE_H */ 345#endif /* _ASM_POWERPC_PAGE_H */
diff --git a/arch/powerpc/include/asm/page_32.h b/arch/powerpc/include/asm/page_32.h
index 5c378e9b78c8..683dfbc67ca8 100644
--- a/arch/powerpc/include/asm/page_32.h
+++ b/arch/powerpc/include/asm/page_32.h
@@ -22,7 +22,8 @@
22#define PTE_FLAGS_OFFSET 0 22#define PTE_FLAGS_OFFSET 0
23#endif 23#endif
24 24
25#ifdef CONFIG_PPC_256K_PAGES 25#if defined(CONFIG_PPC_256K_PAGES) || \
26 (defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES))
26#define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2 - 2) /* 1/4 of a page */ 27#define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2 - 2) /* 1/4 of a page */
27#else 28#else
28#define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2) /* full page */ 29#define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2) /* full page */
diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h
index 94d449031b18..aee4fcc24990 100644
--- a/arch/powerpc/include/asm/pci-bridge.h
+++ b/arch/powerpc/include/asm/pci-bridge.h
@@ -129,6 +129,7 @@ struct pci_controller {
129#endif /* CONFIG_PPC64 */ 129#endif /* CONFIG_PPC64 */
130 130
131 void *private_data; 131 void *private_data;
132 struct npu *npu;
132}; 133};
133 134
134/* These are used for config access before all the PCI probing 135/* These are used for config access before all the PCI probing
diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h
index 2af9ded80540..0c72f1897063 100644
--- a/arch/powerpc/include/asm/pci.h
+++ b/arch/powerpc/include/asm/pci.h
@@ -129,5 +129,9 @@ extern void pcibios_scan_phb(struct pci_controller *hose);
129 129
130extern struct pci_dev *pnv_pci_get_gpu_dev(struct pci_dev *npdev); 130extern struct pci_dev *pnv_pci_get_gpu_dev(struct pci_dev *npdev);
131extern struct pci_dev *pnv_pci_get_npu_dev(struct pci_dev *gpdev, int index); 131extern struct pci_dev *pnv_pci_get_npu_dev(struct pci_dev *gpdev, int index);
132extern int pnv_npu2_init(struct pci_controller *hose);
133extern int pnv_npu2_map_lpar_dev(struct pci_dev *gpdev, unsigned int lparid,
134 unsigned long msr);
135extern int pnv_npu2_unmap_lpar_dev(struct pci_dev *gpdev);
132 136
133#endif /* __ASM_POWERPC_PCI_H */ 137#endif /* __ASM_POWERPC_PCI_H */
diff --git a/arch/powerpc/include/asm/perf_event.h b/arch/powerpc/include/asm/perf_event.h
index 16a49819da9a..35926cd6cd0b 100644
--- a/arch/powerpc/include/asm/perf_event.h
+++ b/arch/powerpc/include/asm/perf_event.h
@@ -39,4 +39,7 @@
39 (regs)->gpr[1] = current_stack_pointer(); \ 39 (regs)->gpr[1] = current_stack_pointer(); \
40 asm volatile("mfmsr %0" : "=r" ((regs)->msr)); \ 40 asm volatile("mfmsr %0" : "=r" ((regs)->msr)); \
41 } while (0) 41 } while (0)
42
43/* To support perf_regs sier update */
44extern bool is_sier_available(void);
42#endif 45#endif
diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h
index 67a8a9585d50..e60aeb46d6a0 100644
--- a/arch/powerpc/include/asm/perf_event_server.h
+++ b/arch/powerpc/include/asm/perf_event_server.h
@@ -41,6 +41,8 @@ struct power_pmu {
41 void (*get_mem_data_src)(union perf_mem_data_src *dsrc, 41 void (*get_mem_data_src)(union perf_mem_data_src *dsrc,
42 u32 flags, struct pt_regs *regs); 42 u32 flags, struct pt_regs *regs);
43 void (*get_mem_weight)(u64 *weight); 43 void (*get_mem_weight)(u64 *weight);
44 unsigned long group_constraint_mask;
45 unsigned long group_constraint_val;
44 u64 (*bhrb_filter_map)(u64 branch_sample_type); 46 u64 (*bhrb_filter_map)(u64 branch_sample_type);
45 void (*config_bhrb)(u64 pmu_bhrb_filter); 47 void (*config_bhrb)(u64 pmu_bhrb_filter);
46 void (*disable_pmc)(unsigned int pmc, unsigned long mmcr[]); 48 void (*disable_pmc)(unsigned int pmc, unsigned long mmcr[]);
diff --git a/arch/powerpc/include/asm/pgtable-types.h b/arch/powerpc/include/asm/pgtable-types.h
index eccb30b38b47..3b0edf041b2e 100644
--- a/arch/powerpc/include/asm/pgtable-types.h
+++ b/arch/powerpc/include/asm/pgtable-types.h
@@ -3,7 +3,11 @@
3#define _ASM_POWERPC_PGTABLE_TYPES_H 3#define _ASM_POWERPC_PGTABLE_TYPES_H
4 4
5/* PTE level */ 5/* PTE level */
6#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
7typedef struct { pte_basic_t pte, pte1, pte2, pte3; } pte_t;
8#else
6typedef struct { pte_basic_t pte; } pte_t; 9typedef struct { pte_basic_t pte; } pte_t;
10#endif
7#define __pte(x) ((pte_t) { (x) }) 11#define __pte(x) ((pte_t) { (x) })
8static inline pte_basic_t pte_val(pte_t x) 12static inline pte_basic_t pte_val(pte_t x)
9{ 13{
diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h
index 9679b7519a35..dad1d27e196d 100644
--- a/arch/powerpc/include/asm/pgtable.h
+++ b/arch/powerpc/include/asm/pgtable.h
@@ -66,7 +66,6 @@ extern unsigned long empty_zero_page[];
66 66
67extern pgd_t swapper_pg_dir[]; 67extern pgd_t swapper_pg_dir[];
68 68
69void limit_zone_pfn(enum zone_type zone, unsigned long max_pfn);
70int dma_pfn_limit_to_zone(u64 pfn_limit); 69int dma_pfn_limit_to_zone(u64 pfn_limit);
71extern void paging_init(void); 70extern void paging_init(void);
72 71
@@ -101,7 +100,7 @@ extern int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr,
101/* can we use this in kvm */ 100/* can we use this in kvm */
102unsigned long vmalloc_to_phys(void *vmalloc_addr); 101unsigned long vmalloc_to_phys(void *vmalloc_addr);
103 102
104void pgtable_cache_add(unsigned shift, void (*ctor)(void *)); 103void pgtable_cache_add(unsigned int shift);
105void pgtable_cache_init(void); 104void pgtable_cache_init(void);
106 105
107#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_PPC32) 106#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_PPC32)
@@ -110,6 +109,35 @@ void mark_initmem_nx(void);
110static inline void mark_initmem_nx(void) { } 109static inline void mark_initmem_nx(void) { }
111#endif 110#endif
112 111
112/*
113 * When used, PTE_FRAG_NR is defined in subarch pgtable.h
114 * so we are sure it is included when arriving here.
115 */
116#ifdef PTE_FRAG_NR
117static inline void *pte_frag_get(mm_context_t *ctx)
118{
119 return ctx->pte_frag;
120}
121
122static inline void pte_frag_set(mm_context_t *ctx, void *p)
123{
124 ctx->pte_frag = p;
125}
126#else
127#define PTE_FRAG_NR 1
128#define PTE_FRAG_SIZE_SHIFT PAGE_SHIFT
129#define PTE_FRAG_SIZE (1UL << PTE_FRAG_SIZE_SHIFT)
130
131static inline void *pte_frag_get(mm_context_t *ctx)
132{
133 return NULL;
134}
135
136static inline void pte_frag_set(mm_context_t *ctx, void *p)
137{
138}
139#endif
140
113#endif /* __ASSEMBLY__ */ 141#endif /* __ASSEMBLY__ */
114 142
115#endif /* _ASM_POWERPC_PGTABLE_H */ 143#endif /* _ASM_POWERPC_PGTABLE_H */
diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
index a6e9e314c707..7f693e0f7499 100644
--- a/arch/powerpc/include/asm/ppc-opcode.h
+++ b/arch/powerpc/include/asm/ppc-opcode.h
@@ -257,6 +257,7 @@
257#define PPC_INST_MTSPR_DSCR_USER_MASK 0xfc1ffffe 257#define PPC_INST_MTSPR_DSCR_USER_MASK 0xfc1ffffe
258#define PPC_INST_MFVSRD 0x7c000066 258#define PPC_INST_MFVSRD 0x7c000066
259#define PPC_INST_MTVSRD 0x7c000166 259#define PPC_INST_MTVSRD 0x7c000166
260#define PPC_INST_SC 0x44000002
260#define PPC_INST_SLBFEE 0x7c0007a7 261#define PPC_INST_SLBFEE 0x7c0007a7
261#define PPC_INST_SLBIA 0x7c0003e4 262#define PPC_INST_SLBIA 0x7c0003e4
262 263
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h
index b5d023680801..e0637730a8e7 100644
--- a/arch/powerpc/include/asm/ppc_asm.h
+++ b/arch/powerpc/include/asm/ppc_asm.h
@@ -480,26 +480,11 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)
480 ori rd,rd,((KERNELBASE>>48)&0xFFFF);\ 480 ori rd,rd,((KERNELBASE>>48)&0xFFFF);\
481 rotldi rd,rd,48 481 rotldi rd,rd,48
482#else 482#else
483/*
484 * On APUS (Amiga PowerPC cpu upgrade board), we don't know the
485 * physical base address of RAM at compile time.
486 */
487#define toreal(rd) tophys(rd,rd) 483#define toreal(rd) tophys(rd,rd)
488#define fromreal(rd) tovirt(rd,rd) 484#define fromreal(rd) tovirt(rd,rd)
489 485
490#define tophys(rd,rs) \ 486#define tophys(rd, rs) addis rd, rs, -PAGE_OFFSET@h
4910: addis rd,rs,-PAGE_OFFSET@h; \ 487#define tovirt(rd, rs) addis rd, rs, PAGE_OFFSET@h
492 .section ".vtop_fixup","aw"; \
493 .align 1; \
494 .long 0b; \
495 .previous
496
497#define tovirt(rd,rs) \
4980: addis rd,rs,PAGE_OFFSET@h; \
499 .section ".ptov_fixup","aw"; \
500 .align 1; \
501 .long 0b; \
502 .previous
503#endif 488#endif
504 489
505#ifdef CONFIG_PPC_BOOK3S_64 490#ifdef CONFIG_PPC_BOOK3S_64
@@ -821,4 +806,14 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)
821 stringify_in_c(.long (_target) - . ;) \ 806 stringify_in_c(.long (_target) - . ;) \
822 stringify_in_c(.previous) 807 stringify_in_c(.previous)
823 808
809#ifdef CONFIG_PPC_FSL_BOOK3E
810#define BTB_FLUSH(reg) \
811 lis reg,BUCSR_INIT@h; \
812 ori reg,reg,BUCSR_INIT@l; \
813 mtspr SPRN_BUCSR,reg; \
814 isync;
815#else
816#define BTB_FLUSH(reg)
817#endif /* CONFIG_PPC_FSL_BOOK3E */
818
824#endif /* _ASM_POWERPC_PPC_ASM_H */ 819#endif /* _ASM_POWERPC_PPC_ASM_H */
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index de52c3166ba4..1c98ef1f2d5b 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -582,7 +582,7 @@
582#define HID0_POWER9_RADIX __MASK(63 - 8) 582#define HID0_POWER9_RADIX __MASK(63 - 8)
583 583
584#define SPRN_HID1 0x3F1 /* Hardware Implementation Register 1 */ 584#define SPRN_HID1 0x3F1 /* Hardware Implementation Register 1 */
585#ifdef CONFIG_6xx 585#ifdef CONFIG_PPC_BOOK3S_32
586#define HID1_EMCP (1<<31) /* 7450 Machine Check Pin Enable */ 586#define HID1_EMCP (1<<31) /* 7450 Machine Check Pin Enable */
587#define HID1_DFS (1<<22) /* 7447A Dynamic Frequency Scaling */ 587#define HID1_DFS (1<<22) /* 7447A Dynamic Frequency Scaling */
588#define HID1_PC0 (1<<16) /* 7450 PLL_CFG[0] */ 588#define HID1_PC0 (1<<16) /* 7450 PLL_CFG[0] */
@@ -769,6 +769,8 @@
769#define SRR1_PROGTRAP 0x00020000 /* Trap */ 769#define SRR1_PROGTRAP 0x00020000 /* Trap */
770#define SRR1_PROGADDR 0x00010000 /* SRR0 contains subsequent addr */ 770#define SRR1_PROGADDR 0x00010000 /* SRR0 contains subsequent addr */
771 771
772#define SRR1_MCE_MCP 0x00080000 /* Machine check signal caused interrupt */
773
772#define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */ 774#define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */
773#define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */ 775#define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */
774#define HSRR1_DENORM 0x00100000 /* Denorm exception */ 776#define HSRR1_DENORM 0x00100000 /* Denorm exception */
diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h
index 1fffbba8d6a5..65676e2325b8 100644
--- a/arch/powerpc/include/asm/setup.h
+++ b/arch/powerpc/include/asm/setup.h
@@ -67,6 +67,13 @@ void do_barrier_nospec_fixups_range(bool enable, void *start, void *end);
67static inline void do_barrier_nospec_fixups_range(bool enable, void *start, void *end) { }; 67static inline void do_barrier_nospec_fixups_range(bool enable, void *start, void *end) { };
68#endif 68#endif
69 69
70#ifdef CONFIG_PPC_FSL_BOOK3E
71void setup_spectre_v2(void);
72#else
73static inline void setup_spectre_v2(void) {};
74#endif
75void do_btb_flush_fixups(void);
76
70#endif /* !__ASSEMBLY__ */ 77#endif /* !__ASSEMBLY__ */
71 78
72#endif /* _ASM_POWERPC_SETUP_H */ 79#endif /* _ASM_POWERPC_SETUP_H */
diff --git a/arch/powerpc/include/asm/sfp-machine.h b/arch/powerpc/include/asm/sfp-machine.h
index d89beaba26ff..8b957aabb826 100644
--- a/arch/powerpc/include/asm/sfp-machine.h
+++ b/arch/powerpc/include/asm/sfp-machine.h
@@ -213,30 +213,18 @@
213 * respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow 213 * respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow
214 * (i.e. carry out) is not stored anywhere, and is lost. 214 * (i.e. carry out) is not stored anywhere, and is lost.
215 */ 215 */
216#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 216#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
217 do { \ 217 do { \
218 if (__builtin_constant_p (bh) && (bh) == 0) \ 218 if (__builtin_constant_p (bh) && (bh) == 0) \
219 __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ 219 __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \
220 : "=r" ((USItype)(sh)), \ 220 : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
221 "=&r" ((USItype)(sl)) \ 221 else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
222 : "%r" ((USItype)(ah)), \ 222 __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \
223 "%r" ((USItype)(al)), \ 223 : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
224 "rI" ((USItype)(bl))); \
225 else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \
226 __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
227 : "=r" ((USItype)(sh)), \
228 "=&r" ((USItype)(sl)) \
229 : "%r" ((USItype)(ah)), \
230 "%r" ((USItype)(al)), \
231 "rI" ((USItype)(bl))); \
232 else \ 224 else \
233 __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ 225 __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \
234 : "=r" ((USItype)(sh)), \ 226 : "=r" (sh), "=&r" (sl) \
235 "=&r" ((USItype)(sl)) \ 227 : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
236 : "%r" ((USItype)(ah)), \
237 "r" ((USItype)(bh)), \
238 "%r" ((USItype)(al)), \
239 "rI" ((USItype)(bl))); \
240 } while (0) 228 } while (0)
241 229
242/* sub_ddmmss is used in op-2.h and udivmodti4.c and should be equivalent to 230/* sub_ddmmss is used in op-2.h and udivmodti4.c and should be equivalent to
@@ -248,44 +236,24 @@
248 * and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, 236 * and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
249 * and is lost. 237 * and is lost.
250 */ 238 */
251#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 239#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
252 do { \ 240 do { \
253 if (__builtin_constant_p (ah) && (ah) == 0) \ 241 if (__builtin_constant_p (ah) && (ah) == 0) \
254 __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ 242 __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \
255 : "=r" ((USItype)(sh)), \ 243 : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
256 "=&r" ((USItype)(sl)) \ 244 else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \
257 : "r" ((USItype)(bh)), \ 245 __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \
258 "rI" ((USItype)(al)), \ 246 : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
259 "r" ((USItype)(bl))); \
260 else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0) \
261 __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
262 : "=r" ((USItype)(sh)), \
263 "=&r" ((USItype)(sl)) \
264 : "r" ((USItype)(bh)), \
265 "rI" ((USItype)(al)), \
266 "r" ((USItype)(bl))); \
267 else if (__builtin_constant_p (bh) && (bh) == 0) \ 247 else if (__builtin_constant_p (bh) && (bh) == 0) \
268 __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ 248 __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \
269 : "=r" ((USItype)(sh)), \ 249 : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
270 "=&r" ((USItype)(sl)) \ 250 else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
271 : "r" ((USItype)(ah)), \ 251 __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \
272 "rI" ((USItype)(al)), \ 252 : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
273 "r" ((USItype)(bl))); \
274 else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \
275 __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
276 : "=r" ((USItype)(sh)), \
277 "=&r" ((USItype)(sl)) \
278 : "r" ((USItype)(ah)), \
279 "rI" ((USItype)(al)), \
280 "r" ((USItype)(bl))); \
281 else \ 253 else \
282 __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ 254 __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \
283 : "=r" ((USItype)(sh)), \ 255 : "=r" (sh), "=&r" (sl) \
284 "=&r" ((USItype)(sl)) \ 256 : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
285 : "r" ((USItype)(ah)), \
286 "r" ((USItype)(bh)), \
287 "rI" ((USItype)(al)), \
288 "r" ((USItype)(bl))); \
289 } while (0) 257 } while (0)
290 258
291/* asm fragments for mul and div */ 259/* asm fragments for mul and div */
@@ -294,13 +262,10 @@
294 * UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype 262 * UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype
295 * word product in HIGH_PROD and LOW_PROD. 263 * word product in HIGH_PROD and LOW_PROD.
296 */ 264 */
297#define umul_ppmm(ph, pl, m0, m1) \ 265#define umul_ppmm(ph, pl, m0, m1) \
298 do { \ 266 do { \
299 USItype __m0 = (m0), __m1 = (m1); \ 267 USItype __m0 = (m0), __m1 = (m1); \
300 __asm__ ("mulhwu %0,%1,%2" \ 268 __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
301 : "=r" ((USItype)(ph)) \
302 : "%r" (__m0), \
303 "r" (__m1)); \
304 (pl) = __m0 * __m1; \ 269 (pl) = __m0 * __m1; \
305 } while (0) 270 } while (0)
306 271
@@ -312,9 +277,10 @@
312 * significant bit of DENOMINATOR must be 1, then the pre-processor symbol 277 * significant bit of DENOMINATOR must be 1, then the pre-processor symbol
313 * UDIV_NEEDS_NORMALIZATION is defined to 1. 278 * UDIV_NEEDS_NORMALIZATION is defined to 1.
314 */ 279 */
315#define udiv_qrnnd(q, r, n1, n0, d) \ 280#define udiv_qrnnd(q, r, n1, n0, d) \
316 do { \ 281 do { \
317 UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m; \ 282 UWtype __d1, __d0, __q1, __q0; \
283 UWtype __r1, __r0, __m; \
318 __d1 = __ll_highpart (d); \ 284 __d1 = __ll_highpart (d); \
319 __d0 = __ll_lowpart (d); \ 285 __d0 = __ll_lowpart (d); \
320 \ 286 \
@@ -325,7 +291,7 @@
325 if (__r1 < __m) \ 291 if (__r1 < __m) \
326 { \ 292 { \
327 __q1--, __r1 += (d); \ 293 __q1--, __r1 += (d); \
328 if (__r1 >= (d)) /* we didn't get carry when adding to __r1 */ \ 294 if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
329 if (__r1 < __m) \ 295 if (__r1 < __m) \
330 __q1--, __r1 += (d); \ 296 __q1--, __r1 += (d); \
331 } \ 297 } \
diff --git a/arch/powerpc/include/asm/slice.h b/arch/powerpc/include/asm/slice.h
index a595461c9cb0..44816cbc4198 100644
--- a/arch/powerpc/include/asm/slice.h
+++ b/arch/powerpc/include/asm/slice.h
@@ -10,6 +10,10 @@
10#include <asm/nohash/32/slice.h> 10#include <asm/nohash/32/slice.h>
11#endif 11#endif
12 12
13#ifndef __ASSEMBLY__
14
15struct mm_struct;
16
13#ifdef CONFIG_PPC_MM_SLICES 17#ifdef CONFIG_PPC_MM_SLICES
14 18
15#ifdef CONFIG_HUGETLB_PAGE 19#ifdef CONFIG_HUGETLB_PAGE
@@ -18,10 +22,6 @@
18#define HAVE_ARCH_UNMAPPED_AREA 22#define HAVE_ARCH_UNMAPPED_AREA
19#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN 23#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
20 24
21#ifndef __ASSEMBLY__
22
23struct mm_struct;
24
25unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len, 25unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
26 unsigned long flags, unsigned int psize, 26 unsigned long flags, unsigned int psize,
27 int topdown); 27 int topdown);
@@ -34,8 +34,12 @@ void slice_set_range_psize(struct mm_struct *mm, unsigned long start,
34void slice_init_new_context_exec(struct mm_struct *mm); 34void slice_init_new_context_exec(struct mm_struct *mm);
35void slice_setup_new_exec(void); 35void slice_setup_new_exec(void);
36 36
37#endif /* __ASSEMBLY__ */ 37#else /* CONFIG_PPC_MM_SLICES */
38
39static inline void slice_init_new_context_exec(struct mm_struct *mm) {}
38 40
39#endif /* CONFIG_PPC_MM_SLICES */ 41#endif /* CONFIG_PPC_MM_SLICES */
40 42
43#endif /* __ASSEMBLY__ */
44
41#endif /* _ASM_POWERPC_SLICE_H */ 45#endif /* _ASM_POWERPC_SLICE_H */
diff --git a/arch/powerpc/include/asm/syscall.h b/arch/powerpc/include/asm/syscall.h
index ab9f3f0a8637..1a0e7a8b1c81 100644
--- a/arch/powerpc/include/asm/syscall.h
+++ b/arch/powerpc/include/asm/syscall.h
@@ -18,9 +18,8 @@
18#include <linux/thread_info.h> 18#include <linux/thread_info.h>
19 19
20/* ftrace syscalls requires exporting the sys_call_table */ 20/* ftrace syscalls requires exporting the sys_call_table */
21#ifdef CONFIG_FTRACE_SYSCALLS
22extern const unsigned long sys_call_table[]; 21extern const unsigned long sys_call_table[];
23#endif /* CONFIG_FTRACE_SYSCALLS */ 22extern const unsigned long compat_sys_call_table[];
24 23
25static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 24static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
26{ 25{
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h
deleted file mode 100644
index 01b5171ea189..000000000000
--- a/arch/powerpc/include/asm/systbl.h
+++ /dev/null
@@ -1,396 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * List of powerpc syscalls. For the meaning of the _SPU suffix see
4 * arch/powerpc/platforms/cell/spu_callbacks.c
5 */
6
7SYSCALL(restart_syscall)
8SYSCALL(exit)
9PPC_SYS(fork)
10SYSCALL_SPU(read)
11SYSCALL_SPU(write)
12COMPAT_SYS_SPU(open)
13SYSCALL_SPU(close)
14SYSCALL_SPU(waitpid)
15SYSCALL_SPU(creat)
16SYSCALL_SPU(link)
17SYSCALL_SPU(unlink)
18COMPAT_SYS(execve)
19SYSCALL_SPU(chdir)
20COMPAT_SYS_SPU(time)
21SYSCALL_SPU(mknod)
22SYSCALL_SPU(chmod)
23SYSCALL_SPU(lchown)
24SYSCALL(ni_syscall)
25OLDSYS(stat)
26COMPAT_SYS_SPU(lseek)
27SYSCALL_SPU(getpid)
28COMPAT_SYS(mount)
29SYSX(sys_ni_syscall,sys_oldumount,sys_oldumount)
30SYSCALL_SPU(setuid)
31SYSCALL_SPU(getuid)
32COMPAT_SYS_SPU(stime)
33COMPAT_SYS(ptrace)
34SYSCALL_SPU(alarm)
35OLDSYS(fstat)
36SYSCALL(pause)
37COMPAT_SYS(utime)
38SYSCALL(ni_syscall)
39SYSCALL(ni_syscall)
40SYSCALL_SPU(access)
41SYSCALL_SPU(nice)
42SYSCALL(ni_syscall)
43SYSCALL_SPU(sync)
44SYSCALL_SPU(kill)
45SYSCALL_SPU(rename)
46SYSCALL_SPU(mkdir)
47SYSCALL_SPU(rmdir)
48SYSCALL_SPU(dup)
49SYSCALL_SPU(pipe)
50COMPAT_SYS_SPU(times)
51SYSCALL(ni_syscall)
52SYSCALL_SPU(brk)
53SYSCALL_SPU(setgid)
54SYSCALL_SPU(getgid)
55SYSCALL(signal)
56SYSCALL_SPU(geteuid)
57SYSCALL_SPU(getegid)
58SYSCALL(acct)
59SYSCALL(umount)
60SYSCALL(ni_syscall)
61COMPAT_SYS_SPU(ioctl)
62COMPAT_SYS_SPU(fcntl)
63SYSCALL(ni_syscall)
64SYSCALL_SPU(setpgid)
65SYSCALL(ni_syscall)
66SYSX(sys_ni_syscall,sys_olduname,sys_olduname)
67SYSCALL_SPU(umask)
68SYSCALL_SPU(chroot)
69COMPAT_SYS(ustat)
70SYSCALL_SPU(dup2)
71SYSCALL_SPU(getppid)
72SYSCALL_SPU(getpgrp)
73SYSCALL_SPU(setsid)
74SYS32ONLY(sigaction)
75SYSCALL_SPU(sgetmask)
76SYSCALL_SPU(ssetmask)
77SYSCALL_SPU(setreuid)
78SYSCALL_SPU(setregid)
79#define compat_sys_sigsuspend sys_sigsuspend
80SYS32ONLY(sigsuspend)
81SYSX(sys_ni_syscall,compat_sys_sigpending,sys_sigpending)
82SYSCALL_SPU(sethostname)
83COMPAT_SYS_SPU(setrlimit)
84SYSX(sys_ni_syscall,compat_sys_old_getrlimit,sys_old_getrlimit)
85COMPAT_SYS_SPU(getrusage)
86COMPAT_SYS_SPU(gettimeofday)
87COMPAT_SYS_SPU(settimeofday)
88SYSCALL_SPU(getgroups)
89SYSCALL_SPU(setgroups)
90SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select)
91SYSCALL_SPU(symlink)
92OLDSYS(lstat)
93SYSCALL_SPU(readlink)
94SYSCALL(uselib)
95SYSCALL(swapon)
96SYSCALL(reboot)
97SYSX(sys_ni_syscall,compat_sys_old_readdir,sys_old_readdir)
98SYSCALL_SPU(mmap)
99SYSCALL_SPU(munmap)
100COMPAT_SYS_SPU(truncate)
101COMPAT_SYS_SPU(ftruncate)
102SYSCALL_SPU(fchmod)
103SYSCALL_SPU(fchown)
104SYSCALL_SPU(getpriority)
105SYSCALL_SPU(setpriority)
106SYSCALL(ni_syscall)
107COMPAT_SYS(statfs)
108COMPAT_SYS(fstatfs)
109SYSCALL(ni_syscall)
110COMPAT_SYS_SPU(socketcall)
111SYSCALL_SPU(syslog)
112COMPAT_SYS_SPU(setitimer)
113COMPAT_SYS_SPU(getitimer)
114COMPAT_SYS_SPU(newstat)
115COMPAT_SYS_SPU(newlstat)
116COMPAT_SYS_SPU(newfstat)
117SYSX(sys_ni_syscall,sys_uname,sys_uname)
118SYSCALL(ni_syscall)
119SYSCALL_SPU(vhangup)
120SYSCALL(ni_syscall)
121SYSCALL(ni_syscall)
122COMPAT_SYS_SPU(wait4)
123SYSCALL(swapoff)
124COMPAT_SYS_SPU(sysinfo)
125COMPAT_SYS(ipc)
126SYSCALL_SPU(fsync)
127SYS32ONLY(sigreturn)
128PPC_SYS(clone)
129SYSCALL_SPU(setdomainname)
130SYSCALL_SPU(newuname)
131SYSCALL(ni_syscall)
132COMPAT_SYS_SPU(adjtimex)
133SYSCALL_SPU(mprotect)
134SYSX(sys_ni_syscall,compat_sys_sigprocmask,sys_sigprocmask)
135SYSCALL(ni_syscall)
136SYSCALL(init_module)
137SYSCALL(delete_module)
138SYSCALL(ni_syscall)
139SYSCALL(quotactl)
140SYSCALL_SPU(getpgid)
141SYSCALL_SPU(fchdir)
142SYSCALL_SPU(bdflush)
143SYSCALL_SPU(sysfs)
144SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality)
145SYSCALL(ni_syscall)
146SYSCALL_SPU(setfsuid)
147SYSCALL_SPU(setfsgid)
148SYSCALL_SPU(llseek)
149COMPAT_SYS_SPU(getdents)
150COMPAT_SPU_NEW(select)
151SYSCALL_SPU(flock)
152SYSCALL_SPU(msync)
153COMPAT_SYS_SPU(readv)
154COMPAT_SYS_SPU(writev)
155SYSCALL_SPU(getsid)
156SYSCALL_SPU(fdatasync)
157COMPAT_SYS(sysctl)
158SYSCALL_SPU(mlock)
159SYSCALL_SPU(munlock)
160SYSCALL_SPU(mlockall)
161SYSCALL_SPU(munlockall)
162SYSCALL_SPU(sched_setparam)
163SYSCALL_SPU(sched_getparam)
164SYSCALL_SPU(sched_setscheduler)
165SYSCALL_SPU(sched_getscheduler)
166SYSCALL_SPU(sched_yield)
167SYSCALL_SPU(sched_get_priority_max)
168SYSCALL_SPU(sched_get_priority_min)
169COMPAT_SYS_SPU(sched_rr_get_interval)
170COMPAT_SYS_SPU(nanosleep)
171SYSCALL_SPU(mremap)
172SYSCALL_SPU(setresuid)
173SYSCALL_SPU(getresuid)
174SYSCALL(ni_syscall)
175SYSCALL_SPU(poll)
176SYSCALL(ni_syscall)
177SYSCALL_SPU(setresgid)
178SYSCALL_SPU(getresgid)
179SYSCALL_SPU(prctl)
180COMPAT_SYS(rt_sigreturn)
181COMPAT_SYS(rt_sigaction)
182COMPAT_SYS(rt_sigprocmask)
183COMPAT_SYS(rt_sigpending)
184COMPAT_SYS(rt_sigtimedwait)
185COMPAT_SYS(rt_sigqueueinfo)
186COMPAT_SYS(rt_sigsuspend)
187COMPAT_SYS_SPU(pread64)
188COMPAT_SYS_SPU(pwrite64)
189SYSCALL_SPU(chown)
190SYSCALL_SPU(getcwd)
191SYSCALL_SPU(capget)
192SYSCALL_SPU(capset)
193COMPAT_SYS(sigaltstack)
194SYSX_SPU(sys_sendfile64,compat_sys_sendfile,sys_sendfile)
195SYSCALL(ni_syscall)
196SYSCALL(ni_syscall)
197PPC_SYS(vfork)
198COMPAT_SYS_SPU(getrlimit)
199COMPAT_SYS_SPU(readahead)
200SYS32ONLY(mmap2)
201SYS32ONLY(truncate64)
202SYS32ONLY(ftruncate64)
203SYSX(sys_ni_syscall,sys_stat64,sys_stat64)
204SYSX(sys_ni_syscall,sys_lstat64,sys_lstat64)
205SYSX(sys_ni_syscall,sys_fstat64,sys_fstat64)
206SYSCALL(pciconfig_read)
207SYSCALL(pciconfig_write)
208SYSCALL(pciconfig_iobase)
209SYSCALL(ni_syscall)
210SYSCALL_SPU(getdents64)
211SYSCALL_SPU(pivot_root)
212SYSX(sys_ni_syscall,compat_sys_fcntl64,sys_fcntl64)
213SYSCALL_SPU(madvise)
214SYSCALL_SPU(mincore)
215SYSCALL_SPU(gettid)
216SYSCALL_SPU(tkill)
217SYSCALL_SPU(setxattr)
218SYSCALL_SPU(lsetxattr)
219SYSCALL_SPU(fsetxattr)
220SYSCALL_SPU(getxattr)
221SYSCALL_SPU(lgetxattr)
222SYSCALL_SPU(fgetxattr)
223SYSCALL_SPU(listxattr)
224SYSCALL_SPU(llistxattr)
225SYSCALL_SPU(flistxattr)
226SYSCALL_SPU(removexattr)
227SYSCALL_SPU(lremovexattr)
228SYSCALL_SPU(fremovexattr)
229COMPAT_SYS_SPU(futex)
230COMPAT_SYS_SPU(sched_setaffinity)
231COMPAT_SYS_SPU(sched_getaffinity)
232SYSCALL(ni_syscall)
233SYSCALL(ni_syscall)
234SYS32ONLY(sendfile64)
235COMPAT_SYS_SPU(io_setup)
236SYSCALL_SPU(io_destroy)
237COMPAT_SYS_SPU(io_getevents)
238COMPAT_SYS_SPU(io_submit)
239SYSCALL_SPU(io_cancel)
240SYSCALL(set_tid_address)
241SYSX_SPU(sys_fadvise64,ppc32_fadvise64,sys_fadvise64)
242SYSCALL(exit_group)
243COMPAT_SYS(lookup_dcookie)
244SYSCALL_SPU(epoll_create)
245SYSCALL_SPU(epoll_ctl)
246SYSCALL_SPU(epoll_wait)
247SYSCALL_SPU(remap_file_pages)
248COMPAT_SYS_SPU(timer_create)
249COMPAT_SYS_SPU(timer_settime)
250COMPAT_SYS_SPU(timer_gettime)
251SYSCALL_SPU(timer_getoverrun)
252SYSCALL_SPU(timer_delete)
253COMPAT_SYS_SPU(clock_settime)
254COMPAT_SYS_SPU(clock_gettime)
255COMPAT_SYS_SPU(clock_getres)
256COMPAT_SYS_SPU(clock_nanosleep)
257SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext)
258SYSCALL_SPU(tgkill)
259COMPAT_SYS_SPU(utimes)
260COMPAT_SYS_SPU(statfs64)
261COMPAT_SYS_SPU(fstatfs64)
262SYSX(sys_ni_syscall,ppc_fadvise64_64,ppc_fadvise64_64)
263SYSCALL_SPU(rtas)
264OLDSYS(debug_setcontext)
265SYSCALL(ni_syscall)
266COMPAT_SYS(migrate_pages)
267COMPAT_SYS(mbind)
268COMPAT_SYS(get_mempolicy)
269COMPAT_SYS(set_mempolicy)
270COMPAT_SYS(mq_open)
271SYSCALL(mq_unlink)
272COMPAT_SYS(mq_timedsend)
273COMPAT_SYS(mq_timedreceive)
274COMPAT_SYS(mq_notify)
275COMPAT_SYS(mq_getsetattr)
276COMPAT_SYS(kexec_load)
277SYSCALL(add_key)
278SYSCALL(request_key)
279COMPAT_SYS(keyctl)
280COMPAT_SYS(waitid)
281SYSCALL(ioprio_set)
282SYSCALL(ioprio_get)
283SYSCALL(inotify_init)
284SYSCALL(inotify_add_watch)
285SYSCALL(inotify_rm_watch)
286SYSCALL(spu_run)
287SYSCALL(spu_create)
288COMPAT_SYS(pselect6)
289COMPAT_SYS(ppoll)
290SYSCALL_SPU(unshare)
291SYSCALL_SPU(splice)
292SYSCALL_SPU(tee)
293COMPAT_SYS_SPU(vmsplice)
294COMPAT_SYS_SPU(openat)
295SYSCALL_SPU(mkdirat)
296SYSCALL_SPU(mknodat)
297SYSCALL_SPU(fchownat)
298COMPAT_SYS_SPU(futimesat)
299SYSX_SPU(sys_newfstatat,sys_fstatat64,sys_fstatat64)
300SYSCALL_SPU(unlinkat)
301SYSCALL_SPU(renameat)
302SYSCALL_SPU(linkat)
303SYSCALL_SPU(symlinkat)
304SYSCALL_SPU(readlinkat)
305SYSCALL_SPU(fchmodat)
306SYSCALL_SPU(faccessat)
307COMPAT_SYS_SPU(get_robust_list)
308COMPAT_SYS_SPU(set_robust_list)
309COMPAT_SYS_SPU(move_pages)
310SYSCALL_SPU(getcpu)
311COMPAT_SYS(epoll_pwait)
312COMPAT_SYS_SPU(utimensat)
313COMPAT_SYS_SPU(signalfd)
314SYSCALL_SPU(timerfd_create)
315SYSCALL_SPU(eventfd)
316COMPAT_SYS_SPU(sync_file_range2)
317COMPAT_SYS(fallocate)
318SYSCALL(subpage_prot)
319COMPAT_SYS_SPU(timerfd_settime)
320COMPAT_SYS_SPU(timerfd_gettime)
321COMPAT_SYS_SPU(signalfd4)
322SYSCALL_SPU(eventfd2)
323SYSCALL_SPU(epoll_create1)
324SYSCALL_SPU(dup3)
325SYSCALL_SPU(pipe2)
326SYSCALL(inotify_init1)
327SYSCALL_SPU(perf_event_open)
328COMPAT_SYS_SPU(preadv)
329COMPAT_SYS_SPU(pwritev)
330COMPAT_SYS(rt_tgsigqueueinfo)
331SYSCALL(fanotify_init)
332COMPAT_SYS(fanotify_mark)
333SYSCALL_SPU(prlimit64)
334SYSCALL_SPU(socket)
335SYSCALL_SPU(bind)
336SYSCALL_SPU(connect)
337SYSCALL_SPU(listen)
338SYSCALL_SPU(accept)
339SYSCALL_SPU(getsockname)
340SYSCALL_SPU(getpeername)
341SYSCALL_SPU(socketpair)
342SYSCALL_SPU(send)
343SYSCALL_SPU(sendto)
344COMPAT_SYS_SPU(recv)
345COMPAT_SYS_SPU(recvfrom)
346SYSCALL_SPU(shutdown)
347COMPAT_SYS_SPU(setsockopt)
348COMPAT_SYS_SPU(getsockopt)
349COMPAT_SYS_SPU(sendmsg)
350COMPAT_SYS_SPU(recvmsg)
351COMPAT_SYS_SPU(recvmmsg)
352SYSCALL_SPU(accept4)
353SYSCALL_SPU(name_to_handle_at)
354COMPAT_SYS_SPU(open_by_handle_at)
355COMPAT_SYS_SPU(clock_adjtime)
356SYSCALL_SPU(syncfs)
357COMPAT_SYS_SPU(sendmmsg)
358SYSCALL_SPU(setns)
359COMPAT_SYS(process_vm_readv)
360COMPAT_SYS(process_vm_writev)
361SYSCALL(finit_module)
362SYSCALL(kcmp) /* sys_kcmp */
363SYSCALL_SPU(sched_setattr)
364SYSCALL_SPU(sched_getattr)
365SYSCALL_SPU(renameat2)
366SYSCALL_SPU(seccomp)
367SYSCALL_SPU(getrandom)
368SYSCALL_SPU(memfd_create)
369SYSCALL_SPU(bpf)
370COMPAT_SYS(execveat)
371PPC64ONLY(switch_endian)
372SYSCALL_SPU(userfaultfd)
373SYSCALL_SPU(membarrier)
374SYSCALL(ni_syscall)
375SYSCALL(ni_syscall)
376SYSCALL(ni_syscall)
377SYSCALL(ni_syscall)
378SYSCALL(ni_syscall)
379SYSCALL(ni_syscall)
380SYSCALL(ni_syscall)
381SYSCALL(ni_syscall)
382SYSCALL(ni_syscall)
383SYSCALL(ni_syscall)
384SYSCALL(ni_syscall)
385SYSCALL(ni_syscall)
386SYSCALL(mlock2)
387SYSCALL(copy_file_range)
388COMPAT_SYS_SPU(preadv2)
389COMPAT_SYS_SPU(pwritev2)
390SYSCALL(kexec_file_load)
391SYSCALL(statx)
392SYSCALL(pkey_alloc)
393SYSCALL(pkey_free)
394SYSCALL(pkey_mprotect)
395SYSCALL(rseq)
396COMPAT_SYS(io_pgetevents)
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
index b80d492ceb29..54bf7e68a7e1 100644
--- a/arch/powerpc/include/asm/time.h
+++ b/arch/powerpc/include/asm/time.h
@@ -43,7 +43,7 @@ struct div_result {
43 43
44/* Accessor functions for the timebase (RTC on 601) registers. */ 44/* Accessor functions for the timebase (RTC on 601) registers. */
45/* If one day CONFIG_POWER is added just define __USE_RTC as 1 */ 45/* If one day CONFIG_POWER is added just define __USE_RTC as 1 */
46#ifdef CONFIG_6xx 46#ifdef CONFIG_PPC_BOOK3S_32
47#define __USE_RTC() (cpu_has_feature(CPU_FTR_USE_RTC)) 47#define __USE_RTC() (cpu_has_feature(CPU_FTR_USE_RTC))
48#else 48#else
49#define __USE_RTC() 0 49#define __USE_RTC() 0
diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h
index f0e571b2dc7c..e24c67d5ba75 100644
--- a/arch/powerpc/include/asm/tlb.h
+++ b/arch/powerpc/include/asm/tlb.h
@@ -40,7 +40,7 @@ extern void flush_hash_entry(struct mm_struct *mm, pte_t *ptep,
40static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, 40static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep,
41 unsigned long address) 41 unsigned long address)
42{ 42{
43#ifdef CONFIG_PPC_STD_MMU_32 43#ifdef CONFIG_PPC_BOOK3S_32
44 if (pte_val(*ptep) & _PAGE_HASHPTE) 44 if (pte_val(*ptep) & _PAGE_HASHPTE)
45 flush_hash_entry(tlb->mm, ptep, address); 45 flush_hash_entry(tlb->mm, ptep, address);
46#endif 46#endif
diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h
index 15bea9a0f260..ebc0b916dcf9 100644
--- a/arch/powerpc/include/asm/uaccess.h
+++ b/arch/powerpc/include/asm/uaccess.h
@@ -63,7 +63,7 @@ static inline int __access_ok(unsigned long addr, unsigned long size,
63#endif 63#endif
64 64
65#define access_ok(type, addr, size) \ 65#define access_ok(type, addr, size) \
66 (__chk_user_ptr(addr), \ 66 (__chk_user_ptr(addr), (void)(type), \
67 __access_ok((__force unsigned long)(addr), (size), get_fs())) 67 __access_ok((__force unsigned long)(addr), (size), get_fs()))
68 68
69/* 69/*
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h
index b0de85b477e1..a3c35e6d6ffb 100644
--- a/arch/powerpc/include/asm/unistd.h
+++ b/arch/powerpc/include/asm/unistd.h
@@ -11,8 +11,7 @@
11 11
12#include <uapi/asm/unistd.h> 12#include <uapi/asm/unistd.h>
13 13
14 14#define NR_syscalls __NR_syscalls
15#define NR_syscalls 389
16 15
17#define __NR__exit __NR_exit 16#define __NR__exit __NR_exit
18 17