From: Xiang W Date: Mon, 22 May 2023 05:18:08 +0000 (+0800) Subject: lib: utils: Improve fdt_ipi X-Git-Tag: v1.3~28 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9a0bdd0c844ea87a7b83c313e1dd8e8152d508e7;p=platform%2Fkernel%2Fopensbi.git 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 --- 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; - } + /* 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; }