summaryrefslogtreecommitdiffstats
path: root/src/occ_gpe0/firdata/ast_mboxdd.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@us.ibm.com>2018-08-29 16:16:57 -0500
committerWilliam A. Bryan <wilbryan@us.ibm.com>2018-09-25 14:49:42 -0500
commit3e23a4ef97bc78aa8c8cf691407fdf9b8da30664 (patch)
tree713aca74d5dc0c3acf1813bce2dba1003cff0187 /src/occ_gpe0/firdata/ast_mboxdd.c
parent1de1be8ec36b461f04bbe417023dbff3de5071f4 (diff)
downloadtalos-occ-3e23a4ef97bc78aa8c8cf691407fdf9b8da30664.tar.gz
talos-occ-3e23a4ef97bc78aa8c8cf691407fdf9b8da30664.zip
Write firdata to PNOR over IPMI
Change-Id: I50c586baf2c2cb2a83ffb30e81304eef3d65119c Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/65953 Reviewed-by: Martha Broyles <mbroyles@us.ibm.com> Reviewed-by: ANDREW R. JEFFERY <andrewrj@au1.ibm.com> Reviewed-by: William A. Bryan <wilbryan@us.ibm.com> Tested-by: William A. Bryan <wilbryan@us.ibm.com>
Diffstat (limited to 'src/occ_gpe0/firdata/ast_mboxdd.c')
-rw-r--r--src/occ_gpe0/firdata/ast_mboxdd.c197
1 files changed, 105 insertions, 92 deletions
diff --git a/src/occ_gpe0/firdata/ast_mboxdd.c b/src/occ_gpe0/firdata/ast_mboxdd.c
index 397a01d..a9d2c24 100644
--- a/src/occ_gpe0/firdata/ast_mboxdd.c
+++ b/src/occ_gpe0/firdata/ast_mboxdd.c
@@ -37,6 +37,9 @@
#include <lpc.h>
#include <gpe_util.h>
+int ipmi_sendCommand(mboxMessage_t *io_msg, int i_arg_size);
+
+
errorHndl_t writeRegSIO(uint8_t i_regAddr, uint8_t i_data)
{
errorHndl_t l_err = NO_ERROR;
@@ -105,7 +108,8 @@ errorHndl_t mboxIn(uint64_t i_addr, uint8_t *o_byte)
len );
}
-errorHndl_t doMessage( astMbox_t *io_mbox, mboxMessage_t *io_msg )
+
+errorHndl_t doMessage( astMbox_t *io_mbox, mboxMessage_t *io_msg, int i_arg_size )
{
uint8_t* l_data = (uint8_t*)io_msg;
errorHndl_t l_err = NO_ERROR;
@@ -116,128 +120,137 @@ errorHndl_t doMessage( astMbox_t *io_mbox, mboxMessage_t *io_msg )
io_msg->iv_seq = io_mbox->iv_mboxMsgSeq++;
- do
+ //First try to send the message over IPMI
+ l_err = ipmi_sendCommand(io_msg, i_arg_size);
+
+ // If it didn't work then try to access the AST MBOX via LPC
+ // This is allowd for the case of an older BMC. Eventually it could
+ // be removed.
+ if(l_err)
{
- /* Write message out */
- for (i = 0; i < BMC_MBOX_DATA_REGS && !l_err; i++)
+ do
{
- l_err = mboxOut(i, l_data[i]);
- }
+ /* Write message out */
+ for (i = 0; i < BMC_MBOX_DATA_REGS && !l_err; i++)
+ {
+ l_err = mboxOut(i, l_data[i]);
+ }
- if ( l_err )
- {
- break;
- }
+ if ( l_err )
+ {
+ break;
+ }
- /* Clear status1 response bit as it was just set via reg write*/
- l_err = mboxOut(MBOX_STATUS_1, MBOX_STATUS1_RESP);
+ /* Clear status1 response bit as it was just set via reg write*/
+ l_err = mboxOut(MBOX_STATUS_1, MBOX_STATUS1_RESP);
- if ( l_err )
- {
- break;
- }
+ if ( l_err )
+ {
+ break;
+ }
- /* Ping BMC */
- l_err = mboxOut(MBOX_HOST_CTRL, MBOX_CTRL_INT_SEND);
+ /* Ping BMC */
+ l_err = mboxOut(MBOX_HOST_CTRL, MBOX_CTRL_INT_SEND);
- if ( l_err )
- {
- break;
- }
+ if ( l_err )
+ {
+ break;
+ }
- /* Wait for response */
- while ( l_loops++ < MBOX_MAX_RESP_WAIT_US && !l_err )
- {
- l_err = mboxIn(MBOX_STATUS_1, &l_stat1);
+ /* Wait for response */
+ while ( l_loops++ < MBOX_MAX_RESP_WAIT_US && !l_err )
+ {
+ l_err = mboxIn(MBOX_STATUS_1, &l_stat1);
+
+ if ( l_err )
+ {
+ TRAC_ERR("doMessage error from MBOX_STATUS_1");
+ break;
+ }
+
+ if ( l_stat1 & MBOX_STATUS1_RESP )
+ {
+ break;
+ }
+
+ busy_wait(1000);
+ }
if ( l_err )
{
- TRAC_ERR("doMessage error from MBOX_STATUS_1");
+ TRAC_ERR( "Got error waiting for response !");
break;
}
- if ( l_stat1 & MBOX_STATUS1_RESP )
+ if ( !(l_stat1 & MBOX_STATUS1_RESP) )
{
+ TRAC_ERR( "Timeout waiting for response !");
+
+ // Don't try to interrupt the BMC anymore
+ l_err = mboxOut(MBOX_HOST_CTRL, 0);
+ if ( l_err)
+ {
+ //Note the command failed
+ TRAC_ERR( "Error communicating with MBOX daemon");
+ TRAC_ERR( "Mbox status 1 reg: %x", l_stat1);
+ }
+
+ // Tell the code below that we generated the error
+ // (not an LPC error)
+ l_prot_error = true;
break;
}
- busy_wait(1000);
- }
-
- if ( l_err )
- {
- TRAC_ERR( "Got error waiting for response !");
- break;
- }
-
- if ( !(l_stat1 & MBOX_STATUS1_RESP) )
- {
- TRAC_ERR( "Timeout waiting for response !");
-
- // Don't try to interrupt the BMC anymore
- l_err = mboxOut(MBOX_HOST_CTRL, 0);
- if ( l_err)
+ /* Clear status */
+ l_err = mboxOut(MBOX_STATUS_1, MBOX_STATUS1_RESP);
+ if (l_err)
{
- //Note the command failed
- TRAC_ERR( "Error communicating with MBOX daemon");
- TRAC_ERR( "Mbox status 1 reg: %x", l_stat1);
+ TRAC_ERR( "Got error clearing status");
+ break;
}
- // Tell the code below that we generated the error
- // (not an LPC error)
- l_prot_error = true;
- break;
- }
+ // Remember some message fields before they get overwritten
+ // by the response
+ uint8_t old_seq = io_msg->iv_seq;
- /* Clear status */
- l_err = mboxOut(MBOX_STATUS_1, MBOX_STATUS1_RESP);
- if (l_err)
- {
- TRAC_ERR( "Got error clearing status");
- break;
- }
+ // Read response
+ for (i = 0; i < BMC_MBOX_DATA_REGS && !l_err; i++)
+ {
+ l_err = mboxIn(i, &l_data[i]);
+ }
- // Remember some message fields before they get overwritten
- // by the response
- uint8_t old_seq = io_msg->iv_seq;
+ if ( l_err )
+ {
+ TRAC_ERR( "Got error reading response !");
+ break;
+ }
- // Read response
- for (i = 0; i < BMC_MBOX_DATA_REGS && !l_err; i++)
- {
- l_err = mboxIn(i, &l_data[i]);
- }
+ if (old_seq != io_msg->iv_seq)
+ {
+ TRAC_ERR( "bad sequence number in mbox message, got %d want %d",
+ io_msg->iv_seq, old_seq);
+ l_err = -1;
+ break;
+ }
- if ( l_err )
- {
- TRAC_ERR( "Got error reading response !");
- break;
- }
+ if (io_msg->iv_resp != MBOX_R_SUCCESS)
+ {
+ TRAC_ERR( "BMC mbox command failed with err %d",
+ io_msg->iv_resp);
+ l_err = -1;
+ // Tell code below that we generated the error (not an LPC error)
+ l_prot_error = true;
+ break;
+ }
- if (old_seq != io_msg->iv_seq)
- {
- TRAC_ERR( "bad sequence number in mbox message, got %d want %d",
- io_msg->iv_seq, old_seq);
- l_err = -1;
- break;
}
+ while(0);
- if (io_msg->iv_resp != MBOX_R_SUCCESS)
+ // If we got an LPC error, commit it and generate our own
+ if ( l_err && !l_prot_error )
{
- TRAC_ERR( "BMC mbox command failed with err %d",
- io_msg->iv_resp);
l_err = -1;
- // Tell code below that we generated the error (not an LPC error)
- l_prot_error = true;
- break;
}
-
- }
- while(0);
-
- // If we got an LPC error, commit it and generate our own
- if ( l_err && !l_prot_error )
- {
- l_err = -1;
}
return l_err;
OpenPOWER on IntegriCloud