lib: sbi_irqchip: fix device lookup by caps when first is NULL
PATCH 1/1 lib: sbi_irqchip: fix device lookup by caps when first is NULL
lib: sbi_irqchip: fix device lookup by caps when first is NULL
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.
--- lib/sbi/sbi_irqchip.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
lib/sbi/sbi_irqchip.c +2 -3
@@ -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;
Signature · 7 lines
2.43.0 -- opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi
Quoted 2 lines · David E. Garcia Porras
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.
Quoted 14 lines
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_availis therefore always false, sompxy_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.
Quoted 6 lines
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 <[email protected]>
LGTM.
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
Quoted 28 lines
--- lib/sbi/sbi_irqchip.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)lib/sbi/sbi_irqchip.c +2
-4@@ -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
Signature · 3 lines
opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi