diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2015-01-26 14:41:54 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-02-28 05:49:51 -0600 |
commit | 29581aca6a1ed02d3374e5688e5f32fcb6f104bc (patch) | |
tree | 11f3ef76e83a0e18b313e2aa67b45292190e4b2a /src/usr/hwpf/hwp | |
parent | 9ca7f528d22e488c53d2dfbad32423806b47ddb0 (diff) | |
download | talos-hostboot-29581aca6a1ed02d3374e5688e5f32fcb6f104bc.tar.gz talos-hostboot-29581aca6a1ed02d3374e5688e5f32fcb6f104bc.zip |
HTMGT: Implement OCC Reset
Change-Id: Icb713497d662d1ab55718409675bf4b23ac2c3ec
RTC: 121721
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/15530
Tested-by: Jenkins Server
Reviewed-by: Christopher Cain <cjcain@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp')
-rw-r--r-- | src/usr/hwpf/hwp/occ/makefile | 4 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/occ/occ.C | 125 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/occ/occ.mk | 3 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/occ/occ_common.C | 22 |
4 files changed, 93 insertions, 61 deletions
diff --git a/src/usr/hwpf/hwp/occ/makefile b/src/usr/hwpf/hwp/occ/makefile index 9eb68e669..042b66ec4 100644 --- a/src/usr/hwpf/hwp/occ/makefile +++ b/src/usr/hwpf/hwp/occ/makefile @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2013,2014 +# Contributors Listed Below - COPYRIGHT 2013,2015 # [+] International Business Machines Corp. # # @@ -29,7 +29,7 @@ MODULE = occ SUBDIRS += runtime.d ## Objects unique to HB IPL -OBJS += occ.o +OBJS += ## Objects common to HB IPL and HBRT include occ.mk diff --git a/src/usr/hwpf/hwp/occ/occ.C b/src/usr/hwpf/hwp/occ/occ.C index ac2f4b126..b5168896a 100644 --- a/src/usr/hwpf/hwp/occ/occ.C +++ b/src/usr/hwpf/hwp/occ/occ.C @@ -74,65 +74,83 @@ using namespace TARGETING; namespace HBOCC { /** - * @brief Setup homer addresses and load OCC for a specified processor + * @brief Determine homer addresses and load OCC image for a processor. * - * @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 + * @param[in] i_target0 Target proc to load + * @param[in] i_homerVirtAddrBase + * IPL: Base Virtual address of all HOMER images + * Runtime: Ignored - Determined using Attributes * - * @return errlHndl_t Error log + * @param[in] i_homerPhysAddrBase + * IPL: Base Physical address of all HOMER images + * Runtime: Ignored - Determined using Attributes + * + * @return errlHndl_t Error log */ - errlHndl_t Setupnload (Target* i_target, - void* i_homerVirtAddrBase, - uint64_t i_homerPhysAddrBase) - { + errlHndl_t primeAndLoadOcc (Target* i_target, + void* i_homerVirtAddrBase, + uint64_t i_homerPhysAddrBase) + { errlHndl_t l_errl = NULL; TRACUCOMP( g_fapiTd, - ENTER_MRK"Setupnload" ); + ENTER_MRK"primeAndLoadOcc" ); do { //============================== //Setup Addresses //============================== - uint8_t tmpPos = i_target->getAttr<ATTR_POSITION>(); - uint64_t tmpOffset = (tmpPos * VMM_HOMER_INSTANCE_SIZE); + uint8_t procPos = i_target->getAttr<ATTR_POSITION>(); + uint64_t procOffset = (procPos * VMM_HOMER_INSTANCE_SIZE); + +#ifndef __HOSTBOOT_RUNTIME + uint64_t occImgPaddr = + i_homerPhysAddrBase + procOffset + HOMER_OFFSET_TO_OCC_IMG; + + uint64_t occImgVaddr = reinterpret_cast<uint64_t> + (i_homerVirtAddrBase) + procOffset + HOMER_OFFSET_TO_OCC_IMG; + + uint64_t commonPhysAddr = + i_homerPhysAddrBase + VMM_HOMER_REGION_SIZE; + + uint64_t homerHostVirtAddr = reinterpret_cast<uint64_t> + (i_homerVirtAddrBase) + procOffset + + HOMER_OFFSET_TO_OCC_HOST_DATA; +#else + uint64_t homerPaddr = i_target->getAttr<ATTR_HOMER_PHYS_ADDR>(); + uint64_t homerVaddr = i_target->getAttr<ATTR_HOMER_VIRT_ADDR>(); + + uint64_t occImgPaddr = homerPaddr + HOMER_OFFSET_TO_OCC_IMG; + uint64_t occImgVaddr = homerVaddr + HOMER_OFFSET_TO_OCC_IMG; - uint64_t i_homerPhysAddr = i_homerPhysAddrBase + tmpOffset + - HOMER_OFFSET_TO_OCC_IMG; - uint64_t i_homerVirtAddr = reinterpret_cast<uint64_t> - (i_homerVirtAddrBase) + tmpOffset + - HOMER_OFFSET_TO_OCC_IMG; + uint64_t commonPhysAddr = // After homer region + (homerPaddr - procOffset) + VMM_HOMER_REGION_SIZE; + + uint64_t homerHostVirtAddr = + homerVaddr + HOMER_OFFSET_TO_OCC_HOST_DATA; + +#endif - uint64_t i_commonPhysAddr = i_homerPhysAddrBase + - VMM_HOMER_REGION_SIZE; //============================== // Load OCC //============================== l_errl= HBOCC::loadOCC(i_target, - i_homerPhysAddr, - i_homerVirtAddr, - i_commonPhysAddr); + occImgPaddr, + occImgVaddr, + commonPhysAddr); if(l_errl != NULL) { - TRACFCOMP( g_fapiImpTd, ERR_MRK"Setupnload: loadOCC failed" ); + TRACFCOMP( g_fapiImpTd, ERR_MRK"primeAndLoadOcc: loadOCC failed" ); break; } //============================== //Setup host data area of HOMER; //============================== - uint64_t i_homerHostVirtAddr = reinterpret_cast<uint64_t> - (i_homerVirtAddrBase) + - tmpOffset + HOMER_OFFSET_TO_OCC_HOST_DATA; - void* occHostVirt = reinterpret_cast<void*>(i_homerHostVirtAddr); + void* occHostVirt = reinterpret_cast<void*>(homerHostVirtAddr); l_errl = HBOCC::loadHostDataToHomer(i_target,occHostVirt); if( l_errl != NULL ) { @@ -156,12 +174,14 @@ namespace HBOCC { errlHndl_t l_errl = NULL; void* homerVirtAddrBase = NULL; + uint64_t homerPhysAddrBase = VMM_HOMER_REGION_START_ADDR; bool winkle_loaded = false; TRACUCOMP( g_fapiTd, ENTER_MRK"loadnStartAllOccs" ); do { +#ifndef __HOSTBOOT_RUNTIME //OCC requires the build_winkle_images library if ( !VFS::module_is_loaded( "libbuild_winkle_images.so" ) ) { @@ -181,7 +201,6 @@ namespace HBOCC "loadnStartAllOccs: Unsupported HOMER Region size"); //If running Sapphire need to place this at the top of memory - uint64_t homerPhysAddrBase = VMM_HOMER_REGION_START_ADDR; if(TARGETING::is_sapphire_load()) { homerPhysAddrBase = TARGETING::get_top_mem_addr(); @@ -196,6 +215,8 @@ namespace HBOCC mm_block_map(reinterpret_cast<void*>(homerPhysAddrBase), VMM_HOMER_REGION_SIZE); +#endif + TargetHandleList procChips; getAllChips(procChips, TYPE_PROC, true); @@ -233,9 +254,9 @@ namespace HBOCC ++itr) { /******* SETUP AND LOAD **************/ - l_errl = Setupnload (*itr, - homerVirtAddrBase, - homerPhysAddrBase); + l_errl = primeAndLoadOcc (*itr, + homerVirtAddrBase, + homerPhysAddrBase); if(l_errl) { o_failedOccTarget = *itr; @@ -278,7 +299,8 @@ namespace HBOCC Target* targ0 = *itr; Target* targ1 = NULL; - TRACUCOMP( g_fapiImpTd, INFO_MRK"loadnStartAllOccs: Cur target nodeID=%d", + TRACUCOMP( g_fapiImpTd, INFO_MRK + "loadnStartAllOccs: Cur target nodeID=%d", targ0->getAttr<ATTR_FABRIC_NODE_ID>()); @@ -287,7 +309,10 @@ namespace HBOCC // and update targ1 pointer if((itr+1) != procChips.end()) { - TRACUCOMP( g_fapiImpTd, INFO_MRK"loadnStartAllOccs: n+1 target nodeID=%d", ((*(itr+1))->getAttr<ATTR_FABRIC_NODE_ID>())); + TRACUCOMP( g_fapiImpTd, INFO_MRK + "loadnStartAllOccs: n+1 target nodeID=%d", + ((*(itr+1))->getAttr<ATTR_FABRIC_NODE_ID>()) + ); if((targ0->getAttr<ATTR_FABRIC_NODE_ID>()) == ((*(itr+1))->getAttr<ATTR_FABRIC_NODE_ID>())) @@ -298,26 +323,28 @@ namespace HBOCC } /********** Setup and load targ0 ***********/ - l_errl = Setupnload (targ0, - homerVirtAddrBase, - homerPhysAddrBase); + l_errl = primeAndLoadOcc (targ0, + homerVirtAddrBase, + homerPhysAddrBase); if(l_errl) { o_failedOccTarget = targ0; TRACFCOMP( g_fapiImpTd, ERR_MRK - "loadnStartAllOccs: Setupnload failed on targ0"); + "loadnStartAllOccs: " + "primeAndLoadOcc failed on targ0"); break; } /*********** Setup and load targ1 **********/ - l_errl = Setupnload (targ1, - homerVirtAddrBase, - homerPhysAddrBase); + l_errl = primeAndLoadOcc (targ1, + homerVirtAddrBase, + homerPhysAddrBase); if(l_errl) { o_failedOccTarget = targ1; TRACFCOMP( g_fapiImpTd, ERR_MRK - "loadnStartAllOccs:Setupnload failed on targ1"); + "loadnStartAllOccs: " + "primeAndLoadOcc failed on targ1"); break; } @@ -325,7 +352,8 @@ namespace HBOCC l_errl = HBOCC::startOCC (targ0, targ1, o_failedOccTarget); if (l_errl) { - TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartAllOccs: start failed"); + TRACFCOMP( g_fapiImpTd, ERR_MRK + "loadnStartAllOccs: start failed"); break; } } @@ -385,7 +413,10 @@ namespace HBOCC l_tmpErrl = VFS::module_unload( "libbuild_winkle_images.so" ); if ( l_tmpErrl ) { - TRACFCOMP( g_fapiTd,ERR_MRK"loadnStartAllOccs: Error unloading build_winkle module" ); + TRACFCOMP + ( g_fapiTd,ERR_MRK + "loadnStartAllOccs: Error unloading build_winkle module" + ); if(l_errl) { errlCommit( l_tmpErrl, HWPF_COMP_ID ); diff --git a/src/usr/hwpf/hwp/occ/occ.mk b/src/usr/hwpf/hwp/occ/occ.mk index 0425824c3..073b9dc7c 100644 --- a/src/usr/hwpf/hwp/occ/occ.mk +++ b/src/usr/hwpf/hwp/occ/occ.mk @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2014 +# Contributors Listed Below - COPYRIGHT 2014,2015 # [+] International Business Machines Corp. # # @@ -73,6 +73,7 @@ OBJS += p8_ocb_indir_setup_linear.o #common occ functions between ipl and runtime OBJS += occ_common.o +OBJS += occ.o OBJS += $(if $(CONFIG_HTMGT),occAccess.o) ## NOTE: add a new directory onto the vpaths when you add a new HWP diff --git a/src/usr/hwpf/hwp/occ/occ_common.C b/src/usr/hwpf/hwp/occ/occ_common.C index e444b26d4..98e638286 100644 --- a/src/usr/hwpf/hwp/occ/occ_common.C +++ b/src/usr/hwpf/hwp/occ/occ_common.C @@ -178,13 +178,9 @@ namespace HBOCC return l_errl; } - /** - * @brief Execute procedures and steps necessary - * to load OCC data in specified processor - */ errlHndl_t loadOCC(TARGETING::Target* i_target, - uint64_t i_homerPhysAddr, - uint64_t i_homerVirtAddr, + uint64_t i_occImgPaddr, + uint64_t i_occImgVaddr, uint64_t i_commonPhysAddr) { errlHndl_t l_errl = NULL; @@ -194,8 +190,12 @@ namespace HBOCC // 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); + // Subtract HOMER_OFFSET_TO_OCC_IMG to be technically + // correct though HOMER_OFFSET_TO_OCC_IMG happens to be zero + i_target->setAttr<ATTR_HOMER_PHYS_ADDR> + (i_occImgPaddr - HOMER_OFFSET_TO_OCC_IMG); + i_target->setAttr<ATTR_HOMER_VIRT_ADDR> + (i_occImgVaddr - HOMER_OFFSET_TO_OCC_IMG); } // cast OUR type of target to a FAPI type of target. const fapi::Target l_fapiTarg(fapi::TARGET_TYPE_PROC_CHIP, @@ -210,13 +210,13 @@ namespace HBOCC // 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); + i_occImgPaddr, VMM_HOMER_INSTANCE_SIZE_IN_MB); FAPI_INVOKE_HWP( l_errl, p8_pba_bar_config, l_fapiTarg, 0, - i_homerPhysAddr, + i_occImgPaddr, VMM_HOMER_INSTANCE_SIZE_IN_MB, PBA_CMD_SCOPE_NODAL ); @@ -279,7 +279,7 @@ namespace HBOCC //============================== //Load the OCC HOMER image //============================== - void* occVirt = reinterpret_cast<void *>(i_homerVirtAddr); + void* occVirt = reinterpret_cast<void *>(i_occImgVaddr); l_errl = loadOCCImageToHomer( occVirt ); if( l_errl != NULL ) { |