diff options
Diffstat (limited to 'arch/powerpc/include/asm')
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 @@ | |||
| 1 | generated-y += syscall_table_32.h | ||
| 2 | generated-y += syscall_table_64.h | ||
| 3 | generated-y += syscall_table_c32.h | ||
| 4 | generated-y += syscall_table_spu.h | ||
| 1 | generic-y += div64.h | 5 | generic-y += div64.h |
| 2 | generic-y += export.h | 6 | generic-y += export.h |
| 3 | generic-y += irq_regs.h | 7 | generic-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); | |||
| 61 | void single_step_exception(struct pt_regs *regs); | 61 | void single_step_exception(struct pt_regs *regs); |
| 62 | void program_check_exception(struct pt_regs *regs); | 62 | void program_check_exception(struct pt_regs *regs); |
| 63 | void alignment_exception(struct pt_regs *regs); | 63 | void alignment_exception(struct pt_regs *regs); |
| 64 | void slb_miss_bad_addr(struct pt_regs *regs); | ||
| 65 | void StackOverflow(struct pt_regs *regs); | 64 | void StackOverflow(struct pt_regs *regs); |
| 66 | void kernel_fp_unavailable_exception(struct pt_regs *regs); | 65 | void kernel_fp_unavailable_exception(struct pt_regs *regs); |
| 67 | void altivec_unavailable_exception(struct pt_regs *regs); | 66 | void 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 | ||
| 41 | struct ppc_bat { | 48 | struct ppc_bat { |
| 42 | u32 batu; | 49 | u32 batu; |
| 43 | u32 batl; | 50 | u32 batl; |
| 44 | }; | 51 | }; |
| 52 | |||
| 53 | typedef 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 */ | ||
| 96 | extern s32 patch__hash_page_A0, patch__hash_page_A1, patch__hash_page_A2; | ||
| 97 | extern s32 patch__hash_page_B, patch__hash_page_C; | ||
| 98 | extern s32 patch__flush_hash_A0, patch__flush_hash_A1, patch__flush_hash_A2; | ||
| 99 | extern 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 @@ | |||
| 25 | extern void __bad_pte(pmd_t *pmd); | 25 | extern void __bad_pte(pmd_t *pmd); |
| 26 | 26 | ||
| 27 | extern struct kmem_cache *pgtable_cache[]; | 27 | extern 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 | ||
| 33 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | 30 | static 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 | |||
| 55 | static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, | 50 | static 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, | |||
| 61 | static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, | 56 | static 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 | |||
| 70 | static 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 | |||
| 76 | static 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 | ||
| 85 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); | 64 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); |
| 86 | extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); | 65 | extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); |
| 66 | void pte_frag_destroy(void *pte_frag); | ||
| 67 | pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel); | ||
| 68 | void pte_fragment_free(unsigned long *table, int kernel); | ||
| 87 | 69 | ||
| 88 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | 70 | static 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 | ||
| 93 | static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) | 75 | static 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 | ||
| 99 | static inline void pgtable_free(void *table, unsigned index_size) | 80 | static 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, | |||
| 138 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, | 118 | static 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); | |||
| 384 | static inline int pte_young(pte_t pte) { return !!(pte_val(pte) & _PAGE_ACCESSED); } | 371 | static inline int pte_young(pte_t pte) { return !!(pte_val(pte) & _PAGE_ACCESSED); } |
| 385 | static inline int pte_special(pte_t pte) { return !!(pte_val(pte) & _PAGE_SPECIAL); } | 372 | static inline int pte_special(pte_t pte) { return !!(pte_val(pte) & _PAGE_SPECIAL); } |
| 386 | static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; } | 373 | static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; } |
| 387 | static inline bool pte_exec(pte_t pte) { return true; } | 374 | static inline bool pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_EXEC; } |
| 388 | 375 | ||
| 389 | static inline int pte_present(pte_t pte) | 376 | static inline int pte_present(pte_t pte) |
| 390 | { | 377 | { |
| @@ -451,7 +438,7 @@ static inline pte_t pte_wrprotect(pte_t pte) | |||
| 451 | 438 | ||
| 452 | static inline pte_t pte_exprotect(pte_t pte) | 439 | static 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 | ||
| 457 | static inline pte_t pte_mkclean(pte_t pte) | 444 | static inline pte_t pte_mkclean(pte_t pte) |
| @@ -466,7 +453,7 @@ static inline pte_t pte_mkold(pte_t pte) | |||
| 466 | 453 | ||
| 467 | static inline pte_t pte_mkexec(pte_t pte) | 454 | static 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 | ||
| 472 | static inline pte_t pte_mkpte(pte_t pte) | 459 | static inline pte_t pte_mkpte(pte_t pte) |
| @@ -524,7 +511,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
| 524 | static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr, | 511 | static 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 | }; |
| 25 | extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT]; | 27 | extern 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 | */ | ||
| 34 | typedef 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 | ||
| 39 | extern struct kmem_cache *pgtable_cache[]; | 39 | extern 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 | ||
| 45 | extern pte_t *pte_fragment_alloc(struct mm_struct *, unsigned long, int); | 42 | extern pte_t *pte_fragment_alloc(struct mm_struct *, unsigned long, int); |
| 46 | extern pmd_t *pmd_fragment_alloc(struct mm_struct *, unsigned long); | 43 | extern 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 |
| 51 | extern void __tlb_remove_table(void *_table); | 48 | extern void __tlb_remove_table(void *_table); |
| 52 | #endif | 49 | #endif |
| 50 | void pte_frag_destroy(void *pte_frag); | ||
| 53 | 51 | ||
| 54 | static inline pgd_t *radix__pgd_alloc(struct mm_struct *mm) | 52 | static 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 | ||
| 1307 | static inline const int pud_pfn(pud_t pud) | 1307 | static 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 |
| 75 | extern long _get_L2CR(void); | 75 | extern long _get_L2CR(void); |
| 76 | extern long _get_L3CR(void); | 76 | extern long _get_L3CR(void); |
| 77 | extern void _set_L2CR(unsigned long); | 77 | extern 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, | |||
| 33 | int patch_branch(unsigned int *addr, unsigned long target, int flags); | 33 | int patch_branch(unsigned int *addr, unsigned long target, int flags); |
| 34 | int patch_instruction(unsigned int *addr, unsigned int instr); | 34 | int patch_instruction(unsigned int *addr, unsigned int instr); |
| 35 | int raw_patch_instruction(unsigned int *addr, unsigned int instr); | 35 | int raw_patch_instruction(unsigned int *addr, unsigned int instr); |
| 36 | int patch_instruction_site(s32 *addr, unsigned int instr); | ||
| 37 | int patch_branch_site(s32 *site, unsigned long target, int flags); | ||
| 38 | 36 | ||
| 39 | static inline unsigned long patch_site_addr(s32 *site) | 37 | static 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 | ||
| 42 | static inline int patch_instruction_site(s32 *site, unsigned int instr) | ||
| 43 | { | ||
| 44 | return patch_instruction((unsigned int *)patch_site_addr(site), instr); | ||
| 45 | } | ||
| 46 | |||
| 47 | static 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 | |||
| 52 | static 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 | |||
| 58 | static 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 | |||
| 44 | int instr_is_relative_branch(unsigned int instr); | 63 | int instr_is_relative_branch(unsigned int instr); |
| 45 | int instr_is_relative_link_branch(unsigned int instr); | 64 | int instr_is_relative_link_branch(unsigned int instr); |
| 46 | int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr); | 65 | int 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); | |||
| 44 | extern int machine_check_e200(struct pt_regs *regs); | 44 | extern int machine_check_e200(struct pt_regs *regs); |
| 45 | extern int machine_check_47x(struct pt_regs *regs); | 45 | extern int machine_check_47x(struct pt_regs *regs); |
| 46 | int machine_check_8xx(struct pt_regs *regs); | 46 | int machine_check_8xx(struct pt_regs *regs); |
| 47 | int machine_check_83xx(struct pt_regs *regs); | ||
| 47 | 48 | ||
| 48 | extern void cpu_down_flush_e500v2(void); | 49 | extern void cpu_down_flush_e500v2(void); |
| 49 | extern void cpu_down_flush_e500mc(void); | 50 | extern 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 | */ |
| 41 | struct device; | 41 | struct device; |
| 42 | extern void *__dma_alloc_coherent(struct device *dev, size_t size, | ||
| 43 | dma_addr_t *handle, gfp_t gfp); | ||
| 44 | extern void __dma_free_coherent(size_t size, void *vaddr); | ||
| 45 | extern void __dma_sync(void *vaddr, size_t size, int direction); | 42 | extern void __dma_sync(void *vaddr, size_t size, int direction); |
| 46 | extern void __dma_sync_page(struct page *page, unsigned long offset, | 43 | extern 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 | ||
| 113 | extern u64 __dma_get_required_mask(struct device *dev); | 108 | extern 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 | ||
| 203 | extern int is_fadump_boot_memory_area(u64 addr, ulong size); | 208 | extern int is_fadump_memory_area(u64 addr, ulong size); |
| 204 | extern int early_init_dt_scan_fw_dump(unsigned long node, | 209 | extern 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); |
| 206 | extern int fadump_reserve_mem(void); | 211 | extern 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 \ | ||
| 225 | 955: \ | ||
| 226 | |||
| 227 | #define END_BTB_FLUSH_SECTION \ | ||
| 228 | 956: \ | ||
| 229 | .pushsection __btb_flush_fixup,"a"; \ | ||
| 230 | .align 2; \ | ||
| 231 | 957: \ | ||
| 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; | |||
| 230 | extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; | 241 | extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; |
| 231 | extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup; | 242 | extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup; |
| 232 | extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup; | 243 | extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup; |
| 244 | extern long __start__btb_flush_fixup, __stop__btb_flush_fixup; | ||
| 233 | 245 | ||
| 234 | void apply_feature_fixups(void); | 246 | void apply_feature_fixups(void); |
| 235 | void setup_feature_keys(void); | 247 | void 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 | ||
| 8 | extern 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, | |||
| 129 | static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, | 129 | static 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 |
| 138 | extern int huge_ptep_set_access_flags(struct vm_area_struct *vma, | 137 | int 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 | ||
| 142 | static inline void arch_clear_hugepage_flags(struct page *page) | 141 | static 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 | */ |
| 805 | static inline unsigned long virt_to_phys(volatile void * address) | 807 | static 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) | 834 | static 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 | ||
| 216 | extern void iommu_register_group(struct iommu_table_group *table_group, | 216 | extern 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); |
| 218 | extern int iommu_add_device(struct device *dev); | 218 | extern int iommu_add_device(struct iommu_table_group *table_group, |
| 219 | struct device *dev); | ||
| 219 | extern void iommu_del_device(struct device *dev); | 220 | extern void iommu_del_device(struct device *dev); |
| 220 | extern int __init tce_iommu_bus_notifier_init(void); | 221 | extern long iommu_tce_xchg(struct mm_struct *mm, struct iommu_table *tbl, |
| 221 | extern 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 |
| 224 | static inline void iommu_register_group(struct iommu_table_group *table_group, | 225 | static 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 | ||
| 230 | static inline int iommu_add_device(struct device *dev) | 231 | static 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) | |||
| 235 | static inline void iommu_del_device(struct device *dev) | 237 | static inline void iommu_del_device(struct device *dev) |
| 236 | { | 238 | { |
| 237 | } | 239 | } |
| 238 | |||
| 239 | static 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 | ||
| 245 | int dma_iommu_mapping_error(struct device *dev, dma_addr_t dma_addr); | 242 | int 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 | ||
| 72 | extern int ipic_set_priority(unsigned int irq, unsigned int priority); | ||
| 73 | extern void ipic_set_highest_priority(unsigned int irq); | 72 | extern void ipic_set_highest_priority(unsigned int irq); |
| 74 | extern void ipic_set_default_priority(void); | 73 | extern void ipic_set_default_priority(void); |
| 75 | extern void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq); | 74 | extern 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 | ||
| 133 | enum { | 133 | enum { |
| 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 | ||
| 22 | extern int isolate_lru_page(struct page *page); /* from internal.h */ | 22 | extern int isolate_lru_page(struct page *page); /* from internal.h */ |
| 23 | extern bool mm_iommu_preregistered(struct mm_struct *mm); | 23 | extern bool mm_iommu_preregistered(struct mm_struct *mm); |
| 24 | extern long mm_iommu_get(struct mm_struct *mm, | 24 | extern 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); |
| 27 | extern 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); | ||
| 27 | extern long mm_iommu_put(struct mm_struct *mm, | 30 | extern 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); |
| 29 | extern void mm_iommu_init(struct mm_struct *mm); | 32 | extern 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); |
| 33 | extern struct mm_iommu_table_group_mem_t *mm_iommu_lookup_rm( | 36 | extern 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); |
| 35 | extern struct mm_iommu_table_group_mem_t *mm_iommu_find(struct mm_struct *mm, | 38 | extern 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); |
| 37 | extern long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t *mem, | 40 | extern 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); |
| 39 | extern long mm_iommu_ua_to_hpa_rm(struct mm_iommu_table_group_mem_t *mem, | 42 | extern 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); |
| 41 | extern void mm_iommu_ua_mark_dirty_rm(struct mm_struct *mm, unsigned long ua); | 44 | extern void mm_iommu_ua_mark_dirty_rm(struct mm_struct *mm, unsigned long ua); |
| 45 | extern bool mm_iommu_is_devmem(struct mm_struct *mm, unsigned long hpa, | ||
| 46 | unsigned int pageshift, unsigned long *size); | ||
| 42 | extern long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t *mem); | 47 | extern long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t *mem); |
| 43 | extern void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t *mem); | 48 | extern void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t *mem); |
| 49 | #else | ||
| 50 | static 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 |
| 45 | extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm); | 56 | extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm); |
| 46 | extern void set_context(unsigned long id, pgd_t *pgd); | 57 | extern 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 | ||
| 220 | static 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 | ||
| 227 | static inline void arch_exit_mmap(struct mm_struct *mm) | 232 | static 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 |
| 248 | bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write, | 253 | bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write, |
| 249 | bool execute, bool foreign); | 254 | bool execute, bool foreign); |
| 255 | void arch_dup_pkeys(struct mm_struct *oldmm, struct mm_struct *mm); | ||
| 250 | #else /* CONFIG_PPC_MEM_KEYS */ | 256 | #else /* CONFIG_PPC_MEM_KEYS */ |
| 251 | static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, | 257 | static 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 | ||
| 263 | static inline u64 pte_to_hpte_pkey_bits(u64 pteflags) | 270 | static 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 | ||
| 277 | static 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 */ | ||
| 115 | extern 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__ | ||
| 22 | typedef 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 @@ | |||
| 25 | extern void __bad_pte(pmd_t *pmd); | 25 | extern void __bad_pte(pmd_t *pmd); |
| 26 | 26 | ||
| 27 | extern struct kmem_cache *pgtable_cache[]; | 27 | extern 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 | ||
| 33 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | 30 | static 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, | |||
| 61 | static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, | 58 | static 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 | ||
| 71 | static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, | 67 | static 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, | |||
| 77 | static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, | 73 | static 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 | ||
| 86 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); | 82 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); |
| 87 | extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); | 83 | extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); |
| 84 | void pte_frag_destroy(void *pte_frag); | ||
| 85 | pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel); | ||
| 86 | void pte_fragment_free(unsigned long *table, int kernel); | ||
| 88 | 87 | ||
| 89 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | 88 | static 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 | ||
| 94 | static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) | 93 | static 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 | ||
| 100 | static inline void pgtable_free(void *table, unsigned index_size) | 98 | static 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__ | ||
| 9 | typedef 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 | ||
| 38 | extern struct kmem_cache *pgtable_cache[]; | 38 | extern 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 | ||
| 44 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | 41 | static 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); | |||
| 347 | extern int opal_sensor_init(void); | 347 | extern int opal_sensor_init(void); |
| 348 | extern int opal_hmi_handler_init(void); | 348 | extern int opal_hmi_handler_init(void); |
| 349 | extern int opal_event_init(void); | 349 | extern int opal_event_init(void); |
| 350 | int opal_power_control_init(void); | ||
| 350 | 351 | ||
| 351 | extern int opal_machine_check(struct pt_regs *regs); | 352 | extern int opal_machine_check(struct pt_regs *regs); |
| 352 | extern bool opal_mce_check_early_recovery(struct pt_regs *regs); | 353 | extern 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 | ||
| 337 | struct vm_area_struct; | 337 | struct 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 | */ | ||
| 344 | typedef pte_t *pgtable_t; | ||
| 345 | #else | ||
| 346 | #if defined(CONFIG_PPC_64K_PAGES) && defined(CONFIG_PPC64) | ||
| 347 | typedef pte_t *pgtable_t; | ||
| 348 | #else | ||
| 349 | typedef 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 | ||
| 130 | extern struct pci_dev *pnv_pci_get_gpu_dev(struct pci_dev *npdev); | 130 | extern struct pci_dev *pnv_pci_get_gpu_dev(struct pci_dev *npdev); |
| 131 | extern struct pci_dev *pnv_pci_get_npu_dev(struct pci_dev *gpdev, int index); | 131 | extern struct pci_dev *pnv_pci_get_npu_dev(struct pci_dev *gpdev, int index); |
| 132 | extern int pnv_npu2_init(struct pci_controller *hose); | ||
| 133 | extern int pnv_npu2_map_lpar_dev(struct pci_dev *gpdev, unsigned int lparid, | ||
| 134 | unsigned long msr); | ||
| 135 | extern 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 */ | ||
| 44 | extern 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) | ||
| 7 | typedef struct { pte_basic_t pte, pte1, pte2, pte3; } pte_t; | ||
| 8 | #else | ||
| 6 | typedef struct { pte_basic_t pte; } pte_t; | 9 | typedef struct { pte_basic_t pte; } pte_t; |
| 10 | #endif | ||
| 7 | #define __pte(x) ((pte_t) { (x) }) | 11 | #define __pte(x) ((pte_t) { (x) }) |
| 8 | static inline pte_basic_t pte_val(pte_t x) | 12 | static 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 | ||
| 67 | extern pgd_t swapper_pg_dir[]; | 67 | extern pgd_t swapper_pg_dir[]; |
| 68 | 68 | ||
| 69 | void limit_zone_pfn(enum zone_type zone, unsigned long max_pfn); | ||
| 70 | int dma_pfn_limit_to_zone(u64 pfn_limit); | 69 | int dma_pfn_limit_to_zone(u64 pfn_limit); |
| 71 | extern void paging_init(void); | 70 | extern 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 */ |
| 102 | unsigned long vmalloc_to_phys(void *vmalloc_addr); | 101 | unsigned long vmalloc_to_phys(void *vmalloc_addr); |
| 103 | 102 | ||
| 104 | void pgtable_cache_add(unsigned shift, void (*ctor)(void *)); | 103 | void pgtable_cache_add(unsigned int shift); |
| 105 | void pgtable_cache_init(void); | 104 | void 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); | |||
| 110 | static inline void mark_initmem_nx(void) { } | 109 | static 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 | ||
| 117 | static inline void *pte_frag_get(mm_context_t *ctx) | ||
| 118 | { | ||
| 119 | return ctx->pte_frag; | ||
| 120 | } | ||
| 121 | |||
| 122 | static 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 | |||
| 131 | static inline void *pte_frag_get(mm_context_t *ctx) | ||
| 132 | { | ||
| 133 | return NULL; | ||
| 134 | } | ||
| 135 | |||
| 136 | static 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 |
| 491 | 0: 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) \ | ||
| 498 | 0: 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); | |||
| 67 | static inline void do_barrier_nospec_fixups_range(bool enable, void *start, void *end) { }; | 67 | static 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 | ||
| 71 | void setup_spectre_v2(void); | ||
| 72 | #else | ||
| 73 | static inline void setup_spectre_v2(void) {}; | ||
| 74 | #endif | ||
| 75 | void 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 | |||
| 15 | struct 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 | |||
| 23 | struct mm_struct; | ||
| 24 | |||
| 25 | unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len, | 25 | unsigned 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, | |||
| 34 | void slice_init_new_context_exec(struct mm_struct *mm); | 34 | void slice_init_new_context_exec(struct mm_struct *mm); |
| 35 | void slice_setup_new_exec(void); | 35 | void slice_setup_new_exec(void); |
| 36 | 36 | ||
| 37 | #endif /* __ASSEMBLY__ */ | 37 | #else /* CONFIG_PPC_MM_SLICES */ |
| 38 | |||
| 39 | static 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 | ||
| 22 | extern const unsigned long sys_call_table[]; | 21 | extern const unsigned long sys_call_table[]; |
| 23 | #endif /* CONFIG_FTRACE_SYSCALLS */ | 22 | extern const unsigned long compat_sys_call_table[]; |
| 24 | 23 | ||
| 25 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) | 24 | static 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 | |||
| 7 | SYSCALL(restart_syscall) | ||
| 8 | SYSCALL(exit) | ||
| 9 | PPC_SYS(fork) | ||
| 10 | SYSCALL_SPU(read) | ||
| 11 | SYSCALL_SPU(write) | ||
| 12 | COMPAT_SYS_SPU(open) | ||
| 13 | SYSCALL_SPU(close) | ||
| 14 | SYSCALL_SPU(waitpid) | ||
| 15 | SYSCALL_SPU(creat) | ||
| 16 | SYSCALL_SPU(link) | ||
| 17 | SYSCALL_SPU(unlink) | ||
| 18 | COMPAT_SYS(execve) | ||
| 19 | SYSCALL_SPU(chdir) | ||
| 20 | COMPAT_SYS_SPU(time) | ||
| 21 | SYSCALL_SPU(mknod) | ||
| 22 | SYSCALL_SPU(chmod) | ||
| 23 | SYSCALL_SPU(lchown) | ||
| 24 | SYSCALL(ni_syscall) | ||
| 25 | OLDSYS(stat) | ||
| 26 | COMPAT_SYS_SPU(lseek) | ||
| 27 | SYSCALL_SPU(getpid) | ||
| 28 | COMPAT_SYS(mount) | ||
| 29 | SYSX(sys_ni_syscall,sys_oldumount,sys_oldumount) | ||
| 30 | SYSCALL_SPU(setuid) | ||
| 31 | SYSCALL_SPU(getuid) | ||
| 32 | COMPAT_SYS_SPU(stime) | ||
| 33 | COMPAT_SYS(ptrace) | ||
| 34 | SYSCALL_SPU(alarm) | ||
| 35 | OLDSYS(fstat) | ||
| 36 | SYSCALL(pause) | ||
| 37 | COMPAT_SYS(utime) | ||
| 38 | SYSCALL(ni_syscall) | ||
| 39 | SYSCALL(ni_syscall) | ||
| 40 | SYSCALL_SPU(access) | ||
| 41 | SYSCALL_SPU(nice) | ||
| 42 | SYSCALL(ni_syscall) | ||
| 43 | SYSCALL_SPU(sync) | ||
| 44 | SYSCALL_SPU(kill) | ||
| 45 | SYSCALL_SPU(rename) | ||
| 46 | SYSCALL_SPU(mkdir) | ||
| 47 | SYSCALL_SPU(rmdir) | ||
| 48 | SYSCALL_SPU(dup) | ||
| 49 | SYSCALL_SPU(pipe) | ||
| 50 | COMPAT_SYS_SPU(times) | ||
| 51 | SYSCALL(ni_syscall) | ||
| 52 | SYSCALL_SPU(brk) | ||
| 53 | SYSCALL_SPU(setgid) | ||
| 54 | SYSCALL_SPU(getgid) | ||
| 55 | SYSCALL(signal) | ||
| 56 | SYSCALL_SPU(geteuid) | ||
| 57 | SYSCALL_SPU(getegid) | ||
| 58 | SYSCALL(acct) | ||
| 59 | SYSCALL(umount) | ||
| 60 | SYSCALL(ni_syscall) | ||
| 61 | COMPAT_SYS_SPU(ioctl) | ||
| 62 | COMPAT_SYS_SPU(fcntl) | ||
| 63 | SYSCALL(ni_syscall) | ||
| 64 | SYSCALL_SPU(setpgid) | ||
| 65 | SYSCALL(ni_syscall) | ||
| 66 | SYSX(sys_ni_syscall,sys_olduname,sys_olduname) | ||
| 67 | SYSCALL_SPU(umask) | ||
| 68 | SYSCALL_SPU(chroot) | ||
| 69 | COMPAT_SYS(ustat) | ||
| 70 | SYSCALL_SPU(dup2) | ||
| 71 | SYSCALL_SPU(getppid) | ||
| 72 | SYSCALL_SPU(getpgrp) | ||
| 73 | SYSCALL_SPU(setsid) | ||
| 74 | SYS32ONLY(sigaction) | ||
| 75 | SYSCALL_SPU(sgetmask) | ||
| 76 | SYSCALL_SPU(ssetmask) | ||
| 77 | SYSCALL_SPU(setreuid) | ||
| 78 | SYSCALL_SPU(setregid) | ||
| 79 | #define compat_sys_sigsuspend sys_sigsuspend | ||
| 80 | SYS32ONLY(sigsuspend) | ||
| 81 | SYSX(sys_ni_syscall,compat_sys_sigpending,sys_sigpending) | ||
| 82 | SYSCALL_SPU(sethostname) | ||
| 83 | COMPAT_SYS_SPU(setrlimit) | ||
| 84 | SYSX(sys_ni_syscall,compat_sys_old_getrlimit,sys_old_getrlimit) | ||
| 85 | COMPAT_SYS_SPU(getrusage) | ||
| 86 | COMPAT_SYS_SPU(gettimeofday) | ||
| 87 | COMPAT_SYS_SPU(settimeofday) | ||
| 88 | SYSCALL_SPU(getgroups) | ||
| 89 | SYSCALL_SPU(setgroups) | ||
| 90 | SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select) | ||
| 91 | SYSCALL_SPU(symlink) | ||
| 92 | OLDSYS(lstat) | ||
| 93 | SYSCALL_SPU(readlink) | ||
| 94 | SYSCALL(uselib) | ||
| 95 | SYSCALL(swapon) | ||
| 96 | SYSCALL(reboot) | ||
| 97 | SYSX(sys_ni_syscall,compat_sys_old_readdir,sys_old_readdir) | ||
| 98 | SYSCALL_SPU(mmap) | ||
| 99 | SYSCALL_SPU(munmap) | ||
| 100 | COMPAT_SYS_SPU(truncate) | ||
| 101 | COMPAT_SYS_SPU(ftruncate) | ||
| 102 | SYSCALL_SPU(fchmod) | ||
| 103 | SYSCALL_SPU(fchown) | ||
| 104 | SYSCALL_SPU(getpriority) | ||
| 105 | SYSCALL_SPU(setpriority) | ||
| 106 | SYSCALL(ni_syscall) | ||
| 107 | COMPAT_SYS(statfs) | ||
| 108 | COMPAT_SYS(fstatfs) | ||
| 109 | SYSCALL(ni_syscall) | ||
| 110 | COMPAT_SYS_SPU(socketcall) | ||
| 111 | SYSCALL_SPU(syslog) | ||
| 112 | COMPAT_SYS_SPU(setitimer) | ||
| 113 | COMPAT_SYS_SPU(getitimer) | ||
| 114 | COMPAT_SYS_SPU(newstat) | ||
| 115 | COMPAT_SYS_SPU(newlstat) | ||
| 116 | COMPAT_SYS_SPU(newfstat) | ||
| 117 | SYSX(sys_ni_syscall,sys_uname,sys_uname) | ||
| 118 | SYSCALL(ni_syscall) | ||
| 119 | SYSCALL_SPU(vhangup) | ||
| 120 | SYSCALL(ni_syscall) | ||
| 121 | SYSCALL(ni_syscall) | ||
| 122 | COMPAT_SYS_SPU(wait4) | ||
| 123 | SYSCALL(swapoff) | ||
| 124 | COMPAT_SYS_SPU(sysinfo) | ||
| 125 | COMPAT_SYS(ipc) | ||
| 126 | SYSCALL_SPU(fsync) | ||
| 127 | SYS32ONLY(sigreturn) | ||
| 128 | PPC_SYS(clone) | ||
| 129 | SYSCALL_SPU(setdomainname) | ||
| 130 | SYSCALL_SPU(newuname) | ||
| 131 | SYSCALL(ni_syscall) | ||
| 132 | COMPAT_SYS_SPU(adjtimex) | ||
| 133 | SYSCALL_SPU(mprotect) | ||
| 134 | SYSX(sys_ni_syscall,compat_sys_sigprocmask,sys_sigprocmask) | ||
| 135 | SYSCALL(ni_syscall) | ||
| 136 | SYSCALL(init_module) | ||
| 137 | SYSCALL(delete_module) | ||
| 138 | SYSCALL(ni_syscall) | ||
| 139 | SYSCALL(quotactl) | ||
| 140 | SYSCALL_SPU(getpgid) | ||
| 141 | SYSCALL_SPU(fchdir) | ||
| 142 | SYSCALL_SPU(bdflush) | ||
| 143 | SYSCALL_SPU(sysfs) | ||
| 144 | SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality) | ||
| 145 | SYSCALL(ni_syscall) | ||
| 146 | SYSCALL_SPU(setfsuid) | ||
| 147 | SYSCALL_SPU(setfsgid) | ||
| 148 | SYSCALL_SPU(llseek) | ||
| 149 | COMPAT_SYS_SPU(getdents) | ||
| 150 | COMPAT_SPU_NEW(select) | ||
| 151 | SYSCALL_SPU(flock) | ||
| 152 | SYSCALL_SPU(msync) | ||
| 153 | COMPAT_SYS_SPU(readv) | ||
| 154 | COMPAT_SYS_SPU(writev) | ||
| 155 | SYSCALL_SPU(getsid) | ||
| 156 | SYSCALL_SPU(fdatasync) | ||
| 157 | COMPAT_SYS(sysctl) | ||
| 158 | SYSCALL_SPU(mlock) | ||
| 159 | SYSCALL_SPU(munlock) | ||
| 160 | SYSCALL_SPU(mlockall) | ||
| 161 | SYSCALL_SPU(munlockall) | ||
| 162 | SYSCALL_SPU(sched_setparam) | ||
| 163 | SYSCALL_SPU(sched_getparam) | ||
| 164 | SYSCALL_SPU(sched_setscheduler) | ||
| 165 | SYSCALL_SPU(sched_getscheduler) | ||
| 166 | SYSCALL_SPU(sched_yield) | ||
| 167 | SYSCALL_SPU(sched_get_priority_max) | ||
| 168 | SYSCALL_SPU(sched_get_priority_min) | ||
| 169 | COMPAT_SYS_SPU(sched_rr_get_interval) | ||
| 170 | COMPAT_SYS_SPU(nanosleep) | ||
| 171 | SYSCALL_SPU(mremap) | ||
| 172 | SYSCALL_SPU(setresuid) | ||
| 173 | SYSCALL_SPU(getresuid) | ||
| 174 | SYSCALL(ni_syscall) | ||
| 175 | SYSCALL_SPU(poll) | ||
| 176 | SYSCALL(ni_syscall) | ||
| 177 | SYSCALL_SPU(setresgid) | ||
| 178 | SYSCALL_SPU(getresgid) | ||
| 179 | SYSCALL_SPU(prctl) | ||
| 180 | COMPAT_SYS(rt_sigreturn) | ||
| 181 | COMPAT_SYS(rt_sigaction) | ||
| 182 | COMPAT_SYS(rt_sigprocmask) | ||
| 183 | COMPAT_SYS(rt_sigpending) | ||
| 184 | COMPAT_SYS(rt_sigtimedwait) | ||
| 185 | COMPAT_SYS(rt_sigqueueinfo) | ||
| 186 | COMPAT_SYS(rt_sigsuspend) | ||
| 187 | COMPAT_SYS_SPU(pread64) | ||
| 188 | COMPAT_SYS_SPU(pwrite64) | ||
| 189 | SYSCALL_SPU(chown) | ||
| 190 | SYSCALL_SPU(getcwd) | ||
| 191 | SYSCALL_SPU(capget) | ||
| 192 | SYSCALL_SPU(capset) | ||
| 193 | COMPAT_SYS(sigaltstack) | ||
| 194 | SYSX_SPU(sys_sendfile64,compat_sys_sendfile,sys_sendfile) | ||
| 195 | SYSCALL(ni_syscall) | ||
| 196 | SYSCALL(ni_syscall) | ||
| 197 | PPC_SYS(vfork) | ||
| 198 | COMPAT_SYS_SPU(getrlimit) | ||
| 199 | COMPAT_SYS_SPU(readahead) | ||
| 200 | SYS32ONLY(mmap2) | ||
| 201 | SYS32ONLY(truncate64) | ||
| 202 | SYS32ONLY(ftruncate64) | ||
| 203 | SYSX(sys_ni_syscall,sys_stat64,sys_stat64) | ||
| 204 | SYSX(sys_ni_syscall,sys_lstat64,sys_lstat64) | ||
| 205 | SYSX(sys_ni_syscall,sys_fstat64,sys_fstat64) | ||
| 206 | SYSCALL(pciconfig_read) | ||
| 207 | SYSCALL(pciconfig_write) | ||
| 208 | SYSCALL(pciconfig_iobase) | ||
| 209 | SYSCALL(ni_syscall) | ||
| 210 | SYSCALL_SPU(getdents64) | ||
| 211 | SYSCALL_SPU(pivot_root) | ||
| 212 | SYSX(sys_ni_syscall,compat_sys_fcntl64,sys_fcntl64) | ||
| 213 | SYSCALL_SPU(madvise) | ||
| 214 | SYSCALL_SPU(mincore) | ||
| 215 | SYSCALL_SPU(gettid) | ||
| 216 | SYSCALL_SPU(tkill) | ||
| 217 | SYSCALL_SPU(setxattr) | ||
| 218 | SYSCALL_SPU(lsetxattr) | ||
| 219 | SYSCALL_SPU(fsetxattr) | ||
| 220 | SYSCALL_SPU(getxattr) | ||
| 221 | SYSCALL_SPU(lgetxattr) | ||
| 222 | SYSCALL_SPU(fgetxattr) | ||
| 223 | SYSCALL_SPU(listxattr) | ||
| 224 | SYSCALL_SPU(llistxattr) | ||
| 225 | SYSCALL_SPU(flistxattr) | ||
| 226 | SYSCALL_SPU(removexattr) | ||
| 227 | SYSCALL_SPU(lremovexattr) | ||
| 228 | SYSCALL_SPU(fremovexattr) | ||
| 229 | COMPAT_SYS_SPU(futex) | ||
| 230 | COMPAT_SYS_SPU(sched_setaffinity) | ||
| 231 | COMPAT_SYS_SPU(sched_getaffinity) | ||
| 232 | SYSCALL(ni_syscall) | ||
| 233 | SYSCALL(ni_syscall) | ||
| 234 | SYS32ONLY(sendfile64) | ||
| 235 | COMPAT_SYS_SPU(io_setup) | ||
| 236 | SYSCALL_SPU(io_destroy) | ||
| 237 | COMPAT_SYS_SPU(io_getevents) | ||
| 238 | COMPAT_SYS_SPU(io_submit) | ||
| 239 | SYSCALL_SPU(io_cancel) | ||
| 240 | SYSCALL(set_tid_address) | ||
| 241 | SYSX_SPU(sys_fadvise64,ppc32_fadvise64,sys_fadvise64) | ||
| 242 | SYSCALL(exit_group) | ||
| 243 | COMPAT_SYS(lookup_dcookie) | ||
| 244 | SYSCALL_SPU(epoll_create) | ||
| 245 | SYSCALL_SPU(epoll_ctl) | ||
| 246 | SYSCALL_SPU(epoll_wait) | ||
| 247 | SYSCALL_SPU(remap_file_pages) | ||
| 248 | COMPAT_SYS_SPU(timer_create) | ||
| 249 | COMPAT_SYS_SPU(timer_settime) | ||
| 250 | COMPAT_SYS_SPU(timer_gettime) | ||
| 251 | SYSCALL_SPU(timer_getoverrun) | ||
| 252 | SYSCALL_SPU(timer_delete) | ||
| 253 | COMPAT_SYS_SPU(clock_settime) | ||
| 254 | COMPAT_SYS_SPU(clock_gettime) | ||
| 255 | COMPAT_SYS_SPU(clock_getres) | ||
| 256 | COMPAT_SYS_SPU(clock_nanosleep) | ||
| 257 | SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext) | ||
| 258 | SYSCALL_SPU(tgkill) | ||
| 259 | COMPAT_SYS_SPU(utimes) | ||
| 260 | COMPAT_SYS_SPU(statfs64) | ||
| 261 | COMPAT_SYS_SPU(fstatfs64) | ||
| 262 | SYSX(sys_ni_syscall,ppc_fadvise64_64,ppc_fadvise64_64) | ||
| 263 | SYSCALL_SPU(rtas) | ||
| 264 | OLDSYS(debug_setcontext) | ||
| 265 | SYSCALL(ni_syscall) | ||
| 266 | COMPAT_SYS(migrate_pages) | ||
| 267 | COMPAT_SYS(mbind) | ||
| 268 | COMPAT_SYS(get_mempolicy) | ||
| 269 | COMPAT_SYS(set_mempolicy) | ||
| 270 | COMPAT_SYS(mq_open) | ||
| 271 | SYSCALL(mq_unlink) | ||
| 272 | COMPAT_SYS(mq_timedsend) | ||
| 273 | COMPAT_SYS(mq_timedreceive) | ||
| 274 | COMPAT_SYS(mq_notify) | ||
| 275 | COMPAT_SYS(mq_getsetattr) | ||
| 276 | COMPAT_SYS(kexec_load) | ||
| 277 | SYSCALL(add_key) | ||
| 278 | SYSCALL(request_key) | ||
| 279 | COMPAT_SYS(keyctl) | ||
| 280 | COMPAT_SYS(waitid) | ||
| 281 | SYSCALL(ioprio_set) | ||
| 282 | SYSCALL(ioprio_get) | ||
| 283 | SYSCALL(inotify_init) | ||
| 284 | SYSCALL(inotify_add_watch) | ||
| 285 | SYSCALL(inotify_rm_watch) | ||
| 286 | SYSCALL(spu_run) | ||
| 287 | SYSCALL(spu_create) | ||
| 288 | COMPAT_SYS(pselect6) | ||
| 289 | COMPAT_SYS(ppoll) | ||
| 290 | SYSCALL_SPU(unshare) | ||
| 291 | SYSCALL_SPU(splice) | ||
| 292 | SYSCALL_SPU(tee) | ||
| 293 | COMPAT_SYS_SPU(vmsplice) | ||
| 294 | COMPAT_SYS_SPU(openat) | ||
| 295 | SYSCALL_SPU(mkdirat) | ||
| 296 | SYSCALL_SPU(mknodat) | ||
| 297 | SYSCALL_SPU(fchownat) | ||
| 298 | COMPAT_SYS_SPU(futimesat) | ||
| 299 | SYSX_SPU(sys_newfstatat,sys_fstatat64,sys_fstatat64) | ||
| 300 | SYSCALL_SPU(unlinkat) | ||
| 301 | SYSCALL_SPU(renameat) | ||
| 302 | SYSCALL_SPU(linkat) | ||
| 303 | SYSCALL_SPU(symlinkat) | ||
| 304 | SYSCALL_SPU(readlinkat) | ||
| 305 | SYSCALL_SPU(fchmodat) | ||
| 306 | SYSCALL_SPU(faccessat) | ||
| 307 | COMPAT_SYS_SPU(get_robust_list) | ||
| 308 | COMPAT_SYS_SPU(set_robust_list) | ||
| 309 | COMPAT_SYS_SPU(move_pages) | ||
| 310 | SYSCALL_SPU(getcpu) | ||
| 311 | COMPAT_SYS(epoll_pwait) | ||
| 312 | COMPAT_SYS_SPU(utimensat) | ||
| 313 | COMPAT_SYS_SPU(signalfd) | ||
| 314 | SYSCALL_SPU(timerfd_create) | ||
| 315 | SYSCALL_SPU(eventfd) | ||
| 316 | COMPAT_SYS_SPU(sync_file_range2) | ||
| 317 | COMPAT_SYS(fallocate) | ||
| 318 | SYSCALL(subpage_prot) | ||
| 319 | COMPAT_SYS_SPU(timerfd_settime) | ||
| 320 | COMPAT_SYS_SPU(timerfd_gettime) | ||
| 321 | COMPAT_SYS_SPU(signalfd4) | ||
| 322 | SYSCALL_SPU(eventfd2) | ||
| 323 | SYSCALL_SPU(epoll_create1) | ||
| 324 | SYSCALL_SPU(dup3) | ||
| 325 | SYSCALL_SPU(pipe2) | ||
| 326 | SYSCALL(inotify_init1) | ||
| 327 | SYSCALL_SPU(perf_event_open) | ||
| 328 | COMPAT_SYS_SPU(preadv) | ||
| 329 | COMPAT_SYS_SPU(pwritev) | ||
| 330 | COMPAT_SYS(rt_tgsigqueueinfo) | ||
| 331 | SYSCALL(fanotify_init) | ||
| 332 | COMPAT_SYS(fanotify_mark) | ||
| 333 | SYSCALL_SPU(prlimit64) | ||
| 334 | SYSCALL_SPU(socket) | ||
| 335 | SYSCALL_SPU(bind) | ||
| 336 | SYSCALL_SPU(connect) | ||
| 337 | SYSCALL_SPU(listen) | ||
| 338 | SYSCALL_SPU(accept) | ||
| 339 | SYSCALL_SPU(getsockname) | ||
| 340 | SYSCALL_SPU(getpeername) | ||
| 341 | SYSCALL_SPU(socketpair) | ||
| 342 | SYSCALL_SPU(send) | ||
| 343 | SYSCALL_SPU(sendto) | ||
| 344 | COMPAT_SYS_SPU(recv) | ||
| 345 | COMPAT_SYS_SPU(recvfrom) | ||
| 346 | SYSCALL_SPU(shutdown) | ||
| 347 | COMPAT_SYS_SPU(setsockopt) | ||
| 348 | COMPAT_SYS_SPU(getsockopt) | ||
| 349 | COMPAT_SYS_SPU(sendmsg) | ||
| 350 | COMPAT_SYS_SPU(recvmsg) | ||
| 351 | COMPAT_SYS_SPU(recvmmsg) | ||
| 352 | SYSCALL_SPU(accept4) | ||
| 353 | SYSCALL_SPU(name_to_handle_at) | ||
| 354 | COMPAT_SYS_SPU(open_by_handle_at) | ||
| 355 | COMPAT_SYS_SPU(clock_adjtime) | ||
| 356 | SYSCALL_SPU(syncfs) | ||
| 357 | COMPAT_SYS_SPU(sendmmsg) | ||
| 358 | SYSCALL_SPU(setns) | ||
| 359 | COMPAT_SYS(process_vm_readv) | ||
| 360 | COMPAT_SYS(process_vm_writev) | ||
| 361 | SYSCALL(finit_module) | ||
| 362 | SYSCALL(kcmp) /* sys_kcmp */ | ||
| 363 | SYSCALL_SPU(sched_setattr) | ||
| 364 | SYSCALL_SPU(sched_getattr) | ||
| 365 | SYSCALL_SPU(renameat2) | ||
| 366 | SYSCALL_SPU(seccomp) | ||
| 367 | SYSCALL_SPU(getrandom) | ||
| 368 | SYSCALL_SPU(memfd_create) | ||
| 369 | SYSCALL_SPU(bpf) | ||
| 370 | COMPAT_SYS(execveat) | ||
| 371 | PPC64ONLY(switch_endian) | ||
| 372 | SYSCALL_SPU(userfaultfd) | ||
| 373 | SYSCALL_SPU(membarrier) | ||
| 374 | SYSCALL(ni_syscall) | ||
| 375 | SYSCALL(ni_syscall) | ||
| 376 | SYSCALL(ni_syscall) | ||
| 377 | SYSCALL(ni_syscall) | ||
| 378 | SYSCALL(ni_syscall) | ||
| 379 | SYSCALL(ni_syscall) | ||
| 380 | SYSCALL(ni_syscall) | ||
| 381 | SYSCALL(ni_syscall) | ||
| 382 | SYSCALL(ni_syscall) | ||
| 383 | SYSCALL(ni_syscall) | ||
| 384 | SYSCALL(ni_syscall) | ||
| 385 | SYSCALL(ni_syscall) | ||
| 386 | SYSCALL(mlock2) | ||
| 387 | SYSCALL(copy_file_range) | ||
| 388 | COMPAT_SYS_SPU(preadv2) | ||
| 389 | COMPAT_SYS_SPU(pwritev2) | ||
| 390 | SYSCALL(kexec_file_load) | ||
| 391 | SYSCALL(statx) | ||
| 392 | SYSCALL(pkey_alloc) | ||
| 393 | SYSCALL(pkey_free) | ||
| 394 | SYSCALL(pkey_mprotect) | ||
| 395 | SYSCALL(rseq) | ||
| 396 | COMPAT_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, | |||
| 40 | static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, | 40 | static 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 | ||
