[Skiboot] [PATCH] System reset IPI facility and Mambo implementation
Stewart Smith
stewart at linux.vnet.ibm.com
Fri Feb 3 17:08:51 AEDT 2017
Nicholas Piggin <npiggin at gmail.com> writes:
> 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.
I'm hoping he spins a V2 on top of this patch :)
A thought... this is the kind of functionality that's ideal to get some
kind of test case written for so that we don't go and by accident break
it. So I'm CCing in Pridhiviraj so that it's on the todo list to get
going as part of op-test-framework tests.
> 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
FYI, we've moved to .rst and ReSTructured text, but it's not a big deal,
I can convert when merging if needed.
> @@ -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.
Cool - I gather the API definition has settled down a bit?
For OPAL_PARTIAL, does the "and none were delivered" also apply to
SYS_RESET_ALL_OTHERS ? I'd guess not, but we may want to be explicit.
> +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);
For SYS_RESET_ALL, If we're not running on the last CPU, we would reset
ourselves before we could reset ourselves before we reset the others, right?
otherwise looks good.
--
Stewart Smith
OPAL Architect, IBM.
More information about the Skiboot
mailing list