summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/occ/occ.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hwpf/hwp/occ/occ.C')
-rw-r--r--src/usr/hwpf/hwp/occ/occ.C125
1 files changed, 78 insertions, 47 deletions
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 );
OpenPOWER on IntegriCloud