ppc/shutdown: Implement machine_{halt,restart}()

OPAL has easy APIs for shutdown/reboot, so wire them up.

Then, use machine_halt() rather than an infinite loop at the end of
start_xen().  This avoids the Qemu smoke test needing to wait for the full
timeout in order to succeed.

  (XEN) 8e011600000000c0 is the result of PTE map
  Enabled radix in LPCR
  Flushed TLB
  Hello, ppc64le!
  [    6.341897656,5] OPAL: Shutdown request type 0x0...

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Shawn Anastasio <sanastasio@raptorengineering.com>
This commit is contained in:
Andrew Cooper committed 2024-07-22 10:50:03 +01:00
1 parent e42e4d8c3e
commit e44f33ccdd
5 files changed
+56 -17

No files matched your search

+1
View File
@@ -4,6 +4,7 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.init.o
obj-y += mm-radix.o
obj-y += opal.o
obj-y += setup.o
obj-y += shutdown.o
obj-y += stubs.o
obj-y += tlb-radix.o
+4
View File
@@ -79,3 +79,7 @@ opal_return_mmu:
OPAL_CALL(opal_console_write, OPAL_CONSOLE_WRITE)
OPAL_CALL(opal_console_flush, OPAL_CONSOLE_FLUSH)
OPAL_CALL(opal_reinit_cpus, OPAL_REINIT_CPUS)
OPAL_CALL(opal_cec_power_down, OPAL_CEC_POWER_DOWN)
OPAL_CALL(opal_cec_reboot, OPAL_CEC_REBOOT)
OPAL_CALL(opal_poll_events, OPAL_POLL_EVENTS)
+3 -5
View File
@@ -2,6 +2,8 @@
#include <xen/init.h>
#include <xen/lib.h>
#include <xen/mm.h>
#include <xen/shutdown.h>
#include <public/version.h>
#include <asm/boot.h>
#include <asm/early_printk.h>
@@ -43,11 +45,7 @@ void __init noreturn start_xen(unsigned long r3, unsigned long r4,
early_printk("Hello, ppc64le!\n");
for ( ; ; )
/* Set current hardware thread to very low priority */
HMT_very_low();
unreachable();
machine_halt();
}
void arch_get_xen_caps(xen_capabilities_info_t *info)
+48
View File
@@ -0,0 +1,48 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <xen/shutdown.h>
#include <asm/opal-api.h>
int64_t opal_cec_power_down(uint64_t request);
int64_t opal_cec_reboot(void);
int64_t opal_poll_events(uint64_t *outstanding_event_mask);
void machine_halt(void)
{
int rc;
/* TODO: mask any OPAL IRQs before shutting down */
do {
rc = opal_cec_power_down(0);
if ( rc == OPAL_BUSY_EVENT )
opal_poll_events(NULL);
} while ( rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT );
for ( ;; )
opal_poll_events(NULL);
}
void machine_restart(unsigned int delay_millisecs)
{
int rc;
/*
* TODO: mask any OPAL IRQs before shutting down
* TODO: mdelay(delay_millisecs);
*/
do {
rc = opal_cec_reboot();
if ( rc == OPAL_BUSY_EVENT )
opal_poll_events(NULL);
} while ( rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT );
for ( ;; )
opal_poll_events(NULL);
}
-12
View File
@@ -60,18 +60,6 @@ void vcpu_show_execution_state(struct vcpu *v)
BUG_ON("unimplemented");
}
/* shutdown.c */
void machine_restart(unsigned int delay_millisecs)
{
BUG_ON("unimplemented");
}
void machine_halt(void)
{
BUG_ON("unimplemented");
}
/* vm_event.c */
void vm_event_fill_regs(vm_event_request_t *req)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.