[PATCH v6] lib:utils:irqchip: Check before initializing imsic.

Anup Patel anup at brainfault.org
Wed May 15 22:43:59 PDT 2024


On Wed, May 15, 2024 at 11:46 AM Cheng Yang <yangcheng.work at foxmail.com> wrote:
>
> 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 at foxmail.com>
> Changes V5 -> V6:
>   - Use csr_read_allowed instead of bitmap to simplify checking if hart supports Imsic, suggestion from Anup.
> Changes V4 -> V5:
>   - Fixed the issue where patch cannot be applied due to the editor automatically removing trailing spaces.
> Changes V3 -> V4:
>   - Rebase to the latest master branch.
> Changes V2 -> V3:
>   - Trailing whitespace.
>   - Replace platform.hart_index2id to generic_hart_index2id.
> Changes V1 -> V2:
>   - Add the processing of plat->hart_index2id be NULL in fdt_check_imsic_mlevel.
> ---
>  lib/utils/irqchip/imsic.c | 7 +++++++

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

>  1 file changed, 7 insertions(+)
>
> diff --git a/lib/utils/irqchip/imsic.c b/lib/utils/irqchip/imsic.c
> index f2a35c6..fad1beb 100644
> --- a/lib/utils/irqchip/imsic.c
> +++ b/lib/utils/irqchip/imsic.c
> @@ -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,7 @@ 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 +233,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);
>
> --
> 2.34.1
>



More information about the opensbi mailing list