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 | |
| parent | 3abbc2756991593bee3e2ad88f36f9eb26e6bf00 (diff) | |
| download | blackbird-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.H | 43 | ||||
| -rw-r--r-- | src/include/usr/util/utillidmgr.H | 52 | ||||
| -rw-r--r-- | src/usr/isteps/pm/makefile | 1 | ||||
| -rw-r--r-- | src/usr/isteps/pm/pm.mk | 5 | ||||
| -rw-r--r-- | src/usr/isteps/pm/pm_common.C | 341 | ||||
| -rw-r--r-- | src/usr/isteps/pm/pm_common.H | 12 | ||||
| -rw-r--r-- | src/usr/isteps/pm/runtime/rt_pm.C | 77 | ||||
| -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 |
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; } |

