diff options
author | Sachin Gupta <sgupta2m@in.ibm.com> | 2017-01-30 22:45:50 -0600 |
---|---|---|
committer | AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com> | 2017-01-31 05:38:03 -0500 |
commit | 182e8f571de45900adb7adb2646a74b604bbf634 (patch) | |
tree | b6f2b8560bb87b8ba91c931db8f5826d715bce7a /src | |
parent | 2b4734c0efa73aac9ee5b9e5851c36f2f9b5f2a3 (diff) | |
download | talos-sbe-182e8f571de45900adb7adb2646a74b604bbf634.tar.gz talos-sbe-182e8f571de45900adb7adb2646a74b604bbf634.zip |
Fix SBE State machine
Change-Id: I3bb28207b9e8fdc7cd704369077443e4482951b9
CQ: SW377101
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/35628
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Shakeeb A. Pasha B K <shakeebbk@in.ibm.com>
Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/sbefw/sbecmdparser.C | 2 | ||||
-rw-r--r-- | src/sbefw/sbecmdreceiver.C | 42 |
2 files changed, 15 insertions, 29 deletions
diff --git a/src/sbefw/sbecmdparser.C b/src/sbefw/sbecmdparser.C index 36f75e0b..e95f39ad 100644 --- a/src/sbefw/sbecmdparser.C +++ b/src/sbefw/sbecmdparser.C @@ -128,7 +128,7 @@ static sbeCmdStruct_t g_sbeMemoryAccessCmdArray [] = { {sbeGetMem, SBE_CMD_GETMEM, - HARDWARE_FENCED_STATE, + SBE_FENCE_AT_CONTINUOUS_IPL, }, {sbePutMem, diff --git a/src/sbefw/sbecmdreceiver.C b/src/sbefw/sbecmdreceiver.C index 98126b5a..4799c295 100644 --- a/src/sbefw/sbecmdreceiver.C +++ b/src/sbefw/sbecmdreceiver.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER sbe Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2016 */ +/* Contributors Listed Below - COPYRIGHT 2015,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -56,7 +56,7 @@ void sbeCommandReceiver_routine(void *i_pArg) #define SBE_FUNC " sbeCommandReceiver_routine " SBE_ENTER(SBE_FUNC); uint32_t l_rc = SBE_SEC_OPERATION_SUCCESSFUL; - + sbeInterfaceSrc_t curInterface = SBE_INTERFACE_UNKNOWN; // Update SBE msgg reg to indicate that control loop // is ready now to receive data on its interfaces (void)SbeRegAccess::theSbeRegAccess().setSbeReady(); @@ -104,8 +104,7 @@ void sbeCommandReceiver_routine(void *i_pArg) //Clear the Interrupt Source bit for PSU g_sbeIntrSource.clearIntrSource(SBE_INTERRUPT_ROUTINE, SBE_INTERFACE_PSU); - g_sbeIntrSource.setIntrSource(SBE_RX_ROUTINE, - SBE_INTERFACE_PSU); + curInterface = SBE_INTERFACE_PSU; // First clear PSU->SBE DB bit 0 l_rc = sbeClearPsu2SbeDbBitX(SBE_PSU2SBE_DOORBELL_CLEAR_BIT0); if (l_rc) @@ -133,8 +132,7 @@ void sbeCommandReceiver_routine(void *i_pArg) //Clear the Interrupt Source bit for FIFO g_sbeIntrSource.clearIntrSource(SBE_INTERRUPT_ROUTINE, SBE_INTERFACE_FIFO); - g_sbeIntrSource.setIntrSource(SBE_RX_ROUTINE, - SBE_INTERFACE_FIFO); + curInterface = SBE_INTERFACE_FIFO; // This thread will attempt to unblock the command processor // thread on the following scenarios: @@ -192,13 +190,11 @@ void sbeCommandReceiver_routine(void *i_pArg) { // Command Validation failed; SBE_ERROR(SBE_FUNC"Command validation failed"); - if ( g_sbeIntrSource.isSet(SBE_RX_ROUTINE, - SBE_INTERFACE_PSU) ) + if ( SBE_INTERFACE_PSU == curInterface ) { g_sbeSbe2PsuRespHdr.setStatus(SBE_PRI_INVALID_COMMAND,l_rc); } - else if ( g_sbeIntrSource.isSet(SBE_RX_ROUTINE, - SBE_INTERFACE_FIFO) ) + else if ( SBE_INTERFACE_FIFO == curInterface ) { g_sbeCmdRespHdr.setStatus(SBE_PRI_INVALID_COMMAND, l_rc); } @@ -219,13 +215,12 @@ void sbeCommandReceiver_routine(void *i_pArg) "State - [0x%04X] ",l_cmdClass,l_command, SbeRegAccess::theSbeRegAccess().getSbeState()); - if ( g_sbeIntrSource.isSet(SBE_RX_ROUTINE, SBE_INTERFACE_PSU) ) + if ( SBE_INTERFACE_PSU == curInterface ) { g_sbeSbe2PsuRespHdr.setStatus(SBE_PRI_INVALID_COMMAND, SBE_SEC_COMMAND_NOT_ALLOWED_IN_THIS_STATE); } - else if ( g_sbeIntrSource.isSet(SBE_RX_ROUTINE, - SBE_INTERFACE_FIFO) ) + else if ( SBE_INTERFACE_FIFO == curInterface ) { g_sbeCmdRespHdr.setStatus(SBE_PRI_INVALID_COMMAND, SBE_SEC_COMMAND_NOT_ALLOWED_IN_THIS_STATE); @@ -237,6 +232,7 @@ void sbeCommandReceiver_routine(void *i_pArg) } while (false); // Inner do..while ends + g_sbeIntrSource.setIntrSource(SBE_RX_ROUTINE, curInterface ); // If there was a FIFO reset request, if (l_rc == SBE_FIFO_RESET_RECEIVED) { @@ -284,33 +280,23 @@ void sbeCommandReceiver_routine(void *i_pArg) // It's likely a code bug or PK failure, // or any other PSU/FIFO access (scom) failure. - // @TODO via RTC : 129166 - // Review if we need to add ASSERT here - // Add Error trace, collect FFDC and // continue wait for the next interrupt SBE_ERROR(SBE_FUNC"Unexpected failure, " "l_rcPk=[%d], g_sbeSemCmdProcess.count=[%d], l_rc=[%d]", l_rcPk, g_sbeSemCmdProcess.count, l_rc); + pk_halt(); } - if ( g_sbeIntrSource.isSet(SBE_RX_ROUTINE, - SBE_INTERFACE_PSU) ) + if ( SBE_INTERFACE_PSU == curInterface ) { - if(l_rc == SBE_SEC_COMMAND_NOT_ALLOWED_IN_THIS_STATE) - { - sbeHandlePsuResponse(l_rc); - } + sbeHandlePsuResponse(l_rc); g_sbeIntrSource.clearIntrSource(SBE_ALL_HANDLER, SBE_INTERFACE_PSU); pk_irq_enable(SBE_IRQ_HOST_PSU_INTR); } - else if ( g_sbeIntrSource.isSet(SBE_RX_ROUTINE, - SBE_INTERFACE_FIFO) ) + else if ( SBE_INTERFACE_FIFO == curInterface ) { - if(l_rc == SBE_SEC_COMMAND_NOT_ALLOWED_IN_THIS_STATE) - { - sbeHandleFifoResponse(l_rc); - } + sbeHandleFifoResponse(l_rc); g_sbeIntrSource.clearIntrSource(SBE_ALL_HANDLER, SBE_INTERFACE_FIFO); pk_irq_enable(SBE_IRQ_SBEFIFO_DATA); |