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