[PATCH v2 03/13] lib: sbi: Use AIA CSRs for local interrupts when available
Atish Patra
atishp at atishpatra.org
Wed Feb 9 08:41:21 PST 2022
On Wed, Feb 9, 2022 at 7:05 AM Anup Patel <apatel at ventanamicro.com> wrote:
>
> We should use AIA CSRs to process local interrupts whenever AIA
> is available.
>
> Signed-off-by: Anup Patel <anup.patel at wdc.com>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
> lib/sbi/sbi_trap.c | 57 +++++++++++++++++++++++++++++++++++++---------
> 1 file changed, 46 insertions(+), 11 deletions(-)
>
> diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c
> index 8d20e04..bc8961f 100644
> --- a/lib/sbi/sbi_trap.c
> +++ b/lib/sbi/sbi_trap.c
> @@ -195,6 +195,44 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
> return 0;
> }
>
> +static int sbi_trap_nonaia_irq(struct sbi_trap_regs *regs, ulong mcause)
> +{
> + mcause &= ~(1UL << (__riscv_xlen - 1));
> + switch (mcause) {
> + case IRQ_M_TIMER:
> + sbi_timer_process();
> + break;
> + case IRQ_M_SOFT:
> + sbi_ipi_process();
> + break;
> + default:
> + return SBI_ENOENT;
> + };
> +
> + return 0;
> +}
> +
> +static int sbi_trap_aia_irq(struct sbi_trap_regs *regs, ulong mcause)
> +{
> + unsigned long mtopi;
> +
> + while ((mtopi = csr_read(CSR_MTOPI))) {
> + mtopi = mtopi >> TOPI_IID_SHIFT;
> + switch (mtopi) {
> + case IRQ_M_TIMER:
> + sbi_timer_process();
> + break;
> + case IRQ_M_SOFT:
> + sbi_ipi_process();
> + break;
> + default:
> + return SBI_ENOENT;
> + }
> + }
> +
> + return 0;
> +}
> +
> /**
> * Handle trap/interrupt
> *
> @@ -225,18 +263,15 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs)
> }
>
> if (mcause & (1UL << (__riscv_xlen - 1))) {
> - mcause &= ~(1UL << (__riscv_xlen - 1));
> - switch (mcause) {
> - case IRQ_M_TIMER:
> - sbi_timer_process();
> - break;
> - case IRQ_M_SOFT:
> - sbi_ipi_process();
> - break;
> - default:
> - msg = "unhandled external interrupt";
> + if (sbi_hart_has_feature(sbi_scratch_thishart_ptr(),
> + SBI_HART_HAS_AIA))
> + rc = sbi_trap_aia_irq(regs, mcause);
> + else
> + rc = sbi_trap_nonaia_irq(regs, mcause);
> + if (rc) {
> + msg = "unhandled local interrupt";
> goto trap_error;
> - };
> + }
> return regs;
> }
>
> --
> 2.25.1
>
Reviewed-by: Atish Patra <atishp at rivosinc.com>
--
Regards,
Atish
More information about the opensbi
mailing list