summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2014-01-19 22:06:28 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2014-02-11 15:30:46 -0600
commitb7733595ec491960fa6c97f5ad1fb2c47ac5592c (patch)
treef4a169250428db5411fb42e2f9d7a5f3dd96b927 /src
parent18bdf83d7705bd3c519b195ce095e39181214435 (diff)
downloadblackbird-hostboot-b7733595ec491960fa6c97f5ad1fb2c47ac5592c.tar.gz
blackbird-hostboot-b7733595ec491960fa6c97f5ad1fb2c47ac5592c.zip
HBRT: Build small devtree for HDAT-based Sapphire.
Change-Id: I06fb4c6d07a82146b19a38457d2114569c53a571 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/8147 Tested-by: Jenkins Server Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/devtree/devtreeif.H11
-rw-r--r--src/usr/devtree/bld_devtree.C84
-rw-r--r--src/usr/devtree/devtree.C25
-rw-r--r--src/usr/devtree/devtree.H7
-rw-r--r--src/usr/hwpf/hwp/start_payload/start_payload.C25
5 files changed, 115 insertions, 37 deletions
diff --git a/src/include/usr/devtree/devtreeif.H b/src/include/usr/devtree/devtreeif.H
index e6c068e88..2fbcb885d 100644
--- a/src/include/usr/devtree/devtreeif.H
+++ b/src/include/usr/devtree/devtreeif.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* COPYRIGHT International Business Machines Corp. 2012,2014 */
/* */
/* p1 */
/* */
@@ -32,9 +32,16 @@ namespace DEVTREE
/**
* @brief Build flattened dev tree for Sapphire
*
+ * @param[in] i_dtAddr - Address to load devtree. 0 will use a default
+ * data area appropriate for non-HDAT Sapphire.
+ * @param[in] i_dtSize - Allowable size for the devtree.
+ * @param[in] i_smallTree - Build a small devtree appropriate for inside
+ * the HDAT area.
+ *
* @return errlHndl_t NULL on success
*/
- errlHndl_t build_flatdevtree( void );
+ errlHndl_t build_flatdevtree( uint64_t i_dtAddr = 0, size_t i_dtSize = 0,
+ bool i_smallTree = false);
/**
* @brief Get the address of the flattened dev tree for Sapphire
diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C
index b9c8e4949..2124cae6b 100644
--- a/src/usr/devtree/bld_devtree.C
+++ b/src/usr/devtree/bld_devtree.C
@@ -50,7 +50,7 @@ $ */
#include <pnor/pnorif.H>
#include <sys/mm.h>
#include <util/align.H>
-
+#include <vector>
trace_desc_t *g_trac_devtree = NULL;
TRAC_INIT(&g_trac_devtree, "DEVTREE", 4096);
@@ -453,8 +453,7 @@ uint32_t bld_intr_node(devTree * i_dt, dtOffset_t & i_parentNode,
void add_reserved_mem(devTree * i_dt,
- uint64_t i_homerAddr[],
- size_t i_num,
+ std::vector<uint64_t>& i_homerAddr,
uint64_t i_extraAddr[],
uint64_t i_extraSize[],
const char* i_extraStr[],
@@ -483,14 +482,16 @@ void add_reserved_mem(devTree * i_dt,
dtOffset_t rootNode = i_dt->findNode("/");
+ size_t l_num = i_homerAddr.size();
+
const char* homerStr = "ibm,slw-occ-image";
- const char* reserve_strs[i_num+i_extraCnt+1];
- uint64_t ranges[i_num+i_extraCnt][2];
+ const char* reserve_strs[l_num+i_extraCnt+1];
+ uint64_t ranges[l_num+i_extraCnt][2];
uint64_t cell_count = sizeof(ranges) / sizeof(uint64_t);
- uint64_t res_mem_addrs[i_num+i_extraCnt];
- uint64_t res_mem_sizes[i_num+i_extraCnt];
+ uint64_t res_mem_addrs[l_num+i_extraCnt];
+ uint64_t res_mem_sizes[l_num+i_extraCnt];
- for(size_t i = 0; i<i_num; i++)
+ for(size_t i = 0; i<l_num; i++)
{
reserve_strs[i] = homerStr;
ranges[i][0] = i_homerAddr[i];
@@ -506,21 +507,21 @@ void add_reserved_mem(devTree * i_dt,
TRACFCOMP( g_trac_devtree, "Reserved Region %s @ %lx, %lx",
i_extraStr[i], i_extraAddr[i], i_extraSize[i]);
- reserve_strs[i_num] = i_extraStr[i];
- ranges[i_num][0] = i_extraAddr[i];
- ranges[i_num][1] = i_extraSize[i];
+ reserve_strs[l_num] = i_extraStr[i];
+ ranges[l_num][0] = i_extraAddr[i];
+ ranges[l_num][1] = i_extraSize[i];
- res_mem_addrs[i_num] = i_extraAddr[i];
- res_mem_sizes[i_num] = i_extraSize[i];
+ res_mem_addrs[l_num] = i_extraAddr[i];
+ res_mem_sizes[l_num] = i_extraSize[i];
- i_num++;
+ l_num++;
}
else
{
cell_count -= sizeof(ranges[0]);
}
}
- reserve_strs[i_num] = NULL;
+ reserve_strs[l_num] = NULL;
i_dt->addPropertyStrings(rootNode, "reserved-names", reserve_strs);
i_dt->addPropertyCells64(rootNode, "reserved-ranges",
@@ -581,8 +582,13 @@ void load_hbrt_image(uint64_t& io_address)
}
-errlHndl_t bld_fdt_cpu(devTree * i_dt)
+errlHndl_t bld_fdt_cpu(devTree * i_dt,
+ std::vector<uint64_t>& o_homerRegions,
+ bool i_smallTree)
{
+ // Nothing to do for small trees currently.
+ if (i_smallTree) { return NULL; }
+
errlHndl_t errhdl = NULL;
/* Find the / node and add a cpus node under it. */
@@ -596,7 +602,6 @@ errlHndl_t bld_fdt_cpu(devTree * i_dt)
// Get all functional proc chip targets
TARGETING::TargetHandleList l_procTargetList;
getAllChips(l_procTargetList, TYPE_PROC);
- uint64_t l_homerAddr[l_procTargetList.size()];
for (size_t proc = 0; (!errhdl) && (proc < l_procTargetList.size()); proc++)
{
@@ -608,7 +613,7 @@ errlHndl_t bld_fdt_cpu(devTree * i_dt)
//Each processor will have a HOMER image that needs
//to be reserved -- save it away
- l_homerAddr[proc] = getHomerPhysAddr(l_pProc);
+ o_homerRegions.push_back(getHomerPhysAddr(l_pProc));
TARGETING::TargetHandleList l_exlist;
getChildChiplets( l_exlist, l_pProc, TYPE_CORE );
@@ -647,6 +652,15 @@ errlHndl_t bld_fdt_cpu(devTree * i_dt)
}
}
+ return errhdl;
+}
+
+errlHndl_t bld_fdt_reserved_mem(devTree * i_dt,
+ std::vector<uint64_t>& i_homerRegions,
+ bool i_smallTree)
+{
+ errlHndl_t errhdl = NULL;
+
// VPD
uint64_t l_vpd_addr = 0;
@@ -672,18 +686,21 @@ errlHndl_t bld_fdt_cpu(devTree * i_dt)
//Add in reserved memory for HOMER images and HBRT sections.
add_reserved_mem(i_dt,
- l_homerAddr,
- l_procTargetList.size(),
+ i_homerRegions,
l_extra_addrs,
l_extra_sizes,
l_extra_addrs_str,
l_extra_addr_cnt);
return errhdl;
+
}
-errlHndl_t bld_fdt_mem(devTree * i_dt)
+errlHndl_t bld_fdt_mem(devTree * i_dt, bool i_smallTree)
{
+ // Nothing to do for small trees currently.
+ if (i_smallTree) { return NULL; }
+
errlHndl_t errhdl = NULL;
bool rc;
@@ -858,26 +875,43 @@ errlHndl_t bld_fdt_mem(devTree * i_dt)
return errhdl;
}
-errlHndl_t build_flatdevtree( void )
+errlHndl_t build_flatdevtree( uint64_t i_dtAddr, size_t i_dtSize,
+ bool i_smallTree )
{
errlHndl_t errhdl = NULL;
devTree * dt = &Singleton<devTree>::instance();
+ bool devTreeVirtual = true;
do
{
+ if (0 == i_dtAddr)
+ {
+ i_dtAddr = DEVTREE_DATA_ADDR;
+ i_dtSize = DEVTREE_SPACE_SIZE;
+ devTreeVirtual = false;
+ }
TRACFCOMP( g_trac_devtree, "---devtree init---" );
- dt->initialize(DEVTREE_DATA_ADDR, DEVTREE_SPACE_SIZE);
+ dt->initialize(i_dtAddr, i_dtSize, devTreeVirtual);
+
+ std::vector<uint64_t> l_homerRegions;
TRACFCOMP( g_trac_devtree, "---devtree cpu ---" );
- errhdl = bld_fdt_cpu(dt);
+ errhdl = bld_fdt_cpu(dt, l_homerRegions, i_smallTree);
+ if(errhdl)
+ {
+ break;
+ }
+
+ TRACFCOMP( g_trac_devtree, "---devtree reserved mem ---" );
+ errhdl = bld_fdt_reserved_mem(dt, l_homerRegions, i_smallTree);
if(errhdl)
{
break;
}
TRACFCOMP( g_trac_devtree, "---devtree mem ---" );
- errhdl = bld_fdt_mem(dt);
+ errhdl = bld_fdt_mem(dt, i_smallTree);
if(errhdl)
{
break;
diff --git a/src/usr/devtree/devtree.C b/src/usr/devtree/devtree.C
index eac9f1b0e..62b5763ba 100644
--- a/src/usr/devtree/devtree.C
+++ b/src/usr/devtree/devtree.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -55,14 +55,22 @@ uint32_t devTree::getSize()
return mHeader->totalSize;
}
-void devTree::initialize(uint64_t i_addr, size_t i_maxSize)
+void devTree::initialize(uint64_t i_addr, size_t i_maxSize, bool i_virtual)
{
/* Initialize the device tree header. */
mMaxSize = i_maxSize;
- mPhysAddr = i_addr;
- mSpace= static_cast<char*>
- (mm_block_map(reinterpret_cast<void*>(mPhysAddr),
- mMaxSize));
+ if (i_virtual)
+ {
+ mPhysAddr = 0;
+ mSpace = reinterpret_cast<char*>(i_addr);
+ }
+ else
+ {
+ mPhysAddr = i_addr;
+ mSpace= static_cast<char*>
+ (mm_block_map(reinterpret_cast<void*>(mPhysAddr),
+ mMaxSize));
+ }
memset(mSpace, 0, mMaxSize);
mNextPhandle = 1;
@@ -724,7 +732,10 @@ devTree::devTree()
*/
devTree::~devTree()
{
- mm_block_unmap(mSpace);
+ if (mPhysAddr)
+ {
+ mm_block_unmap(mSpace);
+ }
}
}
diff --git a/src/usr/devtree/devtree.H b/src/usr/devtree/devtree.H
index 42d4f0bd7..128ed7b89 100644
--- a/src/usr/devtree/devtree.H
+++ b/src/usr/devtree/devtree.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -54,10 +54,11 @@ typedef size_t dtOffset_t;
/**
* Initialize the FDT at address and size
- * @param[in] i_addr Physical address to place FDT at
+ * @param[in] i_addr Address to place FDT at
* @param[in] i_maxSize Size of FDT
+ * @param[in] i_virtual Address is virtual.
*/
- void initialize(uint64_t i_addr, size_t i_maxSize);
+ void initialize(uint64_t i_addr, size_t i_maxSize, bool i_virtual);
/**
* Find given node (e.g. "/lpc") in the FDT
diff --git a/src/usr/hwpf/hwp/start_payload/start_payload.C b/src/usr/hwpf/hwp/start_payload/start_payload.C
index e83e66328..c89aa30bc 100644
--- a/src/usr/hwpf/hwp/start_payload/start_payload.C
+++ b/src/usr/hwpf/hwp/start_payload/start_payload.C
@@ -309,6 +309,31 @@ void* call_host_runtime_setup( void *io_pArgs )
break;
}
}
+ else if( is_sapphire_load() )
+ {
+ // Find area in HDAT to load devtree.
+ uint64_t l_dtAddr = 0;
+ size_t l_dtSize = 0;
+ l_err = RUNTIME::get_host_data_section(RUNTIME::HSVC_SYSTEM_DATA,
+ 0, l_dtAddr, l_dtSize);
+
+ if ( l_err )
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Could not find system data area for Devtree.");
+ break;
+ }
+
+ l_err = DEVTREE::build_flatdevtree(l_dtAddr, l_dtSize, true);
+
+ if ( l_err )
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Failed to build small dev-tree for HDAT.");
+ break;
+ }
+
+ }
else if( TARGETING::PAYLOAD_KIND_PHYP == payload_kind )
{
//If PHYP then clear out the PORE BARs
OpenPOWER on IntegriCloud