|
8 | 8 |
|
9 | 9 | #include <linux/bits.h> |
10 | 10 | #include <linux/const.h> |
| 11 | +#include <asm/errata_list.h> |
11 | 12 |
|
12 | 13 | extern bool pgtable_l4_enabled; |
13 | 14 | extern bool pgtable_l5_enabled; |
@@ -73,6 +74,52 @@ typedef struct { |
73 | 74 | */ |
74 | 75 | #define _PAGE_PFN_MASK GENMASK(53, 10) |
75 | 76 |
|
| 77 | +/* |
| 78 | + * [62:61] Svpbmt Memory Type definitions: |
| 79 | + * |
| 80 | + * 00 - PMA Normal Cacheable, No change to implied PMA memory type |
| 81 | + * 01 - NC Non-cacheable, idempotent, weakly-ordered Main Memory |
| 82 | + * 10 - IO Non-cacheable, non-idempotent, strongly-ordered I/O memory |
| 83 | + * 11 - Rsvd Reserved for future standard use |
| 84 | + */ |
| 85 | +#define _PAGE_NOCACHE_SVPBMT (1UL << 61) |
| 86 | +#define _PAGE_IO_SVPBMT (1UL << 62) |
| 87 | +#define _PAGE_MTMASK_SVPBMT (_PAGE_NOCACHE_SVPBMT | _PAGE_IO_SVPBMT) |
| 88 | + |
| 89 | +static inline u64 riscv_page_mtmask(void) |
| 90 | +{ |
| 91 | + u64 val; |
| 92 | + |
| 93 | + ALT_SVPBMT(val, _PAGE_MTMASK); |
| 94 | + return val; |
| 95 | +} |
| 96 | + |
| 97 | +static inline u64 riscv_page_nocache(void) |
| 98 | +{ |
| 99 | + u64 val; |
| 100 | + |
| 101 | + ALT_SVPBMT(val, _PAGE_NOCACHE); |
| 102 | + return val; |
| 103 | +} |
| 104 | + |
| 105 | +static inline u64 riscv_page_io(void) |
| 106 | +{ |
| 107 | + u64 val; |
| 108 | + |
| 109 | + ALT_SVPBMT(val, _PAGE_IO); |
| 110 | + return val; |
| 111 | +} |
| 112 | + |
| 113 | +#define _PAGE_NOCACHE riscv_page_nocache() |
| 114 | +#define _PAGE_IO riscv_page_io() |
| 115 | +#define _PAGE_MTMASK riscv_page_mtmask() |
| 116 | + |
| 117 | +/* Set of bits to preserve across pte_modify() */ |
| 118 | +#define _PAGE_CHG_MASK (~(unsigned long)(_PAGE_PRESENT | _PAGE_READ | \ |
| 119 | + _PAGE_WRITE | _PAGE_EXEC | \ |
| 120 | + _PAGE_USER | _PAGE_GLOBAL | \ |
| 121 | + _PAGE_MTMASK)) |
| 122 | + |
76 | 123 | static inline int pud_present(pud_t pud) |
77 | 124 | { |
78 | 125 | return (pud_val(pud) & _PAGE_PRESENT); |
|
0 commit comments