summaryrefslogtreecommitdiffstats
path: root/src/occ_gpe0/firdata/pnor_mboxdd.c
diff options
context:
space:
mode:
authorBill Hoffa <wghoffa@us.ibm.com>2017-07-19 14:53:01 -0500
committerWilliam A. Bryan <wilbryan@us.ibm.com>2017-07-22 16:29:49 -0400
commit56ecb493705fef5b2275b94329836f8690ef0865 (patch)
tree0de3ef2b3fb966c4fcc0044398d03593cab0df0b /src/occ_gpe0/firdata/pnor_mboxdd.c
parent7990cb411443a3d30a40f2cd101732fc353bcd38 (diff)
downloadtalos-occ-56ecb493705fef5b2275b94329836f8690ef0865.tar.gz
talos-occ-56ecb493705fef5b2275b94329836f8690ef0865.zip
PNOR Write Fixes for FIRDATA collection path
- Updated write_pnor_8B() to add ECC - Removed memcpy calls as they cause unaligned accesses - LPC accesses modified to only be 4 bytes at a time Change-Id: I2bc2fddce3e652f97890962754f8dfa2e2e8d9aa Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43458 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Prachi Gupta <pragupta@us.ibm.com> Reviewed-by: ILYA SMIRNOV <ismirno@us.ibm.com> Reviewed-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.c55
1 files changed, 44 insertions, 11 deletions
diff --git a/src/occ_gpe0/firdata/pnor_mboxdd.c b/src/occ_gpe0/firdata/pnor_mboxdd.c
index 19aaf5d..9c5a4e6 100644
--- a/src/occ_gpe0/firdata/pnor_mboxdd.c
+++ b/src/occ_gpe0/firdata/pnor_mboxdd.c
@@ -186,7 +186,6 @@ errorHndl_t writeFlash(pnorMbox_t* i_pnorMbox,
return FAIL;
}
-
errorHndl_t l_flushErr = NO_ERROR;
while (i_size)
@@ -194,24 +193,60 @@ errorHndl_t writeFlash(pnorMbox_t* i_pnorMbox,
uint32_t l_lpcAddr;
uint32_t l_chunkLen;
- l_err = adjustMboxWindow(i_pnorMbox,
+
+ if (PAGE_PROGRAM_BYTES > i_size)
+ {
+ l_err = adjustMboxWindow(i_pnorMbox,
+ true,
+ i_addr,
+ PAGE_PROGRAM_BYTES,
+ &l_lpcAddr,
+ &l_chunkLen);
+ }
+ else
+ {
+ l_err = adjustMboxWindow(i_pnorMbox,
true,
i_addr,
i_size,
&l_lpcAddr,
&l_chunkLen);
+ }
if (l_err)
{
+ PK_TRACE("Error adjusting MBOX Window for addr: "
+ "0x%x size: 0x%x", l_lpcAddr, i_size);
break;
}
- //Directly do LPC access to space pointed to by BMC
- l_err = lpc_write(LPC_TRANS_FW, l_lpcAddr, i_data, l_chunkLen);
+ //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
+ uint32_t l_size_written = 0;
+ uint32_t l_lpc_write_size = 4; //in bytes
+ uint8_t *l_lpc_write_data = i_data;
- if (l_err)
+ while ( (i_size) && (l_size_written < i_size) &&
+ (l_size_written < l_chunkLen))
{
- break;
+ if (i_size - l_size_written < l_lpc_write_size)
+ {
+ l_lpc_write_size = i_size - l_size_written;
+ }
+
+ //Directly do LPC access to space pointed to by BMC
+ l_err = lpc_write(LPC_TRANS_FW, l_lpcAddr,
+ l_lpc_write_data, l_lpc_write_size);
+
+ if (l_err)
+ {
+ break;
+ }
+
+ l_lpc_write_data += l_lpc_write_size;
+ l_size_written += l_lpc_write_size;
+ l_lpcAddr += l_lpc_write_size;
}
//Tell BMC to push data from LPC space into PNOR
@@ -242,13 +277,8 @@ errorHndl_t writeFlash(pnorMbox_t* i_pnorMbox,
if( l_err )
{
i_size = 0;
- }
-
- if(l_err)
- {
break;
}
-
}
while(0);
@@ -301,6 +331,8 @@ errorHndl_t adjustMboxWindow(pnorMbox_t* i_pnorMbox,
* Then open the new one at the right position. The required
* alignment differs between protocol versions
*/
+ PK_TRACE("astMboxDD::adjustMboxWindow using protocol version: %d",
+ i_pnorMbox->iv_protocolVersion);
if (i_pnorMbox->iv_protocolVersion == 1)
{
l_wSize = i_isWrite ? i_pnorMbox->iv_writeWindowSize
@@ -333,6 +365,7 @@ errorHndl_t adjustMboxWindow(pnorMbox_t* i_pnorMbox,
if (l_err)
{
+ PK_TRACE("Error creating Window");
break;
}
OpenPOWER on IntegriCloud