[PATCH 6/7] lib: sbi_irqchip: fix MSI EIID gap and tail allocation logic in register_msi
Pawandeep Oza
pawandeep.oza at oss.qualcomm.com
Mon Jun 15 10:18:51 PDT 2026
Fix sbi_irqchip_register_msi() that prevented contiguous EIID allocation:
- Gap check condition was inverted: the original `h->first_hwirq -
hwirq < num_hwirq` incorrectly set `found = true` when the gap was
too small to fit num_hwirq entries. Correct to `>= num_hwirq` so
allocation only proceeds when sufficient space exists between
registered handlers.
- Tail-space check `!found && !hwirq` never triggered after iteration
Replace with `(chip->num_hwirq - hwirq) >= num_hwirq` to correctly
allocate if handler list is empty.
Fixes: 79e63bc8348d ("irqchip: add sbi_irqchip_register_msi support")
Signed-off-by: Pawandeep Oza <poza at qti.qualcomm.com>
Signed-off-by: Oza Pawandeep <pawandeep.oza at oss.qualcomm.com>
---
lib/sbi/sbi_irqchip.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c
index 49fa4806..a4480751 100644
--- a/lib/sbi/sbi_irqchip.c
+++ b/lib/sbi/sbi_irqchip.c
@@ -354,7 +354,7 @@ int sbi_irqchip_register_msi(struct sbi_irqchip_device *chip, u32 num_hwirq,
if (h->first_hwirq <= hwirq && hwirq < (h->first_hwirq + h->num_hwirq)) {
hwirq = h->first_hwirq + h->num_hwirq;
} else if (hwirq < h->first_hwirq) {
- if (h->first_hwirq - hwirq < num_hwirq) {
+ if (h->first_hwirq - hwirq >= num_hwirq) {
found = true;
break;
} else {
@@ -362,7 +362,7 @@ int sbi_irqchip_register_msi(struct sbi_irqchip_device *chip, u32 num_hwirq,
}
}
}
- if (!found && !hwirq)
+ if (!found && (chip->num_hwirq - hwirq) >= num_hwirq)
found = true;
if (!found)
return SBI_ENOSPC;
--
2.43.0
More information about the opensbi
mailing list