summaryrefslogtreecommitdiffstats
path: root/src/occ_gpe0/firdata/pnor_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/pnor_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/pnor_mboxdd.c')
-rw-r--r--src/occ_gpe0/firdata/pnor_mboxdd.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/occ_gpe0/firdata/pnor_mboxdd.c b/src/occ_gpe0/firdata/pnor_mboxdd.c
index 9c5a4e6..4251eda 100644
--- a/src/occ_gpe0/firdata/pnor_mboxdd.c
+++ b/src/occ_gpe0/firdata/pnor_mboxdd.c
@@ -42,6 +42,7 @@ errorHndl_t hwInit(pnorMbox_t* i_pnorMbox)
errorHndl_t l_err = NO_ERROR;
uint8_t* l_data;
int i;
+ int l_arg_size = 0;
do
{
//Current window starts closed
@@ -65,7 +66,8 @@ errorHndl_t hwInit(pnorMbox_t* i_pnorMbox)
l_getInfoMsg.iv_cmd = MBOX_C_GET_MBOX_INFO;
put8(&l_getInfoMsg, 0, 2);
- l_err = doMessage(&i_pnorMbox->iv_mbox, &l_getInfoMsg);
+ l_arg_size = 1;
+ l_err = doMessage(&i_pnorMbox->iv_mbox, &l_getInfoMsg, l_arg_size);
if (l_err)
{
TRAC_ERR("doMessage to ping BMC failed with rc=0x%x", l_err);
@@ -89,7 +91,8 @@ errorHndl_t hwInit(pnorMbox_t* i_pnorMbox)
//Now get the size of the flash
mboxMessage_t l_getSizeMsg;
l_getSizeMsg.iv_cmd = MBOX_C_GET_FLASH_INFO;
- l_err = doMessage(&i_pnorMbox->iv_mbox, &l_getSizeMsg);
+ l_arg_size = 0;
+ l_err = doMessage(&i_pnorMbox->iv_mbox, &l_getSizeMsg, l_arg_size);
if (l_err)
{
TRAC_ERR("doMessage failed to get flash size rc=0x%x", l_err);
@@ -220,9 +223,9 @@ errorHndl_t writeFlash(pnorMbox_t* i_pnorMbox,
break;
}
- //For whatever reason LPC writes can only handle 4 bytes at a time
- //We write 256 bytes from the previous functions, so break up the
- //large write into 4 byte writes
+ //LPC writes are done via LPC scom interface and can only handle 4
+ //bytes at a time. We write 256 bytes from the previous functions,
+ // so break up the large write into 4 byte writes
uint32_t l_size_written = 0;
uint32_t l_lpc_write_size = 4; //in bytes
uint8_t *l_lpc_write_data = i_data;
@@ -263,9 +266,6 @@ errorHndl_t writeFlash(pnorMbox_t* i_pnorMbox,
}
/* We flush whether we had an error or not.
- *
- * NOTE: It would help the daemon a lot if we moved that out of here
- * and instead had a single flush call over a series of writes.
*/
l_flushErr = writeFlush(i_pnorMbox);
@@ -292,6 +292,7 @@ errorHndl_t adjustMboxWindow(pnorMbox_t* i_pnorMbox,
{
errorHndl_t l_err = NO_ERROR;
uint32_t l_pos, l_wSize, l_reqSize;
+ int l_arg_size = 0;
do
{
@@ -361,7 +362,8 @@ errorHndl_t adjustMboxWindow(pnorMbox_t* i_pnorMbox,
put16(&winMsg, 0, l_pos >> i_pnorMbox->iv_blockShift);
put16(&winMsg, 2, l_reqSize >> i_pnorMbox->iv_blockShift);
- l_err = doMessage(&i_pnorMbox->iv_mbox, &winMsg);
+ l_arg_size = 4;
+ l_err = doMessage(&i_pnorMbox->iv_mbox, &winMsg, l_arg_size);
if (l_err)
{
@@ -406,6 +408,7 @@ errorHndl_t writeDirty(pnorMbox_t* i_pnorMbox, uint32_t i_addr, uint32_t i_size)
uint32_t l_blockMask = (1u << i_pnorMbox->iv_blockShift) - 1;
uint32_t l_start = i_addr & ~l_blockMask;
uint32_t l_end = ((i_addr + i_size) + l_blockMask) & ~l_blockMask;
+ int l_arg_size = 0;
mboxMessage_t dirtyMsg;
dirtyMsg.iv_cmd = MBOX_C_MARK_WRITE_DIRTY;
@@ -422,16 +425,18 @@ errorHndl_t writeDirty(pnorMbox_t* i_pnorMbox, uint32_t i_addr, uint32_t i_size)
put16(&dirtyMsg, 2, (l_end - l_start) >> i_pnorMbox->iv_blockShift);
}
- return doMessage(&i_pnorMbox->iv_mbox, &dirtyMsg);
+ l_arg_size = 4;
+ return doMessage(&i_pnorMbox->iv_mbox, &dirtyMsg, l_arg_size);
}
errorHndl_t writeFlush(pnorMbox_t* i_pnorMbox)
{
mboxMessage_t flushMsg;
flushMsg.iv_cmd = MBOX_C_WRITE_FLUSH;
+ int l_arg_size = 0;
put16(&flushMsg, 0, 0);
put32(&flushMsg, 2, 0);
- return doMessage(&i_pnorMbox->iv_mbox, &flushMsg);
+ return doMessage(&i_pnorMbox->iv_mbox, &flushMsg, l_arg_size);
}
OpenPOWER on IntegriCloud