summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2017-11-29 15:36:43 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2017-12-03 21:49:12 -0600
commit57e544ee01919529763d86e1643e5d5d27b98abb (patch)
tree0f19f82e17455479899ba6e1d2caab4ea6df7e52
parentf84a8a1c749d8ee7b5e91d5a04a98c6332c182b1 (diff)
downloadblackbird-skiboot-57e544ee01919529763d86e1643e5d5d27b98abb.tar.gz
blackbird-skiboot-57e544ee01919529763d86e1643e5d5d27b98abb.zip
fast-reboot: factor out the mambo sreset code
Move the mambo sreset code out from the P8 implementation. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--core/fast-reboot.c88
1 files changed, 62 insertions, 26 deletions
diff --git a/core/fast-reboot.c b/core/fast-reboot.c
index 412639ad..effcd6f5 100644
--- a/core/fast-reboot.c
+++ b/core/fast-reboot.c
@@ -39,7 +39,7 @@ uint8_t reboot_in_progress;
static volatile bool fast_boot_release;
static struct lock reset_lock = LOCK_UNLOCKED;
-static int set_special_wakeup(struct cpu_thread *cpu)
+static int p8_set_special_wakeup(struct cpu_thread *cpu)
{
uint64_t val, poll_target, stamp;
uint32_t core_id;
@@ -54,8 +54,6 @@ static int set_special_wakeup(struct cpu_thread *cpu)
core_id = pir_to_core_id(cpu->pir);
prlog(PR_DEBUG, "RESET Waking up core 0x%x\n", core_id);
- if (chip_quirk(QUIRK_MAMBO_CALLOUTS))
- return OPAL_SUCCESS;
/*
* The original HWp reads the XSCOM first but ignores the result
@@ -152,7 +150,7 @@ static int set_special_wakeup(struct cpu_thread *cpu)
return OPAL_HARDWARE;
}
-static int clr_special_wakeup(struct cpu_thread *cpu)
+static int p8_clr_special_wakeup(struct cpu_thread *cpu)
{
uint64_t val;
uint32_t core_id;
@@ -167,8 +165,6 @@ static int clr_special_wakeup(struct cpu_thread *cpu)
core_id = pir_to_core_id(cpu->pir);
prlog(PR_DEBUG, "RESET: Releasing core 0x%x wakeup\n", core_id);
- if (chip_quirk(QUIRK_MAMBO_CALLOUTS))
- return OPAL_SUCCESS;
/*
* The original HWp reads the XSCOM first but ignores the result
@@ -201,23 +197,12 @@ static int clr_special_wakeup(struct cpu_thread *cpu)
return 0;
}
-extern unsigned long callthru_tcl(const char *str, int len);
-
-static void set_direct_ctl(struct cpu_thread *cpu, uint64_t bits)
+static void p8_set_direct_ctl(struct cpu_thread *cpu, uint64_t bits)
{
uint32_t core_id = pir_to_core_id(cpu->pir);
uint32_t chip_id = pir_to_chip_id(cpu->pir);
uint32_t thread_id = pir_to_thread_id(cpu->pir);
uint32_t xscom_addr;
- char tcl_cmd[50];
-
- if (chip_quirk(QUIRK_MAMBO_CALLOUTS)) {
- if (bits != P8_DIRECT_CTL_SRESET)
- return;
- snprintf(tcl_cmd, sizeof(tcl_cmd), "mysim cpu %i:%i set spr pc 0x100", core_id, thread_id);
- callthru_tcl(tcl_cmd, strlen(tcl_cmd));
- return;
- }
xscom_addr = XSCOM_ADDR_P8_EX(core_id,
P8_EX_TCTL_DIRECT_CONTROLS(thread_id));
@@ -225,7 +210,7 @@ static void set_direct_ctl(struct cpu_thread *cpu, uint64_t bits)
xscom_write(chip_id, xscom_addr, bits);
}
-static int sreset_all_prepare(void)
+static int p8_sreset_all_prepare(void)
{
struct cpu_thread *cpu;
@@ -234,7 +219,7 @@ static int sreset_all_prepare(void)
/* Assert special wakup on all cores. Only on operational cores. */
for_each_ungarded_primary(cpu) {
- if (set_special_wakeup(cpu) != OPAL_SUCCESS)
+ if (p8_set_special_wakeup(cpu) != OPAL_SUCCESS)
return false;
}
@@ -243,21 +228,21 @@ static int sreset_all_prepare(void)
/* Put everybody in stop except myself */
for_each_ungarded_cpu(cpu) {
if (cpu != this_cpu())
- set_direct_ctl(cpu, P8_DIRECT_CTL_STOP);
+ p8_set_direct_ctl(cpu, P8_DIRECT_CTL_STOP);
}
return true;
}
-static void sreset_all_finish(void)
+static void p8_sreset_all_finish(void)
{
struct cpu_thread *cpu;
for_each_ungarded_primary(cpu)
- clr_special_wakeup(cpu);
+ p8_clr_special_wakeup(cpu);
}
-static void sreset_all_others(void)
+static void p8_sreset_all_others(void)
{
struct cpu_thread *cpu;
@@ -266,7 +251,7 @@ static void sreset_all_others(void)
/* Put everybody in pre-nap except myself */
for_each_ungarded_cpu(cpu) {
if (cpu != this_cpu())
- set_direct_ctl(cpu, P8_DIRECT_CTL_PRENAP);
+ p8_set_direct_ctl(cpu, P8_DIRECT_CTL_PRENAP);
}
prlog(PR_DEBUG, "RESET: Resetting all threads but one...\n");
@@ -274,7 +259,58 @@ static void sreset_all_others(void)
/* Reset everybody except my own core threads */
for_each_ungarded_cpu(cpu) {
if (cpu != this_cpu())
- set_direct_ctl(cpu, P8_DIRECT_CTL_SRESET);
+ p8_set_direct_ctl(cpu, P8_DIRECT_CTL_SRESET);
+ }
+}
+
+extern unsigned long callthru_tcl(const char *str, int len);
+
+static void mambo_sreset_cpu(struct cpu_thread *cpu)
+{
+ uint32_t core_id = pir_to_core_id(cpu->pir);
+ uint32_t thread_id = pir_to_thread_id(cpu->pir);
+ char tcl_cmd[50];
+
+ snprintf(tcl_cmd, sizeof(tcl_cmd), "mysim cpu %i:%i set spr pc 0x100", core_id, thread_id);
+ callthru_tcl(tcl_cmd, strlen(tcl_cmd));
+}
+
+static int sreset_all_prepare(void)
+{
+ if (chip_quirk(QUIRK_MAMBO_CALLOUTS))
+ return true;
+
+ if (proc_gen == proc_gen_p8)
+ return p8_sreset_all_prepare();
+
+ return false;
+}
+
+static void sreset_all_finish(void)
+{
+ if (chip_quirk(QUIRK_MAMBO_CALLOUTS))
+ return;
+
+ if (proc_gen == proc_gen_p8)
+ return p8_sreset_all_finish();
+}
+
+static void sreset_all_others(void)
+{
+ if (chip_quirk(QUIRK_MAMBO_CALLOUTS)) {
+ struct cpu_thread *cpu;
+
+ for_each_ungarded_cpu(cpu) {
+ if (cpu == this_cpu())
+ continue;
+ mambo_sreset_cpu(cpu);
+ }
+ return;
+ }
+
+ if (proc_gen == proc_gen_p8) {
+ p8_sreset_all_others();
+ return;
}
}
OpenPOWER on IntegriCloud