diff options
| -rw-r--r-- | src/usr/diag/mdia/mdiafwd.H | 32 | ||||
| -rw-r--r-- | src/usr/diag/mdia/mdiasm.C | 100 |
2 files changed, 128 insertions, 4 deletions
diff --git a/src/usr/diag/mdia/mdiafwd.H b/src/usr/diag/mdia/mdiafwd.H index 213743c35..83186f23e 100644 --- a/src/usr/diag/mdia/mdiafwd.H +++ b/src/usr/diag/mdia/mdiafwd.H @@ -73,10 +73,34 @@ enum DiagMode */ enum { - /** - * @brief maint command address register - */ - MBA01_MBMACAQ = 0x0301060D, + // mem chiplet regs + MEM_SPA_FIR = 0x03040004, + MEM_SPA_FIR_MASK = 0x03040007, + + // mba unit regs + MBA01_SPA = 0X03010611, + MBA01_SPA_MASK = 0X03010614, + MBA01_CMD_TYPE = 0X0301060A, + MBA01_CMD_CONTROL = 0X0301060B, + MBA01_CMD_STATUS = 0X0301060C, + MBA01_MBMACAQ = 0X0301060D, + MBA01_MBMEA = 0X0301060E, + + // mcs unit regs + MCI_FIR = 0x02011840, + MCI_FIR_MASK = 0x02011843, + MCI_FIR_ACT0 = 0x02011846, + MCI_FIR_ACT1 = 0x02011847, + MCS_MODE4 = 0x0201181A, + + // proc regs + HOST_ATTN_PRES = 0x01020000, + HOST_ATTN_MASK = 0x0102000C, + HOST_ATTN_CFG = 0x0102000F, + IPOLL_MASK = 0x01020013, + IPOLL_STATUS = 0x01020014, + PBUS_GP1 = 0x02000001, + PBUS_GP2 = 0x02000002, }; /** diff --git a/src/usr/diag/mdia/mdiasm.C b/src/usr/diag/mdia/mdiasm.C index f46575c8c..5e9a8132a 100644 --- a/src/usr/diag/mdia/mdiasm.C +++ b/src/usr/diag/mdia/mdiasm.C @@ -38,6 +38,8 @@ #include <fapiPlatHwpInvoker.H> #include <diag/prdf/prdfMain.H> #include <devicefw/userif.H> +#include <targeting/common/utilFilter.H> +#include <errl/errludlogregister.H> using namespace TARGETING; using namespace ERRORLOG; @@ -57,6 +59,100 @@ void StateMachine::running(bool & o_running) mutex_unlock(&iv_mutex); } +void addTimeoutFFDC(TargetHandle_t i_mba, errlHndl_t & io_log) +{ + const uint64_t mbaRegs[] = { + MBA01_SPA, + MBA01_SPA_MASK, + MBA01_CMD_TYPE, + MBA01_CMD_CONTROL, + MBA01_CMD_STATUS, + MBA01_MBMACAQ, + MBA01_MBMEA, + }; + + const uint64_t membufRegs[] = { + MEM_SPA_FIR, + MEM_SPA_FIR_MASK, + }; + + const uint64_t mcsRegs[] = { + MCI_FIR, + MCI_FIR_MASK, + MCI_FIR_ACT0, + MCI_FIR_ACT1, + MCS_MODE4, + }; + + const uint64_t procRegs[] = { + HOST_ATTN_PRES, + HOST_ATTN_MASK, + HOST_ATTN_CFG, + IPOLL_MASK, + IPOLL_STATUS, + PBUS_GP1, + PBUS_GP2, + }; + + // get the parent membuf + ConstTargetHandle_t membuf = getParentChip(i_mba); + + // get the parent mcs + TargetHandleList targetList; + TargetHandle_t mcs = NULL; + if(membuf) + { + getParentAffinityTargets( + targetList, + membuf, + CLASS_UNIT, + TYPE_MCS); + } + if(targetList.size() == 1) + { + mcs = targetList[0]; + } + + // get the parent proc + ConstTargetHandle_t proc = NULL; + if(mcs) + { + proc = getParentChip(mcs); + } + + const struct Entry + { + TARGETING::ConstTargetHandle_t target; + const uint64_t * begin; + const uint64_t * end; + } tables[] = { + {i_mba, mbaRegs, mbaRegs + sizeof(mbaRegs)/sizeof(*mbaRegs)}, + {membuf, + membufRegs, membufRegs + sizeof(membufRegs)/sizeof(*membufRegs)}, + {mcs, mcsRegs, mcsRegs + sizeof(mcsRegs)/sizeof(*mcsRegs)}, + {proc, procRegs, procRegs + sizeof(procRegs)/sizeof(*procRegs)}, + }; + + for(const Entry * tableIt = tables; + tableIt != tables + sizeof(tables)/sizeof(*tables); + ++tableIt) + { + if(!tableIt->target) + { + continue; + } + for(const uint64_t * regIt = tableIt->begin; + regIt != tableIt->end; + ++regIt) + { + ErrlUserDetailsLogRegister udLogRegister( + tableIt->target, + DEVICE_SCOM_ADDRESS(*regIt)); + udLogRegister.addToLog(io_log); + } + } +} + void StateMachine::processCommandTimeout(const MonitorIDs & i_monitorIDs) { MDIA_FAST("sm: processCommandTimeout"); @@ -106,6 +202,10 @@ void StateMachine::processCommandTimeout(const MonitorIDs & i_monitorIDs) MAINT_COMMAND_TIMED_OUT, *((*wit)->workItem), 0); + // collect ffdc + + addTimeoutFFDC(target, err); + err->addHwCallout(target, HWAS::SRCI_PRIORITY_HIGH, HWAS::DECONFIG, |

