1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * arch/sh/mm/hugetlbpage.c 4 * 5 * SuperH HugeTLB page support. 6 * 7 * Cloned from sparc64 by Paul Mundt. 8 * 9 * Copyright (C) 2002, 2003 David S. Miller (davem@redhat.com) 10 */ 11 12 #include <linux/init.h> 13 #include <linux/fs.h> 14 #include <linux/mm.h> 15 #include <linux/hugetlb.h> 16 #include <linux/pagemap.h> 17 #include <linux/sysctl.h> 18 19 #include <asm/mman.h> 20 #include <asm/tlb.h> 21 #include <asm/tlbflush.h> 22 #include <asm/cacheflush.h> 23 24 pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, 25 unsigned long addr, unsigned long sz) 26 { 27 pgd_t *pgd; 28 p4d_t *p4d; 29 pud_t *pud; 30 pmd_t *pmd; 31 pte_t *pte = NULL; 32 33 pgd = pgd_offset(mm, addr); 34 if (pgd) { 35 p4d = p4d_alloc(mm, pgd, addr); 36 if (p4d) { 37 pud = pud_alloc(mm, p4d, addr); 38 if (pud) { 39 pmd = pmd_alloc(mm, pud, addr); 40 if (pmd) 41 pte = pte_alloc_huge(mm, pmd, addr); 42 } 43 } 44 } 45 46 return pte; 47 } 48 49 pte_t *huge_pte_offset(struct mm_struct *mm, 50 unsigned long addr, unsigned long sz) 51 { 52 pgd_t *pgd; 53 p4d_t *p4d; 54 pud_t *pud; 55 pmd_t *pmd; 56 pte_t *pte = NULL; 57 58 pgd = pgd_offset(mm, addr); 59 if (pgd) { 60 p4d = p4d_offset(pgd, addr); 61 if (p4d) { 62 pud = pud_offset(p4d, addr); 63 if (pud) { 64 pmd = pmd_offset(pud, addr); 65 if (pmd) 66 pte = pte_offset_huge(pmd, addr); 67 } 68 } 69 } 70 71 return pte; 72 } 73