|
16 | 16 |
|
17 | 17 | #ifdef CONFIG_ERRATA_THEAD
|
18 | 18 | #define ERRATA_THEAD_PBMT 0
|
19 |
| -#define ERRATA_THEAD_NUMBER 1 |
| 19 | +#define ERRATA_THEAD_CMO 1 |
| 20 | +#define ERRATA_THEAD_NUMBER 2 |
20 | 21 | #endif
|
21 | 22 |
|
22 | 23 | #define CPUFEATURE_SVPBMT 0
|
@@ -94,17 +95,54 @@ asm volatile(ALTERNATIVE( \
|
94 | 95 | #define ALT_THEAD_PMA(_val)
|
95 | 96 | #endif
|
96 | 97 |
|
| 98 | +/* |
| 99 | + * dcache.ipa rs1 (invalidate, physical address) |
| 100 | + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | |
| 101 | + * 0000001 01010 rs1 000 00000 0001011 |
| 102 | + * dache.iva rs1 (invalida, virtual address) |
| 103 | + * 0000001 00110 rs1 000 00000 0001011 |
| 104 | + * |
| 105 | + * dcache.cpa rs1 (clean, physical address) |
| 106 | + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | |
| 107 | + * 0000001 01001 rs1 000 00000 0001011 |
| 108 | + * dcache.cva rs1 (clean, virtual address) |
| 109 | + * 0000001 00100 rs1 000 00000 0001011 |
| 110 | + * |
| 111 | + * dcache.cipa rs1 (clean then invalidate, physical address) |
| 112 | + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | |
| 113 | + * 0000001 01011 rs1 000 00000 0001011 |
| 114 | + * dcache.civa rs1 (... virtual address) |
| 115 | + * 0000001 00111 rs1 000 00000 0001011 |
| 116 | + * |
| 117 | + * sync.s (make sure all cache operations finished) |
| 118 | + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | |
| 119 | + * 0000000 11001 00000 000 00000 0001011 |
| 120 | + */ |
| 121 | +#define THEAD_inval_A0 ".long 0x0265000b" |
| 122 | +#define THEAD_clean_A0 ".long 0x0245000b" |
| 123 | +#define THEAD_flush_A0 ".long 0x0275000b" |
| 124 | +#define THEAD_SYNC_S ".long 0x0190000b" |
| 125 | + |
97 | 126 | #define ALT_CMO_OP(_op, _start, _size, _cachesize) \
|
98 |
| -asm volatile(ALTERNATIVE( \ |
99 |
| - __nops(5), \ |
| 127 | +asm volatile(ALTERNATIVE_2( \ |
| 128 | + __nops(6), \ |
100 | 129 | "mv a0, %1\n\t" \
|
101 | 130 | "j 2f\n\t" \
|
102 | 131 | "3:\n\t" \
|
103 | 132 | "cbo." __stringify(_op) " (a0)\n\t" \
|
104 | 133 | "add a0, a0, %0\n\t" \
|
105 | 134 | "2:\n\t" \
|
106 |
| - "bltu a0, %2, 3b\n\t", 0, \ |
107 |
| - CPUFEATURE_ZICBOM, CONFIG_RISCV_ISA_ZICBOM) \ |
| 135 | + "bltu a0, %2, 3b\n\t" \ |
| 136 | + "nop", 0, CPUFEATURE_ZICBOM, CONFIG_RISCV_ISA_ZICBOM, \ |
| 137 | + "mv a0, %1\n\t" \ |
| 138 | + "j 2f\n\t" \ |
| 139 | + "3:\n\t" \ |
| 140 | + THEAD_##_op##_A0 "\n\t" \ |
| 141 | + "add a0, a0, %0\n\t" \ |
| 142 | + "2:\n\t" \ |
| 143 | + "bltu a0, %2, 3b\n\t" \ |
| 144 | + THEAD_SYNC_S, THEAD_VENDOR_ID, \ |
| 145 | + ERRATA_THEAD_CMO, CONFIG_ERRATA_THEAD_CMO) \ |
108 | 146 | : : "r"(_cachesize), \
|
109 | 147 | "r"((unsigned long)(_start) & ~((_cachesize) - 1UL)), \
|
110 | 148 | "r"((unsigned long)(_start) + (_size)) \
|
|
0 commit comments