diff options
author | Marty Gloff <mgloff@us.ibm.com> | 2016-06-01 15:38:15 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2016-07-03 22:41:46 -0400 |
commit | 0dffc041ec01993e9399aeb8b17c9784617102e1 (patch) | |
tree | 42121111c923d57118202f5dad537a4455c9e745 /src/usr/util | |
parent | 3abbc2756991593bee3e2ad88f36f9eb26e6bf00 (diff) | |
download | talos-hostboot-0dffc041ec01993e9399aeb8b17c9784617102e1.tar.gz talos-hostboot-0dffc041ec01993e9399aeb8b17c9784617102e1.zip |
PM Complex Implementation Deferred to Pass 2
Load a given LID only once from pnor/fsp.
Make a publicly accessible version of convertHomerPhysToVert() for HTMGT to
consume and have it handle the non-runtime case.
Use constants defined by HWP or FAPI.
Change-Id: I554d57a0b74ca674be9fa9a5b527f6bb53f9a4d6
RTC: 155384
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/25273
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/util')
-rw-r--r-- | src/usr/util/runtime/test/testlidmgr_rt.H | 26 | ||||
-rw-r--r-- | src/usr/util/runtime/utillidmgr_rt.C | 31 | ||||
-rw-r--r-- | src/usr/util/test/testlidmgr.H | 64 | ||||
-rw-r--r-- | src/usr/util/utillidmgr.C | 69 |
4 files changed, 184 insertions, 6 deletions
diff --git a/src/usr/util/runtime/test/testlidmgr_rt.H b/src/usr/util/runtime/test/testlidmgr_rt.H index d869e3c81..36eb8bc64 100644 --- a/src/usr/util/runtime/test/testlidmgr_rt.H +++ b/src/usr/util/runtime/test/testlidmgr_rt.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2015 */ +/* Contributors Listed Below - COPYRIGHT 2014,2016 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -98,6 +98,30 @@ class LidMgrRtTest : public CxxTest::TestSuite TS_FAIL("testLidInPnor: failed to get lid from PNOR"); } delete[] l_ptr; + + void* l_pLidImage = NULL; + size_t l_lidImageSize = 0; + l_errl = l_lidMgr.getStoredLidImage(l_pLidImage, + l_lidImageSize); + if (l_errl) + { + errlCommit(l_errl, UTIL_COMP_ID); + TS_FAIL("testLidInPnor: failed to store lid from PNOR"); + } + + if (l_lidImageSize != l_lidPnorInfo.size) + { + TS_FAIL("testLidInPnor: lidImageSize does not match pnor" + " TEST section size 0x%.8X != 0x%.8X", + l_lidImageSize, l_lidPnorInfo.size); + } + + l_errl = l_lidMgr.releaseLidImage(); + if(l_errl) + { + errlCommit(l_errl, UTIL_COMP_ID); + TS_FAIL("testLidInPnor: failed to release lid from PNOR"); + } }while(0); } }; diff --git a/src/usr/util/runtime/utillidmgr_rt.C b/src/usr/util/runtime/utillidmgr_rt.C index c3dcb1ec8..710159990 100644 --- a/src/usr/util/runtime/utillidmgr_rt.C +++ b/src/usr/util/runtime/utillidmgr_rt.C @@ -83,6 +83,37 @@ errlHndl_t UtilLidMgr::getLid(void* i_dest, size_t i_destSize) return l_err; } +errlHndl_t UtilLidMgr::getStoredLidImage(void*& o_pLidImage, + size_t& o_lidImageSize) +{ + errlHndl_t l_err = NULL; + + if((NULL == iv_lidBuffer) || (0 == iv_lidSize)) + { + l_err = loadLid(); + } + + if(l_err) + { + o_lidImageSize = 0; + o_pLidImage = NULL; + } + else + { + o_lidImageSize = iv_lidSize; + o_pLidImage = iv_lidBuffer; + } + + return l_err; +} + +errlHndl_t UtilLidMgr::releaseLidImage(void) +{ + errlHndl_t l_err = cleanup(); + + return l_err; +} + errlHndl_t UtilLidMgr::loadLid() { if (NULL != iv_lidBuffer) return NULL; diff --git a/src/usr/util/test/testlidmgr.H b/src/usr/util/test/testlidmgr.H index 69932fe7d..37cc3d7b9 100644 --- a/src/usr/util/test/testlidmgr.H +++ b/src/usr/util/test/testlidmgr.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2015 */ +/* Contributors Listed Below - COPYRIGHT 2014,2016 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -88,7 +88,8 @@ public: if (l_lidSize != l_lidPnorInfo.size) { - TS_FAIL("testLidInPnor: lidSize does not match pnor test section size 0x%.8X != 0x%.8X", + TS_FAIL("testLidInPnor: lidSize does not match pnor test" + " section size 0x%.8X != 0x%.8X", l_lidSize, l_lidPnorInfo.size); break; } @@ -105,7 +106,40 @@ public: } else { - TS_FAIL("testLidInPnor: should fail getLid() due to lidSize > provided size"); + TS_FAIL("testLidInPnor: should fail getLid() due to lidSize " + "> provided size"); + } + + // Use setLidId to clear invalid size + l_errl = l_lidMgr.setLidId(Util::TEST_LIDID); + if (l_errl) + { + errlCommit(l_errl, UTIL_COMP_ID); + TS_FAIL("testLidInPnor: failed to set lid ID"); + } + + void* l_pLidImage = NULL; + size_t l_lidImageSize = 0; + l_errl = l_lidMgr.getStoredLidImage(l_pLidImage, + l_lidImageSize); + if (l_errl) + { + errlCommit(l_errl, UTIL_COMP_ID); + TS_FAIL("testLidInPnor: failed to store lid from PNOR"); + } + + if (l_lidImageSize != l_lidPnorInfo.size) + { + TS_FAIL("testLidInPnor: lidImageSize does not match pnor test" + " section size 0x%.8X != 0x%.8X", + l_lidImageSize, l_lidPnorInfo.size); + } + + l_errl = l_lidMgr.releaseLidImage(); + if(l_errl) + { + errlCommit(l_errl, UTIL_COMP_ID); + TS_FAIL("testLidInPnor: failed to release lid from PNOR"); } delete[] l_ptrTest; }while(0); @@ -159,6 +193,30 @@ public: TS_FAIL("testLidInPnorOcc: failed to get lid from PNOR"); } delete[] l_ptrOcc; + + void* l_pLidImage = NULL; + size_t l_lidImageSize = 0; + l_errl = l_lidMgr.getStoredLidImage(l_pLidImage, + l_lidImageSize); + if (l_errl) + { + errlCommit(l_errl, UTIL_COMP_ID); + TS_FAIL("testLidInPnorOcc: failed to store lid from PNOR"); + } + + if (l_lidImageSize != l_lidPnorInfo.size) + { + TS_FAIL("testLidInPnorOcc: lidImageSize does not match pnor OCC" + " section size 0x%.8X != 0x%.8X", + l_lidImageSize, l_lidPnorInfo.size); + } + + l_errl = l_lidMgr.releaseLidImage(); + if(l_errl) + { + errlCommit(l_errl, UTIL_COMP_ID); + TS_FAIL("testLidInPnorOcc: failed to release lid from PNOR"); + } }while(0); } }; diff --git a/src/usr/util/utillidmgr.C b/src/usr/util/utillidmgr.C index 25253eb41..8d081bb9f 100644 --- a/src/usr/util/utillidmgr.C +++ b/src/usr/util/utillidmgr.C @@ -44,6 +44,8 @@ UtilLidMgr::UtilLidMgr(uint32_t i_lidId) : iv_needUnlock(false) ,iv_queueRegistered(false) ,iv_HbMsgQ(NULL) +,iv_pLidImage(NULL) +,iv_lidImageSize(0) ,iv_lidSize(0) { updateLid(i_lidId); @@ -208,6 +210,8 @@ errlHndl_t UtilLidMgr::getLidSizePnor(size_t& o_lidSize, bool& o_imgInPnor) return errl; } +/////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////// errlHndl_t UtilLidMgr::getLidPnor(void* i_dest, size_t i_destSize, bool& o_imgInPnor) @@ -511,8 +515,8 @@ errlHndl_t UtilLidMgr::getLid(void* i_dest, size_t i_destSize) * @reasoncode Util::UTIL_LIDMGR_UNSUP_MSG * @userdata1 LID ID * @userdata2 Message Type - * @devdesc Invalid Message type received from FSP when - * transferring LID pages. + * @devdesc Invalid Message type received from FSP + * when transferring LID pages. */ errl = new ErrlEntry(ERRL_SEV_UNRECOVERABLE, Util::UTIL_LIDMGR_GETLID, @@ -540,6 +544,60 @@ errlHndl_t UtilLidMgr::getLid(void* i_dest, size_t i_destSize) return errl; } +/////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////// +errlHndl_t UtilLidMgr::getStoredLidImage(void*& o_pLidImage, + size_t& o_lidImageSize) +{ + errlHndl_t errl = NULL; + + if((iv_pLidImage != NULL) && (iv_lidImageSize != 0)) + { + o_pLidImage = iv_pLidImage; + o_lidImageSize = iv_lidImageSize; + } + else + { + if(0 == iv_lidImageSize) + { + errl = getLidSize(iv_lidImageSize); + } + + if(errl != NULL) + { + if(iv_pLidImage != NULL) + { + free(iv_pLidImage); + } + + iv_pLidImage = static_cast<void*>(malloc(iv_lidImageSize)); + + errl = getLid(iv_pLidImage, iv_lidImageSize); + } + + if(errl) + { + cleanup(); + } + + o_pLidImage = iv_pLidImage; + o_lidImageSize = iv_lidImageSize; + } + + return errl; +} + + +/////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////// +errlHndl_t UtilLidMgr::releaseLidImage(void) +{ + errlHndl_t errl = cleanup(); + + return errl; +} + + errlHndl_t UtilLidMgr::sendMboxMessage( MBOX_MSG_TYPE type, msg_t * i_msg ) { @@ -679,6 +737,13 @@ errlHndl_t UtilLidMgr::cleanup() } } + if(iv_pLidImage != NULL) + { + free(iv_pLidImage); + iv_pLidImage = NULL; + } + + iv_lidImageSize = 0; return l_err; } |