Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/mm: split asm/hugetlb.h into dedicated subarch files

Three subarches support hugepages:
- fsl book3e
- book3s/64
- 8xx

This patch splits asm/hugetlb.h to reduce the #ifdef mess.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Christophe Leroy and committed by
Michael Ellerman
8197af22 0001e5aa

+106 -83
+40
arch/powerpc/include/asm/book3s/64/hugetlb.h
··· 62 62 extern void huge_ptep_modify_prot_commit(struct vm_area_struct *vma, 63 63 unsigned long addr, pte_t *ptep, 64 64 pte_t old_pte, pte_t new_pte); 65 + /* 66 + * This should work for other subarchs too. But right now we use the 67 + * new format only for 64bit book3s 68 + */ 69 + static inline pte_t *hugepd_page(hugepd_t hpd) 70 + { 71 + BUG_ON(!hugepd_ok(hpd)); 72 + /* 73 + * We have only four bits to encode, MMU page size 74 + */ 75 + BUILD_BUG_ON((MMU_PAGE_COUNT - 1) > 0xf); 76 + return __va(hpd_val(hpd) & HUGEPD_ADDR_MASK); 77 + } 78 + 79 + static inline unsigned int hugepd_mmu_psize(hugepd_t hpd) 80 + { 81 + return (hpd_val(hpd) & HUGEPD_SHIFT_MASK) >> 2; 82 + } 83 + 84 + static inline unsigned int hugepd_shift(hugepd_t hpd) 85 + { 86 + return mmu_psize_to_shift(hugepd_mmu_psize(hpd)); 87 + } 88 + static inline void flush_hugetlb_page(struct vm_area_struct *vma, 89 + unsigned long vmaddr) 90 + { 91 + if (radix_enabled()) 92 + return radix__flush_hugetlb_page(vma, vmaddr); 93 + } 94 + 95 + static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr, 96 + unsigned int pdshift) 97 + { 98 + unsigned long idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd); 99 + 100 + return hugepd_page(hpd) + idx; 101 + } 102 + 103 + void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr); 104 + 65 105 #endif
+4 -83
arch/powerpc/include/asm/hugetlb.h
··· 6 6 #include <asm/page.h> 7 7 8 8 #ifdef CONFIG_PPC_BOOK3S_64 9 - 10 9 #include <asm/book3s/64/hugetlb.h> 11 - /* 12 - * This should work for other subarchs too. But right now we use the 13 - * new format only for 64bit book3s 14 - */ 15 - static inline pte_t *hugepd_page(hugepd_t hpd) 16 - { 17 - BUG_ON(!hugepd_ok(hpd)); 18 - /* 19 - * We have only four bits to encode, MMU page size 20 - */ 21 - BUILD_BUG_ON((MMU_PAGE_COUNT - 1) > 0xf); 22 - return __va(hpd_val(hpd) & HUGEPD_ADDR_MASK); 23 - } 24 - 25 - static inline unsigned int hugepd_mmu_psize(hugepd_t hpd) 26 - { 27 - return (hpd_val(hpd) & HUGEPD_SHIFT_MASK) >> 2; 28 - } 29 - 30 - static inline unsigned int hugepd_shift(hugepd_t hpd) 31 - { 32 - return mmu_psize_to_shift(hugepd_mmu_psize(hpd)); 33 - } 34 - static inline void flush_hugetlb_page(struct vm_area_struct *vma, 35 - unsigned long vmaddr) 36 - { 37 - if (radix_enabled()) 38 - return radix__flush_hugetlb_page(vma, vmaddr); 39 - } 40 - 41 - #else 42 - 43 - static inline pte_t *hugepd_page(hugepd_t hpd) 44 - { 45 - BUG_ON(!hugepd_ok(hpd)); 46 - #ifdef CONFIG_PPC_8xx 47 - return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK); 48 - #else 49 - return (pte_t *)((hpd_val(hpd) & 50 - ~HUGEPD_SHIFT_MASK) | PD_HUGE); 51 - #endif 52 - } 53 - 54 - static inline unsigned int hugepd_shift(hugepd_t hpd) 55 - { 56 - #ifdef CONFIG_PPC_8xx 57 - return ((hpd_val(hpd) & _PMD_PAGE_MASK) >> 1) + 17; 58 - #else 59 - return hpd_val(hpd) & HUGEPD_SHIFT_MASK; 60 - #endif 61 - } 62 - 10 + #elif defined(CONFIG_PPC_FSL_BOOK3E) 11 + #include <asm/nohash/hugetlb-book3e.h> 12 + #elif defined(CONFIG_PPC_8xx) 13 + #include <asm/nohash/32/hugetlb-8xx.h> 63 14 #endif /* CONFIG_PPC_BOOK3S_64 */ 64 - 65 - 66 - static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr, 67 - unsigned pdshift) 68 - { 69 - /* 70 - * On FSL BookE, we have multiple higher-level table entries that 71 - * point to the same hugepte. Just use the first one since they're all 72 - * identical. So for that case, idx=0. 73 - */ 74 - unsigned long idx = 0; 75 - 76 - pte_t *dir = hugepd_page(hpd); 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); 81 - #endif 82 - 83 - return dir + idx; 84 - } 85 15 86 16 void flush_dcache_icache_hugepage(struct page *page); 87 17 ··· 29 99 30 100 void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea, 31 101 pte_t pte); 32 - #ifdef CONFIG_PPC_8xx 33 - static inline void flush_hugetlb_page(struct vm_area_struct *vma, 34 - unsigned long vmaddr) 35 - { 36 - flush_tlb_page(vma, vmaddr); 37 - } 38 - #else 39 - void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr); 40 - #endif 41 102 42 103 #define __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE 43 104 void hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
+31
arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #ifndef _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H 3 + #define _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H 4 + 5 + static inline pte_t *hugepd_page(hugepd_t hpd) 6 + { 7 + BUG_ON(!hugepd_ok(hpd)); 8 + 9 + return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK); 10 + } 11 + 12 + static inline unsigned int hugepd_shift(hugepd_t hpd) 13 + { 14 + return ((hpd_val(hpd) & _PMD_PAGE_MASK) >> 1) + 17; 15 + } 16 + 17 + static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr, 18 + unsigned int pdshift) 19 + { 20 + unsigned long idx = (addr & ((1UL << pdshift) - 1)) >> PAGE_SHIFT; 21 + 22 + return hugepd_page(hpd) + idx; 23 + } 24 + 25 + static inline void flush_hugetlb_page(struct vm_area_struct *vma, 26 + unsigned long vmaddr) 27 + { 28 + flush_tlb_page(vma, vmaddr); 29 + } 30 + 31 + #endif /* _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H */
+31
arch/powerpc/include/asm/nohash/hugetlb-book3e.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #ifndef _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H 3 + #define _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H 4 + 5 + static inline pte_t *hugepd_page(hugepd_t hpd) 6 + { 7 + if (WARN_ON(!hugepd_ok(hpd))) 8 + return NULL; 9 + 10 + return (pte_t *)((hpd_val(hpd) & ~HUGEPD_SHIFT_MASK) | PD_HUGE); 11 + } 12 + 13 + static inline unsigned int hugepd_shift(hugepd_t hpd) 14 + { 15 + return hpd_val(hpd) & HUGEPD_SHIFT_MASK; 16 + } 17 + 18 + static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr, 19 + unsigned int pdshift) 20 + { 21 + /* 22 + * On FSL BookE, we have multiple higher-level table entries that 23 + * point to the same hugepte. Just use the first one since they're all 24 + * identical. So for that case, idx=0. 25 + */ 26 + return hugepd_page(hpd); 27 + } 28 + 29 + void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr); 30 + 31 + #endif /* _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H */