diff options
author | Heiko Stuebner <heiko@sntech.de> | 2022-10-04 19:42:26 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2022-10-13 07:22:06 +0300 |
commit | 2f63f2465c42c64559e4f7b9d0183c2b47472019 (patch) | |
tree | 34b9a5443f2efa471e7dd530f62eebc6d07286d7 /platform | |
parent | 4f2acb53e21af805e499f7f594a931af9b0623fd (diff) | |
download | opensbi-2f63f2465c42c64559e4f7b9d0183c2b47472019.tar.xz |
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 <ajones@ventanamicro.com>
Reviewed-by: Guo Ren <guoren@kernel.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Diffstat (limited to 'platform')
-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 e55da25..7f1558d 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 bf51aba..595b0fd 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, |