|
14 | 14 | #define ERRATA_SIFIVE_NUMBER 2 |
15 | 15 | #endif |
16 | 16 |
|
| 17 | +#ifdef CONFIG_ERRATA_THEAD |
| 18 | +#define ERRATA_THEAD_PBMT 0 |
| 19 | +#define ERRATA_THEAD_NUMBER 1 |
| 20 | +#endif |
| 21 | + |
17 | 22 | #define CPUFEATURE_SVPBMT 0 |
18 | 23 | #define CPUFEATURE_NUMBER 1 |
19 | 24 |
|
@@ -42,12 +47,51 @@ asm(ALTERNATIVE("sfence.vma %0", "sfence.vma", SIFIVE_VENDOR_ID, \ |
42 | 47 | * in the default case. |
43 | 48 | */ |
44 | 49 | #define ALT_SVPBMT_SHIFT 61 |
| 50 | +#define ALT_THEAD_PBMT_SHIFT 59 |
45 | 51 | #define ALT_SVPBMT(_val, prot) \ |
46 | | -asm(ALTERNATIVE("li %0, 0\t\nnop", "li %0, %1\t\nslli %0,%0,%2", 0, \ |
47 | | - CPUFEATURE_SVPBMT, CONFIG_RISCV_ISA_SVPBMT) \ |
| 52 | +asm(ALTERNATIVE_2("li %0, 0\t\nnop", \ |
| 53 | + "li %0, %1\t\nslli %0,%0,%3", 0, \ |
| 54 | + CPUFEATURE_SVPBMT, CONFIG_RISCV_ISA_SVPBMT, \ |
| 55 | + "li %0, %2\t\nslli %0,%0,%4", THEAD_VENDOR_ID, \ |
| 56 | + ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \ |
48 | 57 | : "=r"(_val) \ |
49 | 58 | : "I"(prot##_SVPBMT >> ALT_SVPBMT_SHIFT), \ |
50 | | - "I"(ALT_SVPBMT_SHIFT)) |
| 59 | + "I"(prot##_THEAD >> ALT_THEAD_PBMT_SHIFT), \ |
| 60 | + "I"(ALT_SVPBMT_SHIFT), \ |
| 61 | + "I"(ALT_THEAD_PBMT_SHIFT)) |
| 62 | + |
| 63 | +#ifdef CONFIG_ERRATA_THEAD_PBMT |
| 64 | +/* |
| 65 | + * IO/NOCACHE memory types are handled together with svpbmt, |
| 66 | + * so on T-Head chips, check if no other memory type is set, |
| 67 | + * and set the non-0 PMA type if applicable. |
| 68 | + */ |
| 69 | +#define ALT_THEAD_PMA(_val) \ |
| 70 | +asm volatile(ALTERNATIVE( \ |
| 71 | + "nop\n\t" \ |
| 72 | + "nop\n\t" \ |
| 73 | + "nop\n\t" \ |
| 74 | + "nop\n\t" \ |
| 75 | + "nop\n\t" \ |
| 76 | + "nop\n\t" \ |
| 77 | + "nop", \ |
| 78 | + "li t3, %2\n\t" \ |
| 79 | + "slli t3, t3, %4\n\t" \ |
| 80 | + "and t3, %0, t3\n\t" \ |
| 81 | + "bne t3, zero, 2f\n\t" \ |
| 82 | + "li t3, %3\n\t" \ |
| 83 | + "slli t3, t3, %4\n\t" \ |
| 84 | + "or %0, %0, t3\n\t" \ |
| 85 | + "2:", THEAD_VENDOR_ID, \ |
| 86 | + ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \ |
| 87 | + : "+r"(_val) \ |
| 88 | + : "0"(_val), \ |
| 89 | + "I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_PBMT_SHIFT), \ |
| 90 | + "I"(_PAGE_PMA_THEAD >> ALT_THEAD_PBMT_SHIFT), \ |
| 91 | + "I"(ALT_THEAD_PBMT_SHIFT)) |
| 92 | +#else |
| 93 | +#define ALT_THEAD_PMA(_val) |
| 94 | +#endif |
51 | 95 |
|
52 | 96 | #endif /* __ASSEMBLY__ */ |
53 | 97 |
|
|
0 commit comments