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>
This commit is contained in:
Mayuresh Chitale 2022-06-10 10:19:20 +05:30 committed by Anup Patel
parent adc3388d76
commit ce1d6188a2
2 changed files with 32 additions and 0 deletions

View File

@ -11,6 +11,7 @@
#define __PLATFORM_OVERRIDE_H__ #define __PLATFORM_OVERRIDE_H__
#include <sbi/sbi_types.h> #include <sbi/sbi_types.h>
#include <sbi/sbi_trap.h>
struct platform_override { struct platform_override {
const struct fdt_match *match_table; const struct fdt_match *match_table;
@ -21,6 +22,12 @@ struct platform_override {
void (*early_exit)(const struct fdt_match *match); void (*early_exit)(const struct fdt_match *match);
void (*final_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 (*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 #endif

View File

@ -168,6 +168,29 @@ static int generic_final_init(bool cold_boot)
return 0; 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) static void generic_early_exit(void)
{ {
if (generic_plat && generic_plat->early_exit) 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, .get_tlbr_flush_limit = generic_tlbr_flush_limit,
.timer_init = fdt_timer_init, .timer_init = fdt_timer_init,
.timer_exit = fdt_timer_exit, .timer_exit = fdt_timer_exit,
.vendor_ext_check = generic_vendor_ext_check,
.vendor_ext_provider = generic_vendor_ext_provider,
}; };
struct sbi_platform platform = { struct sbi_platform platform = {