diff options
author | Mayuresh Chitale <mchitale@ventanamicro.com> | 2022-06-10 10:19:20 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2022-06-13 11:17:38 +0530 |
commit | ce1d6188a2169c7771af1189cc8332e7a394cd19 (patch) | |
tree | b602cc806969fa2bcdfd43b7fa2acb3b36b2b724 /platform | |
parent | adc3388d76af18487d8ba4a53a1d1e83655435f3 (diff) | |
download | opensbi-ce1d6188a2169c7771af1189cc8332e7a394cd19.zip opensbi-ce1d6188a2169c7771af1189cc8332e7a394cd19.tar.gz opensbi-ce1d6188a2169c7771af1189cc8332e7a394cd19.tar.bz2 |
platform: generic: add overrides for vendor extensions
Allow the vendor_ext_check and vendor_ext_provider APIs of the
generic platform to be overridden by other platforms
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Diffstat (limited to 'platform')
-rw-r--r-- | platform/generic/include/platform_override.h | 7 | ||||
-rw-r--r-- | platform/generic/platform.c | 25 |
2 files changed, 32 insertions, 0 deletions
diff --git a/platform/generic/include/platform_override.h b/platform/generic/include/platform_override.h index 4af8754..e55da25 100644 --- a/platform/generic/include/platform_override.h +++ b/platform/generic/include/platform_override.h @@ -11,6 +11,7 @@ #define __PLATFORM_OVERRIDE_H__ #include <sbi/sbi_types.h> +#include <sbi/sbi_trap.h> struct platform_override { const struct fdt_match *match_table; @@ -21,6 +22,12 @@ 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 (*vendor_ext_check)(long extid, const struct fdt_match *match); + int (*vendor_ext_provider)(long extid, long funcid, + const struct sbi_trap_regs *regs, + unsigned long *out_value, + struct sbi_trap_info *out_trap, + const struct fdt_match *match); }; #endif diff --git a/platform/generic/platform.c b/platform/generic/platform.c index 7651273..bf93af6 100644 --- a/platform/generic/platform.c +++ b/platform/generic/platform.c @@ -168,6 +168,29 @@ static int generic_final_init(bool cold_boot) return 0; } +static int generic_vendor_ext_check(long extid) +{ + if (generic_plat && generic_plat->vendor_ext_check) + return generic_plat->vendor_ext_check(extid, + generic_plat_match); + + return 0; +} + +static int generic_vendor_ext_provider(long extid, long funcid, + const struct sbi_trap_regs *regs, + unsigned long *out_value, + struct sbi_trap_info *out_trap) +{ + if (generic_plat && generic_plat->vendor_ext_provider) { + return generic_plat->vendor_ext_provider(extid, funcid, regs, + out_value, out_trap, + generic_plat_match); + } + + return SBI_ENOTSUPP; +} + static void generic_early_exit(void) { if (generic_plat && generic_plat->early_exit) @@ -236,6 +259,8 @@ const struct sbi_platform_operations platform_ops = { .get_tlbr_flush_limit = generic_tlbr_flush_limit, .timer_init = fdt_timer_init, .timer_exit = fdt_timer_exit, + .vendor_ext_check = generic_vendor_ext_check, + .vendor_ext_provider = generic_vendor_ext_provider, }; struct sbi_platform platform = { |