summaryrefslogtreecommitdiffstats
path: root/src
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
parent3abbc2756991593bee3e2ad88f36f9eb26e6bf00 (diff)
downloadblackbird-hostboot-0dffc041ec01993e9399aeb8b17c9784617102e1.tar.gz
blackbird-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')
-rw-r--r--src/include/usr/isteps/pm/pm_common_ext.H43
-rw-r--r--src/include/usr/util/utillidmgr.H52
-rw-r--r--src/usr/isteps/pm/makefile1
-rw-r--r--src/usr/isteps/pm/pm.mk5
-rw-r--r--src/usr/isteps/pm/pm_common.C341
-rw-r--r--src/usr/isteps/pm/pm_common.H12
-rw-r--r--src/usr/isteps/pm/runtime/rt_pm.C77
-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
11 files changed, 524 insertions, 197 deletions
diff --git a/src/include/usr/isteps/pm/pm_common_ext.H b/src/include/usr/isteps/pm/pm_common_ext.H
new file mode 100644
index 000000000..bd8e87633
--- /dev/null
+++ b/src/include/usr/isteps/pm/pm_common_ext.H
@@ -0,0 +1,43 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/include/usr/isteps/pm/pm_common_ext.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2016 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+#ifndef PM_COMMON_EXT_H
+#define PM_COMMON_EXT_H
+
+#include <errl/errlentry.H>
+
+namespace HBPM
+{
+ /**
+ * @brief Convert HOMER physical address space to a vitual address
+ * @param[in] i_proc_target Processsor target
+ * @param[in] i_phys_addr Physical address
+ * @return NULL on error, else virtual address
+ */
+ void *convertHomerPhysToVirt( TARGETING::Target* i_proc_target,
+ uint64_t i_phys_addr);
+
+} //namespace HBPM ends
+
+#endif
diff --git a/src/include/usr/util/utillidmgr.H b/src/include/usr/util/utillidmgr.H
index ae37c1164..36e9716a2 100644
--- a/src/include/usr/util/utillidmgr.H
+++ b/src/include/usr/util/utillidmgr.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2015 */
+/* Contributors Listed Below - COPYRIGHT 2013,2016 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -46,6 +46,9 @@ enum LidId
{
TEST_LIDID = 0x00000111,
OCC_LIDID = 0x81e00430,
+ // Hcode Reference Image LIDs
+ NIMBUS_HCODE_LIDID = 0x81e00602,
+ CUMULUS_HCODE_LIDID = 0x81e00603,
};
}
@@ -141,6 +144,43 @@ class UtilLidMgr
*/
errlHndl_t getLid(void* i_dest, size_t i_destSize);
+ /**
+ * @brief Get Stored LID Image
+ *
+ * @par Detailed Description:
+ * Determines if a lid image is stored in hostboot
+ * memory space for this UtilLidMgr object. If an
+ * image is not stored, then the lid image is stored.
+ * Returns pointer and size for the lid image.
+ *
+ * @param[out] o_pLidImage
+ * Pointer to where lid image is stored in hostboot
+ * memory
+ *
+ * @param[out] o_lidImageSize
+ * Size of lid image is stored in hostboot memory
+ *
+ *
+ * @return errlHndl_t
+ * return errl == NULL -> success
+ * return errl != NULL -> failure
+ */
+ errlHndl_t getStoredLidImage(void*& o_pLidImage,
+ size_t& o_lidImageSize);
+
+ /**
+ * @brief Release LID Image
+ *
+ * @par Detailed Description:
+ * Frees memory space allocated for the lid image.
+ * Clears variables associated with storing the image.
+ *
+ * @return errlHndl_t
+ * return errl == NULL -> success
+ * return errl != NULL -> failure
+ */
+ errlHndl_t releaseLidImage(void);
+
#ifdef __HOSTBOOT_RUNTIME
/**
* @brief Get a list of LID numbers
@@ -323,6 +363,16 @@ class UtilLidMgr
*/
msg_q_t iv_HbMsgQ;
+ /**
+ * @brief pointer to buffer with image of current LID
+ */
+ void* iv_pLidImage;
+
+ /**
+ * @brief size of buffer with image of current LID
+ */
+ size_t iv_lidImageSize;
+
#else // __HOSTBOOT_RUNTIME
diff --git a/src/usr/isteps/pm/makefile b/src/usr/isteps/pm/makefile
index dd45303f5..77f7c69cb 100644
--- a/src/usr/isteps/pm/makefile
+++ b/src/usr/isteps/pm/makefile
@@ -29,7 +29,6 @@ MODULE = pm
SUBDIRS+=runtime.d
## Objects unique to HB IPL
-OBJS +=
## Objects common to HB IPL and HBRT
include pm.mk
diff --git a/src/usr/isteps/pm/pm.mk b/src/usr/isteps/pm/pm.mk
index 349c34ca0..af5e71eb5 100644
--- a/src/usr/isteps/pm/pm.mk
+++ b/src/usr/isteps/pm/pm.mk
@@ -30,8 +30,6 @@ EXTRAINCDIR += ${ROOTPATH}/src/include/usr/fapi2/
## pointer to common HWP files
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/common/include/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/common/pmlib/include/registers/
-EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/utils/imageProcs/
-EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/xip/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/lib/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/utils/stopreg/
@@ -81,6 +79,3 @@ include ${HWP_XIP_PATH}/p9_xip_image.mk
include ${HWP_IMAGEPROCS_PATH}/p9_tor.mk
include ${HWP_IMAGEPROCS_PATH}/p9_ring_identification.mk
include ${HWP_IMAGEPROCS_PATH}/p9_ringId.mk
-
-
-include ${ROOTPATH}/config.mk
diff --git a/src/usr/isteps/pm/pm_common.C b/src/usr/isteps/pm/pm_common.C
index 60c42a855..da25b2710 100644
--- a/src/usr/isteps/pm/pm_common.C
+++ b/src/usr/isteps/pm/pm_common.C
@@ -26,12 +26,13 @@
#include <stdint.h>
#include <pm/pm_common.H>
+#include <isteps/pm/pm_common_ext.H>
#include <initservice/taskargs.H>
#include <errl/errlentry.H>
#include <sys/misc.h>
-
+#include <sys/mm.h>
// targeting support
#include <targeting/common/commontargeting.H>
#include <targeting/common/utilFilter.H>
@@ -49,7 +50,6 @@
#include <isteps/istep_reasoncodes.H>
#include <vfs/vfs.H>
-#include <util/utillidmgr.H>
#include <initservice/initserviceif.H>
#include <runtime/interface.h>
@@ -71,11 +71,80 @@
//#define TRACUCOMP(args...) TRACFCOMP(args)
#define TRACUCOMP(args...)
+// Definitions for convertHomerPhysToVirt()
+#ifndef __HOSTBOOT_RUNTIME
+#define HBPM_UNMAP mm_block_unmap
+#define HBPM_MAP mm_block_map
+#define HBPM_PHYS_ADDR (reinterpret_cast<void*>(i_phys_addr))
+#else
+#define HBPM_UNMAP g_hostInterfaces->unmap_phys_mem
+#define HBPM_MAP g_hostInterfaces->map_phys_mem
+#define HBPM_PHYS_ADDR i_phys_addr
+#endif
+
+
using namespace TARGETING;
using namespace p9_hcodeImageBuild;
namespace HBPM
{
+ constexpr uint64_t OCC_HOST_AREA_SIZE_IN_MB = OCC_HOST_AREA_SIZE / ONE_MB;
+ constexpr uint64_t HOMER_INSTANCE_SIZE_IN_MB =
+ sizeof(Homerlayout_t) / ONE_MB;
+
+ std::shared_ptr<UtilLidMgr> g_pOccLidMgr (nullptr);
+ std::shared_ptr<UtilLidMgr> g_pHcodeLidMgr (nullptr);
+
+ /**
+ * @brief Convert HOMER physical address space to a vitual address
+ * @param[in] i_proc_target Processsor target
+ * @param[in] i_phys_addr Physical address
+ * @return NULL on error, else virtual address
+ */
+ void *convertHomerPhysToVirt( TARGETING::Target* i_proc_target,
+ uint64_t i_phys_addr)
+ {
+ int rc = 0;
+
+ void *l_virt_addr = reinterpret_cast<void*>
+ (i_proc_target->getAttr<ATTR_HOMER_VIRT_ADDR>());
+
+ if((i_proc_target->getAttr<ATTR_HOMER_PHYS_ADDR>() != i_phys_addr) ||
+ (NULL == l_virt_addr))
+ {
+ if(NULL != l_virt_addr)
+ {
+ rc = HBPM_UNMAP(l_virt_addr);
+
+ if(rc)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ ERR_MRK"convertHomerPhysToVirt: "
+ "unmap_phys_mem failed, rc=0x%0X",
+ rc);
+
+ l_virt_addr = NULL;
+ }
+ }
+
+ l_virt_addr = HBPM_MAP(HBPM_PHYS_ADDR,
+ sizeof(Homerlayout_t));
+
+ // Update the attributes for the current values
+ i_proc_target->setAttr<ATTR_HOMER_PHYS_ADDR>(i_phys_addr);
+ i_proc_target->setAttr<ATTR_HOMER_VIRT_ADDR>(
+ reinterpret_cast<uint64_t>(l_virt_addr));
+
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "convertHomerPhysToVirt: "
+ "phys_addr=0x%0lX, virt_addr=0x%0lX",
+ i_phys_addr,
+ reinterpret_cast<uint64_t>(l_virt_addr));
+ }
+
+ return l_virt_addr;
+ } // convertHomerPhysToVirt
+
/**
* @brief Build new Pstate Parameter Block for PGPE and CME
*/
@@ -106,8 +175,6 @@ namespace HBPM
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"pstateParameterBuild: "
"p9_pstate_parameter_build failed!" );
- l_errl->collectTrace(FAPI_TRACE_NAME,256);
- l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
l_errl->collectTrace("ISTEPS_TRACE",256);
break;
@@ -201,7 +268,7 @@ namespace HBPM
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ENTER_MRK"loadHcode(0x%08X, %p, %d)",
- i_target->getAttr<ATTR_HUID>(),
+ get_huid(i_target),
i_pImageOut,
i_mode);
@@ -211,48 +278,61 @@ namespace HBPM
// figure out homer offsets
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>
l_fapiTarg(i_target);
-/* @TODO RTC: 148935 start */
- void *l_pImageIn = NULL;
+
+ void *l_buffer0 = (void*)malloc(HW_IMG_RING_SIZE);
+ void *l_buffer1 = (void*)malloc(HW_IMG_RING_SIZE);
do
{
- // @TODO RTC: 148935 Only get LID once from pnor/fsp
- size_t lidSize = 0;
- uint32_t lidId = (i_target->getAttr<ATTR_MODEL>() == MODEL_NIMBUS)
- ? HBPM::NIMBUS_HCODE_LIDID
- : HBPM::CUMULUS_HCODE_LIDID;
- UtilLidMgr lidMgr(lidId);
-
- l_errl = lidMgr.getLidSize(lidSize);
- if(l_errl)
+ bool l_isNimbus = (i_target->getAttr<ATTR_MODEL>() == MODEL_NIMBUS);
+ uint32_t l_lidId = (l_isNimbus) ? Util::NIMBUS_HCODE_LIDID
+ : Util::CUMULUS_HCODE_LIDID;
+ if(g_pHcodeLidMgr.get() == nullptr)
+ {
+ g_pHcodeLidMgr = std::shared_ptr<UtilLidMgr>
+ (new UtilLidMgr(l_lidId));
+ }
+ void* l_pImageIn = NULL;
+ size_t l_lidImageSize = 0;
+
+ // NOTE: Ideally, there would also be a check to determine if LID
+ // manager already got the new LID, but the currently
+ // available information does not make it possible to do that.
+ if(HBRT_PM_RELOAD == i_mode)
+ {
+ // When reloading, release LID image so any update is used
+ l_errl = g_pHcodeLidMgr->releaseLidImage();
+ }
+
+ if (l_errl)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"loadHcode: "
- "Error getting lid size. lidId=0x%.8x",
- lidId);
+ "release stored LID image failed!");
+ l_errl->collectTrace("ISTEPS_TRACE",256);
+ l_errl->collectTrace(FAPI_TRACE_NAME,256);
+ l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
break;
}
- // allocate memory for Hcode
- l_pImageIn = static_cast<void*>(malloc(lidSize));
-
- l_errl = lidMgr.getLid(l_pImageIn, lidSize);
- if(l_errl)
+ l_errl = g_pHcodeLidMgr->getStoredLidImage(l_pImageIn,
+ l_lidImageSize);
+ if (l_errl)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- ERR_MRK"loadHcode: "
- "Error getting lid. lidId=0x%.8x",
- lidId);
+ ERR_MRK"loadHcode: get stored LID image failed!");
+ l_errl->collectTrace("ISTEPS_TRACE",256);
+ l_errl->collectTrace(FAPI_TRACE_NAME,256);
+ l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
break;
}
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "loadHcode: HCODE addr = 0x%p ",
- l_pImageIn);
+ "loadHcode: HCODE addr = 0x%p, lidId = 0x%.8x",
+ l_pImageIn,
+ l_lidId);
ImageType_t l_imgType;
- void *l_buffer0 = (void*)malloc(HW_IMG_RING_SIZE);
- void *l_buffer1 = (void*)malloc(HW_IMG_RING_SIZE);
FAPI_INVOKE_HWP( l_errl,
p9_hcode_image_build,
@@ -272,8 +352,6 @@ namespace HBPM
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"loadHcode: p9_hcode_image_build failed!" );
- l_errl->collectTrace(FAPI_TRACE_NAME,256);
- l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
l_errl->collectTrace("ISTEPS_TRACE",256);
break;
@@ -283,59 +361,83 @@ namespace HBPM
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
"pImageOut=%p",i_pImageOut);
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "lidSize=%d",lidSize);
-
- /* TODO RTC: 155384
- Many of these structures moved around and this needs to be
- refactored
+ "lidSize=%d",l_lidImageSize);
- // Log some info from the headers
+ // Log some info from the headers in the Homer layout
Homerlayout_t* pChipHomer = (Homerlayout_t*)i_pImageOut;
- // SGPE Region with QPMR Header
- SgpeLayout_t* pSgpeLayout =
- (SgpeLayout_t*)(&(pChipHomer->sgpeRegion));
- QpmrHeaderLayout_t* pQpmrHeaderLayout =
- (QpmrHeaderLayout_t*)(&(pSgpeLayout->qpmrHeader));
-
+ // QPMR Region with SGPE Region
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "QPMR -- Date:%d, Version:%d",
- pQpmrHeaderLayout->buildDate,
- pQpmrHeaderLayout->buildVersion);
-
- SgpeImageHeader_t* pSgpeImageHeader =
- (SgpeImageHeader_t*)(&(pSgpeLayout->imgHeader));
+ "QPMR region -- Location: %p",
+ &(pChipHomer->qpmrRegion));
+ QpmrHeaderLayout_t* pQpmrHeader = (QpmrHeaderLayout_t*)
+ (&(pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader));
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "SGPE -- Location: %p, Date:%d, Version:%d",
- pSgpeLayout,
- pSgpeImageHeader->buildDate,
- pSgpeImageHeader->buildVer);
-
- // CME Region
- CmeRegionLayout_t* pCmeLayout =
- (CmeRegionLayout_t*)(&(pChipHomer->cmeRegion));
- CmeImageHeader_t* pCmeImageHeader =
- (CmeImageHeader_t*)(&(pCmeLayout->imgHeader));
-
+ "QPMR header -- Date:0x%08X, Version:0x%08X, "
+ "Image offset:0x%08X, Image length:0x%08X, "
+ "Bootloader offset:0x%08X, Bootloader length:0x%08X",
+ pQpmrHeader->buildDate,
+ pQpmrHeader->buildVersion,
+ pQpmrHeader->sgpeImgOffset,
+ pQpmrHeader->sgpeImgLength,
+ pQpmrHeader->bootLoaderOffset,
+ pQpmrHeader->bootLoaderLength);
+
+ sgpeHeader_t* pSgpeImageHeader = (sgpeHeader_t*)
+ (&(pChipHomer->qpmrRegion.sgpeRegion.imgHeader));
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "CME -- Location: %p, Date:%d, Version:%d",
- pCmeLayout,
- pCmeImageHeader->buildDate,
- pCmeImageHeader->buildVer);
+ "SGPE header -- Date:0x%08X, Version:0x%08X, "
+ "Image offset:0x%08X, Image length:0x%08X",
+ pSgpeImageHeader->g_sgpe_build_date,
+ pSgpeImageHeader->g_sgpe_build_ver);
- // PGPE Region
- PgpeLayout_t* pPgpeLayout =
- (PgpeLayout_t*)(&(pChipHomer->pgpeRegion));
+ // CPMR Region with Self Restore Region and CME Binary
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "CPMR region -- Location: %p",
+ &(pChipHomer->cpmrRegion));
+ cpmrHeader_t* pCpmrHeader =
+ (cpmrHeader_t*)(&(pChipHomer->
+ cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader));
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "CMPR header -- Date:0x%08X, Version:0x%08X, "
+ "Image offset:0x%08X, Image length:0x%08X",
+ pCpmrHeader->cpmrbuildDate,
+ pCpmrHeader->cpmrVersion,
+ pCpmrHeader->cmeImgOffset,
+ pCpmrHeader->cmeImgLength);
+
+ cmeHeader_t* pCmeHeader = (cmeHeader_t*)
+ (&(pChipHomer->cpmrRegion.cmeBin.elements.imgHeader));
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "CME header -- Date:0x%08X, Version:0x%08X, "
+ "Hcode offset:0x%08X, Hcode length:0x%08X",
+ pCmeHeader->g_cme_build_date,
+ pCmeHeader->g_cme_build_ver,
+ pCmeHeader->g_cme_hcode_offset,
+ pCmeHeader->g_cme_hcode_length);
+
+ // PPMR Region
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "PGPE -- Location: %p",
- pPgpeLayout);
+ "PPMR region -- Location: %p",
+ &(pChipHomer->ppmrRegion));
- **/
+ PgpeHeader_t* pPgpeHeader = (PgpeHeader_t*)
+ (&(pChipHomer->ppmrRegion.pgpeBin.elements.imgHeader));
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "PGPE header -- Date:0x%08X, Version:0x%08X, "
+ "Hcode offset:0x%08X, Hcode length:0x%08X",
+ pPgpeHeader->g_pgpe_build_date,
+ pPgpeHeader->g_pgpe_build_ver,
+ pPgpeHeader->g_pgpe_hcode_offset,
+ pPgpeHeader->g_pgpe_hcode_length);
} while(0);
-/* end @TODO RTC: 148935 */
+
+ free(l_buffer0);
+ free(l_buffer1);
+
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
EXIT_MRK"loadHcode: RC=0x%X, PLID=0x%lX",
ERRL_GETRC_SAFE(l_errl), ERRL_GETPLID_SAFE(l_errl) );
@@ -361,7 +463,7 @@ namespace HBPM
// cast OUR type of target to a FAPI type of target.
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>
l_fapiTarg(i_target);
- char l_fapiTargString[50]; // @TODO RTC: 148935 Find constant for 50
+ char l_fapiTargString[ATTR_FAPI_NAME_max_chars];
toString(l_fapiTarg, l_fapiTargString, sizeof(l_fapiTargString));
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
@@ -372,19 +474,18 @@ namespace HBPM
//==============================
// BAR0 is the Entire HOMER (start of HOMER contains OCC base Image)
- // Bar size is in MB, obtained value of 4MB from Greg Still
+ // Bar size is in MB
TRACUCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
INFO_MRK"loadOCCSetup: OCC Address: 0x%.8X, size=0x%.8X",
- i_occImgPaddr, VMM_HOMER_INSTANCE_SIZE_IN_MB);
- // @TODO RTC: 148935 Find/Define size constant in HWP dir
-/* @TODO RTC: 148935 start */
+ i_occImgPaddr,
+ HOMER_INSTANCE_SIZE_IN_MB);
+
FAPI_INVOKE_HWP( l_errl,
p9_pm_pba_bar_config,
l_fapiTarg,
0,
i_occImgPaddr,
- VMM_HOMER_INSTANCE_SIZE_IN_MB, // @TODO RTC: 148935
- // Find/Define constant in HWP directory for size
+ HOMER_INSTANCE_SIZE_IN_MB,
p9pba::LOCAL_NODAL,
0xFF );
@@ -392,12 +493,10 @@ namespace HBPM
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"loadOCCSetup: Bar0 config failed!" );
- l_errl->collectTrace(FAPI_TRACE_NAME,256);
- l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
l_errl->collectTrace("ISTEPS_TRACE",256);
break;
}
-/* end @TODO RTC: 148935 */
+
// BAR2 is the OCC Common Area
// Bar size is in MB
TARGETING::Target* sys = NULL;
@@ -407,16 +506,15 @@ namespace HBPM
TRACUCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
INFO_MRK"loadOCCSetup: "
"OCC Common Addr: 0x%.8X,size=0x%.8X",
- i_commonPhysAddr,VMM_OCC_COMMON_SIZE_IN_MB);
- // @TODO RTC: 148935 Find/Define size constant in HWP dir
-/* @TODO RTC: 148935 start */
+ i_commonPhysAddr,
+ OCC_HOST_AREA_SIZE_IN_MB);
+
FAPI_INVOKE_HWP( l_errl,
p9_pm_pba_bar_config,
l_fapiTarg,
2,
i_commonPhysAddr,
- VMM_OCC_COMMON_SIZE_IN_MB, // @TODO RTC: 148935
- // Find/Define constant in HWP directory for size
+ OCC_HOST_AREA_SIZE_IN_MB,
p9pba::LOCAL_NODAL,
0xFF );
@@ -424,19 +522,17 @@ namespace HBPM
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"loadOCCSetup: Bar2 config failed!" );
- l_errl->collectTrace(FAPI_TRACE_NAME,256);
- l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
l_errl->collectTrace("ISTEPS_TRACE",256);
break;
}
-/* end @TODO RTC: 148935 */
+
}while(0);
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
EXIT_MRK"loadOCCSetup: RC=0x%X, PLID=0x%lX",
ERRL_GETRC_SAFE(l_errl), ERRL_GETPLID_SAFE(l_errl) );
return l_errl;
- }
+ } // loadOCCSetup
/**
@@ -445,7 +541,8 @@ namespace HBPM
*/
errlHndl_t loadOCCImageToHomer(TARGETING::Target* i_target,
uint64_t i_occImgPaddr,
- uint64_t i_occImgVaddr) // dest
+ uint64_t i_occImgVaddr, // dest
+ uint32_t i_mode)
{
errlHndl_t l_errl = NULL;
@@ -453,31 +550,51 @@ namespace HBPM
ENTER_MRK"loadOCCImageToHomer(0x%08X, 0x%08X)",
i_occImgPaddr, i_occImgVaddr);
do{
- void* occVirt = reinterpret_cast<void *>(i_occImgVaddr);
+ if(g_pOccLidMgr.get() == nullptr)
+ {
+ g_pOccLidMgr = std::shared_ptr<UtilLidMgr>
+ (new UtilLidMgr(Util::OCC_LIDID));
+ }
+ void* l_pLidImage = NULL;
+ size_t l_lidImageSize = 0;
- // @TODO RTC: 148935 Only get LID once from pnor/fsp
- size_t lidSize = 0;
- UtilLidMgr lidMgr(HBPM::OCC_LIDID);
+ // NOTE: Ideally, there would also be a check to determine if LID
+ // manager already got the new LID, but the currently
+ // available information does not make it possible to do that.
+ if(HBRT_PM_RELOAD == i_mode)
+ {
+ // When reloading, release LID image so any update is used
+ l_errl = g_pOccLidMgr->releaseLidImage();
+ }
- l_errl = lidMgr.getLidSize(lidSize);
- if(l_errl)
+ if (l_errl)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"loadOCCImageToHomer: "
- "Error getting lid size. lidId=0x%.8x",
- OCC_LIDID);
+ "release stored LID image failed!");
+ l_errl->collectTrace("ISTEPS_TRACE",256);
+ l_errl->collectTrace(FAPI_TRACE_NAME,256);
+ l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
break;
}
- l_errl = lidMgr.getLid(occVirt, lidSize);
- if(l_errl)
+ l_errl = g_pOccLidMgr->getStoredLidImage(l_pLidImage,
+ l_lidImageSize);
+ if (l_errl)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"loadOCCImageToHomer: "
- "Error getting lid. lidId=0x%.8x",
- OCC_LIDID);
+ "get stored LID image failed!");
+ l_errl->collectTrace("ISTEPS_TRACE",256);
+ l_errl->collectTrace(FAPI_TRACE_NAME,256);
+ l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
break;
}
+
+ void* occVirt = reinterpret_cast<void *>(i_occImgVaddr);
+
+ // copy LID to Homer
+ memcpy(occVirt, l_pLidImage, l_lidImageSize);
}while(0);
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
@@ -500,7 +617,7 @@ namespace HBPM
// figure out homer offsets
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>
l_fapiTarg(i_target);
-/* @TODO RTC: 148935 start */
+
do {
// Init path
// p9_pm_init.C enum: PM_INIT
@@ -513,20 +630,18 @@ namespace HBPM
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"startPMComplex: p9_pm_init, init failed!" );
- l_errl->collectTrace(FAPI_TRACE_NAME,256);
- l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
l_errl->collectTrace("ISTEPS_TRACE",256);
break;
}
} while (0);
-/* end @TODO RTC: 148935 */
+
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
EXIT_MRK"startPMComplex: RC=0x%X, PLID=0x%lX",
ERRL_GETRC_SAFE(l_errl), ERRL_GETPLID_SAFE(l_errl) );
return l_errl;
- }
+ } // startPMComplex
/**
@@ -542,7 +657,7 @@ namespace HBPM
// figure out homer offsets
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>
l_fapiTarg(i_target);
-/* @TODO RTC: 148935 start */
+
do
{
// Reset path
@@ -556,20 +671,18 @@ namespace HBPM
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
ERR_MRK"resetPMComplex:p9_pm_init, reset failed!" );
- l_errl->collectTrace(FAPI_TRACE_NAME,256);
- l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256);
l_errl->collectTrace("ISTEPS_TRACE",256);
break;
}
} while(0);
-/* end @TODO RTC: 148935 */
+
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
EXIT_MRK"resetPMComplex: RC=0x%X, PLID=0x%lX",
ERRL_GETRC_SAFE(l_errl), ERRL_GETPLID_SAFE(l_errl) );
return l_errl;
- }
+ } // resetPMComplex
} // end HBPM namespace
diff --git a/src/usr/isteps/pm/pm_common.H b/src/usr/isteps/pm/pm_common.H
index 692bea0ad..152860c49 100644
--- a/src/usr/isteps/pm/pm_common.H
+++ b/src/usr/isteps/pm/pm_common.H
@@ -27,6 +27,7 @@
#include <limits.h>
#include <errl/errlentry.H>
+#include <util/utillidmgr.H>
#include <diag/prdf/prdfWriteHomerFirData.H>
namespace HBPM
@@ -60,7 +61,6 @@ namespace HBPM
{
OccHostDataVersion = 0x00000090,
- OCC_LIDID = 0x81e00430, // @TODO RTC: 148935 Where to define?
OCC_IBSCOM_RANGE_IN_MB = MEGABYTE,
// Interrupt Types
@@ -70,10 +70,6 @@ namespace HBPM
// FIR Master
NOT_FIR_MASTER = 0x00000000,
IS_FIR_MASTER = 0x00000001,
-
- // Hcode Reference Image LIDs
- NIMBUS_HCODE_LIDID = 0x81e00602, // @TODO RTC: 148935 Where to define?
- CUMULUS_HCODE_LIDID = 0x81e00603, // @TODO RTC: 148935 Where to define?
};
/**
@@ -87,7 +83,7 @@ namespace HBPM
errlHndl_t pstateParameterBuild( TARGETING::Target* i_target,
void* i_homer);
-/**
+ /**
* @brief Sets up OCC Host data in Homer
*
* @param[in] i_proc: target processor to load
@@ -139,11 +135,13 @@ namespace HBPM
* proc's OCC image in the homer
* @param[in] i_occImgVaddr: Virtual address of current
* proc's OCC image in the homer
+ * @param[in] i_mode Selects initial load vs concurrent reloads
* @return errlHndl_t Error log if loadOCCImageToHomer failed
*/
errlHndl_t loadOCCImageToHomer(TARGETING::Target* i_target,
uint64_t i_occImgPaddr,
- uint64_t i_occImgVaddr);
+ uint64_t i_occImgVaddr,
+ uint32_t i_mode);
/**
* @brief Start PM Complex.
diff --git a/src/usr/isteps/pm/runtime/rt_pm.C b/src/usr/isteps/pm/runtime/rt_pm.C
index 46aefe865..5414a27c6 100644
--- a/src/usr/isteps/pm/runtime/rt_pm.C
+++ b/src/usr/isteps/pm/runtime/rt_pm.C
@@ -32,6 +32,7 @@
#include <util/utillidmgr.H>
#include <pm/pm_common.H>
+#include <isteps/pm/pm_common_ext.H>
#include <runtime/interface.h>
#include <runtime/rt_targeting.H>
@@ -72,52 +73,6 @@ namespace RTPM
}
- // @TODO RTC: 148935 Defer creation of publicly accessible version for
- // HTMGT to consume that also handles the non-runtime case
- /**
- * @brief Convert HOMER physical address space to a vitual address
- * @param[in] i_proc_target Processsor target
- * @param[in] i_phys_addr Physical address
- * @return NULL on error, else virtual address
- */
- void *convertHomerPhysToVirt( TARGETING::Target* i_proc_target,
- uint64_t i_phys_addr)
- {
- int rc = 0;
-
- void *l_virt_addr = reinterpret_cast <void*>
- (i_proc_target->getAttr<ATTR_HOMER_VIRT_ADDR>());
-
- if((i_proc_target->getAttr<ATTR_HOMER_PHYS_ADDR>() != i_phys_addr) ||
- (NULL == l_virt_addr))
- {
- if(NULL != l_virt_addr)
- {
- rc = g_hostInterfaces->unmap_phys_mem(l_virt_addr);
- if(rc)
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- ERR_MRK"convertHomerPhysToVirt: "
- "unmap_phys_mem failed, rc=0x%0X",
- rc);
-
- l_virt_addr = NULL;
- }
- }
-
- l_virt_addr = g_hostInterfaces->map_phys_mem(i_phys_addr,
- 4*MEGABYTE);
-
- // Update the attributes for the current values
- i_proc_target->setAttr<ATTR_HOMER_PHYS_ADDR>(i_phys_addr);
- i_proc_target->setAttr<ATTR_HOMER_VIRT_ADDR>(
- reinterpret_cast<uint64_t>(l_virt_addr));
- }
-
- return l_virt_addr;
- }
-
-
/**
* @brief Load OCC/HCODE images into mainstore
*/
@@ -144,7 +99,7 @@ namespace RTPM
i_occ_common_addr,
i_chip,
i_mode);
-/* @TODO RTC: 148935 */
+
do
{
// Utility to convert i_chip to Target
@@ -162,11 +117,11 @@ namespace RTPM
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"load_pm_complex: "
"proc Target HUID=0x%08X",
- proc_target->getAttr<ATTR_HUID>());
+ get_huid(proc_target));
}
- void* occVirt = convertHomerPhysToVirt(proc_target,
- i_homer_addr);
+ void* occVirt = HBPM::convertHomerPhysToVirt(proc_target,
+ i_homer_addr);
if(NULL == occVirt)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
@@ -175,8 +130,7 @@ namespace RTPM
break;
}
- uint64_t l_homer_addr_va =
- reinterpret_cast <uint64_t>(occVirt);
+ uint64_t l_homer_addr_va = reinterpret_cast <uint64_t>(occVirt);
err = HBPM::loadOCCSetup(proc_target,
i_homer_addr,
@@ -192,7 +146,8 @@ namespace RTPM
err = HBPM::loadOCCImageToHomer(proc_target,
i_homer_addr,
- l_homer_addr_va);
+ l_homer_addr_va,
+ i_mode);
if(err)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
@@ -237,7 +192,7 @@ namespace RTPM
break;
}
} while(0);
-/* @TODO RTC: 148935 */
+
if (err)
{
pm_complex_error(err,
@@ -262,10 +217,6 @@ namespace RTPM
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"start_pm_complex: RtProcChip %llx", i_chip);
- // Run Sheldon's simics command file @TODO RTC: 148935
- /* MAGIC_INSTRUCTION(MAGIC_RUN_COMMAND_FILE); @TODO RTC: 148935 */
-
-/* @TODO RTC: 148935 start */
do
{
// Utility to convert i_chip to Target
@@ -283,7 +234,7 @@ namespace RTPM
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"start_pm_complex: "
"proc Target HUID=0x%08X",
- proc_target->getAttr<ATTR_HUID>());
+ get_huid(proc_target));
}
err = HBPM::startPMComplex(proc_target);
@@ -295,7 +246,7 @@ namespace RTPM
break;
}
} while(0);
-/* end @TODO RTC: 148935 */
+
if ( err )
{
pm_complex_error(err,
@@ -319,7 +270,7 @@ namespace RTPM
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"reset_pm_complex: RtProcChip %llx", i_chip);
-/* @TODO RTC: 148935 start */
+
do
{
// Utility to convert i_chip to Target
@@ -337,7 +288,7 @@ namespace RTPM
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"reset_pm_complex: "
"proc Target HUID=0x%08X",
- proc_target->getAttr<ATTR_HUID>());
+ get_huid(proc_target));
}
err = HBPM::resetPMComplex(proc_target);
@@ -349,7 +300,7 @@ namespace RTPM
break;
}
} while(0);
-/* end @TODO RTC: 148935 */
+
if ( err )
{
pm_complex_error(err,
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