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>
This commit is contained in:
Xiang W
2023-05-22 13:18:08 +08:00
committed by Anup Patel
parent 264d0be1fd
commit 9a0bdd0c84

View File

@@ -16,24 +16,17 @@
extern struct fdt_ipi *fdt_ipi_drivers[]; extern struct fdt_ipi *fdt_ipi_drivers[];
extern unsigned long fdt_ipi_drivers_size; extern unsigned long fdt_ipi_drivers_size;
static struct fdt_ipi dummy = { static struct fdt_ipi *current_driver = NULL;
.match_table = NULL,
.cold_init = NULL,
.warm_init = NULL,
.exit = NULL,
};
static struct fdt_ipi *current_driver = &dummy;
void fdt_ipi_exit(void) void fdt_ipi_exit(void)
{ {
if (current_driver->exit) if (current_driver && current_driver->exit)
current_driver->exit(); current_driver->exit();
} }
static int fdt_ipi_warm_init(void) 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 current_driver->warm_init();
return 0; return 0;
} }
@@ -51,20 +44,28 @@ static int fdt_ipi_cold_init(void)
noff = -1; noff = -1;
while ((noff = fdt_find_match(fdt, noff, while ((noff = fdt_find_match(fdt, noff,
drv->match_table, &match)) >= 0) { drv->match_table, &match)) >= 0) {
if (drv->cold_init) { /* drv->cold_init must not be NULL */
rc = drv->cold_init(fdt, noff, match); if (drv->cold_init == NULL)
if (rc == SBI_ENODEV) return SBI_EFAIL;
continue;
if (rc)
return rc;
}
current_driver = drv;
}
if (current_driver != &dummy) rc = drv->cold_init(fdt, noff, match);
break; 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; return 0;
} }