From 9a0bdd0c844ea87a7b83c313e1dd8e8152d508e7 Mon Sep 17 00:00:00 2001 From: Xiang W Date: Mon, 22 May 2023 13:18:08 +0800 Subject: [PATCH] lib: utils: Improve fdt_ipi Remove dummy driver. Optimize fdt_ipi_cold_init to exit the loop early. Signed-off-by: Xiang W Reviewed-by: Anup Patel --- lib/utils/ipi/fdt_ipi.c | 43 +++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/lib/utils/ipi/fdt_ipi.c b/lib/utils/ipi/fdt_ipi.c index 66dc510..7762aba 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; - } - current_driver = drv; - } + /* drv->cold_init must not be NULL */ + if (drv->cold_init == NULL) + return SBI_EFAIL; - if (current_driver != &dummy) - break; + rc = drv->cold_init(fdt, noff, match); + if (rc == SBI_ENODEV) + continue; + if (rc) + return rc; + current_driver = drv; + + /* + * 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; }