summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorBill Hoffa <wghoffa@us.ibm.com>2018-07-23 10:34:32 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-07-24 09:39:23 -0500
commit331b4bff6cb94d3578243089c2adcf3908058d63 (patch)
tree22d542cc21702eea675e2f8fa278ca35edf164b4 /src/kernel
parent923ed59ce8a7703b5d36abee3ada0fd4248a6178 (diff)
downloadtalos-hostboot-331b4bff6cb94d3578243089c2adcf3908058d63.tar.gz
talos-hostboot-331b4bff6cb94d3578243089c2adcf3908058d63.zip
Restore Timebase on Master Core Threads 1-3 after Sleep/Winkle
Change-Id: I329dd64345f2474cb0dad628ccc2244d85be86c2 CQ: SW429364 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63147 Reviewed-by: ILYA SMIRNOV <ismirno@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Reviewed-by: Prachi Gupta <pragupta@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/cpumgr.C1
-rw-r--r--src/kernel/doorbell.C14
-rw-r--r--src/kernel/misc.C4
-rw-r--r--src/kernel/workitem.C15
4 files changed, 31 insertions, 3 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index 095b0a946..6ef08051c 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -253,6 +253,7 @@ void CpuManager::startCPU(ssize_t i)
cpu->idle_task = TaskManager::createIdleTask();
cpu->idle_task->cpu = cpu;
cpu->periodic_count = 0;
+ cpu->cpu_restore_tb = 0;
// Call TimeManager setup for a CPU.
TimeManager::init_cpu(cpu);
diff --git a/src/kernel/doorbell.C b/src/kernel/doorbell.C
index e746ab8cb..c24ee1384 100644
--- a/src/kernel/doorbell.C
+++ b/src/kernel/doorbell.C
@@ -79,6 +79,20 @@ void send_doorbell_wakeup(uint64_t i_pir)
doorbell_send(i_pir);
}
+void send_doorbell_restore_tb(uint64_t i_pir, uint64_t i_tb)
+{
+ cpu_t *l_cpu = CpuManager::getCpu(i_pir);
+ l_cpu->cpu_restore_tb = i_tb;
+
+ printkd("send_doorbell_restore_tb to pir: %lx\n", i_pir);
+ //Create WorkItem and put on the stack to be executed during doorbell
+ // execution
+ KernelWorkItem* l_work = new CpuTbRestoreDoorbellWorkItem();
+ l_cpu->doorbell_actions.push(l_work);
+ //Send doorbell to wakeup core/thread
+ doorbell_send(i_pir);
+}
+
void send_doorbell_ipc(uint64_t i_pir)
{
printk("send_doorbell_ipc to pir: %lx\n", i_pir);
diff --git a/src/kernel/misc.C b/src/kernel/misc.C
index 9f21fe75b..c770fc49f 100644
--- a/src/kernel/misc.C
+++ b/src/kernel/misc.C
@@ -348,7 +348,7 @@ namespace KernelMisc
// NOTE: The deferred work container verifies master core
// threads 1-3 wake up so a direct doorbell can be sent. For
// threads on other cores send_doorbell_wakeup() is used.
- doorbell_send(l_pir + i);
+ send_doorbell_restore_tb(l_pir + i, iv_timebase);
}
}
@@ -358,7 +358,6 @@ namespace KernelMisc
{
cpu->scheduler->setNextRunnable();
}
-
}
void WinkleCore::masterPostWork()
@@ -465,7 +464,6 @@ namespace KernelMisc
{
cpu->scheduler->setNextRunnable();
}
-
}
void WinkleAll::masterPostWork()
diff --git a/src/kernel/workitem.C b/src/kernel/workitem.C
index 0edf83083..53f91cb3b 100644
--- a/src/kernel/workitem.C
+++ b/src/kernel/workitem.C
@@ -27,6 +27,7 @@
#include <kernel/workitem.H>
#include <kernel/console.H>
#include <kernel/intmsghandler.H>
+#include <kernel/cpumgr.H>
//Define the desired behavior for a CPU core/thread
// wakeup scenario
@@ -40,3 +41,17 @@ void CpuWakeupDoorbellWorkItem::operator() (void)
InterruptMsgHdlr::sendThreadWakeupMsg(pir);
return;
}
+
+void CpuTbRestoreDoorbellWorkItem::operator() (void)
+{
+ size_t pir = getPIR();
+ cpu_t *l_cpu = CpuManager::getCpu(pir);
+
+ uint64_t l_restore_tb = l_cpu->cpu_restore_tb;
+ printkd("pir:%ld tb:0x%0x\n", pir, l_restore_tb);
+ if (l_restore_tb > getTB())
+ {
+ setTB(l_restore_tb);
+ }
+ return;
+}
OpenPOWER on IntegriCloud