Commit | Line | Data |
---|---|---|
6f4eea90 VC |
1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* | |
3 | * Copyright (C) 2021 Sifive. | |
4 | */ | |
5 | #ifndef ASM_ERRATA_LIST_H | |
6 | #define ASM_ERRATA_LIST_H | |
7 | ||
800149a7 | 8 | #include <asm/alternative.h> |
65e9fb08 | 9 | #include <asm/csr.h> |
dd23e953 | 10 | #include <asm/insn-def.h> |
4bf88607 | 11 | #include <asm/hwcap.h> |
800149a7 VC |
12 | #include <asm/vendorid_list.h> |
13 | ||
e021ae7f | 14 | #ifdef CONFIG_ERRATA_ANDES |
be5e8872 YCPL |
15 | #define ERRATA_ANDES_NO_IOCP 0 |
16 | #define ERRATA_ANDES_NUMBER 1 | |
e021ae7f LP |
17 | #endif |
18 | ||
6f4eea90 | 19 | #ifdef CONFIG_ERRATA_SIFIVE |
800149a7 | 20 | #define ERRATA_SIFIVE_CIP_453 0 |
bff3ff52 VC |
21 | #define ERRATA_SIFIVE_CIP_1200 1 |
22 | #define ERRATA_SIFIVE_NUMBER 2 | |
6f4eea90 VC |
23 | #endif |
24 | ||
a35707c3 | 25 | #ifdef CONFIG_ERRATA_THEAD |
6179d4a2 | 26 | #define ERRATA_THEAD_MAE 0 |
a4ff64ed | 27 | #define ERRATA_THEAD_PMU 1 |
4bf97069 CJ |
28 | #define ERRATA_THEAD_GHOSTWRITE 2 |
29 | #define ERRATA_THEAD_NUMBER 3 | |
a35707c3 HS |
30 | #endif |
31 | ||
800149a7 VC |
32 | #ifdef __ASSEMBLY__ |
33 | ||
34 | #define ALT_INSN_FAULT(x) \ | |
35 | ALTERNATIVE(__stringify(RISCV_PTR do_trap_insn_fault), \ | |
36 | __stringify(RISCV_PTR sifive_cip_453_insn_fault_trp), \ | |
37 | SIFIVE_VENDOR_ID, ERRATA_SIFIVE_CIP_453, \ | |
38 | CONFIG_ERRATA_SIFIVE_CIP_453) | |
39 | ||
40 | #define ALT_PAGE_FAULT(x) \ | |
41 | ALTERNATIVE(__stringify(RISCV_PTR do_page_fault), \ | |
42 | __stringify(RISCV_PTR sifive_cip_453_page_fault_trp), \ | |
43 | SIFIVE_VENDOR_ID, ERRATA_SIFIVE_CIP_453, \ | |
44 | CONFIG_ERRATA_SIFIVE_CIP_453) | |
bff3ff52 VC |
45 | #else /* !__ASSEMBLY__ */ |
46 | ||
20e03d70 SH |
47 | #define ALT_SFENCE_VMA_ASID(asid) \ |
48 | asm(ALTERNATIVE("sfence.vma x0, %0", "sfence.vma", SIFIVE_VENDOR_ID, \ | |
49 | ERRATA_SIFIVE_CIP_1200, CONFIG_ERRATA_SIFIVE_CIP_1200) \ | |
50 | : : "r" (asid) : "memory") | |
51 | ||
52 | #define ALT_SFENCE_VMA_ADDR(addr) \ | |
bff3ff52 VC |
53 | asm(ALTERNATIVE("sfence.vma %0", "sfence.vma", SIFIVE_VENDOR_ID, \ |
54 | ERRATA_SIFIVE_CIP_1200, CONFIG_ERRATA_SIFIVE_CIP_1200) \ | |
55 | : : "r" (addr) : "memory") | |
56 | ||
20e03d70 SH |
57 | #define ALT_SFENCE_VMA_ADDR_ASID(addr, asid) \ |
58 | asm(ALTERNATIVE("sfence.vma %0, %1", "sfence.vma", SIFIVE_VENDOR_ID, \ | |
59 | ERRATA_SIFIVE_CIP_1200, CONFIG_ERRATA_SIFIVE_CIP_1200) \ | |
60 | : : "r" (addr), "r" (asid) : "memory") | |
61 | ||
ff689fd2 HS |
62 | /* |
63 | * _val is marked as "will be overwritten", so need to set it to 0 | |
64 | * in the default case. | |
65 | */ | |
66 | #define ALT_SVPBMT_SHIFT 61 | |
6179d4a2 | 67 | #define ALT_THEAD_MAE_SHIFT 59 |
ff689fd2 | 68 | #define ALT_SVPBMT(_val, prot) \ |
a35707c3 HS |
69 | asm(ALTERNATIVE_2("li %0, 0\t\nnop", \ |
70 | "li %0, %1\t\nslli %0,%0,%3", 0, \ | |
4bf88607 | 71 | RISCV_ISA_EXT_SVPBMT, CONFIG_RISCV_ISA_SVPBMT, \ |
a35707c3 | 72 | "li %0, %2\t\nslli %0,%0,%4", THEAD_VENDOR_ID, \ |
6179d4a2 | 73 | ERRATA_THEAD_MAE, CONFIG_ERRATA_THEAD_MAE) \ |
ff689fd2 HS |
74 | : "=r"(_val) \ |
75 | : "I"(prot##_SVPBMT >> ALT_SVPBMT_SHIFT), \ | |
6179d4a2 | 76 | "I"(prot##_THEAD >> ALT_THEAD_MAE_SHIFT), \ |
a35707c3 | 77 | "I"(ALT_SVPBMT_SHIFT), \ |
6179d4a2 | 78 | "I"(ALT_THEAD_MAE_SHIFT)) |
a35707c3 | 79 | |
6179d4a2 | 80 | #ifdef CONFIG_ERRATA_THEAD_MAE |
a35707c3 HS |
81 | /* |
82 | * IO/NOCACHE memory types are handled together with svpbmt, | |
83 | * so on T-Head chips, check if no other memory type is set, | |
84 | * and set the non-0 PMA type if applicable. | |
85 | */ | |
86 | #define ALT_THEAD_PMA(_val) \ | |
87 | asm volatile(ALTERNATIVE( \ | |
9c2ea4a3 | 88 | __nops(7), \ |
e8303156 NC |
89 | "li t3, %1\n\t" \ |
90 | "slli t3, t3, %3\n\t" \ | |
a35707c3 HS |
91 | "and t3, %0, t3\n\t" \ |
92 | "bne t3, zero, 2f\n\t" \ | |
e8303156 NC |
93 | "li t3, %2\n\t" \ |
94 | "slli t3, t3, %3\n\t" \ | |
a35707c3 HS |
95 | "or %0, %0, t3\n\t" \ |
96 | "2:", THEAD_VENDOR_ID, \ | |
6179d4a2 | 97 | ERRATA_THEAD_MAE, CONFIG_ERRATA_THEAD_MAE) \ |
a35707c3 | 98 | : "+r"(_val) \ |
6179d4a2 CM |
99 | : "I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_MAE_SHIFT), \ |
100 | "I"(_PAGE_PMA_THEAD >> ALT_THEAD_MAE_SHIFT), \ | |
101 | "I"(ALT_THEAD_MAE_SHIFT) \ | |
e8303156 | 102 | : "t3") |
a35707c3 HS |
103 | #else |
104 | #define ALT_THEAD_PMA(_val) | |
105 | #endif | |
ff689fd2 | 106 | |
1631ba12 | 107 | #define ALT_CMO_OP(_op, _start, _size, _cachesize) \ |
a4ff64ed JZ |
108 | asm volatile(ALTERNATIVE( \ |
109 | __nops(5), \ | |
1631ba12 HS |
110 | "mv a0, %1\n\t" \ |
111 | "j 2f\n\t" \ | |
112 | "3:\n\t" \ | |
dd23e953 | 113 | CBO_##_op(a0) \ |
1631ba12 HS |
114 | "add a0, a0, %0\n\t" \ |
115 | "2:\n\t" \ | |
a4ff64ed JZ |
116 | "bltu a0, %2, 3b\n\t", \ |
117 | 0, RISCV_ISA_EXT_ZICBOM, CONFIG_RISCV_ISA_ZICBOM) \ | |
1631ba12 HS |
118 | : : "r"(_cachesize), \ |
119 | "r"((unsigned long)(_start) & ~((_cachesize) - 1UL)), \ | |
120 | "r"((unsigned long)(_start) + (_size)) \ | |
121 | : "a0") | |
122 | ||
65e9fb08 HS |
123 | #define THEAD_C9XX_RV_IRQ_PMU 17 |
124 | #define THEAD_C9XX_CSR_SCOUNTEROF 0x5c5 | |
125 | ||
800149a7 VC |
126 | #endif /* __ASSEMBLY__ */ |
127 | ||
6f4eea90 | 128 | #endif |