[Skiboot] [PATCH] System reset IPI facility and Mambo implementation

Nicholas Piggin npiggin at gmail.com
Fri Feb 3 01:24:47 AEDT 2017


Add an opal call OPAL_SIGNAL_SYSTEM_RESET which allows system reset
exceptions to be raised on other CPUs and act as an NMI IPI. There
is an initial simple Mambo implementation, but allowances are made
for a more complex hardware implementation.

This is based on the hardware implementation patch by Alistair Popple.

Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
---
Hi,

I'm not sure what the state of Alistair's patch is, but it may
make testing easier to initially add this mambo implementation.

Thanks,
Nick

 doc/opal-api/opal-signal-system-reset-145.txt | 31 +++++++++++++++++
 include/opal-api.h                            |  3 +-
 platforms/mambo/mambo.c                       | 48 +++++++++++++++++++++++++++
 3 files changed, 81 insertions(+), 1 deletion(-)
 create mode 100644 doc/opal-api/opal-signal-system-reset-145.txt

diff --git a/doc/opal-api/opal-signal-system-reset-145.txt b/doc/opal-api/opal-signal-system-reset-145.txt
new file mode 100644
index 00000000..25b96dbb
--- /dev/null
+++ b/doc/opal-api/opal-signal-system-reset-145.txt
@@ -0,0 +1,31 @@
+OPAL_SIGNAL_SYSTEM_RESET
+-------------------
+
+#define OPAL_SIGNAL_SYSTEM_RESET			145
+
+int64_t signal_system_reset(int32_t cpu_nr)
+
+Arguments:
+
+  int32_t cpu_nr
+    Either the cpu server number of the target cpu to reset, or
+    SYS_RESET_ALL (-1) to indicate all cpus should be reset, or
+    SYS_RESET_ALL_OTHERS (-2) to indicate all but the current cpu
+    should be reset.
+
+This OPAL call causes the specified cpu(s) to be reset to the system
+reset exception handler (0x100).
+
+The exact contents of system registers (e.g., SRR1 wakeup causes) may
+vary depending on implementation and should not be relied upon.
+
+Resetting active threads on the same core as this call is run may
+not be supported by some platforms. In that case, OPAL_PARTIAL will be
+returned and NONE of the interrupts will be delivered.
+
+Return Values:
+OPAL_SUCCESS: the power down was updated successful
+OPAL_PARAMETER: a parameter was incorrect
+OPAL_HARDWARE: hardware indicated failure during instruction ramming
+OPAL_PARTIAL: not all requested cpus could be reset at this time
+OPAL_UNSUPPORTED: this processor generation is not supported
diff --git a/include/opal-api.h b/include/opal-api.h
index c891db97..c32a2fde 100644
--- a/include/opal-api.h
+++ b/include/opal-api.h
@@ -200,7 +200,8 @@
 #define OPAL_XIVE_RESERVED2			142
 #define OPAL_XIVE_RESERVED3			143
 #define OPAL_XIVE_RESERVED4			144
-#define OPAL_LAST				144
+#define OPAL_SIGNAL_SYSTEM_RESET		145
+#define OPAL_LAST				145
 
 /* Device tree flags */
 
diff --git a/platforms/mambo/mambo.c b/platforms/mambo/mambo.c
index 976efeac..3131db9c 100644
--- a/platforms/mambo/mambo.c
+++ b/platforms/mambo/mambo.c
@@ -19,6 +19,7 @@
 #include <device.h>
 #include <console.h>
 #include <chip.h>
+#include <cpu.h>
 #include <opal-api.h>
 #include <opal-internal.h>
 #include <time-utils.h>
@@ -211,8 +212,55 @@ static void mambo_rtc_init(void)
 	opal_register(OPAL_RTC_READ, mambo_rtc_read, 2);
 }
 
+static void mambo_system_reset_cpu(struct cpu_thread *cpu)
+{
+	uint32_t core_id;
+	uint32_t thread_id;
+	char tcl_cmd[50];
+
+	core_id = pir_to_core_id(cpu->pir);
+	thread_id = pir_to_thread_id(cpu->pir);
+
+	snprintf(tcl_cmd, sizeof(tcl_cmd), "mysim cpu %i:%i interrupt SystemReset", core_id, thread_id);
+	callthru_tcl(tcl_cmd, strlen(tcl_cmd));
+}
+
+#define SYS_RESET_ALL		-1
+#define SYS_RESET_ALL_OTHERS	-2
+
+static int64_t mambo_signal_system_reset(int32_t cpu_nr)
+{
+	struct cpu_thread *cpu;
+
+	if (cpu_nr < 0) {
+		if (cpu_nr < SYS_RESET_ALL_OTHERS)
+			return OPAL_PARAMETER;
+
+		for_each_cpu(cpu) {
+			if (cpu_nr == SYS_RESET_ALL_OTHERS && cpu == this_cpu())
+				continue;
+			mambo_system_reset_cpu(cpu);
+		}
+		return OPAL_SUCCESS;
+
+	} else {
+		cpu = find_cpu_by_server(cpu_nr);
+		if (!cpu)
+			return OPAL_PARAMETER;
+
+		mambo_system_reset_cpu(cpu);
+		return OPAL_SUCCESS;
+	}
+}
+
+static void mambo_sreset_init(void)
+{
+	opal_register(OPAL_SIGNAL_SYSTEM_RESET, mambo_signal_system_reset, 1);
+}
+
 static void mambo_platform_init(void)
 {
+	mambo_sreset_init();
 	mambo_rtc_init();
 	bogus_disk_flash_init();
 }
-- 
2.11.0



More information about the Skiboot mailing list