]> xenbits.xensource.com Git - xen.git/commitdiff
ppc/shutdown: Implement machine_{halt,restart}()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 5 Jul 2024 17:56:48 +0000 (18:56 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 22 Jul 2024 09:50:03 +0000 (10:50 +0100)
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>
xen/arch/ppc/Makefile
xen/arch/ppc/ppc64/opal-calls.S
xen/arch/ppc/setup.c
xen/arch/ppc/shutdown.c [new file with mode: 0644]
xen/arch/ppc/stubs.c

index 71feb5e2c41f8494e83c1f12c53bf2a00837c41b..655d212f66878f1a63716ef409ebed15fab64590 100644 (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
 
index cc5de75c8af45ad37bf7c16f6cbaf65240315a74..69d07909d108d980abc7e9c4c821586d6f9f15dd 100644 (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)
index 7fe06aa4bfb0334ba5890bd3d4f4f9e89a4c604f..5fb5ab64e323a8c99bddb1b00b22c7fd6e51c746 100644 (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)
diff --git a/xen/arch/ppc/shutdown.c b/xen/arch/ppc/shutdown.c
new file mode 100644 (file)
index 0000000..6e49a09
--- /dev/null
@@ -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);
+}
+
index e743a86710137af29bf940ac91b48ee2900ddc05..50e54d61c00c80919afb8061c6fbd3688061eb15 100644 (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)