[PATCH v2 03/13] lib: sbi: Use AIA CSRs for local interrupts when available

Anup Patel anup at brainfault.org
Tue Feb 15 07:15:21 PST 2022


On Wed, Feb 9, 2022 at 10:11 PM Atish Patra <atishp at atishpatra.org> wrote:
>
> 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>

Applied this patch to the riscv/opensbi repo.

Regards,
Anup

>
> --
> Regards,
> Atish



More information about the opensbi mailing list