summaryrefslogtreecommitdiffstats
path: root/src/usr/scom/scom.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/scom/scom.C')
-rw-r--r--src/usr/scom/scom.C71
1 files changed, 63 insertions, 8 deletions
diff --git a/src/usr/scom/scom.C b/src/usr/scom/scom.C
index e11736f62..6cded14e5 100644
--- a/src/usr/scom/scom.C
+++ b/src/usr/scom/scom.C
@@ -57,8 +57,8 @@ namespace SCOM
* @param[in] i_target Target of SCOM operation
* @param[in] i_addr SCOM address
*/
-void addScomFailFFFDC( errlHndl_t i_err,
- TARGETING::Target* i_target,
+void addScomFailFFDC( errlHndl_t i_err,
+ TARGETING::Target* i_target,
uint64_t i_addr );
@@ -310,6 +310,7 @@ errlHndl_t checkIndirectAndDoScom(DeviceFW::OperationType i_opType,
//Add the callouts for the specific PCB/PIB error
PIB::addFruCallouts( i_target,
scomout.piberr,
+ i_addr,
l_err );
//Add this target to the FFDC
@@ -426,6 +427,7 @@ errlHndl_t checkIndirectAndDoScom(DeviceFW::OperationType i_opType,
//Add the callouts for the specific PCB/PIB error
PIB::addFruCallouts( i_target,
scomout.piberr,
+ i_addr,
l_err );
//Add this target to the FFDC
@@ -553,7 +555,7 @@ errlHndl_t doScomOp(DeviceFW::OperationType i_opType,
//Add some additional FFDC based on the specific operation
if( l_err )
{
- addScomFailFFFDC( l_err, i_target, i_addr );
+ addScomFailFFDC( l_err, i_target, i_addr );
}
return l_err;
@@ -562,18 +564,18 @@ errlHndl_t doScomOp(DeviceFW::OperationType i_opType,
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
-void addScomFailFFFDC( errlHndl_t i_err,
- TARGETING::Target* i_target,
- uint64_t i_addr )
+void addScomFailFFDC( errlHndl_t i_err,
+ TARGETING::Target* i_target,
+ uint64_t i_addr )
{
// Read some error regs from scom
ERRORLOG::ErrlUserDetailsLogRegister l_scom_data(i_target);
bool addit = false;
+ TARGETING::TYPE l_type = i_target->getAttr<TARGETING::ATTR_TYPE>();
//PBA scoms on the processor
if( ((i_addr & 0xFFFFF000) == 0x00064000)
- && (TARGETING::TYPE_PROC
- == i_target->getAttr<TARGETING::ATTR_TYPE>()) )
+ && (TARGETING::TYPE_PROC == l_type) )
{
addit = true;
//look for hung operations on the PBA
@@ -592,6 +594,59 @@ void addScomFailFFFDC( errlHndl_t i_err,
l_scom_data.addData(DEVICE_SCOM_ADDRESS(ffdc_regs[x]));
}
}
+ //EX scoms on the processor (not including PCB slave regs)
+ else if( ((i_addr & 0xF0000000) == 0x10000000)
+ && ((i_addr & 0x00FF0000) != 0x000F0000)
+ && (TARGETING::TYPE_PROC == l_type) )
+ {
+ addit = true;
+ uint64_t ex_offset = 0xFF000000 & i_addr;
+ //grab some data related to the PCB slave state
+ uint64_t ffdc_regs[] = {
+ 0x0F010B, //Special Wakeup
+ 0x0F0012, //GP3
+ 0x0F0100, //PowerManagement GP0
+ 0x0F0106, //PFET Status Core
+ 0x0F010E, //PFET Status ECO
+ 0x0F0111, //PM State History
+ };
+ for( size_t x = 0; x < (sizeof(ffdc_regs)/sizeof(ffdc_regs[0])); x++ )
+ {
+ l_scom_data.addData(DEVICE_SCOM_ADDRESS(ex_offset|ffdc_regs[x]));
+ }
+ }
+
+ //Any non-PCB Slave and non TP reg on the processor
+ if( ((i_addr & 0x00FF0000) != 0x000F0000)
+ && ((i_addr & 0xFF000000) != 0x00000000)
+ && (TARGETING::TYPE_PROC == l_type) )
+ {
+ addit = true;
+ uint64_t chiplet_offset = 0xFF000000 & i_addr;
+ //grab some data related to the PCB slave state
+ uint64_t ffdc_regs[] = {
+ 0x0F0012, //GP3
+ 0x0F001F, //Error capture reg
+ };
+ for( size_t x = 0; x < (sizeof(ffdc_regs)/sizeof(ffdc_regs[0])); x++ )
+ {
+ l_scom_data.addData( DEVICE_SCOM_ADDRESS(
+ chiplet_offset|ffdc_regs[x]) );
+ }
+
+ //grab the clock/osc regs
+ l_scom_data.addData(DEVICE_SCOM_ADDRESS(0x00050019));
+ l_scom_data.addData(DEVICE_SCOM_ADDRESS(0x0005001A));
+ //grab the clock regs via FSI too, just in case
+ TARGETING::Target* mproc = NULL;
+ TARGETING::targetService().masterProcChipTargetHandle(mproc);
+ if( (i_target != TARGETING::MASTER_PROCESSOR_CHIP_TARGET_SENTINEL)
+ && (i_target != mproc) )
+ {
+ l_scom_data.addData(DEVICE_FSI_ADDRESS(0x2864));//==2819
+ l_scom_data.addData(DEVICE_FSI_ADDRESS(0x2868));//==281A
+ }
+ }
if( addit )
{
OpenPOWER on IntegriCloud