[PATCH 8/8] lib: sbi_irqchip: Allow registering interrupt handlers

Anup Patel anup at brainfault.org
Tue Feb 10 08:39:10 PST 2026


On Tue, Feb 10, 2026 at 12:29 AM Ray Mao <raymond.mao at riscstar.com> wrote:
>
> Hi Anup,
>
> On Sat, Feb 7, 2026 at 5:26 AM Anup Patel <anup.patel at oss.qualcomm.com> wrote:
>>
>> To handle external interrupts in M-mode, the sbi_irqchip framework
>> must allow registering interrupt handlers from device drivers.
>>
>> Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
>> ---
>>  include/sbi/sbi_irqchip.h |  56 ++++++++++-
>>  lib/sbi/sbi_irqchip.c     | 202 +++++++++++++++++++++++++++++++++++++-
>>  lib/utils/irqchip/aplic.c |   1 +
>>  lib/utils/irqchip/imsic.c |   9 ++
>>  lib/utils/irqchip/plic.c  |   1 +
>>  5 files changed, 267 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/sbi/sbi_irqchip.h b/include/sbi/sbi_irqchip.h
>> index d2c47ae8..77b54110 100644
>> --- a/include/sbi/sbi_irqchip.h
>> +++ b/include/sbi/sbi_irqchip.h
>> @@ -18,12 +18,21 @@ struct sbi_scratch;
>>
>>  /** irqchip hardware device */
>>  struct sbi_irqchip_device {
>> -       /** Node in the list of irqchip devices */
>> +       /** Node in the list of irqchip devices (private) */
>>         struct sbi_dlist node;
>>
>> +       /** Internal data of all hardware interrupts of this irqchip (private) */
>> +       struct sbi_irqchip_hwirq_data *hwirqs;
>> +
>> +       /** List of interrupt handlers */
>> +       struct sbi_dlist handler_list;
>> +
>>         /** Unique ID of this irqchip */
>>         u32 id;
>>
>> +       /** Number of hardware IRQs of this irqchip */
>> +       u32 num_hwirq;
>> +
>>         /** Set of harts targetted by this irqchip */
>>         struct sbi_hartmask target_harts;
>>
>> @@ -32,6 +41,21 @@ struct sbi_irqchip_device {
>>
>>         /** Process hardware interrupts from this irqchip */
>>         int (*process_hwirqs)(struct sbi_irqchip_device *chip);
>> +
>> +       /** Setup a hardware interrupt of this irqchip */
>> +       int (*hwirq_setup)(struct sbi_irqchip_device *chip, u32 hwirq);
>> +
>> +       /** Cleanup a hardware interrupt of this irqchip */
>> +       void (*hwirq_cleanup)(struct sbi_irqchip_device *chip, u32 hwirq);
>> +
>> +       /** End of hardware interrupt of this irqchip */
>> +       void (*hwirq_eoi)(struct sbi_irqchip_device *chip, u32 hwirq);
>
>
> If hwirq_eoi() is an equivalent of claim(), then hwirq should be a pointer of memory, since we need to read and return the IDC_TOPI_ID from CLAIMI.
>

I think the external interrupt handling flow is not clear
to you but let me try to explain.

Whenever a hart receives external interrupt:

1) The sbi_trap_handler() is called by low-level handler
which in-turn calls sbi_irqchip_process()
2) The sbi_irqchip_process() will in-turn call
process_hwirqs() of appropriate driver
3) The process_hwirqs() in-case of APLIC
direct-mode will use IDC_TOPI_ID to determine
hwirq number and call sbi_irqchip_process_hwirq()
to handle it.

If we have nested irqchip such as IMSIC+APLIC
then process_hwirqs() will be implemented by IMSIC
whereas APLIC will use sbi_irqchip_request_handler()
to register callback for IMSIC hwirqs. This means
sbi_irqchip_process() will call process_hwirqs() of
IMSIC and IMSIC will call APLIC interrupt handler
via sbi_irqchip_process_hwirq() whereas the APLIC
interrupt handler will again call sbi_irqchip_process_hwirq().

In other words, we can support any irqchip topology.

Regards,
Anup



More information about the opensbi mailing list