[OpenBIOS] [PATCH 4/5] SPARC64: implement power-off word

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Mon Jan 15 22:04:35 CET 2018


Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
 arch/sparc64/openbios.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/arch/sparc64/openbios.c b/arch/sparc64/openbios.c
index c0e1d0d..46d44ea 100644
--- a/arch/sparc64/openbios.c
+++ b/arch/sparc64/openbios.c
@@ -120,6 +120,28 @@ sparc64_reset_all(void)
         : : "r" (val), "r" (addr) : "memory");
 }
 
+/* Power off */
+static void
+sparc64_power_off(void)
+{
+    /* Locate address of ebus power device */
+    phandle_t ph;
+    uint32_t addr;
+    volatile uint32_t *p;
+    int len;
+
+    ph = find_dev("/pci/pci at 1,1/ebus/power");
+    if (ph) {
+        addr = get_int_property(ph, "address", &len);
+
+        if (len) {
+            /* Set bit 24 to invoke power off */
+            p = cell2pointer(addr);
+            *p = 0x1000000;
+        }
+    }
+}
+
 /* PCI Target Address Space Register (see UltraSPARC IIi User's Manual
   section 19.3.0.4) */
 #define PBM_PCI_TARGET_AS              0x2028
@@ -727,6 +749,11 @@ arch_init( void )
         bind_func("spacel@", spacel_read);
         bind_func("spacex@", spacex_read);
 
+        /* Bind power functions */
+        bind_func("sparc64-power-off", sparc64_power_off);
+        push_str("' sparc64-power-off to power-off");
+        fword("eval");
+
 	bind_func("platform-boot", boot );
 }
 
-- 
2.11.0




More information about the OpenBIOS mailing list