summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2015-01-26 14:41:54 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-02-28 05:49:51 -0600
commit29581aca6a1ed02d3374e5688e5f32fcb6f104bc (patch)
tree11f3ef76e83a0e18b313e2aa67b45292190e4b2a /src/usr/hwpf/hwp
parent9ca7f528d22e488c53d2dfbad32423806b47ddb0 (diff)
downloadtalos-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/makefile4
-rw-r--r--src/usr/hwpf/hwp/occ/occ.C125
-rw-r--r--src/usr/hwpf/hwp/occ/occ.mk3
-rw-r--r--src/usr/hwpf/hwp/occ/occ_common.C22
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 )
{
OpenPOWER on IntegriCloud