Message ID | 20240329121414.688391-3-christoph.muellner@vrull.eu (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | RISC-V: Test th.sxstatus.MAEE bit before enabling MAEE | expand |
On Fri, Mar 29, 2024 at 01:14:14PM +0100, Christoph Müllner wrote: > T-Head's MAEE mechanism (non-compatible equivalent of RVI's Svpbmt) > is currently assumed for all T-Head harts. However, QEMU recently > decided to drop acceptance of guests that write reserved bits in PTEs. > As MAEE uses reserved bits in PTEs and Linux applies the MAEE errata > for all T-Head harts, this broke the Linux startup on QEMU emulations > of the C906 emulation. > > This patch attempts to address this issue by testing the MAEE bit > in the th.sxstatus CSR. This CSR is available in HW and can be > emulated in QEMU. > > This patch also makes the MAEE probing mechanism reliable, because > a test for the right combination of mvendorid, marchid, and mimpid > is not sufficient to enable MAEE. > > Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu> Seems ideal to me, I'm guessing the QEMU guys were okay with emulating the CSR. I don't see any screaming at the very least on the patch for it. Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Thanks, Conor.
diff --git a/arch/riscv/errata/thead/errata.c b/arch/riscv/errata/thead/errata.c index 8c8a8a4b0421..dfa007039208 100644 --- a/arch/riscv/errata/thead/errata.c +++ b/arch/riscv/errata/thead/errata.c @@ -19,6 +19,9 @@ #include <asm/patch.h> #include <asm/vendorid_list.h> +#define CSR_TH_SXSTATUS 0x5c0 +#define SXSTATUS_MAEE _AC(0x200000, UL) + static bool errata_probe_maee(unsigned int stage, unsigned long arch_id, unsigned long impid) { @@ -28,11 +31,14 @@ static bool errata_probe_maee(unsigned int stage, if (arch_id != 0 || impid != 0) return false; - if (stage == RISCV_ALTERNATIVES_EARLY_BOOT || - stage == RISCV_ALTERNATIVES_MODULE) - return true; + if (stage != RISCV_ALTERNATIVES_EARLY_BOOT && + stage != RISCV_ALTERNATIVES_MODULE) + return false; - return false; + if (!(csr_read(CSR_TH_SXSTATUS) & SXSTATUS_MAEE)) + return false; + + return true; } /*
T-Head's MAEE mechanism (non-compatible equivalent of RVI's Svpbmt) is currently assumed for all T-Head harts. However, QEMU recently decided to drop acceptance of guests that write reserved bits in PTEs. As MAEE uses reserved bits in PTEs and Linux applies the MAEE errata for all T-Head harts, this broke the Linux startup on QEMU emulations of the C906 emulation. This patch attempts to address this issue by testing the MAEE bit in the th.sxstatus CSR. This CSR is available in HW and can be emulated in QEMU. This patch also makes the MAEE probing mechanism reliable, because a test for the right combination of mvendorid, marchid, and mimpid is not sufficient to enable MAEE. Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu> --- arch/riscv/errata/thead/errata.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)