1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * IBM System z Huge TLB Page Support for Kernel.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright IBM Corp. 2008
6*4882a593Smuzhiyun * Author(s): Gerald Schaefer <gerald.schaefer@de.ibm.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef _ASM_S390_HUGETLB_H
10*4882a593Smuzhiyun #define _ASM_S390_HUGETLB_H
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/pgtable.h>
13*4882a593Smuzhiyun #include <asm/page.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #define hugetlb_free_pgd_range free_pgd_range
16*4882a593Smuzhiyun #define hugepages_supported() (MACHINE_HAS_EDAT1)
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
19*4882a593Smuzhiyun pte_t *ptep, pte_t pte);
20*4882a593Smuzhiyun pte_t huge_ptep_get(pte_t *ptep);
21*4882a593Smuzhiyun pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
22*4882a593Smuzhiyun unsigned long addr, pte_t *ptep);
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun /*
25*4882a593Smuzhiyun * If the arch doesn't supply something else, assume that hugepage
26*4882a593Smuzhiyun * size aligned regions are ok without further preparation.
27*4882a593Smuzhiyun */
prepare_hugepage_range(struct file * file,unsigned long addr,unsigned long len)28*4882a593Smuzhiyun static inline int prepare_hugepage_range(struct file *file,
29*4882a593Smuzhiyun unsigned long addr, unsigned long len)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun struct hstate *h = hstate_file(file);
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun if (len & ~huge_page_mask(h))
34*4882a593Smuzhiyun return -EINVAL;
35*4882a593Smuzhiyun if (addr & ~huge_page_mask(h))
36*4882a593Smuzhiyun return -EINVAL;
37*4882a593Smuzhiyun return 0;
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
arch_clear_hugepage_flags(struct page * page)40*4882a593Smuzhiyun static inline void arch_clear_hugepage_flags(struct page *page)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun clear_bit(PG_arch_1, &page->flags);
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun #define arch_clear_hugepage_flags arch_clear_hugepage_flags
45*4882a593Smuzhiyun
huge_pte_clear(struct mm_struct * mm,unsigned long addr,pte_t * ptep,unsigned long sz)46*4882a593Smuzhiyun static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
47*4882a593Smuzhiyun pte_t *ptep, unsigned long sz)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun if ((pte_val(*ptep) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
50*4882a593Smuzhiyun pte_val(*ptep) = _REGION3_ENTRY_EMPTY;
51*4882a593Smuzhiyun else
52*4882a593Smuzhiyun pte_val(*ptep) = _SEGMENT_ENTRY_EMPTY;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun
huge_ptep_clear_flush(struct vm_area_struct * vma,unsigned long address,pte_t * ptep)55*4882a593Smuzhiyun static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
56*4882a593Smuzhiyun unsigned long address, pte_t *ptep)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun huge_ptep_get_and_clear(vma->vm_mm, address, ptep);
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
huge_ptep_set_access_flags(struct vm_area_struct * vma,unsigned long addr,pte_t * ptep,pte_t pte,int dirty)61*4882a593Smuzhiyun static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
62*4882a593Smuzhiyun unsigned long addr, pte_t *ptep,
63*4882a593Smuzhiyun pte_t pte, int dirty)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun int changed = !pte_same(huge_ptep_get(ptep), pte);
66*4882a593Smuzhiyun if (changed) {
67*4882a593Smuzhiyun huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
68*4882a593Smuzhiyun set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun return changed;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
huge_ptep_set_wrprotect(struct mm_struct * mm,unsigned long addr,pte_t * ptep)73*4882a593Smuzhiyun static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
74*4882a593Smuzhiyun unsigned long addr, pte_t *ptep)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun pte_t pte = huge_ptep_get_and_clear(mm, addr, ptep);
77*4882a593Smuzhiyun set_huge_pte_at(mm, addr, ptep, pte_wrprotect(pte));
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
mk_huge_pte(struct page * page,pgprot_t pgprot)80*4882a593Smuzhiyun static inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun return mk_pte(page, pgprot);
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun
huge_pte_none(pte_t pte)85*4882a593Smuzhiyun static inline int huge_pte_none(pte_t pte)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun return pte_none(pte);
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
huge_pte_write(pte_t pte)90*4882a593Smuzhiyun static inline int huge_pte_write(pte_t pte)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun return pte_write(pte);
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
huge_pte_dirty(pte_t pte)95*4882a593Smuzhiyun static inline int huge_pte_dirty(pte_t pte)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun return pte_dirty(pte);
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
huge_pte_mkwrite(pte_t pte)100*4882a593Smuzhiyun static inline pte_t huge_pte_mkwrite(pte_t pte)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun return pte_mkwrite(pte);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
huge_pte_mkdirty(pte_t pte)105*4882a593Smuzhiyun static inline pte_t huge_pte_mkdirty(pte_t pte)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun return pte_mkdirty(pte);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
huge_pte_wrprotect(pte_t pte)110*4882a593Smuzhiyun static inline pte_t huge_pte_wrprotect(pte_t pte)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun return pte_wrprotect(pte);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
huge_pte_modify(pte_t pte,pgprot_t newprot)115*4882a593Smuzhiyun static inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun return pte_modify(pte, newprot);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
gigantic_page_runtime_supported(void)120*4882a593Smuzhiyun static inline bool gigantic_page_runtime_supported(void)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun return true;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun #endif /* _ASM_S390_HUGETLB_H */
126