[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