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:
parent
adc3388d76
commit
ce1d6188a2
|
@ -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
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in New Issue