From 331b4bff6cb94d3578243089c2adcf3908058d63 Mon Sep 17 00:00:00 2001 From: Bill Hoffa Date: Mon, 23 Jul 2018 10:34:32 -0500 Subject: 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 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Reviewed-by: Prachi Gupta Reviewed-by: Christian R. Geddes Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Daniel M. Crowell --- src/kernel/cpumgr.C | 1 + src/kernel/doorbell.C | 14 ++++++++++++++ src/kernel/misc.C | 4 +--- src/kernel/workitem.C | 15 +++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) (limited to 'src/kernel') 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 #include #include +#include //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; +} -- cgit v1.2.3