[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