]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - arch/s390/include/asm/page.h
s390/mm: introduce defines to reflect the hardware mmu
[mirror_ubuntu-bionic-kernel.git] / arch / s390 / include / asm / page.h
CommitLineData
1da177e4 1/*
1da177e4 2 * S390 version
a53c8fab 3 * Copyright IBM Corp. 1999, 2000
1da177e4
LT
4 * Author(s): Hartmut Penner (hp@de.ibm.com)
5 */
6
7#ifndef _S390_PAGE_H
8#define _S390_PAGE_H
9
52480ee5 10#include <linux/const.h>
1da177e4
LT
11#include <asm/types.h>
12
c67da7c7
HC
13#define _PAGE_SHIFT 12
14#define _PAGE_SIZE (_AC(1, UL) << _PAGE_SHIFT)
15#define _PAGE_MASK (~(_PAGE_SIZE - 1))
16
1da177e4 17/* PAGE_SHIFT determines the page size */
c67da7c7
HC
18#define PAGE_SHIFT _PAGE_SHIFT
19#define PAGE_SIZE _PAGE_SIZE
20#define PAGE_MASK _PAGE_MASK
0b642ede
PO
21#define PAGE_DEFAULT_ACC 0
22#define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4)
1da177e4 23
41318bfe 24#define HPAGE_SHIFT 20
53492b1d
GS
25#define HPAGE_SIZE (1UL << HPAGE_SHIFT)
26#define HPAGE_MASK (~(HPAGE_SIZE - 1))
27#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
d08de8e2 28#define HUGE_MAX_HSTATE 2
53492b1d
GS
29
30#define ARCH_HAS_SETCLEAR_HUGE_PTE
31#define ARCH_HAS_HUGE_PTE_TYPE
32#define ARCH_HAS_PREPARE_HUGEPAGE
33#define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH
34
41318bfe
DD
35#include <asm/setup.h>
36#ifndef __ASSEMBLY__
37
de3fa841
HC
38void __storage_key_init_range(unsigned long start, unsigned long end);
39
127c1fef
MS
40static inline void storage_key_init_range(unsigned long start, unsigned long end)
41{
de3fa841
HC
42 if (PAGE_DEFAULT_KEY)
43 __storage_key_init_range(start, end);
127c1fef 44}
6b70a920 45
fb3d1c08 46#define clear_page(page) memset((page), 0, PAGE_SIZE)
1da177e4 47
dba6bb60
HC
48/*
49 * copy_page uses the mvcl instruction with 0xb0 padding byte in order to
50 * bypass caches when copying a page. Especially when copying huge pages
51 * this keeps L1 and L2 data caches alive.
52 */
1da177e4
LT
53static inline void copy_page(void *to, void *from)
54{
dba6bb60
HC
55 register void *reg2 asm ("2") = to;
56 register unsigned long reg3 asm ("3") = 0x1000;
57 register void *reg4 asm ("4") = from;
58 register unsigned long reg5 asm ("5") = 0xb0001000;
59 asm volatile(
60 " mvcl 2,4"
61 : "+d" (reg2), "+d" (reg3), "+d" (reg4), "+d" (reg5)
62 : : "memory", "cc");
1da177e4
LT
63}
64
1da177e4
LT
65#define clear_user_page(page, vaddr, pg) clear_page(page)
66#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
67
769848c0
MG
68#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
69 alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
1da177e4
LT
70#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
71
1da177e4
LT
72/*
73 * These are used to make use of C type-checking..
74 */
75
76typedef struct { unsigned long pgprot; } pgprot_t;
b2fa47e6 77typedef struct { unsigned long pgste; } pgste_t;
1da177e4 78typedef struct { unsigned long pte; } pte_t;
1da177e4 79typedef struct { unsigned long pmd; } pmd_t;
190a1d72 80typedef struct { unsigned long pud; } pud_t;
1aea9b3f 81typedef struct { unsigned long p4d; } p4d_t;
1da177e4 82typedef struct { unsigned long pgd; } pgd_t;
146e4b3c 83typedef pte_t *pgtable_t;
1da177e4 84
146e4b3c 85#define pgprot_val(x) ((x).pgprot)
b2fa47e6 86#define pgste_val(x) ((x).pgste)
146e4b3c
MS
87#define pte_val(x) ((x).pte)
88#define pmd_val(x) ((x).pmd)
190a1d72 89#define pud_val(x) ((x).pud)
1aea9b3f 90#define p4d_val(x) ((x).p4d)
1da177e4
LT
91#define pgd_val(x) ((x).pgd)
92
b2fa47e6 93#define __pgste(x) ((pgste_t) { (x) } )
1da177e4
LT
94#define __pte(x) ((pte_t) { (x) } )
95#define __pmd(x) ((pmd_t) { (x) } )
b2fa47e6 96#define __pud(x) ((pud_t) { (x) } )
1aea9b3f 97#define __p4d(x) ((p4d_t) { (x) } )
1da177e4
LT
98#define __pgd(x) ((pgd_t) { (x) } )
99#define __pgprot(x) ((pgprot_t) { (x) } )
100
2d42552d
MS
101static inline void page_set_storage_key(unsigned long addr,
102 unsigned char skey, int mapped)
1da177e4 103{
e2b8d7af
MS
104 if (!mapped)
105 asm volatile(".insn rrf,0xb22b0000,%0,%1,8,0"
106 : : "d" (skey), "a" (addr));
107 else
108 asm volatile("sske %0,%1" : : "d" (skey), "a" (addr));
1da177e4
LT
109}
110
2d42552d 111static inline unsigned char page_get_storage_key(unsigned long addr)
1da177e4 112{
2d42552d 113 unsigned char skey;
1da177e4 114
2d42552d 115 asm volatile("iske %0,%1" : "=d" (skey) : "a" (addr));
1da177e4
LT
116 return skey;
117}
118
2d42552d
MS
119static inline int page_reset_referenced(unsigned long addr)
120{
a7e19ab5 121 int cc;
2d42552d
MS
122
123 asm volatile(
124 " rrbe 0,%1\n"
125 " ipm %0\n"
a7e19ab5
DH
126 " srl %0,28\n"
127 : "=d" (cc) : "a" (addr) : "cc");
128 return cc;
2d42552d
MS
129}
130
131/* Bits int the storage key */
132#define _PAGE_CHANGED 0x02 /* HW changed bit */
133#define _PAGE_REFERENCED 0x04 /* HW referenced bit */
134#define _PAGE_FP_BIT 0x08 /* HW fetch protection bit */
135#define _PAGE_ACC_BITS 0xf0 /* HW access control bits */
136
45e576b1
MS
137struct page;
138void arch_free_page(struct page *page, int order);
139void arch_alloc_page(struct page *page, int order);
c9b5ad54
MS
140void arch_set_page_dat(struct page *page, int order);
141void arch_set_page_nodat(struct page *page, int order);
142int arch_test_page_nodat(struct page *page);
638ad34a 143void arch_set_page_states(int make_stable);
45e576b1 144
ec6743bb
HB
145static inline int devmem_is_allowed(unsigned long pfn)
146{
147 return 0;
148}
149
45e576b1
MS
150#define HAVE_ARCH_FREE_PAGE
151#define HAVE_ARCH_ALLOC_PAGE
152
1da177e4
LT
153#endif /* !__ASSEMBLY__ */
154
1da177e4
LT
155#define __PAGE_OFFSET 0x0UL
156#define PAGE_OFFSET 0x0UL
157#define __pa(x) (unsigned long)(x)
158#define __va(x) (void *)(unsigned long)(x)
1da177e4 159#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
0b2b6e1d 160#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
1da177e4 161#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
3d84683b
DH
162#define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
163#define page_to_virt(page) pfn_to_virt(page_to_pfn(page))
1da177e4 164
146e4b3c 165#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | \
1da177e4
LT
166 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
167
aed63043 168#include <asm-generic/memory_model.h>
5b17e1cd 169#include <asm-generic/getorder.h>
fd4fd5aa 170
1da177e4 171#endif /* _S390_PAGE_H */