summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2013-09-05 09:23:57 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-09-12 16:51:50 -0500
commit52904ec000600bf19fcebe864c15fc7b9e134255 (patch)
treedf1c9678eb2b356effc7d58a2838222b7c932403
parenta816a9a252dbac72cc3a574f16f0cda0efaa38b4 (diff)
downloadtalos-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>
-rw-r--r--src/include/usr/targeting/common/util.H5
-rw-r--r--src/include/usr/vmmconst.h4
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C2
-rw-r--r--src/usr/hwpf/hwp/occ/occ.C47
-rw-r--r--src/usr/hwpf/hwp/start_payload/start_payload.C41
-rw-r--r--src/usr/targeting/common/util.C39
-rw-r--r--src/usr/targeting/common/xmltohb/simics_MURANO.system.xml8
-rw-r--r--src/usr/targeting/common/xmltohb/simics_VENICE.system.xml18
8 files changed, 124 insertions, 40 deletions
diff --git a/src/include/usr/targeting/common/util.H b/src/include/usr/targeting/common/util.H
index e0bb80bf5..d1e2cff0f 100644
--- a/src/include/usr/targeting/common/util.H
+++ b/src/include/usr/targeting/common/util.H
@@ -113,6 +113,11 @@ bool is_sapphire_load(void);
*/
bool is_avp_load(void);
+/**
+ * @brief Utility function to obtain the highest known address in the system
+ */
+uint64_t get_top_mem_addr(void);
+
}
#endif // __TARGETING_COMMON_UTIL_H
diff --git a/src/include/usr/vmmconst.h b/src/include/usr/vmmconst.h
index 544f0d32f..6190e719e 100644
--- a/src/include/usr/vmmconst.h
+++ b/src/include/usr/vmmconst.h
@@ -130,6 +130,10 @@ enum BlockPriority
#define VMM_OCC_COMMON_END \
(VMM_OCC_COMMON_START_ADDR + VMM_OCC_COMMON_SIZE)
+/** Total Memory required for HOMERs and OCC Common */
+#define VMM_ALL_HOMER_OCC_MEMORY_SIZE \
+ (VMM_OCC_COMMON_SIZE+VMM_HOMER_REGION_SIZE)
+
/**
* Test Constants
diff --git a/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C b/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C
index ff6e936f7..6a67bcd7c 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C
+++ b/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C
@@ -382,7 +382,7 @@ void* call_host_build_winkle( void *io_pArgs )
l_memBase = get_top_mem_addr();
assert (l_memBase != 0,
"host_build_winkle: Top of memory was 0!");
- l_memBase -= VMM_HOMER_REGION_SIZE;
+ l_memBase -= VMM_ALL_HOMER_OCC_MEMORY_SIZE;
}
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"HOMER base = %x", l_memBase);
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!" );
diff --git a/src/usr/hwpf/hwp/start_payload/start_payload.C b/src/usr/hwpf/hwp/start_payload/start_payload.C
index b55ea4cbe..86f0e39c5 100644
--- a/src/usr/hwpf/hwp/start_payload/start_payload.C
+++ b/src/usr/hwpf/hwp/start_payload/start_payload.C
@@ -224,10 +224,11 @@ void* call_host_runtime_setup( void *io_pArgs )
= sys->getAttr<TARGETING::ATTR_PAYLOAD_KIND>();
- //Only run OCC in AVP mode. Run the rest in !AVP mode
- if( is_avp_load() )
+ //Start OCC in AVP (or Sapphire mode for now)
+ if( is_avp_load() || is_sapphire_load() )
{
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "Skipping host_runtime_setup in AVP mode. Starting OCC" );
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "Starting OCC" );
+
//Load modules needed by OCC
bool occ_loaded = false;
@@ -274,8 +275,9 @@ void* call_host_runtime_setup( void *io_pArgs )
}
break;
}
- else if( is_sapphire_load() &&
- INITSERVICE::spLess())
+
+ if( is_sapphire_load() &&
+ INITSERVICE::spLess())
{
// Write the devtree out when in SPLess
// Sapphire mode
@@ -288,19 +290,16 @@ void* call_host_runtime_setup( void *io_pArgs )
break;
}
}
- else //PHYP or SAPPHIRE with FSP
+ else if( TARGETING::PAYLOAD_KIND_PHYP == payload_kind )
{
- //If PHYP then clean the PORE BARs
- if( TARGETING::PAYLOAD_KIND_PHYP == payload_kind )
+ //If PHYP then clear out the PORE BARs
+ l_err = clearPoreBars();
+ if( l_err )
{
- l_err = clearPoreBars();
- if( l_err )
- {
- break;
- }
+ break;
}
- //Update the MDRT value
+ //Update the MDRT value (for MS Dump)
l_err = RUNTIME::write_MDRT_Count();
if(l_err != NULL)
{
@@ -319,6 +318,20 @@ void* call_host_runtime_setup( void *io_pArgs )
break;
}
}
+ else if( TARGETING::PAYLOAD_KIND_NONE == payload_kind )
+ {
+ // Write the HostServices attributes into mainstore
+ // for our testcases
+ l_err = RUNTIME::populate_attributes();
+ if ( l_err )
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Could not populate attributes" );
+ // break from do loop if error occured
+ break;
+ }
+ }
+
// - Update HDAT/DEVTREE with tpmd logs
diff --git a/src/usr/targeting/common/util.C b/src/usr/targeting/common/util.C
index a53f2c88a..d592d411f 100644
--- a/src/usr/targeting/common/util.C
+++ b/src/usr/targeting/common/util.C
@@ -32,6 +32,7 @@
//******************************************************************************
#include <targeting/common/attributes.H>
#include <targeting/common/targetservice.H>
+#include <targeting/common/utilFilter.H>
namespace TARGETING
{
@@ -194,5 +195,43 @@ bool is_avp_load(void)
|| (mnfg_flags & TARGETING::MNFG_FLAG_BIT_MNFG_HDAT_AVP_ENABLE));
}
+/**
+ * @brief Utility function to obtain the highest known address in the system
+ */
+uint64_t get_top_mem_addr(void)
+{
+ uint64_t top_addr = 0;
+
+ do
+ {
+ // Get all functional proc chip targets
+ TARGETING::TargetHandleList l_cpuTargetList;
+ TARGETING::getAllChips(l_cpuTargetList, TYPE_PROC);
+
+ for ( size_t proc = 0; proc < l_cpuTargetList.size(); proc++ )
+ {
+ TARGETING::Target * l_pProc = l_cpuTargetList[proc];
+
+ //Not checking success here as fail results in no change to
+ // top_addr
+ uint64_t l_mem_bases[8] = {0,};
+ uint64_t l_mem_sizes[8] = {0,};
+ l_pProc->tryGetAttr<TARGETING::ATTR_PROC_MEM_BASES>(l_mem_bases);
+ l_pProc->tryGetAttr<TARGETING::ATTR_PROC_MEM_SIZES>(l_mem_sizes);
+
+ for (size_t i=0; i< 8; i++)
+ {
+ if(l_mem_sizes[i]) //non zero means that there is memory present
+ {
+ top_addr = std::max(top_addr,
+ l_mem_bases[i] + l_mem_sizes[i]);
+ }
+ }
+ }
+ }while(0);
+
+ return top_addr;
+}
+
}
diff --git a/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml b/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml
index 61c47d4c6..0bc8b5cd5 100644
--- a/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml
+++ b/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml
@@ -211,7 +211,7 @@
<default>10</default>
</attribute>
<attribute><id>PM_SPIVID_FREQUENCY</id>
- <default>0b11</default>
+ <default>0x3</default>
</attribute>
<!-- End pm_plat_attributes.xml -->
<attribute><id>MAX_EXS_PER_PROC_CHIP</id>
@@ -364,7 +364,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b100</default><!-- PORT0NONRED -->
+ <default>0x4</default><!-- PORT0NONRED -->
</attribute>
<attribute><id>PM_SLEEP_TYPE</id></attribute>
<attribute><id>PM_APSS_CHIP_SELECT</id>
@@ -1119,7 +1119,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b000</default><!-- NONE -->
+ <default>0x0</default><!-- NONE -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -2636,7 +2636,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b000</default><!-- NONE -->
+ <default>0x0</default><!-- NONE -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
diff --git a/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml b/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml
index 79db7a86f..0af784c87 100644
--- a/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml
+++ b/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml
@@ -337,7 +337,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -1458,7 +1458,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -2579,7 +2579,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -3699,7 +3699,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -4818,7 +4818,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -5906,7 +5906,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -6992,7 +6992,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -8079,7 +8079,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
@@ -16093,7 +16093,7 @@
<default>1250</default>
</attribute>
<attribute><id>PM_SPIVID_PORT_ENABLE</id>
- <default>0b111</default><!-- REDUNDANT -->
+ <default>0x7</default><!-- REDUNDANT -->
</attribute>
<attribute><id>PM_SLEEP_ENTRY</id></attribute>
<attribute><id>PM_SLEEP_EXIT</id></attribute>
OpenPOWER on IntegriCloud