diff options
Diffstat (limited to 'sbe/sbefw/sbecmdparser.C')
-rw-r--r-- | sbe/sbefw/sbecmdparser.C | 484 |
1 files changed, 0 insertions, 484 deletions
diff --git a/sbe/sbefw/sbecmdparser.C b/sbe/sbefw/sbecmdparser.C deleted file mode 100644 index 5cc8e7e5..00000000 --- a/sbe/sbefw/sbecmdparser.C +++ /dev/null @@ -1,484 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: sbe/sbefw/sbecmdparser.C $ */ -/* */ -/* OpenPOWER sbe Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2015,2016 */ -/* [+] 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: ppe/sbe/sbefw/sbecmdparser.C - * - * @brief This file contains the SBE FIFO Commands - * - */ - -#include "sbecmdparser.H" -#include "sbecmdscomaccess.H" -#include "sbecmdiplcontrol.H" -#include "sbecmdgeneric.H" -#include "sbecmdmemaccess.H" -#include "sbecmdregaccess.H" -#include "sbecmdcntrldmt.H" -#include "sbecmdringaccess.H" -#include "sbecmdsram.H" -#include "sbecmdcntlinst.H" -#include "sbecmdringaccess.H" -#include "sbetrace.H" -#include "sbe_sp_intf.H" -#include "sbeHostMsg.H" -#include "sbe_host_intf.H" -#include "sbestates.H" -#include "sberegaccess.H" - -// Declaration -static const uint16_t HARDWARE_FENCED_STATE = - SBE_FENCE_AT_CONTINUOUS_IPL|SBE_FENCE_AT_QUIESCE| - SBE_FENCE_AT_DMT; - -static const uint16_t PUT_HARDWARE_FENCED_STATE = - HARDWARE_FENCED_STATE|SBE_FENCE_AT_MPIPL; - -//////////////////////////////////////////////////////////////// -// @brief g_sbeScomCmdArray -//////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeScomCmdArray [] = -{ - {sbeGetScom, - SBE_CMD_GETSCOM, - HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - {sbePutScom, - SBE_CMD_PUTSCOM, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - {sbeModifyScom, - SBE_CMD_MODIFYSCOM, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - {sbePutScomUnderMask, - SBE_CMD_PUTSCOM_MASK, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - {sbeMultiScom, - SBE_CMD_MULTISCOM, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, -}; - -//////////////////////////////////////////////////////////////// -// @brief g_sbeIplControlCmdArray -// -//////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeIplControlCmdArray [] = -{ - {sbeHandleIstep, - SBE_CMD_EXECUTE_ISTEP, - PUT_HARDWARE_FENCED_STATE|SBE_FENCE_AT_RUNTIME| - SBE_FENCE_AT_DUMPING, - // This is allowed in FFDC Collect state - // TODO - Issue 157287 - Allow MPIIPL in Isteps state - }, - - {sbeContinueBoot, - SBE_CMD_CONTINUE_BOOT, - PUT_HARDWARE_FENCED_STATE|SBE_FENCE_AT_RUNTIME| - SBE_FENCE_AT_DUMPING|SBE_FENCE_AT_ISTEP, - // This is allowed only in FFDC Collect State in PLCK mode - }, -}; - -//////////////////////////////////////////////////////////////// -// @brief g_sbeGenericCmdArray -// -//////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeGenericCmdArray [] = -{ - {sbeGetCapabilities, - SBE_CMD_GET_SBE_CAPABILITIES, - SBE_STATE_FFDC_COLLECT, - // Fence in FFDC Collect State, since it might over-write traces - }, -}; - -////////////////////////////////////////////////////////////// -// @brief g_sbeMemoryAccessCmdArray -// -////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeMemoryAccessCmdArray [] = -{ - {sbeGetMem, - SBE_CMD_GETMEM, - HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - - {sbePutMem, - SBE_CMD_PUTMEM, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - - {sbeGetOccSram, - SBE_CMD_GETSRAM_OCC, - HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - - {sbePutOccSram, - SBE_CMD_PUTSRAM_OCC, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, -}; - -////////////////////////////////////////////////////////////// -// @brief g_sbeInstructionCntlCmdArray -// -////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeInstructionCntlCmdArray[] = -{ - {sbeCntlInst, - SBE_CMD_CONTROL_INSTRUCTIONS, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, -}; - -////////////////////////////////////////////////////////////// -// @brief g_sbeRegAccessCmdArray -// -////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeRegAccessCmdArray [] = -{ - {sbeGetReg, - SBE_CMD_GETREG, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, - - {sbePutReg, - SBE_CMD_PUTREG, - PUT_HARDWARE_FENCED_STATE|SBE_STATE_FFDC_COLLECT, - }, -}; - -////////////////////////////////////////////////////////////// -// @brief g_sbeMpiplCmdArray -// -////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeMpiplCmdArray[] = -{ - {sbeEnterMpipl, - SBE_CMD_MPIPL_ENTER, - PUT_HARDWARE_FENCED_STATE|SBE_FENCE_AT_ISTEP| - SBE_FENCE_AT_DUMPING|SBE_FENCE_AT_ABORT, - // Allow Fspless system to enter MPIPL - // Honour MPIPL at FFDC Collect state - // Issue 157287 - }, - - {sbeContinueMpipl, - SBE_CMD_MPIPL_CONTINUE, - HARDWARE_FENCED_STATE|SBE_FENCE_AT_ISTEP| - SBE_FENCE_AT_RUNTIME|SBE_FENCE_AT_DUMPING| - SBE_FENCE_AT_ABORT|SBE_FENCE_AT_FFDC_COLLECT, - // Only allowed State is MPIPL - }, -}; - -////////////////////////////////////////////////////////////// -// @brief g_sbeRingAccessCmdArray -// -////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeRingAccessCmdArray [] = -{ - {sbeGetRing, - SBE_CMD_GETRING, - SBE_FENCE_AT_CONTINUOUS_IPL, - }, -}; - -////////////////////////////////////////////////////////////// -// @brief g_sbeCoreStateControlCmdArray -// -////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbeCoreStateControlCmdArray [] = -{ - {sbeControlDeadmanTimer, - SBE_PSU_CMD_CONTROL_DEADMAN, - SBE_FENCE_AT_CONTINUOUS_IPL|SBE_FENCE_AT_QUIESCE| - SBE_FENCE_AT_MPIPL|SBE_FENCE_AT_ISTEP| - SBE_FENCE_AT_DUMPING|SBE_FENCE_AT_ABORT| - SBE_FENCE_AT_FFDC_COLLECT, - }, -}; - -////////////////////////////////////////////////////////////// -// @brief g_sbePutRingFromImageCmdArray -// -////////////////////////////////////////////////////////////// -static sbeCmdStruct_t g_sbePutRingFromImageCmdArray [] = -{ - {sbePutRingFromImagePSU, - SBE_PSU_MSG_PUT_RING_FROM_IMAGE, - SBE_FENCE_AT_CONTINUOUS_IPL, - }, -}; - - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -uint8_t sbeGetCmdStructAttr (const uint8_t i_cmdClass, - sbeCmdStruct_t **o_ppCmd) -{ - #define SBE_FUNC " sbeGetCmdStructAttr " - uint8_t l_numCmds = 0; - *o_ppCmd = NULL; - - switch(i_cmdClass) - { - // FIFO Commands - case SBE_CMD_CLASS_IPL_CONTROL: - // @TODO via RTC : 128655 - // Use C++ style typecase - l_numCmds = sizeof(g_sbeIplControlCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeIplControlCmdArray; - break; - case SBE_CMD_CLASS_SCOM_ACCESS: - l_numCmds = sizeof(g_sbeScomCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeScomCmdArray; - break; - case SBE_CMD_CLASS_GENERIC_MESSAGE: - l_numCmds = sizeof(g_sbeGenericCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeGenericCmdArray; - break; - - case SBE_CMD_CLASS_MEMORY_ACCESS: - l_numCmds = sizeof(g_sbeMemoryAccessCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeMemoryAccessCmdArray; - break; - - case SBE_CMD_CLASS_INSTRUCTION_CONTROL: - l_numCmds = sizeof(g_sbeInstructionCntlCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeInstructionCntlCmdArray; - break; - - case SBE_CMD_CLASS_REGISTER_ACCESS: - l_numCmds = sizeof(g_sbeRegAccessCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeRegAccessCmdArray; - break; - - case SBE_CMD_CLASS_RING_ACCESS: - l_numCmds = sizeof(g_sbeRingAccessCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeRingAccessCmdArray; - break; - - case SBE_CMD_CLASS_MPIPL_COMMANDS: - l_numCmds = sizeof(g_sbeMpiplCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeMpiplCmdArray; - break; - - // PSU Commands - case SBE_PSU_CMD_CLASS_CORE_STATE: - l_numCmds = sizeof(g_sbeCoreStateControlCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbeCoreStateControlCmdArray; - break; - - case SBE_PSU_CMD_CLASS_RING_ACCESS: - l_numCmds = sizeof(g_sbePutRingFromImageCmdArray) / - sizeof(sbeCmdStruct_t); - *o_ppCmd = (sbeCmdStruct_t*)g_sbePutRingFromImageCmdArray; - break; - - // This will grow with each class of chipOp in future - default: - break; - } - return l_numCmds; - #undef SBE_FUNC -} - - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -uint8_t sbeValidateCmdClass (const uint8_t i_cmdClass, - const uint8_t i_cmdOpcode) -{ - #define SBE_FUNC " sbeValidateCmdClass " - uint8_t l_rc = SBE_SEC_COMMAND_NOT_SUPPORTED; - - SBE_INFO(SBE_FUNC"i_cmdClass[0x%02X], " - "i_cmdOpcode[0x%02X]", i_cmdClass, i_cmdOpcode); - - do - { - uint8_t l_numCmds = 0; - sbeCmdStruct_t *l_pCmd = NULL; - - l_numCmds = sbeGetCmdStructAttr (i_cmdClass, &l_pCmd); - if (!l_numCmds) - { - SBE_ERROR(SBE_FUNC"SBE_SEC_COMMAND_CLASS_NOT_SUPPORTED " - "i_cmdClass[0x%02X], i_cmdOpcode[0x%02X]", - i_cmdClass, i_cmdOpcode); - // Command class not supported - l_rc = SBE_SEC_COMMAND_CLASS_NOT_SUPPORTED; - break; - } - - // @TODO via RTC : 128654 - // Analyze on merging the validation functions into one - // and also on using loop vs switch case performance - for (uint8_t l_cnt = 0; l_cnt < l_numCmds; ++l_cnt, ++l_pCmd) - { - if (i_cmdOpcode == l_pCmd->cmd_opcode) - { - // Command found - l_rc = SBE_SEC_OPERATION_SUCCESSFUL; - break; - } - } - } while (false); - - return l_rc; - #undef SBE_FUNC -} - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -bool sbeIsCmdAllowedAtState (const uint8_t i_cmdClass, - const uint8_t i_cmdOpcode) -{ - #define SBE_FUNC " sbeIsCmdAllowedAtState " - uint8_t l_numCmds = 0; - sbeCmdStruct_t *l_pCmd = NULL; - bool l_ret = false; - l_numCmds = sbeGetCmdStructAttr (i_cmdClass, &l_pCmd); - - for (uint8_t l_cnt = 0; l_cnt < l_numCmds; ++l_cnt, ++l_pCmd) - { - if (i_cmdOpcode == l_pCmd->cmd_opcode) - { - // Get the Present State - uint64_t l_state = - SbeRegAccess::theSbeRegAccess().getSbeState(); - SBE_INFO(SBE_FUNC "SBE State [0x%08X] Fence State[0x%04X]", - (uint32_t)(l_state & 0xFFFFFFFF),l_pCmd->cmd_state_fence); - - switch(l_state) - { - case SBE_STATE_QUIESCE: - case SBE_STATE_UNKNOWN: - case SBE_STATE_FAILURE: - // All operations are fenced here, return false - // Reset is the only Option available - break; - - case SBE_STATE_FFDC_COLLECT: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_FFDC_COLLECT)? false:true); - break; - } - - case SBE_STATE_IPLING: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_CONTINUOUS_IPL)? false:true); - break; - } - - case SBE_STATE_ISTEP: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_ISTEP)? false:true); - break; - } - - case SBE_STATE_RUNTIME: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_RUNTIME)? false:true); - break; - } - - case SBE_STATE_DUMP: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_DUMPING)? false:true); - break; - } - - case SBE_STATE_MPIPL: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_MPIPL)? false:true); - break; - } - - case SBE_STATE_DMT: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_DMT)? false:true); - break; - } - - case SBE_STATE_ABORT: - { - l_ret = ((l_pCmd->cmd_state_fence & - SBE_FENCE_AT_ABORT)? false:true); - break; - } - - default: break; - } - } - } - // For any other state, which is not handled above, return from here - return l_ret; - #undef SBE_FUNC -} - -//////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////// -sbeCmdFunc_t sbeFindCmdFunc (const uint8_t i_cmdClass, - const uint8_t i_cmdOpcode) - -{ - #define SBE_FUNC " sbeFindCmdFunc " - uint8_t l_numCmds = 0; - sbeCmdStruct_t *l_pCmd = NULL; - - l_numCmds = sbeGetCmdStructAttr (i_cmdClass, &l_pCmd); - - for (uint8_t l_cnt = 0; l_cnt < l_numCmds; ++l_cnt, ++l_pCmd) - { - if (i_cmdOpcode == l_pCmd->cmd_opcode) - { - break; - } - } - - return l_pCmd ? (l_pCmd->cmd_func) : NULL; - #undef SBE_FUNC -} |