summaryrefslogtreecommitdiffstats
path: root/src/usr/pnor/pnorrp.C
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2019-02-07 15:21:19 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-02-22 10:01:26 -0600
commiteba5c2ffe5ffb1f50966b7990e2f5f71f09105ce (patch)
tree528d700a0838bf326c5590776d21a6ca8902d3e6 /src/usr/pnor/pnorrp.C
parent99f296373162b8996f92e1f1ffbdb977fe90cf12 (diff)
downloadtalos-hostboot-eba5c2ffe5ffb1f50966b7990e2f5f71f09105ce.tar.gz
talos-hostboot-eba5c2ffe5ffb1f50966b7990e2f5f71f09105ce.zip
Statically allocate work pages for PNOR Resource Provider
Any time the PNOR Resource Provider loads in a page that is ECC protected it allocates 0x1200 bytes to hold the data while it is decoded. Continuously allocating 2 pages from the heap leads to a couple of potential issues: - fragmentation of memory due to constant new/delete of pages - extremely low memory situation could prevent new code from paging in The solution here is to place the working buffer inside the PNOR RP class itself. This means we will only do a single allocation of the memory early on in the boot and the memory is always available. Change-Id: I7faabb6be7cc89abdb8a8fb962e0623a2bcd5e99 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/71546 Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com> Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/pnor/pnorrp.C')
-rw-r--r--src/usr/pnor/pnorrp.C23
1 files changed, 5 insertions, 18 deletions
diff --git a/src/usr/pnor/pnorrp.C b/src/usr/pnor/pnorrp.C
index c9a5e5336..af6ccf3fa 100644
--- a/src/usr/pnor/pnorrp.C
+++ b/src/usr/pnor/pnorrp.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2018 */
+/* Contributors Listed Below - COPYRIGHT 2011,2019 */
/* [+] Google Inc. */
/* [+] International Business Machines Corp. */
/* */
@@ -251,6 +251,7 @@ iv_TOC_used(TOC_0)
,iv_shutdown_pending(false)
{
TRACDCOMP(g_trac_pnor, "PnorRP::PnorRP> " );
+
// setup everything in a separate function
initDaemon();
@@ -1315,7 +1316,6 @@ errlHndl_t PnorRP::readFromDevice( uint64_t i_offset,
{
TRACUCOMP(g_trac_pnor, "PnorRP::readFromDevice> i_offset=0x%X, i_chip=%d", i_offset, i_chip );
errlHndl_t l_errhdl = NULL;
- uint8_t* ecc_buffer = NULL;
o_fatalError = 0;
do
@@ -1329,8 +1329,7 @@ errlHndl_t PnorRP::readFromDevice( uint64_t i_offset,
// if we need to handle ECC we need to read more than 1 page
if( i_ecc )
{
- ecc_buffer = new uint8_t[PAGESIZE_PLUS_ECC]();
- data_to_read = ecc_buffer;
+ data_to_read = iv_ecc_buffer;
read_size = PAGESIZE_PLUS_ECC;
}
@@ -1408,11 +1407,6 @@ errlHndl_t PnorRP::readFromDevice( uint64_t i_offset,
}
} while(0);
- if( ecc_buffer )
- {
- delete[] ecc_buffer;
- }
-
TRACUCOMP(g_trac_pnor, "< PnorRP::readFromDevice" );
return l_errhdl;
}
@@ -1427,7 +1421,6 @@ errlHndl_t PnorRP::writeToDevice( uint64_t i_offset,
{
TRACUCOMP(g_trac_pnor, "PnorRP::writeToDevice> i_offset=%X, i_chip=%d", i_offset, i_chip );
errlHndl_t l_errhdl = NULL;
- uint8_t* ecc_buffer = NULL;
do
{
@@ -1440,11 +1433,10 @@ errlHndl_t PnorRP::writeToDevice( uint64_t i_offset,
// apply ECC to data if needed
if( i_ecc )
{
- ecc_buffer = new uint8_t[PAGESIZE_PLUS_ECC];
PNOR::ECC::injectECC( reinterpret_cast<uint8_t*>(i_src),
PAGESIZE,
- reinterpret_cast<uint8_t*>(ecc_buffer) );
- data_to_write = reinterpret_cast<void*>(ecc_buffer);
+ reinterpret_cast<uint8_t*>(iv_ecc_buffer) );
+ data_to_write = reinterpret_cast<void*>(iv_ecc_buffer);
write_size = PAGESIZE_PLUS_ECC;
}
@@ -1463,11 +1455,6 @@ errlHndl_t PnorRP::writeToDevice( uint64_t i_offset,
}
} while(0);
- if( ecc_buffer )
- {
- delete[] ecc_buffer;
- }
-
TRACUCOMP(g_trac_pnor, "< PnorRP::writeToDevice" );
return l_errhdl;
}
OpenPOWER on IntegriCloud