diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2013-09-05 09:23:57 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-09-12 16:51:50 -0500 |
commit | 52904ec000600bf19fcebe864c15fc7b9e134255 (patch) | |
tree | df1c9678eb2b356effc7d58a2838222b7c932403 /src/usr/hwpf/hwp/occ | |
parent | a816a9a252dbac72cc3a574f16f0cda0efaa38b4 (diff) | |
download | talos-hostboot-52904ec000600bf19fcebe864c15fc7b9e134255.tar.gz talos-hostboot-52904ec000600bf19fcebe864c15fc7b9e134255.zip |
Start OCC in Sapphire mode
Enable the OCC code to run in Sapphire mode.
Moved the OCC memory range up to the top our memory in
Sapphire mode like we do for SLW.
Change-Id: Iad857dafd739db6f91ba3fd4f8a332e558d68f8b
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6040
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp/occ')
-rw-r--r-- | src/usr/hwpf/hwp/occ/occ.C | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/src/usr/hwpf/hwp/occ/occ.C b/src/usr/hwpf/hwp/occ/occ.C index cea9c392c..e39d1e73f 100644 --- a/src/usr/hwpf/hwp/occ/occ.C +++ b/src/usr/hwpf/hwp/occ/occ.C @@ -36,6 +36,7 @@ #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> @@ -185,12 +186,16 @@ namespace HBOCC * @param[in] i_target Target proc to load * @param[in] i_homerVirtAddrBase Virtual * address of current - * procs HOMER + * proc's HOMER + * @param[in] i_homerPhysAddrBase Physical + * address of current + * proc's HOMER * * @return errlHndl_t Error log image load failed */ errlHndl_t load(Target* i_target, - void* i_homerVirtAddrBase) + void* i_homerVirtAddrBase, + uint64_t i_homerPhysAddrBase) { errlHndl_t l_errl = NULL; uint64_t targHomer = 0; @@ -202,15 +207,13 @@ namespace HBOCC ENTER_MRK"HBOCC:load()" ); do{ - //Figure out OCC image offset for Target //OCC image offset = HOMER_SIZE*ProcPosition + // OCC offset within HOMR (happens to be zero) uint8_t tmpPos = i_target->getAttr<ATTR_POSITION>(); tmpOffset = tmpPos*VMM_HOMER_INSTANCE_SIZE + HOMER_OFFSET_TO_OCC_IMG; - targHomer = VMM_HOMER_REGION_START_ADDR + - tmpOffset; + targHomer = i_homerPhysAddrBase + tmpOffset; occVirt = reinterpret_cast<void *> (reinterpret_cast<uint64_t>(i_homerVirtAddrBase) @@ -284,7 +287,8 @@ namespace HBOCC // 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 = VMM_OCC_COMMON_START_ADDR; + 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", @@ -349,12 +353,16 @@ namespace HBOCC * @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 */ errlHndl_t loadnStartOcc(Target* i_target0, Target* i_target1, - void* i_homerVirtAddrBase) + void* i_homerVirtAddrBase, + uint64_t i_homerPhysAddrBase) { errlHndl_t l_errl = NULL; @@ -386,7 +394,8 @@ namespace HBOCC //============================== l_errl = load(i_target0, - i_homerVirtAddrBase); + i_homerVirtAddrBase, + i_homerPhysAddrBase); if(l_errl != NULL) { TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartOcc: load failed for target 0" ); @@ -396,7 +405,8 @@ namespace HBOCC if(i_target1 != NULL) { l_errl = load(i_target1, - i_homerVirtAddrBase); + i_homerVirtAddrBase, + i_homerPhysAddrBase); if(l_errl != NULL) { TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartOcc: load failed for target 1" ); @@ -525,9 +535,20 @@ namespace HBOCC assert(VMM_HOMER_REGION_SIZE <= THIRTYTWO_GB, "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(); + assert (homerPhysAddrBase != 0, + "loadnStartAllOccs: Top of memory was 0!"); + homerPhysAddrBase -= VMM_ALL_HOMER_OCC_MEMORY_SIZE; + } + TRACFCOMP( g_fapiTd, "HOMER is at %.16X", homerPhysAddrBase ); + //Map entire homer region into virtual memory homerVirtAddrBase = - mm_block_map(reinterpret_cast<void*>(VMM_HOMER_REGION_START_ADDR), + mm_block_map(reinterpret_cast<void*>(homerPhysAddrBase), VMM_HOMER_REGION_SIZE); TargetHandleList procChips; @@ -565,7 +586,8 @@ namespace HBOCC { l_errl = loadnStartOcc(*itr, NULL, - homerVirtAddrBase); + homerVirtAddrBase, + homerPhysAddrBase); if(l_errl) { TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartAllOccs: loadnStartOcc failed!" ); @@ -614,7 +636,8 @@ namespace HBOCC TRACUCOMP( g_fapiImpTd, INFO_MRK"loadnStartAllOccs: calling loadnStartOcc." ); l_errl = loadnStartOcc(targ0, targ1, - homerVirtAddrBase); + homerVirtAddrBase, + homerPhysAddrBase); if(l_errl) { TRACFCOMP( g_fapiImpTd, ERR_MRK"loadnStartAllOccs: loadnStartOcc failed!" ); |