diff options
author | Bill Hoffa <wghoffa@us.ibm.com> | 2017-07-19 14:53:01 -0500 |
---|---|---|
committer | William A. Bryan <wilbryan@us.ibm.com> | 2017-07-22 16:29:49 -0400 |
commit | 56ecb493705fef5b2275b94329836f8690ef0865 (patch) | |
tree | 0de3ef2b3fb966c4fcc0044398d03593cab0df0b /src/occ_gpe0/firdata/pnor_mboxdd.c | |
parent | 7990cb411443a3d30a40f2cd101732fc353bcd38 (diff) | |
download | talos-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.c | 55 |
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; } |