[PATCH] lib: sbi_irqchip: fix device lookup by caps when first is NULL

Anup Patel anup at brainfault.org
Wed Jul 15 22:59:34 PDT 2026


On Wed, Jul 1, 2026 at 11:43 PM David E. Garcia Porras
<david.garcia at aheadcomputing.com> wrote:
>
> lib: sbi_irqchip: fix device lookup by caps when first is NULL

No need to replicate the patch subject over here. I will drop it at
the time of merging.

>
> When called with first == NULL, sbi_irqchip_find_device_by_caps() should
> scan the device list from the start. Instead it always returns NULL: "found"
> starts false and only flips true when an entry equals "first", but no entry
> ever equals NULL, so every entry hits "else continue" and nothing is checked.
>
> This breaks MSI detection in sbi_mpxy, which calls it with first == NULL:
>
>   ms->msi_avail = !!sbi_irqchip_find_device_by_caps(SBI_IRQCHIP_CAPS_MSI, NULL);
>
> msi_avail is therefore always false, so mpxy_write_std_attr() silently drops
> the MSI attributes (MSI_ADDR_LO/HI, MSI_DATA, MSI_CONTROL) while still
> returning success, and MSI-based MPXY notifications are never delivered.
>
> Initialize "found" from "first" so a NULL "first" scans from the beginning,
> and always continue in the pre-match branch so a non-NULL "first" resumes
> after the given device.
>
> Fixes: 8570b938444d ("lib: sbi_irqchip: Allow irqchip drivers advertise capabilities")
> Signed-off-by: David E. Garcia Porras <david.garcia at aheadcomputing.com>

LGTM.

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

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_irqchip.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c
> index 6d0df02e..f1bc24ca 100644
> --- a/lib/sbi/sbi_irqchip.c
> +++ b/lib/sbi/sbi_irqchip.c
> @@ -412,14 +412,13 @@ struct sbi_irqchip_device *sbi_irqchip_find_device_by_caps(unsigned long caps,
>                                                            struct sbi_irqchip_device *first)
>  {
>         struct sbi_irqchip_device *chip;
> -       bool found = false;
> +       bool found = (first == NULL);
>
>         sbi_list_for_each_entry(chip, &irqchip_list, node) {
>                 if (!found) {
>                         if (first == chip)
>                                 found = true;
> -                       else
> -                               continue;
> +                       continue;
>                 }
>                 if ((chip->caps & caps) == caps)
>                         return chip;
> --
> 2.43.0
>



More information about the opensbi mailing list