1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
5 #ifndef _ASM_PGTABLE_BITS_H
6 #define _ASM_PGTABLE_BITS_H
9 #define _PAGE_VALID_SHIFT 0
10 #define _PAGE_ACCESSED_SHIFT 0 /* Reuse Valid for Accessed */
11 #define _PAGE_DIRTY_SHIFT 1
12 #define _PAGE_PLV_SHIFT 2 /* 2~3, two bits */
13 #define _CACHE_SHIFT 4 /* 4~5, two bits */
14 #define _PAGE_GLOBAL_SHIFT 6
15 #define _PAGE_HUGE_SHIFT 6 /* HUGE is a PMD bit */
16 #define _PAGE_PRESENT_SHIFT 7
17 #define _PAGE_WRITE_SHIFT 8
18 #define _PAGE_MODIFIED_SHIFT 9
19 #define _PAGE_PROTNONE_SHIFT 10
20 #define _PAGE_SPECIAL_SHIFT 11
21 #define _PAGE_HGLOBAL_SHIFT 12 /* HGlobal is a PMD bit */
22 #define _PAGE_PFN_SHIFT 12
23 #define _PAGE_PFN_END_SHIFT 48
24 #define _PAGE_NO_READ_SHIFT 61
25 #define _PAGE_NO_EXEC_SHIFT 62
26 #define _PAGE_RPLV_SHIFT 63
28 /* Used by software */
29 #define _PAGE_PRESENT (_ULCAST_(1) << _PAGE_PRESENT_SHIFT)
30 #define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT)
31 #define _PAGE_ACCESSED (_ULCAST_(1) << _PAGE_ACCESSED_SHIFT)
32 #define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT)
33 #define _PAGE_PROTNONE (_ULCAST_(1) << _PAGE_PROTNONE_SHIFT)
34 #define _PAGE_SPECIAL (_ULCAST_(1) << _PAGE_SPECIAL_SHIFT)
36 /* Used by TLB hardware (placed in EntryLo*) */
37 #define _PAGE_VALID (_ULCAST_(1) << _PAGE_VALID_SHIFT)
38 #define _PAGE_DIRTY (_ULCAST_(1) << _PAGE_DIRTY_SHIFT)
39 #define _PAGE_PLV (_ULCAST_(3) << _PAGE_PLV_SHIFT)
40 #define _PAGE_GLOBAL (_ULCAST_(1) << _PAGE_GLOBAL_SHIFT)
41 #define _PAGE_HUGE (_ULCAST_(1) << _PAGE_HUGE_SHIFT)
42 #define _PAGE_HGLOBAL (_ULCAST_(1) << _PAGE_HGLOBAL_SHIFT)
43 #define _PAGE_NO_READ (_ULCAST_(1) << _PAGE_NO_READ_SHIFT)
44 #define _PAGE_NO_EXEC (_ULCAST_(1) << _PAGE_NO_EXEC_SHIFT)
45 #define _PAGE_RPLV (_ULCAST_(1) << _PAGE_RPLV_SHIFT)
46 #define _CACHE_MASK (_ULCAST_(3) << _CACHE_SHIFT)
47 #define _PFN_SHIFT (PAGE_SHIFT - 12 + _PAGE_PFN_SHIFT)
49 #define _PAGE_USER (PLV_USER << _PAGE_PLV_SHIFT)
50 #define _PAGE_KERN (PLV_KERN << _PAGE_PLV_SHIFT)
52 #define _PFN_MASK (~((_ULCAST_(1) << (_PFN_SHIFT)) - 1) & \
53 ((_ULCAST_(1) << (_PAGE_PFN_END_SHIFT)) - 1))
59 #define _CACHE_SUC (0<<_CACHE_SHIFT) /* Strong-ordered UnCached */
62 #define _CACHE_CC (1<<_CACHE_SHIFT) /* Coherent Cached */
65 #define _CACHE_WUC (2<<_CACHE_SHIFT) /* Weak-ordered UnCached */
68 #define __READABLE (_PAGE_VALID)
69 #define __WRITEABLE (_PAGE_DIRTY | _PAGE_WRITE)
71 #define _PAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV)
72 #define _HPAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV | _PAGE_HUGE)
74 #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_NO_READ | \
75 _PAGE_USER | _CACHE_CC)
76 #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
77 _PAGE_USER | _CACHE_CC)
78 #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _CACHE_CC)
80 #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
81 _PAGE_GLOBAL | _PAGE_KERN | _CACHE_CC)
82 #define PAGE_KERNEL_SUC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
83 _PAGE_GLOBAL | _PAGE_KERN | _CACHE_SUC)
84 #define PAGE_KERNEL_WUC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
85 _PAGE_GLOBAL | _PAGE_KERN | _CACHE_WUC)
87 #define __P000 __pgprot(_CACHE_CC | _PAGE_USER | _PAGE_PROTNONE | _PAGE_NO_EXEC | _PAGE_NO_READ)
88 #define __P001 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_NO_EXEC)
89 #define __P010 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_NO_EXEC)
90 #define __P011 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_NO_EXEC)
91 #define __P100 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT)
92 #define __P101 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT)
93 #define __P110 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT)
94 #define __P111 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT)
96 #define __S000 __pgprot(_CACHE_CC | _PAGE_USER | _PAGE_PROTNONE | _PAGE_NO_EXEC | _PAGE_NO_READ)
97 #define __S001 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_NO_EXEC)
98 #define __S010 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE)
99 #define __S011 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE)
100 #define __S100 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT)
101 #define __S101 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT)
102 #define __S110 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_WRITE)
103 #define __S111 __pgprot(_CACHE_CC | _PAGE_VALID | _PAGE_USER | _PAGE_PRESENT | _PAGE_WRITE)
107 #define pgprot_noncached pgprot_noncached
109 static inline pgprot_t pgprot_noncached(pgprot_t _prot)
111 unsigned long prot = pgprot_val(_prot);
113 prot = (prot & ~_CACHE_MASK) | _CACHE_SUC;
115 return __pgprot(prot);
118 #define pgprot_writecombine pgprot_writecombine
120 static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
122 unsigned long prot = pgprot_val(_prot);
124 prot = (prot & ~_CACHE_MASK) | _CACHE_WUC;
126 return __pgprot(prot);
129 #endif /* !__ASSEMBLY__ */
131 #endif /* _ASM_PGTABLE_BITS_H */