diff options
-rw-r--r-- | asm/misc.S | 5 | ||||
-rw-r--r-- | core/platform.c | 14 | ||||
-rw-r--r-- | include/platform.h | 2 |
3 files changed, 19 insertions, 2 deletions
@@ -69,3 +69,8 @@ mambo_write: .long 0x000eaeb0 blr +.global mambo_sim_exit +mambo_sim_exit: + li %r3, 31 /* aka. SimExitCode */ + .long 0x000eaeb0 + b . diff --git a/core/platform.c b/core/platform.c index f93b141..541fc6c 100644 --- a/core/platform.c +++ b/core/platform.c @@ -21,6 +21,7 @@ #include <console.h> #include <timebase.h> #include <cpu.h> +#include <chip.h> struct platform platform; @@ -59,9 +60,18 @@ static void generic_platform_init(void) fake_rtc_init(); } +static int64_t generic_cec_power_down(uint64_t request __unused) +{ + if (chip_quirk(QUIRK_MAMBO_CALLOUTS)) + mambo_sim_exit(); + + return OPAL_UNSUPPORTED; +} + static struct platform generic_platform = { - .name = "generic", - .init = generic_platform_init, + .name = "generic", + .init = generic_platform_init, + .cec_power_down = generic_cec_power_down, }; void probe_platform(void) diff --git a/include/platform.h b/include/platform.h index be5999b..80aa8ba 100644 --- a/include/platform.h +++ b/include/platform.h @@ -177,4 +177,6 @@ extern int resource_loaded(enum resource_id id, uint32_t idx); extern int wait_for_resource_loaded(enum resource_id id, uint32_t idx); +extern void mambo_sim_exit(void); + #endif /* __PLATFORM_H */ |