summaryrefslogtreecommitdiffstats
path: root/src/usr/util
diff options
context:
space:
mode:
authorMarty Gloff <mgloff@us.ibm.com>2016-06-01 15:38:15 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2016-07-03 22:41:46 -0400
commit0dffc041ec01993e9399aeb8b17c9784617102e1 (patch)
tree42121111c923d57118202f5dad537a4455c9e745 /src/usr/util
parent3abbc2756991593bee3e2ad88f36f9eb26e6bf00 (diff)
downloadtalos-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.H26
-rw-r--r--src/usr/util/runtime/utillidmgr_rt.C31
-rw-r--r--src/usr/util/test/testlidmgr.H64
-rw-r--r--src/usr/util/utillidmgr.C69
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;
}
OpenPOWER on IntegriCloud