summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang W <wxjstz@126.com>2023-05-22 13:18:08 +0800
committerAnup Patel <anup@brainfault.org>2023-05-26 12:43:25 +0530
commit9a0bdd0c844ea87a7b83c313e1dd8e8152d508e7 (patch)
tree58da123b6fb0166563fd694992649b60e426d867
parent264d0be1fdd93874bc8f4a365c911e15ec330ce5 (diff)
downloadopensbi-9a0bdd0c844ea87a7b83c313e1dd8e8152d508e7.tar.gz
opensbi-9a0bdd0c844ea87a7b83c313e1dd8e8152d508e7.zip
lib: utils: Improve fdt_ipi
Remove dummy driver. Optimize fdt_ipi_cold_init to exit the loop early. Signed-off-by: Xiang W <wxjstz@126.com> Reviewed-by: Anup Patel <anup@brainfault.org>
-rw-r--r--lib/utils/ipi/fdt_ipi.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/lib/utils/ipi/fdt_ipi.c b/lib/utils/ipi/fdt_ipi.c
index 66dc5108..7762abab 100644
--- a/lib/utils/ipi/fdt_ipi.c
+++ b/lib/utils/ipi/fdt_ipi.c
@@ -16,24 +16,17 @@
extern struct fdt_ipi *fdt_ipi_drivers[];
extern unsigned long fdt_ipi_drivers_size;
-static struct fdt_ipi dummy = {
- .match_table = NULL,
- .cold_init = NULL,
- .warm_init = NULL,
- .exit = NULL,
-};
-
-static struct fdt_ipi *current_driver = &dummy;
+static struct fdt_ipi *current_driver = NULL;
void fdt_ipi_exit(void)
{
- if (current_driver->exit)
+ if (current_driver && current_driver->exit)
current_driver->exit();
}
static int fdt_ipi_warm_init(void)
{
- if (current_driver->warm_init)
+ if (current_driver && current_driver->warm_init)
return current_driver->warm_init();
return 0;
}
@@ -51,20 +44,28 @@ static int fdt_ipi_cold_init(void)
noff = -1;
while ((noff = fdt_find_match(fdt, noff,
drv->match_table, &match)) >= 0) {
- if (drv->cold_init) {
- rc = drv->cold_init(fdt, noff, match);
- if (rc == SBI_ENODEV)
- continue;
- if (rc)
- return rc;
- }
+ /* drv->cold_init must not be NULL */
+ if (drv->cold_init == NULL)
+ return SBI_EFAIL;
+
+ rc = drv->cold_init(fdt, noff, match);
+ if (rc == SBI_ENODEV)
+ continue;
+ if (rc)
+ return rc;
current_driver = drv;
- }
- if (current_driver != &dummy)
- break;
+ /*
+ * We will have multiple IPI devices on multi-die or
+ * multi-socket systems so we cannot break here.
+ */
+ }
}
+ /*
+ * On some single-hart system there is no need for ipi,
+ * so we cannot return a failure here
+ */
return 0;
}