summaryrefslogtreecommitdiffstats
path: root/src/sbefw/sbecmdCntrlTimer.C
diff options
context:
space:
mode:
authorSachin Gupta <sgupta2m@in.ibm.com>2016-11-24 04:14:05 -0600
committerAMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>2017-01-11 10:13:56 -0500
commitdf7e2b85dbf9e51987a9b79a5e18f258bf5dac45 (patch)
treeecc948a5a1b9a97ed8fb2d894cfd595d709551ad /src/sbefw/sbecmdCntrlTimer.C
parent9db0477faba296410c240b66dcd00747c8a781fd (diff)
downloadtalos-sbe-df7e2b85dbf9e51987a9b79a5e18f258bf5dac45.tar.gz
talos-sbe-df7e2b85dbf9e51987a9b79a5e18f258bf5dac45.zip
Timer service
RTC: 134268 Change-Id: Ie2bb96861f5a12937350048287e23705d0f8bcb0 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32986 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: RAJA DAS <rajadas2@in.ibm.com> Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>
Diffstat (limited to 'src/sbefw/sbecmdCntrlTimer.C')
-rw-r--r--src/sbefw/sbecmdCntrlTimer.C144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/sbefw/sbecmdCntrlTimer.C b/src/sbefw/sbecmdCntrlTimer.C
new file mode 100644
index 00000000..62324979
--- /dev/null
+++ b/src/sbefw/sbecmdCntrlTimer.C
@@ -0,0 +1,144 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/sbefw/sbecmdCntrlTimer.C $ */
+/* */
+/* OpenPOWER sbe Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2015,2017 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+/*
+ * @file: src/sbefw/sbecmdCntrlTimer.C
+ *
+ * @brief This file contains the SBE Timer Commands
+ *
+ */
+
+#include "sbecmdCntrlTimer.H"
+#include "sbetrace.H"
+#include "sbe_sp_intf.H"
+#include "sbeFFDC.H"
+#include "sbeHostMsg.H"
+#include "sbeHostUtils.H"
+#include "sbeTimerSvc.H"
+
+#include "fapi2.H"
+using namespace fapi2;
+
+// Global instance to track PK timer
+static timerService g_hostTimerSvc;
+
+// Callback
+void sbeTimerExpiryCallback(void *)
+{
+ #define SBE_FUNC "sbeTimerExpiryCallback "
+ SBE_ENTER(SBE_FUNC);
+
+ do
+ {
+ // indicate the Host via Bit SBE_SBE2PSU_DOORBELL_SET_BIT14
+ // that Timer has expired
+ SBE_INFO(SBE_FUNC "Updating door bell bit 14");
+ uint32_t l_rc = sbeSetSbe2PsuDbBitX(SBE_SBE2PSU_DOORBELL_SET_BIT14);
+ if(l_rc)
+ {
+ SBE_ERROR(SBE_FUNC " Failed to Write "
+ "SBE_SBE2PSU_DOORBELL_SET_BIT14");
+ pk_halt();
+ }
+ }while(0);
+ SBE_EXIT(SBE_FUNC);
+ #undef SBE_FUNC
+
+}
+/////////////////////////////////////////////////////////////////////
+
+//----------------------------------------------------------------------------
+uint32_t sbeCntrlTimer( uint8_t *i_pArg )
+{
+ #define SBE_FUNC "sbeCntrlTimer "
+ SBE_ENTER(SBE_FUNC);
+ uint32_t l_rc = SBE_SEC_OPERATION_SUCCESSFUL;
+ uint32_t l_fapiRc = FAPI2_RC_SUCCESS;
+
+ do
+ {
+ if(g_sbePsu2SbeCmdReqHdr.flags & SBE_PSU_FLAGS_START_TIMER)
+ {
+ uint64_t time = 0;
+ l_rc = sbeReadPsu2SbeMbxReg(SBE_HOST_PSU_MBOX_REG1,
+ (sizeof(time)/sizeof(uint64_t)),
+ &time, true);
+
+ if(SBE_SEC_OPERATION_SUCCESSFUL != l_rc)
+ {
+ SBE_ERROR(SBE_FUNC" Failed to extract SBE_HOST_PSU_MBOX_REG1");
+ break;
+ }
+
+ SBE_INFO(SBE_FUNC "Start Timer. Time: [%08X]",
+ SBE::lower32BWord(time));
+
+ l_rc = g_hostTimerSvc.startTimer( (uint32_t )time,
+ (PkTimerCallback)&sbeTimerExpiryCallback);
+ if(SBE_SEC_OPERATION_SUCCESSFUL != l_rc)
+ {
+ g_sbeSbe2PsuRespHdr.setStatus(SBE_PRI_INTERNAL_ERROR, l_rc);
+ SBE_ERROR(SBE_FUNC" g_hostTimerSvc.startTimer failed");
+ l_rc = SBE_SEC_OPERATION_SUCCESSFUL;
+ break;
+ }
+ break;
+ }
+ // Acknowledge host
+ l_rc = sbeAcknowledgeHost();
+ if(l_rc)
+ {
+ SBE_ERROR(SBE_FUNC " Failed to Sent Ack to Host over "
+ "SBE_SBE2PSU_DOORBELL_SET_BIT1");
+ break;
+ }
+
+ if(g_sbePsu2SbeCmdReqHdr.flags & SBE_PSU_FLAGS_STOP_TIMER)
+ {
+ SBE_INFO(SBE_FUNC "Stop Timer.");
+ l_rc = g_hostTimerSvc.stopTimer( );
+ if(SBE_SEC_OPERATION_SUCCESSFUL != l_rc)
+ {
+ g_sbeSbe2PsuRespHdr.setStatus(SBE_PRI_INTERNAL_ERROR, l_rc);
+ SBE_ERROR(SBE_FUNC" g_hostTimerSvc.stopTimer failed");
+ l_rc = SBE_SEC_OPERATION_SUCCESSFUL;
+ break;
+ }
+ break;
+ }
+
+ g_sbeSbe2PsuRespHdr.setStatus( SBE_PRI_INVALID_COMMAND,
+ SBE_SEC_COMMAND_NOT_SUPPORTED);
+ SBE_ERROR(SBE_FUNC" Not a valid flag 0x%4X",
+ (uint16_t) g_sbePsu2SbeCmdReqHdr.flags);
+ }while(0);
+
+ // Send the response
+ sbePSUSendResponse(g_sbeSbe2PsuRespHdr, l_fapiRc, l_rc);
+
+ SBE_EXIT(SBE_FUNC);
+ return l_rc;
+ #undef SBE_FUNC
+}
+
OpenPOWER on IntegriCloud