diff options
| author | Heiko Stuebner <[email protected]> | 2022-10-04 18:42:26 +0200 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2022-10-13 09:52:06 +0530 |
| commit | 2f63f2465c42c64559e4f7b9d0183c2b47472019 (patch) | |
| tree | 34b9a5443f2efa471e7dd530f62eebc6d07286d7 | |
| parent | 4f2acb53e21af805e499f7f594a931af9b0623fd (diff) | |
platform: generic: add extensions_init handler and platform-override
Init of non-standard extensions is a platform-specific thing,
so allow generic platforms to do this via a platform-override.
Reviewed-by: Andrew Jones <[email protected]>
Reviewed-by: Guo Ren <[email protected]>
Reviewed-by: Anup Patel <[email protected]>
Signed-off-by: Heiko Stuebner <[email protected]>
| -rw-r--r-- | platform/generic/include/platform_override.h | 3 | ||||
| -rw-r--r-- | platform/generic/platform.c | 10 |
2 files changed, 13 insertions, 0 deletions
diff --git a/platform/generic/include/platform_override.h b/platform/generic/include/platform_override.h index e55da251..7f1558dd 100644 --- a/platform/generic/include/platform_override.h +++ b/platform/generic/include/platform_override.h @@ -10,6 +10,7 @@ #ifndef __PLATFORM_OVERRIDE_H__ #define __PLATFORM_OVERRIDE_H__ +#include <sbi/sbi_hart.h> #include <sbi/sbi_types.h> #include <sbi/sbi_trap.h> @@ -22,6 +23,8 @@ struct platform_override { void (*early_exit)(const struct fdt_match *match); void (*final_exit)(const struct fdt_match *match); int (*fdt_fixup)(void *fdt, const struct fdt_match *match); + int (*extensions_init)(const struct fdt_match *match, + struct sbi_hart_features *hfeatures); int (*vendor_ext_check)(long extid, const struct fdt_match *match); int (*vendor_ext_provider)(long extid, long funcid, const struct sbi_trap_regs *regs, diff --git a/platform/generic/platform.c b/platform/generic/platform.c index bf51aba7..595b0fdb 100644 --- a/platform/generic/platform.c +++ b/platform/generic/platform.c @@ -204,6 +204,15 @@ static void generic_final_exit(void) generic_plat->final_exit(generic_plat_match); } +static int generic_extensions_init(struct sbi_hart_features *hfeatures) +{ + if (generic_plat && generic_plat->extensions_init) + return generic_plat->extensions_init(generic_plat_match, + hfeatures); + + return 0; +} + static int generic_domains_init(void) { return fdt_domains_populate(fdt_get_address()); @@ -257,6 +266,7 @@ const struct sbi_platform_operations platform_ops = { .final_init = generic_final_init, .early_exit = generic_early_exit, .final_exit = generic_final_exit, + .extensions_init = generic_extensions_init, .domains_init = generic_domains_init, .console_init = generic_console_init, .irqchip_init = fdt_irqchip_init, |
