lib: utils/irqchip: Check before initializing imsic

The current mlevel imsic check is only for the platform, which
may cause hart without imsic in the platform to trigger an
illegal instruction exception when initializing imsic. For
example, the platform contains a management hart that only
supports wired interrupts.

This patch will check if each hart supports Smaia extension
before doing imsic initialization to avoid triggering illegal
instruction exceptions.

Signed-off-by: Cheng Yang <yangcheng.work@foxmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Cheng Yang 2024-05-15 14:15:14 +08:00 committed by Anup Patel
parent 2bed4c1c57
commit e3a30a2c91
1 changed files with 8 additions and 0 deletions

View File

@ -12,6 +12,7 @@
#include <sbi/riscv_io.h>
#include <sbi/riscv_encoding.h>
#include <sbi/sbi_console.h>
#include <sbi/sbi_csr_detect.h>
#include <sbi/sbi_domain.h>
#include <sbi/sbi_ipi.h>
#include <sbi/sbi_irqchip.h>
@ -222,6 +223,8 @@ static void imsic_local_eix_update(unsigned long base_id,
void imsic_local_irqchip_init(void)
{
struct sbi_trap_info trap = { 0 };
/*
* This function is expected to be called from:
* 1) nascent_init() platform callback which is called
@ -231,6 +234,11 @@ void imsic_local_irqchip_init(void)
* in boot-up path.
*/
/* If Smaia not available then do nothing */
csr_read_allowed(CSR_MTOPI, (ulong)&trap);
if (trap.cause)
return;
/* Setup threshold to allow all enabled interrupts */
imsic_csr_write(IMSIC_EITHRESHOLD, IMSIC_ENABLE_EITHRESHOLD);