From b42194c6063f64d59fe1c360fa4ae4edd85ad2f3 Mon Sep 17 00:00:00 2001 From: Bill Hoffa Date: Wed, 13 Jan 2016 14:06:31 -0600 Subject: Doorbell Interrupt Base Support for Core/Thread Wakeup This change includes: - Implementation of a generic KernelWorkItem Class - Kernel functionality for doorbell send to specific PIRs - Kernel changes to send core/thread Wakeup doorbells using doorbell_send() + placing KernelWorkItems on a cpu stack obj to be executed during doorbell wakeup - Kernel Interrupt Message handler changes to send wakeup msgs - Interrupt Resource Provider (INTRRP) Changes to handle wakeup msgs and monitor for timeouts - Changes to the IPL flow to invoke proper Core/Thread Wakeup - A basic outline (commented out) for how IPC messages can be implemented in the future Change-Id: I547fb8719bac657def561565ae11ab18cde72096 CMVC-Prereq: 992722 RTC:137564 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/22815 Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Reviewed-by: Andrew J. Geissler Reviewed-by: Prachi Gupta Reviewed-by: Daniel M. Crowell --- src/kernel/misc.C | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/kernel/misc.C') diff --git a/src/kernel/misc.C b/src/kernel/misc.C index 080c0adf3..3b25ae705 100644 --- a/src/kernel/misc.C +++ b/src/kernel/misc.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2011,2015 */ +/* Contributors Listed Below - COPYRIGHT 2011,2016 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -41,7 +41,7 @@ #include #include #include - +#include extern "C" void kernel_shutdown(size_t, uint64_t, uint64_t, uint64_t, @@ -340,8 +340,10 @@ namespace KernelMisc //Issue sbe master workaround InterruptMsgHdlr::issueSbeMboxWA(); + // NOTE: The cpu_t structures for theads 1:3 were created // during init (CpuManager::init). + // #ifdef HOSTBOOT_REAL_WINKLE // @todo- RTC 141924 Start the other threads 1:3 in a new manner @@ -349,6 +351,7 @@ namespace KernelMisc // Maybe something like: sendIPI(..) or addCpuCore(..) // Need interrupt code in place for this. + #else // get other 3 threads going in SIMICs for now MAGIC_INSTRUCTION(MAGIC_WAKE_OTHER_THREADS); @@ -371,6 +374,7 @@ namespace KernelMisc // get new core going in SIMICS MAGIC_INSTRUCTION(MAGIC_WAKE_FUSED_THREADS); #endif + } // end if fused core mode } @@ -440,7 +444,7 @@ namespace KernelMisc { if (slave->winkled) { - InterruptMsgHdlr::sendIPI(i); + InterruptMsgHdlr::sendThreadWakeupMsg(i); } } } -- cgit v1.2.3