summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/mdia
diff options
context:
space:
mode:
authorBrad Bishop <bradleyb@us.ibm.com>2013-02-07 16:34:41 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-02-13 09:02:31 -0600
commit6a008dc64673b6cd04453fcc794ec8525e0e9c42 (patch)
tree5b65668bc4267654cceb46bf374102c4d041b949 /src/usr/diag/mdia
parent43c3ce15b5d8db8096eece1ab5ea656006bf53fb (diff)
downloadtalos-hostboot-6a008dc64673b6cd04453fcc794ec8525e0e9c42.tar.gz
talos-hostboot-6a008dc64673b6cd04453fcc794ec8525e0e9c42.zip
MDIA: Support for restarting stopped commands.
Change-Id: I548976c15e20f3b88c2fc5cd8d80000ddb3aea7f Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/3127 Tested-by: Jenkins Server Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-by: Christopher T. Phan <cphan@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/diag/mdia')
-rw-r--r--src/usr/diag/mdia/mdiafwd.H13
-rw-r--r--src/usr/diag/mdia/mdiasm.C144
2 files changed, 103 insertions, 54 deletions
diff --git a/src/usr/diag/mdia/mdiafwd.H b/src/usr/diag/mdia/mdiafwd.H
index 75dd2a846..213743c35 100644
--- a/src/usr/diag/mdia/mdiafwd.H
+++ b/src/usr/diag/mdia/mdiafwd.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012 */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
/* */
/* p1 */
/* */
@@ -69,6 +69,17 @@ enum DiagMode
};
/**
+ * @brief misc constants
+ */
+enum
+{
+ /**
+ * @brief maint command address register
+ */
+ MBA01_MBMACAQ = 0x0301060D,
+};
+
+/**
* @brief workflow status
*/
enum WorkFlowStatus
diff --git a/src/usr/diag/mdia/mdiasm.C b/src/usr/diag/mdia/mdiasm.C
index a8cc84d73..b94e062d0 100644
--- a/src/usr/diag/mdia/mdiasm.C
+++ b/src/usr/diag/mdia/mdiasm.C
@@ -37,11 +37,13 @@
#include <fapi.H>
#include <fapiPlatHwpInvoker.H>
#include <diag/prdf/common/prdfMain.H>
+#include <devicefw/userif.H>
using namespace TARGETING;
using namespace ERRORLOG;
using namespace std;
using namespace fapi;
+using namespace DeviceFW;
namespace MDIA
{
@@ -436,13 +438,14 @@ errlHndl_t StateMachine::doMaintCommand(WorkFlowProperties & i_wfp)
do {
- FAPI_INVOKE_HWP(
- err,
- mss_get_address_range,
+ // assume the full range for now
+
+ ReturnCode fapirc = mss_get_address_range(
fapiMba,
MSS_ALL_RANKS,
startAddr,
endAddr);
+ err = fapiRcToErrl(fapirc);
if(err)
{
@@ -452,70 +455,105 @@ errlHndl_t StateMachine::doMaintCommand(WorkFlowProperties & i_wfp)
if(restart)
{
+ // bump the starting address if we are restarting
+ // a command
+
cmd = new mss_IncrementAddress(fapiMba);
MDIA_FAST("sm: increment address on: %p", targetMba);
- }
- else
- {
- switch(workItem)
- {
- case START_RANDOM_PATTERN:
- cmd = new mss_SuperFastRandomInit(
- fapiMba,
- startAddr,
- endAddr,
- mss_MaintCmd::PATTERN_RANDOM,
- stopCondition,
- false);
-
- MDIA_FAST("sm: random init on: %p", targetMba);
- break;
- case START_SCRUB:
- cmd = new mss_SuperFastRead(
- fapiMba,
- startAddr,
- endAddr,
- stopCondition,
- false);
+ fapirc = cmd->setupAndExecuteCmd();
- MDIA_FAST("sm: scrub on: %p", targetMba);
- break;
+ delete cmd;
+ cmd = NULL;
- case START_PATTERN_0:
- case START_PATTERN_1:
- case START_PATTERN_2:
- case START_PATTERN_3:
- case START_PATTERN_4:
- case START_PATTERN_5:
- case START_PATTERN_6:
- case START_PATTERN_7:
-
- cmd = new mss_SuperFastInit(
- fapiMba,
- startAddr,
- endAddr,
- static_cast<mss_MaintCmd::PatternIndex>(workItem),
- stopCondition,
- false);
-
- MDIA_FAST("sm: init on: %p", targetMba);
- break;
+ err = fapiRcToErrl(fapirc);
- default:
- break;
+ if(err)
+ {
+ MDIA_FAST("sm: setupAndExecuteCmd failed");
+ break;
}
- if(!cmd)
+ // read the address out so it can be passed
+ // to the command being restarted
+
+ uint64_t address;
+ size_t size = sizeof(address);
+
+ err = deviceRead(
+ targetMba,
+ &address,
+ size,
+ DEVICE_SCOM_ADDRESS(MBA01_MBMACAQ));
+
+ if(err)
{
- MDIA_ERR("unrecognized maint command type %d on: %p",
- workItem, targetMba);
+ MDIA_FAST("sm: reading address failed");
+
break;
}
+
+ startAddr.setDoubleWord(0, address);
+ }
+
+ switch(workItem)
+ {
+ case START_RANDOM_PATTERN:
+ cmd = new mss_SuperFastRandomInit(
+ fapiMba,
+ startAddr,
+ endAddr,
+ mss_MaintCmd::PATTERN_RANDOM,
+ stopCondition,
+ false);
+
+ MDIA_FAST("sm: random init on: %p", targetMba);
+ break;
+
+ case START_SCRUB:
+ cmd = new mss_SuperFastRead(
+ fapiMba,
+ startAddr,
+ endAddr,
+ stopCondition,
+ false);
+
+ MDIA_FAST("sm: scrub on: %p", targetMba);
+ break;
+
+ case START_PATTERN_0:
+ case START_PATTERN_1:
+ case START_PATTERN_2:
+ case START_PATTERN_3:
+ case START_PATTERN_4:
+ case START_PATTERN_5:
+ case START_PATTERN_6:
+ case START_PATTERN_7:
+
+ cmd = new mss_SuperFastInit(
+ fapiMba,
+ startAddr,
+ endAddr,
+ static_cast<mss_MaintCmd::PatternIndex>(workItem),
+ stopCondition,
+ false);
+
+ MDIA_FAST("sm: init on: %p", targetMba);
+ break;
+
+ default:
+ break;
+ }
+
+ if(!cmd)
+ {
+ MDIA_ERR("unrecognized maint command type %d on: %p",
+ workItem, targetMba);
+ break;
}
- ReturnCode fapirc = cmd->setupAndExecuteCmd();
+ fapirc = cmd->setupAndExecuteCmd();
err = fapiRcToErrl(fapirc);
if(err || !cmd)
OpenPOWER on IntegriCloud