diff options
Diffstat (limited to 'src/usr')
-rw-r--r-- | src/usr/hwpf/hwp/occ/occ.C | 495 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/occ/occ.mk | 6 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/occ/occ_common.C | 468 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/occ/runtime/rt_occ.C | 299 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/start_payload/start_payload.C | 1 | ||||
-rw-r--r-- | src/usr/hwpf/test/runtime/rt_occtest.H | 2 | ||||
-rw-r--r-- | src/usr/util/runtime/utillidmgr_rt.C | 2 |
7 files changed, 585 insertions, 688 deletions
diff --git a/src/usr/hwpf/hwp/occ/occ.C b/src/usr/hwpf/hwp/occ/occ.C index a154893dd..25d6e3656 100644 --- a/src/usr/hwpf/hwp/occ/occ.C +++ b/src/usr/hwpf/hwp/occ/occ.C @@ -26,7 +26,9 @@ #include <stdint.h> #include <config.h> -#include <occ/occ.H> +#include <hwpf/hwp/occ/occ.H> +#include <hwpf/hwp/occ/occ_common.H> + #include <initservice/taskargs.H> #include <errl/errlentry.H> @@ -58,6 +60,7 @@ #include <p8_pm_init.H> #include <p8_pm_firinit.H> +#include <config.h> // Easy macro replace for unit testing //#define TRACUCOMP(args...) TRACFCOMP(args) #define TRACUCOMP(args...) @@ -68,429 +71,81 @@ using namespace TARGETING; namespace HBOCC { - - /** - * @brief Fetches OCC image from FSP and writes to - * specified offset. - * - * @param[in] i_occVirtAddr Virtual - * address where OCC image - * should be loaded. - * - * @return errlHndl_t Error log image load failed - */ - errlHndl_t loadOCCImageToHomer(void* i_occVirtAddr) - { - TRACUCOMP( g_fapiTd, - ENTER_MRK"loadOCCImageToHomer(%p)", - i_occVirtAddr); - - errlHndl_t l_errl = NULL; - size_t lidSize = 0; - do { - UtilLidMgr lidMgr(Util::OCC_LIDID); - - l_errl = lidMgr.getLidSize(lidSize); - if(l_errl) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"loadOCCImageToHomer: Error getting lid size. lidId=0x%.8x", - Util::OCC_LIDID); - break; - } - - l_errl = lidMgr.getLid(i_occVirtAddr, lidSize); - if(l_errl) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"loadOCCImageToHomer: Error getting lid.. lidId=0x%.8x", - Util::OCC_LIDID); - break; - } - - }while(0); - - TRACUCOMP( g_fapiTd, - ENTER_MRK"loadOCCImageToHomer"); - - return l_errl; - } - - /** - * @brief Sets up OCC Host data - * - * @param[in] i_occHostDataVirtAddr Virtual - * address of current - * proc's Host data area. + /** + * @brief Setup homer addresses and load OCC for a specified processor * - * @return errlHndl_t Error log Host data setup failed - */ - errlHndl_t loadHostDataToHomer(void* i_occHostDataVirtAddr) - { - TRACUCOMP( g_fapiTd, - ENTER_MRK"loadHostDataToHomer(%p)", - i_occHostDataVirtAddr); - - errlHndl_t l_errl = NULL; - - //Treat virtual address as starting pointer - //for config struct - HBOCC::occHostConfigDataArea_t * config_data = - reinterpret_cast<HBOCC::occHostConfigDataArea_t *> - (i_occHostDataVirtAddr); - - // Get top level system target - TARGETING::TargetService & tS = TARGETING::targetService(); - TARGETING::Target * sysTarget = NULL; - tS.getTopLevelTarget( sysTarget ); - assert( sysTarget != NULL ); - - uint32_t nestFreq = sysTarget->getAttr<ATTR_FREQ_PB>(); - - config_data->version = HBOCC::OccHostDataVersion; - config_data->nestFrequency = nestFreq; - - TRACUCOMP( g_fapiTd, - EXIT_MRK"loadHostDataToHomer"); - - return l_errl; - } - - /** - * @brief Execute procedures and steps necessary - * to load OCC data in specified processor - * - * @param[in] i_target Target proc to load - * @param[in] i_homerVirtAddrBase Virtual - * address of current - * proc's HOMER - * @param[in] i_homerPhysAddrBase Physical - * address of current - * proc's HOMER + * @param[in] i_target0 Target proc to load + * @param[in] i_homerVirtAddrBase Base Virtual + * address of all HOMER + * images + * @param[in] i_homerPhysAddrBase Base Physical + * address of all HOMER + * images * - * @return errlHndl_t Error log image load failed + * @return errlHndl_t Error log */ - errlHndl_t load(Target* i_target, - void* i_homerVirtAddrBase, - uint64_t i_homerPhysAddrBase) - { - errlHndl_t l_errl = NULL; - uint64_t targHomer = 0; - uint64_t tmpOffset = 0; - void* occVirt = 0; - void* occHostVirt = 0; - - TRACFCOMP( g_fapiTd, - ENTER_MRK"HBOCC:load()" ); - - do{ - //Figure out OCC image offset for Target - //OCC image offset = HOMER_SIZE*ProcPosition + - // OCC offset within HOMER (happens to be zero) - uint8_t tmpPos = i_target->getAttr<ATTR_POSITION>(); - tmpOffset = tmpPos*VMM_HOMER_INSTANCE_SIZE + - HOMER_OFFSET_TO_OCC_IMG; - targHomer = i_homerPhysAddrBase + tmpOffset; - uint64_t occVirt64 = - reinterpret_cast<uint64_t>(i_homerVirtAddrBase) - + tmpOffset; - occVirt = reinterpret_cast<void *>(occVirt64); - - // Remember where we put things - if( i_target ) - { - i_target->setAttr<ATTR_HOMER_PHYS_ADDR>(targHomer); - i_target->setAttr<ATTR_HOMER_VIRT_ADDR>(occVirt64); - } - //Figure out OCC Host Data offset for Target - //OCC host data offset = HOMER_SIZE*ProcPosition + - // OCC data within HOMR - tmpOffset = tmpPos*VMM_HOMER_INSTANCE_SIZE + - HOMER_OFFSET_TO_OCC_HOST_DATA; - occHostVirt = - reinterpret_cast<void *> - (reinterpret_cast<uint64_t>(i_homerVirtAddrBase) - + tmpOffset) ; + errlHndl_t Setupnload (Target* i_target, + void* i_homerVirtAddrBase, + uint64_t i_homerPhysAddrBase) + { + errlHndl_t l_errl = NULL; + TRACUCOMP( g_fapiTd, + ENTER_MRK"Setupnload" ); - // cast OUR type of target to a FAPI type of target. - const fapi::Target - l_fapiTarg(fapi::TARGET_TYPE_PROC_CHIP, - (const_cast<Target*>(i_target))); + do { //============================== - //Setup for OCC Load + //Setup Addresses //============================== + uint8_t tmpPos = i_target->getAttr<ATTR_POSITION>(); + uint64_t tmpOffset = (tmpPos * VMM_HOMER_INSTANCE_SIZE) + + HOMER_OFFSET_TO_OCC_IMG; - // BAR0 is the Entire HOMER (start of HOMER contains OCC base Image) - // Bar size is in MB, obtained value of 4MB from Greg Still - const uint64_t bar0_size_MB = VMM_HOMER_INSTANCE_SIZE_IN_MB; - TRACUCOMP( g_fapiImpTd, - INFO_MRK"OCC Address: 0x%.8X, size=0x%.8X", - targHomer, bar0_size_MB ); - - FAPI_INVOKE_HWP( l_errl, - p8_pba_bar_config, - l_fapiTarg, - 0, targHomer, bar0_size_MB, - PBA_CMD_SCOPE_NODAL ); - - if ( l_errl != NULL ) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"Bar0 config failed!" ); - l_errl->collectTrace(FAPI_TRACE_NAME,256); - l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - // BAR1 is what OCC uses to talk to the Centaur - // Bar size is in MB - uint64_t centaur_addr = - i_target->getAttr<ATTR_IBSCOM_PROC_BASE_ADDR>(); - FAPI_INVOKE_HWP( l_errl, - p8_pba_bar_config, - l_fapiTarg, - 1, //i_index - centaur_addr, //i_pba_bar_addr - (uint64_t)OCC_IBSCOM_RANGE_IN_MB, //i_pba_bar_size - PBA_CMD_SCOPE_NODAL ); //i_pba_cmd_scope - - if ( l_errl != NULL ) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"Bar1 config failed!" ); - l_errl->collectTrace(FAPI_TRACE_NAME,256); - l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - // BAR3 is the OCC Common Area - // Bar size is in MB, obtained value of 8MB from Tim Hallett - const uint64_t bar3_size_MB = VMM_OCC_COMMON_SIZE_IN_MB; - const uint64_t occ_common_addr = i_homerPhysAddrBase - + VMM_HOMER_REGION_SIZE; - - TRACUCOMP( g_fapiImpTd, - INFO_MRK"OCC Common Address: 0x%.8X, size=0x%.8X", - occ_common_addr, bar3_size_MB ); + uint64_t i_homerPhysAddr = i_homerPhysAddrBase + tmpOffset; + uint64_t i_homerVirtAddr = reinterpret_cast<uint64_t> + (i_homerVirtAddrBase) + tmpOffset; - FAPI_INVOKE_HWP( l_errl, - p8_pba_bar_config, - l_fapiTarg, - 3, occ_common_addr, - bar3_size_MB, - PBA_CMD_SCOPE_NODAL ); - - if ( l_errl != NULL ) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"Bar3 config failed!" ); - l_errl->collectTrace(FAPI_TRACE_NAME,256); - l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } + uint64_t i_commonPhysAddr = i_homerPhysAddrBase + + VMM_HOMER_REGION_SIZE; //============================== - //Load the OCC HOMER image + // Load OCC //============================== - l_errl = loadOCCImageToHomer( occVirt ); - if( l_errl != NULL ) + l_errl= HBOCC::loadOCC(i_target, + i_homerPhysAddr, + i_homerVirtAddr, + i_commonPhysAddr); + if(l_errl != NULL) { - TRACFCOMP( g_fapiImpTd, ERR_MRK"loading image failed!" ); + TRACFCOMP( g_fapiImpTd, ERR_MRK"Setupnload: loadOCC failed" ); break; } //============================== //Setup host data area of HOMER; //============================== - l_errl = loadHostDataToHomer(occHostVirt); + void* occHostVirt = reinterpret_cast<void *>(i_homerVirtAddr); + l_errl = HBOCC::loadHostDataToHomer(occHostVirt); if( l_errl != NULL ) { TRACFCOMP( g_fapiImpTd, ERR_MRK"loading Host Data Area failed!" ); break; } - - }while(0); - - TRACFCOMP( g_fapiTd, - EXIT_MRK"HBOCC:load()" ); + } while (0); return l_errl; - - } + } /** - * @brief Load and Start OCC for specified DCM - * pair of processors. If 2nd input target - * is NULL, OCC will be setup on just the - * one target. + * @brief Starts OCCs on all Processors in the node + * This is intended to be used for AVP testing. * - * @param[in] i_target0 Target of first proc in - * DCM pair - * @param[in] i_target1 Target of second proc in - * DCM pair - * @param[in] i_homerVirtAddrBase Base Virtual - * address of all HOMER - * images - * @param[in] i_homerPhysAddrBase Base Physical - * address of all HOMER - * images - * - * @return errlHndl_t Error log image load failed + * @param[out] o_failedOccTarget: Pointer to the target failing + * loadnStartAllOccs + * @return errlHndl_t Error log if OCC load failed */ - errlHndl_t loadnStartOcc(Target* i_target0, - Target* i_target1, - void* i_homerVirtAddrBase, - uint64_t i_homerPhysAddrBase) - { - errlHndl_t l_errl = NULL; - - TRACUCOMP( g_fapiTd, - ENTER_MRK"loadnStartOcc" ); - - - do { - // cast OUR type of target to a FAPI type of target. - // figure out homer offsets - const fapi::Target - l_fapiTarg0(fapi::TARGET_TYPE_PROC_CHIP, - (const_cast<Target*>(i_target0))); - - fapi::Target l_fapiTarg1; - if(i_target1) - { - l_fapiTarg1.setType(fapi::TARGET_TYPE_PROC_CHIP); - l_fapiTarg1.set(const_cast<Target*>(i_target1)); - - } - else - { - l_fapiTarg1.setType(fapi::TARGET_TYPE_NONE); - } - - //============================== - //Setup and load oCC - //============================== - - l_errl = load(i_target0, - i_homerVirtAddrBase, - i_homerPhysAddrBase); - if(l_errl != NULL) - { - TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartOcc: load failed for target 0" ); - break; - } - - if(i_target1 != NULL) - { - l_errl = load(i_target1, - i_homerVirtAddrBase, - i_homerPhysAddrBase); - if(l_errl != NULL) - { - TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartOcc: load failed for target 1" ); - break; - } - } - //============================== - // Initialize the logic - //============================== - - // Config path - // p8_pm_init.C enum: PM_CONFIG - FAPI_INVOKE_HWP( l_errl, - p8_pm_init, - l_fapiTarg0, - l_fapiTarg1, - PM_CONFIG ); - - if ( l_errl != NULL ) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"p8_pm_init, config failed!" ); - l_errl->collectTrace(FAPI_TRACE_NAME,256); - l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - // Init path - // p8_pm_init.C enum: PM_INIT - FAPI_INVOKE_HWP( l_errl, - p8_pm_init, - l_fapiTarg0, - l_fapiTarg1, - PM_INIT ); - - if ( l_errl != NULL ) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"p8_pm_init, init failed!" ); - l_errl->collectTrace(FAPI_TRACE_NAME,256); - l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - TRACFCOMP( g_fapiImpTd, - INFO_MRK"OCC Finished: p8_pm_init.C enum: PM_INIT" ); - - - //============================== - //Start the OCC on primary chip of DCM - //============================== - FAPI_INVOKE_HWP( l_errl, - p8_occ_control, - l_fapiTarg0, - PPC405_RESET_OFF, - PPC405_BOOT_MEM ); - - if ( l_errl != NULL ) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"occ_control failed!" ); - l_errl->collectTrace(FAPI_TRACE_NAME,256); - l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - //============================== - // Start the OCC on slave chip of DCM - //============================== - if ( l_fapiTarg1.getType() != fapi::TARGET_TYPE_NONE ) - { - FAPI_INVOKE_HWP( l_errl, - p8_occ_control, - l_fapiTarg1, - PPC405_RESET_OFF, - PPC405_BOOT_MEM ); - - if ( l_errl != NULL ) - { - TRACFCOMP( g_fapiImpTd, - ERR_MRK"occ_control failed!" ); - l_errl->collectTrace(FAPI_TRACE_NAME,256); - l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - } - - } while(0); - - TRACUCOMP( g_fapiTd, - EXIT_MRK"loadnStartOcc" ); - - return l_errl; - } - - - //////////////////////////////////////////////// errlHndl_t loadnStartAllOccs(TARGETING::Target *& o_failedOccTarget) { errlHndl_t l_errl = NULL; @@ -564,12 +219,15 @@ namespace HBOCC if(0 == (*itr1)->getAttr<ATTR_PROC_DCM_INSTALLED>()) { + TRACUCOMP( g_fapiTd, + INFO_MRK"loadnStartAllOccs: non-dcm path entered"); + for (TargetHandleList::iterator itr = procChips.begin(); itr != procChips.end(); ++itr) { - l_errl = loadnStartOcc(*itr, - NULL, + /******* SETUP AND LOAD **************/ + l_errl = Setupnload (*itr, homerVirtAddrBase, homerPhysAddrBase); if(l_errl) @@ -579,6 +237,14 @@ namespace HBOCC "loadnStartAllOccs:loadnStartOcc failed"); break; } + + /********* START OCC *************/ + l_errl = HBOCC::startOCC (*itr, NULL, o_failedOccTarget); + if (l_errl) + { + TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartAllOcc: start failed"); + break; + } } if (l_errl) { @@ -624,16 +290,36 @@ namespace HBOCC targ1 = *itr; } } - TRACUCOMP( g_fapiImpTd, INFO_MRK"loadnStartAllOccs: calling loadnStartOcc." ); - l_errl = loadnStartOcc(targ0, - targ1, + + /********** Setup and load targ0 ***********/ + l_errl = Setupnload (targ0, homerVirtAddrBase, homerPhysAddrBase); if(l_errl) { - o_failedOccTarget = *itr; + o_failedOccTarget = targ0; + TRACFCOMP( g_fapiImpTd, ERR_MRK + "loadnStartAllOccs: Setupnload failed on targ0"); + break; + } + + /*********** Setup and load targ1 **********/ + l_errl = Setupnload (targ1, + homerVirtAddrBase, + homerPhysAddrBase); + if(l_errl) + { + o_failedOccTarget = targ1; TRACFCOMP( g_fapiImpTd, ERR_MRK - "loadnStartAllOccs:loadnStartOcc failed"); + "loadnStartAllOccs:Setupnload failed on targ1"); + break; + } + + /*********** Start OCC *******************/ + l_errl = HBOCC::startOCC (targ0, targ1, o_failedOccTarget); + if (l_errl) + { + TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartAllOccs: start failed"); break; } } @@ -711,8 +397,15 @@ namespace HBOCC return l_errl; } + /** + * @brief Starts OCCs on all Processors in the node + * This is intended to be used for Open Power. + * + * @return errlHndl_t Error log if OCC load failed + */ errlHndl_t activateOCC () { + TRACUCOMP( g_fapiTd,ENTER_MRK"activateOCC" ); errlHndl_t l_errl = NULL; TARGETING::Target* l_failedOccTarget = NULL; //uint8_t l_errStatus = 0; @@ -738,9 +431,7 @@ namespace HBOCC errlCommit (l_errl, HWPF_COMP_ID); } #endif + TRACUCOMP( g_fapiTd,EXIT_MRK"activateOCC" ); return l_errl; } - - - } //end OCC namespace diff --git a/src/usr/hwpf/hwp/occ/occ.mk b/src/usr/hwpf/hwp/occ/occ.mk index 12b5d7743..1a513002d 100644 --- a/src/usr/hwpf/hwp/occ/occ.mk +++ b/src/usr/hwpf/hwp/occ/occ.mk @@ -5,7 +5,9 @@ # # OpenPOWER HostBoot Project # -# COPYRIGHT International Business Machines Corp. 2014 +# Contributors Listed Below - COPYRIGHT 2014 +# [+] 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. @@ -69,6 +71,8 @@ OBJS += p8_pmc_force_vsafe.o OBJS += p8_ocb_indir_access.o OBJS += p8_ocb_indir_setup_linear.o +#common occ functions between ipl and runtime +OBJS += occ_common.o ## NOTE: add a new directory onto the vpaths when you add a new HWP ## EXAMPLE: # VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/occ/<HWP_dir> diff --git a/src/usr/hwpf/hwp/occ/occ_common.C b/src/usr/hwpf/hwp/occ/occ_common.C new file mode 100644 index 000000000..b2768873d --- /dev/null +++ b/src/usr/hwpf/hwp/occ/occ_common.C @@ -0,0 +1,468 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/hwpf/hwp/occ/occ.C $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2013,2014 */ +/* [+] 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 */ + +#include <stdint.h> + +#include <occ/occ_common.H> + +#include <initservice/taskargs.H> +#include <errl/errlentry.H> + +#include <devicefw/userif.H> +#include <sys/misc.h> +#include <sys/mm.h> +#include <sys/mmio.h> +#include <vmmconst.h> + +// targeting support +#include <targeting/common/commontargeting.H> +#include <targeting/common/utilFilter.H> +#include <targeting/common/targetservice.H> +#include <targeting/common/util.H> + +// fapi support +#include <fapi.H> +#include <fapiPlatHwpInvoker.H> +#include <hwpf/plat/fapiPlatTrace.H> +#include <hwpf/hwpf_reasoncodes.H> + +#include <vfs/vfs.H> +#include <util/utillidmgr.H> + +// Procedures +#include <p8_pba_init.H> +#include <p8_occ_control.H> +#include <p8_pba_bar_config.H> +#include <p8_pm_init.H> +#include <p8_pm_firinit.H> +#include <p8_pm_prep_for_reset.H> + +// Easy macro replace for unit testing +//#define TRACUCOMP(args...) TRACFCOMP(args) +#define TRACUCOMP(args...) + +extern trace_desc_t* g_fapiTd; + +using namespace TARGETING; + +namespace HBOCC +{ + /** + * @brief Fetches OCC image from FSP and writes to + * specified offset. + * + * @param[in] i_occVirtAddr Virtual + * address where OCC image + * should be loaded. + * + * @return errlHndl_t Error log image load failed + */ + errlHndl_t loadOCCImageToHomer(void* i_occVirtAddr) + { + TRACUCOMP( g_fapiTd, + ENTER_MRK"loadOCCImageToHomer(%p)", + i_occVirtAddr); + + errlHndl_t l_errl = NULL; + size_t lidSize = 0; + do { + UtilLidMgr lidMgr(HBOCC::OCC_LIDID); + + l_errl = lidMgr.getLidSize(lidSize); + if(l_errl) + { + TRACFCOMP( g_fapiImpTd, + ERR_MRK"loadOCCImageToHomer: Error getting lid size. lidId=0x%.8x", + OCC_LIDID); + break; + } + + l_errl = lidMgr.getLid(i_occVirtAddr, lidSize); + if(l_errl) + { + TRACFCOMP( g_fapiImpTd, + ERR_MRK"loadOCCImageToHomer: Error getting lid.. lidId=0x%.8x", + OCC_LIDID); + break; + } + + }while(0); + + TRACUCOMP( g_fapiTd, + EXIT_MRK"loadOCCImageToHomer"); + + return l_errl; + } + + /** + * @brief Sets up OCC Host data + * + * @param[in] i_occHostDataVirtAddr Virtual + * address of current + * proc's Host data area. + * + * @return errlHndl_t Error log Host data setup failed + */ + errlHndl_t loadHostDataToHomer(void* i_occHostDataVirtAddr) + { + TRACUCOMP( g_fapiTd, + ENTER_MRK"loadHostDataToHomer(%p)", + i_occHostDataVirtAddr); + + errlHndl_t l_errl = NULL; + + //Treat virtual address as starting pointer + //for config struct + HBOCC::occHostConfigDataArea_t * config_data = + reinterpret_cast<HBOCC::occHostConfigDataArea_t *> + (i_occHostDataVirtAddr); + + // Get top level system target + TARGETING::TargetService & tS = TARGETING::targetService(); + TARGETING::Target * sysTarget = NULL; + tS.getTopLevelTarget( sysTarget ); + assert( sysTarget != NULL ); + + uint32_t nestFreq = sysTarget->getAttr<ATTR_FREQ_PB>(); + + config_data->version = HBOCC::OccHostDataVersion; + config_data->nestFrequency = nestFreq; + + TRACUCOMP( g_fapiTd, + EXIT_MRK"loadHostDataToHomer"); + + return l_errl; + } + + /** + * @brief Execute procedures and steps necessary + * to load OCC data in specified processor + * + * @param[in] i_target Target proc to load + * @param[in] i_homerVirtAddrBase Virtual + * address of current + * proc's HOMER + * @param[in] i_homerPhysAddrBase Physical + * address of current + * proc's HOMER + * + * @return errlHndl_t Error log image load failed + */ + errlHndl_t loadOCC(TARGETING::Target* i_target, + uint64_t i_homerPhysAddr, + uint64_t i_homerVirtAddr, + uint64_t i_commonPhysAddr) + { + errlHndl_t l_errl = NULL; + TRACFCOMP( g_fapiTd, + ENTER_MRK"loadOCC" ); + do{ + // Remember where we put things + if( i_target ) + { + i_target->setAttr<ATTR_HOMER_PHYS_ADDR>(i_homerPhysAddr); + i_target->setAttr<ATTR_HOMER_VIRT_ADDR>(i_homerVirtAddr); + } + // cast OUR type of target to a FAPI type of target. + const fapi::Target l_fapiTarg(fapi::TARGET_TYPE_PROC_CHIP, + (const_cast<Target*>(i_target))); + TRACFCOMP( g_fapiTd, "FapiTarget: %s",l_fapiTarg.toEcmdString()); + + //============================== + //Setup for OCC Load + //============================== + + // BAR0 is the Entire HOMER (start of HOMER contains OCC base Image) + // Bar size is in MB, obtained value of 4MB from Greg Still + TRACUCOMP( g_fapiImpTd, + INFO_MRK"loadOCC: OCC Address: 0x%.8X, size=0x%.8X", + i_homerPhysAddr, VMM_HOMER_INSTANCE_SIZE_IN_MB); + + FAPI_INVOKE_HWP( l_errl, + p8_pba_bar_config, + l_fapiTarg, + 0, + i_homerPhysAddr, + VMM_HOMER_INSTANCE_SIZE_IN_MB, + PBA_CMD_SCOPE_NODAL ); + + if (l_errl) + { + TRACFCOMP( g_fapiImpTd, + ERR_MRK"loadOCC: Bar0 config failed!" ); + l_errl->collectTrace(FAPI_TRACE_NAME,256); + l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); + + break; + } + + // BAR1 is what OCC uses to talk to the Centaur + // Bar size is in MB + uint64_t centaur_addr = + i_target->getAttr<ATTR_IBSCOM_PROC_BASE_ADDR>(); + FAPI_INVOKE_HWP( l_errl, + p8_pba_bar_config, + l_fapiTarg, + 1, //i_index + centaur_addr, //i_pba_bar_addr + (uint64_t)OCC_IBSCOM_RANGE_IN_MB, //i_pba_bar_size + PBA_CMD_SCOPE_NODAL ); //i_pba_cmd_scope + + if ( l_errl ) + { + TRACFCOMP( g_fapiImpTd, + ERR_MRK"loadOCC: Bar1 config failed!" ); + l_errl->collectTrace(FAPI_TRACE_NAME,256); + l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); + + break; + } + + // BAR3 is the OCC Common Area + // Bar size is in MB, obtained value of 8MB from Tim Hallett + TRACUCOMP( g_fapiImpTd, + INFO_MRK"loadOCC: OCC Common Addr: 0x%.8X,size=0x%.8X", + i_commonPhysAddr,VMM_OCC_COMMON_SIZE_IN_MB); + + FAPI_INVOKE_HWP( l_errl, + p8_pba_bar_config, + l_fapiTarg, + 3, + i_commonPhysAddr, + VMM_OCC_COMMON_SIZE_IN_MB, + PBA_CMD_SCOPE_NODAL ); + + if ( l_errl != NULL ) + { + TRACFCOMP( g_fapiImpTd, + ERR_MRK"loadOCC: Bar3 config failed!" ); + l_errl->collectTrace(FAPI_TRACE_NAME,256); + l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); + + break; + } + + //============================== + //Load the OCC HOMER image + //============================== + void* occVirt = reinterpret_cast<void *>(i_homerVirtAddr); + l_errl = loadOCCImageToHomer( occVirt ); + if( l_errl != NULL ) + { + TRACFCOMP(g_fapiImpTd, + ERR_MRK"loadOCC: loadOCCImageToHomer failed!"); + break; + } + }while(0); + + TRACFCOMP( g_fapiTd, + EXIT_MRK"loadOCC"); + + return l_errl; + + } + + /** + * @brief Start OCC for specified DCM pair of processors. + * If 2nd input is NULL, OCC will be setup on just + * one target. + * + * @param[in] i_target0: target of first processor in DCM pair + * @param[in] i_target1: target of second processor in DCM pair + * @param[out] o_failedTarget failed target in case of an error + * + * @return errlHndl_t Error log of startOCC failed + */ + errlHndl_t startOCC (Target* i_target0, + Target* i_target1, + Target *& o_failedTarget) + { + TRACFCOMP( g_fapiTd, + ENTER_MRK"startOCC"); + errlHndl_t l_errl = NULL; + + // cast OUR type of target to a FAPI type of target. + // figure out homer offsets + const fapi::Target + l_fapiTarg0(fapi::TARGET_TYPE_PROC_CHIP, + (const_cast<Target*>(i_target0))); + fapi::Target l_fapiTarg1; + if(i_target1) + { + l_fapiTarg1.setType(fapi::TARGET_TYPE_PROC_CHIP); + l_fapiTarg1.set(const_cast<Target*>(i_target1)); + } + else + { + l_fapiTarg1.setType(fapi::TARGET_TYPE_NONE); + } + do { + //============================== + // Initialize the logic + //============================== + + // Config path + // p8_pm_init.C enum: PM_CONFIG + FAPI_INVOKE_HWP( l_errl, + p8_pm_init, + l_fapiTarg0, + l_fapiTarg1, + PM_CONFIG ); + + if ( l_errl != NULL ) + { + o_failedTarget = i_target0; + TRACFCOMP( g_fapiImpTd, + ERR_MRK"startOCC: p8_pm_init, config failed!"); + l_errl->collectTrace(FAPI_TRACE_NAME,256); + l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); + break; + } + + // Init path + // p8_pm_init.C enum: PM_INIT + FAPI_INVOKE_HWP( l_errl, + p8_pm_init, + l_fapiTarg0, + l_fapiTarg1, + PM_INIT ); + + if ( l_errl != NULL ) + { + o_failedTarget = i_target0; + TRACFCOMP( g_fapiImpTd, + ERR_MRK"startOCC: p8_pm_init, init failed!" ); + l_errl->collectTrace(FAPI_TRACE_NAME,256); + l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); + + break; + } + + //============================== + //Start the OCC on primary chip of DCM + //============================== + FAPI_INVOKE_HWP( l_errl, + p8_occ_control, + l_fapiTarg0, + PPC405_RESET_OFF, + PPC405_BOOT_MEM ); + + if ( l_errl != NULL ) + { + o_failedTarget = i_target0; + TRACFCOMP( g_fapiImpTd, + ERR_MRK"startOCC: occ_control failed!"); + l_errl->collectTrace(FAPI_TRACE_NAME,256); + l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); + + break; + } + + //============================== + // Start the OCC on slave chip of DCM + //============================== + if ( l_fapiTarg1.getType() != fapi::TARGET_TYPE_NONE ) + { + FAPI_INVOKE_HWP( l_errl, + p8_occ_control, + l_fapiTarg1, + PPC405_RESET_OFF, + PPC405_BOOT_MEM ); + + if ( l_errl != NULL ) + { + o_failedTarget = i_target1; + TRACFCOMP( g_fapiImpTd, + ERR_MRK"startOCCocc_control failed on slave chip!"); + l_errl->collectTrace(FAPI_TRACE_NAME,256); + l_errl->collectTrace(FAPI_IMP_TRACE_NAME,256); + + break; + } + } + } while (0); + + TRACFCOMP( g_fapiTd, + EXIT_MRK"startOCC"); + return l_errl; + } + /** + * @brief Stop OCC for specified DCM pair of processors. + * If 2nd input is NULL, OCC will be setup on just + * one target. + * + * @param[in] i_target0: target of first processor in DCM pair + * @param[in] i_target1: target of second processor in DCM pair + * + * @return errlHndl_t Error log of stopOCC failed + */ + errlHndl_t stopOCC(TARGETING::Target * i_target0, + TARGETING::Target * i_target1) + { + TRACFCOMP( g_fapiTd, + ENTER_MRK"stopOCC"); + errlHndl_t err = NULL; + do + { + const fapi::Target + l_fapiTarg0(fapi::TARGET_TYPE_PROC_CHIP, + (const_cast<TARGETING::Target*>(i_target0))); + + fapi::Target l_fapiTarg1; + if(i_target1) + { + l_fapiTarg1.setType(fapi::TARGET_TYPE_PROC_CHIP); + l_fapiTarg1.set(const_cast<TARGETING::Target*>(i_target1)); + + } + else + { + l_fapiTarg1.setType(fapi::TARGET_TYPE_NONE); + } + + FAPI_INVOKE_HWP( err, + p8_pm_prep_for_reset, + l_fapiTarg0, + l_fapiTarg1, + PM_RESET ); + + if ( err != NULL ) + { + TRACFCOMP( g_fapiTd, + ERR_MRK"stopOCC:p8_pm_prep_for_reset failed!" ); + err->collectTrace(FAPI_TRACE_NAME,256); + err->collectTrace(FAPI_IMP_TRACE_NAME,256); + + break; + } + + } while(0); + + TRACFCOMP( g_fapiTd, + EXIT_MRK"stopOCC"); + return err; + } +} //end OCC namespace + diff --git a/src/usr/hwpf/hwp/occ/runtime/rt_occ.C b/src/usr/hwpf/hwp/occ/runtime/rt_occ.C index 27160e478..0d5dc806c 100644 --- a/src/usr/hwpf/hwp/occ/runtime/rt_occ.C +++ b/src/usr/hwpf/hwp/occ/runtime/rt_occ.C @@ -24,7 +24,9 @@ /* IBM_PROLOG_END_TAG */ #include <runtime/interface.h> #include <kernel/console.H> -#include <hwpf/hwp/occ/occ.H> + +#include <hwpf/hwp/occ/occ_common.H> + #include <vmmconst.h> #include <sys/misc.h> #include <errno.h> @@ -40,8 +42,6 @@ #include <targeting/common/util.H> #include <runtime/rt_targeting.H> -#include <runtime/interface.h> - // fapi support #include <fapi.H> #include <fapiPlatHwpInvoker.H> @@ -59,11 +59,6 @@ using namespace TARGETING; extern trace_desc_t* g_fapiTd; // defined in rt_fapiPlatUtil.C -// @TODO RTC 98547 -// There is potential to share more code with src/hwpf/hwp/occ/occ.C, -// but would require refactoring the HB occ code and modifying the order and -// sequence of some events. - namespace RT_OCC { typedef std::vector<TARGETING::Target *> target_list_t; @@ -87,30 +82,6 @@ namespace RT_OCC } while (0); } - //--------------------------------------------------------------------- - errlHndl_t addHostData(uint64_t i_hostdata_addr) - { - errlHndl_t err = NULL; - //Treat virtual address as starting pointer - //for config struct - HBOCC::occHostConfigDataArea_t * config_data = - reinterpret_cast<HBOCC::occHostConfigDataArea_t *> - (i_hostdata_addr); - - // Get top level system target - TARGETING::TargetService & tS = TARGETING::targetService(); - TARGETING::Target * sysTarget = NULL; - tS.getTopLevelTarget( sysTarget ); - assert( sysTarget != NULL ); - - uint32_t nestFreq = sysTarget->getAttr<ATTR_FREQ_PB>(); - - config_data->version = HBOCC::OccHostDataVersion; - config_data->nestFrequency = nestFreq; - - return err; - } - //------------------------------------------------------------------------ int executeLoadOCC(uint64_t i_homer_addr_phys, @@ -141,106 +112,21 @@ namespace RT_OCC rc = EINVAL; break; } - - // Remember where we put things - proc_target->setAttr<ATTR_HOMER_PHYS_ADDR>(i_homer_addr_phys); - proc_target->setAttr<ATTR_HOMER_VIRT_ADDR>(i_homer_addr_va); - - // Convert to fapi Target - fapi::Target fapiTarg( fapi::TARGET_TYPE_PROC_CHIP, - (const_cast<TARGETING::Target*>(proc_target) - )); - - TRACFCOMP( g_fapiTd, "FapiTarget: %s",fapiTarg.toEcmdString()); - - // BAR0 is the Entire HOMER, Bar size is in MB - FAPI_INVOKE_HWP( err, - p8_pba_bar_config, - fapiTarg, - 0, //BAR0 - i_homer_addr_phys, - VMM_HOMER_INSTANCE_SIZE_IN_MB, - PBA_CMD_SCOPE_NODAL ); - - if ( err ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"Bar0 config failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - // BAR1 is what OCC uses to talk to the Centaur. Bar size is in MB - uint64_t centaur_addr = - proc_target->getAttr<ATTR_IBSCOM_PROC_BASE_ADDR>(); - - FAPI_INVOKE_HWP( err, - p8_pba_bar_config, - fapiTarg, - 1, //BAR1 - centaur_addr, //i_pba_bar_addr - //i_pba_bar_size - (uint64_t)HBOCC::OCC_IBSCOM_RANGE_IN_MB, - PBA_CMD_SCOPE_NODAL ); //i_pba_cmd_scope - - if ( err != NULL ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"Bar1 config failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - // BAR3 is the OCC Common Area - // Bar size is in MB, obtained value of 8MB from Tim Hallett - FAPI_INVOKE_HWP( err, - p8_pba_bar_config, - fapiTarg, - 3, //BAR3 - i_common_addr_phys, - VMM_OCC_COMMON_SIZE_IN_MB, - PBA_CMD_SCOPE_NODAL ); - - if ( err ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"Bar3 config failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - // Load HOMER image - UtilLidMgr lidmgr(Util::OCC_LIDID); - - size_t lidSize = 0; - err = lidmgr.getLidSize(lidSize); + err = HBOCC::loadOCC(proc_target, + i_homer_addr_phys, + i_homer_addr_va, + i_common_addr_phys); if( err ) { break; } - err = lidmgr.getLid(reinterpret_cast<void*>(i_homer_addr_va), - lidSize); - if( err ) - { - break; - } - - TRACFCOMP( g_fapiTd, - "OCC lid loaded. ID:%x size:%d", - Util::OCC_LIDID, - lidSize); - - // Setup Host Data area of HOMER - err = addHostData(i_homer_addr_va+HOMER_OFFSET_TO_OCC_HOST_DATA); - if( err ) + void* occHostVirt = reinterpret_cast <void *> (i_homer_addr_va + + HOMER_OFFSET_TO_OCC_HOST_DATA); + err = HBOCC::loadHostDataToHomer(occHostVirt); + if( err != NULL ) { + TRACFCOMP( g_fapiImpTd, ERR_MRK"loading Host Data Area failed!" ); break; } @@ -269,164 +155,13 @@ namespace RT_OCC //------------------------------------------------------------------------ - errlHndl_t start_occ(TARGETING::Target * i_target0, - TARGETING::Target * i_target1) - { - errlHndl_t err = NULL; - do - { - const fapi::Target - l_fapiTarg0(fapi::TARGET_TYPE_PROC_CHIP, - (const_cast<TARGETING::Target*>(i_target0))); - - fapi::Target l_fapiTarg1; - if(i_target1) - { - l_fapiTarg1.setType(fapi::TARGET_TYPE_PROC_CHIP); - l_fapiTarg1.set(const_cast<TARGETING::Target*>(i_target1)); - - } - else - { - l_fapiTarg1.setType(fapi::TARGET_TYPE_NONE); - } - - FAPI_INVOKE_HWP( err, - p8_pm_init, - l_fapiTarg0, - l_fapiTarg1, - PM_CONFIG ); - - if ( err != NULL ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"p8_pm_init, config failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - // Init path - // p8_pm_init.C enum: PM_INIT - FAPI_INVOKE_HWP( err, - p8_pm_init, - l_fapiTarg0, - l_fapiTarg1, - PM_INIT ); - - if ( err != NULL ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"p8_pm_init, init failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - TRACFCOMP( g_fapiTd, - INFO_MRK"OCC Finished: p8_pm_init.C enum: PM_INIT" ); - - - //============================== - //Start the OCC on primary chip of DCM - //============================== - FAPI_INVOKE_HWP( err, - p8_occ_control, - l_fapiTarg0, - PPC405_RESET_OFF, - PPC405_BOOT_MEM ); - - if ( err != NULL ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"occ_control failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - //============================== - // Start the OCC on slave chip of DCM - //============================== - if ( l_fapiTarg1.getType() != fapi::TARGET_TYPE_NONE ) - { - FAPI_INVOKE_HWP( err, - p8_occ_control, - l_fapiTarg1, - PPC405_RESET_OFF, - PPC405_BOOT_MEM ); - - if ( err != NULL ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"occ_control failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - } - } while(0); - - return err; - } - - //------------------------------------------------------------------------ - - errlHndl_t stop_occ(TARGETING::Target * i_target0, - TARGETING::Target * i_target1) - { - errlHndl_t err = NULL; - do - { - const fapi::Target - l_fapiTarg0(fapi::TARGET_TYPE_PROC_CHIP, - (const_cast<TARGETING::Target*>(i_target0))); - - fapi::Target l_fapiTarg1; - if(i_target1) - { - l_fapiTarg1.setType(fapi::TARGET_TYPE_PROC_CHIP); - l_fapiTarg1.set(const_cast<TARGETING::Target*>(i_target1)); - - } - else - { - l_fapiTarg1.setType(fapi::TARGET_TYPE_NONE); - } - - FAPI_INVOKE_HWP( err, - p8_pm_prep_for_reset, - l_fapiTarg0, - l_fapiTarg1, - PM_RESET ); - - if ( err != NULL ) - { - TRACFCOMP( g_fapiTd, - ERR_MRK"p8_pm_prep_for_reset failed!" ); - err->collectTrace(FAPI_TRACE_NAME,256); - err->collectTrace(FAPI_IMP_TRACE_NAME,256); - - break; - } - - } while(0); - - return err; - } - - //------------------------------------------------------------------------ - int executeOnDcms(HBOCC::occAction_t i_action, uint64_t * i_proc_chip, size_t i_num_chips) { errlHndl_t err = NULL; int rc = 0; - + TARGETING::Target* l_failedTarget = NULL; TRACFCOMP( g_fapiTd, "Action=%d, number of procs = %d ", i_action, @@ -475,11 +210,11 @@ namespace RT_OCC { if(i_action == HBOCC::OCC_START) { - err = start_occ(*itarg, NULL); + err = HBOCC::startOCC(*itarg, NULL, l_failedTarget); } else if(i_action == HBOCC::OCC_STOP) { - err = stop_occ(*itarg, NULL); + err = HBOCC::stopOCC(*itarg, NULL); } if( err ) @@ -536,11 +271,11 @@ namespace RT_OCC } if(i_action == HBOCC::OCC_START) { - err = start_occ(t0,t1); + err = HBOCC::startOCC(t0,t1, l_failedTarget); } else if(i_action == HBOCC::OCC_STOP) { - err = stop_occ(t0,t1); + err = HBOCC::stopOCC(t0,t1); } if( err ) diff --git a/src/usr/hwpf/hwp/start_payload/start_payload.C b/src/usr/hwpf/hwp/start_payload/start_payload.C index 920edcc0b..2c90b1c7b 100644 --- a/src/usr/hwpf/hwp/start_payload/start_payload.C +++ b/src/usr/hwpf/hwp/start_payload/start_payload.C @@ -327,7 +327,6 @@ void* call_host_runtime_setup( void *io_pArgs ) break; } } - #ifdef CONFIG_SET_NOMINAL_PSTATE // Speed up processors. l_err = setMaxPstate(); diff --git a/src/usr/hwpf/test/runtime/rt_occtest.H b/src/usr/hwpf/test/runtime/rt_occtest.H index 33a189d10..907e82f48 100644 --- a/src/usr/hwpf/test/runtime/rt_occtest.H +++ b/src/usr/hwpf/test/runtime/rt_occtest.H @@ -27,7 +27,7 @@ #include <cxxtest/TestSuite.H> #include <runtime/interface.h> -#include <hwpf/hwp/occ/occ.H> +#include <hwpf/hwp/occ/occ_common.H> #include <fapi.H> #include <targeting/common/commontargeting.H> #include <vmmconst.h> diff --git a/src/usr/util/runtime/utillidmgr_rt.C b/src/usr/util/runtime/utillidmgr_rt.C index 51d1d371c..3b87d4879 100644 --- a/src/usr/util/runtime/utillidmgr_rt.C +++ b/src/usr/util/runtime/utillidmgr_rt.C @@ -30,7 +30,7 @@ #include <errl/errlmanager.H> #include <vfs/vfs.H> #include <runtime/interface.h> -#include <hwpf/hwp/occ/occ.H> +#include <hwpf/hwp/occ/occ_common.H> UtilLidMgr::UtilLidMgr(uint32_t i_lidId) : iv_isPnor(false), iv_lidBuffer(NULL), iv_lidSize(0) |