/* * @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 "sbecmdsram.H" #include "sbecmdcntlinst.H" #include "sbetrace.H" #include "sbe_sp_intf.H" #include "sbeHostMsg.H" #include "sbe_host_intf.H" //////////////////////////////////////////////////////////////// // @brief g_sbeScomCmdArray //////////////////////////////////////////////////////////////// static sbeCmdStruct_t g_sbeScomCmdArray [] = { {sbeGetScom, SBE_CMD_GETSCOM, SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbePutScom, SBE_CMD_PUTSCOM, SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbeModifyScom, SBE_CMD_MODIFYSCOM, SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbePutScomUnderMask, SBE_CMD_PUTSCOM_MASK, SBE_FENCE_AT_CONTINUOUS_IPL, }, }; //////////////////////////////////////////////////////////////// // @brief g_sbeIplControlCmdArray // //////////////////////////////////////////////////////////////// static sbeCmdStruct_t g_sbeIplControlCmdArray [] = { {sbeHandleIstep, SBE_CMD_EXECUTE_ISTEP, SBE_FENCE_AT_CONTINUOUS_IPL|SBE_FENCE_AT_RUNTIME|SBE_FENCE_AT_MPIPL, }, {sbeWaitForSbeIplDone, SBE_CMD_IS_SBE_IPL_DONE, SBE_FENCE_AT_ISTEP|SBE_FENCE_AT_RUNTIME|SBE_FENCE_AT_MPIPL, }, }; //////////////////////////////////////////////////////////////// // @brief g_sbeGenericCmdArray // //////////////////////////////////////////////////////////////// static sbeCmdStruct_t g_sbeGenericCmdArray [] = { {sbeGetCapabilities, SBE_CMD_GET_SBE_CAPABILITIES, SBE_NO_FENCE, }, }; ////////////////////////////////////////////////////////////// // @brief g_sbeMemoryAccessCmdArray // ////////////////////////////////////////////////////////////// static sbeCmdStruct_t g_sbeMemoryAccessCmdArray [] = { {sbeGetMem, SBE_CMD_GETMEM, SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbePutMem, SBE_CMD_PUTMEM, SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbeGetOccSram, SBE_CMD_GETSRAM_OCC, SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbePutOccSram, SBE_CMD_PUTSRAM_OCC, SBE_FENCE_AT_CONTINUOUS_IPL, }, }; ////////////////////////////////////////////////////////////// // @brief g_sbeInstructionCntlCmdArray // ////////////////////////////////////////////////////////////// static sbeCmdStruct_t g_sbeInstructionCntlCmdArray[] = { {sbeCntlInst, SBE_CMD_CONTROL_INSTRUCTIONS, SBE_FENCE_AT_CONTINUOUS_IPL, }, }; ////////////////////////////////////////////////////////////// // @brief g_sbeRegAccessCmdArray // ////////////////////////////////////////////////////////////// static sbeCmdStruct_t g_sbeRegAccessCmdArray [] = { {sbeGetReg, SBE_CMD_GETREG, SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbePutReg, SBE_CMD_PUTREG, SBE_FENCE_AT_CONTINUOUS_IPL, }, }; ////////////////////////////////////////////////////////////// // @brief g_sbeCoreStateControlCmdArray // ////////////////////////////////////////////////////////////// static sbeCmdStruct_t g_sbeCoreStateControlCmdArray [] = { {sbeControlDeadmanTimer, SBE_PSU_CMD_CONTROL_DEADMAN, SBE_FENCE_AT_CONTINUOUS_IPL, }, }; //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// uint8_t sbeGetCmdStructAttr (const uint8_t i_cmdClass, sbeCmdStruct_t **o_ppCmd) { #define SBE_FUNC " sbeGetCmdStructAttr " SBE_DEBUG(SBE_FUNC "i_cmdClass [0x%08X]", i_cmdClass); 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; // PSU Commands case SBE_PSU_CMD_CLASS_CORE_STATE: l_numCmds = sizeof(g_sbeCoreStateControlCmdArray) / sizeof(sbeCmdStruct_t); *o_ppCmd = (sbeCmdStruct_t*)g_sbeCoreStateControlCmdArray; 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_DEBUG(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) { // @TODO via RTC : 126146 // SBE state management return 0; } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// 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); SBE_DEBUG(SBE_FUNC"i_cmdClass[0x%02X], " "i_cmdOpcode[0x%02X], l_numCmds[0x%02X]", i_cmdClass, i_cmdOpcode, l_numCmds); 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 }