summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/import/chips/p9/procedures/hwp/perv/p9_extract_sbe_rc.C42
1 files changed, 24 insertions, 18 deletions
diff --git a/src/import/chips/p9/procedures/hwp/perv/p9_extract_sbe_rc.C b/src/import/chips/p9/procedures/hwp/perv/p9_extract_sbe_rc.C
index 1fe53b1c7..dbaa6f984 100644
--- a/src/import/chips/p9/procedures/hwp/perv/p9_extract_sbe_rc.C
+++ b/src/import/chips/p9/procedures/hwp/perv/p9_extract_sbe_rc.C
@@ -26,29 +26,34 @@
/// @file p9_extract_sbe_rc.C
///
/// @brief Check for errors on the SBE, OTPROM, PIBMEM & SEEPROM
+/// Pre-Checking :
+/// 1) Validating Usecase
+/// 2) (In non HB mode only) Check if VDN_PGOOD is set
+/// 3) Reading chip ec attribute detect if chip is NDD1 or later, and update memory location values
+/// 4) Read the value of DBGPRO 0xE0005 & Store IAR as Current IAR
+/// 5) Identify if PPE is halted from XSR Bit0, if not halted report error as infinite loop
/// Level 0 :
-/// 1) Read the value of RAMDBG 0xE0003 & store SPRG0
+/// 1) If Halted, Read the value of RAMDBG 0xE0003 & store SPRG0
/// 2) Check if SPRG0 has address within valid PIBMEM range
/// 3) If in valid range, then read the PIBMEM Save-off data
/// 4) If PIBMEM Saveoff data not available then Perform RAMMING SRR0, SRR1, FI2C CNFG & STATUS (if valid)
-/// 5) Update l_data_iar to SRR0 value (if valid)
+/// 5) Update l_data32_iar to SRR0 value (if valid)
/// Level 1 :
-/// 1) Read the value of DBGPRO 0xE0005 & Store IAR
-/// 2) Identify if PPE is halted from XSR Bit0, Continue only if halted
-/// 3) If Halted, Check for Halt Conditions(HC) i.e XSR (1:3)
-/// 4) If HC is all Zero report error else Print the Halt condition reported
-/// 5) Print info of XSR bits 7,8,12,13,14,21,28 if TRUE
-/// 6) Read the value of XIRAMEDR 0xE0004 & Store IR and EDR
-/// 7) Check for Machine Check State(MCS) i.e XSR (29:31)
-/// 8) if MCS=0x4 OR Link Register contains Program Interrupt offset
+/// 1) Check for Halt Conditions(HC) i.e XSR (1:3)
+/// 2) If HC is all Zero report error else Print the Halt condition reported
+/// 3) Print info of XSR bits 7,8,12,13,14,21,28 if TRUE
+/// 4) Read the value of XIRAMEDR 0xE0004 & Store IR and EDR
+/// 5) Check for Machine Check State(MCS) i.e XSR (29:31)
+/// 6) if MCS=0x4 OR Link Register contains PIBMEM Program Interrupt offset OR Current IAR has OTPROM Program Interrupt offset
/// Look for IAR range and report specific memory program error
-/// 8) if MCS=0x5 OR Link Register contains Instruction storage interrupt offset
+/// Reading SB_MSG register to collect SBE Code state bits(bit 30:31) & SBE booted bit (bit 0) to report error of specific boot stage
+/// 7) if MCS=0x5 OR Link Register contains PIBMEM Instruction storage interrupt offset OR Current IAR has OTPROM Instruction storage interrupt offset
/// Look for IAR range and report specific memory program error
-/// 8) if MCS=0x6 OR Link Register contains Alignment interrupt offset
+/// 8) if MCS=0x6 OR Link Register contains PIBMEM Alignment interrupt offset OR Current IAR has OTPROM Alignment interrupt offset
/// Look for IAR range and report specific memory program error
-/// 8) if MCS=0x7 OR Link Register contains Data storage interrupt offset
+/// 9) if MCS=0x7 OR Link Register contains PIBMEM Data storage interrupt offset OR Current IAR has OTPROM Data storage interrupt offset
/// Look for IAR range and report specific memory program error
-/// 9) elseif MCS=0x1, 0x2, 0x3, Set the flag as Data Machine Check - l_data_mchk
+/// 10) elseif MCS=0x1, 0x2, 0x3, Set the flag as Data Machine Check - l_data_mchk
/// Level 2 :
/// 1) Based on IAR value identifying the Memory Address range
/// OTPROM (0x000C0000 to 0x000C0378)
@@ -547,7 +552,6 @@ fapi2::ReturnCode p9_extract_sbe_rc(const fapi2::Target<fapi2::TARGET_TYPE_PROC_
FAPI_ASSERT(FAIL, fapi2::EXTRACT_SBE_RC_MAGIC_NUMBER_MISMATCH()
.set_TARGET_CHIP(i_target_chip),
"ERROR:Program Interrupt occured, probably MAGIC NUMBER MISMATCH");
-
}
else
{
@@ -566,17 +570,20 @@ fapi2::ReturnCode p9_extract_sbe_rc(const fapi2::Target<fapi2::TARGET_TYPE_PROC_
if(!l_is_ndd1)
{
fapi2::buffer<uint8_t> l_sbe_code_state;
+ bool l_sbe_booted = false;
FAPI_DBG("p9_extract_sbe_rc : Reading SB_MSG register to collect SBE Code state bits");
if(l_is_HB_module && !i_set_sdb) //HB calling Master Proc or HB calling Slave after SMP
{
FAPI_TRY(getScom(i_target_chip, PERV_SB_MSG_SCOM, l_data64));
l_data64.extractToRight(l_sbe_code_state, 30, 2);
+ l_sbe_booted = l_data64.getBit<0>();
}
else
{
FAPI_TRY(getCfamRegister(i_target_chip, PERV_SB_MSG_FSI, l_data32));
l_data32.extractToRight(l_sbe_code_state, 30, 2);
+ l_sbe_booted = l_data32.getBit<0>();
}
if(l_sbe_code_state == 0x2)
@@ -585,16 +592,15 @@ fapi2::ReturnCode p9_extract_sbe_rc(const fapi2::Target<fapi2::TARGET_TYPE_PROC_
FAPI_ASSERT(FAIL, fapi2::EXTRACT_SBE_RC_SBE_L1_LOADER_FAIL()
.set_TARGET_CHIP(i_target_chip),
"ERROR:Program Interrupt occured during base loader (L1)");
-
}
- else if(l_sbe_code_state == 0x3)
+ else if(l_sbe_code_state == 0x3 && (!l_sbe_booted))
{
o_return_action = P9_EXTRACT_SBE_RC::REIPL_BKP_SEEPROM;
FAPI_ASSERT(FAIL, fapi2::EXTRACT_SBE_RC_SBE_L2_LOADER_FAIL()
.set_TARGET_CHIP(i_target_chip),
"ERROR:Program Interrupt occured during L2 loader or pk boot")
}
- else
+ else if(!l_sbe_booted)
{
FAPI_ERR("p9_extract_sbe_rc : SBE code state value = %02X is invalid", l_sbe_code_state);
}
OpenPOWER on IntegriCloud