diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2014-01-19 22:06:28 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-02-11 15:30:46 -0600 |
commit | b7733595ec491960fa6c97f5ad1fb2c47ac5592c (patch) | |
tree | f4a169250428db5411fb42e2f9d7a5f3dd96b927 /src | |
parent | 18bdf83d7705bd3c519b195ce095e39181214435 (diff) | |
download | blackbird-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.H | 11 | ||||
-rw-r--r-- | src/usr/devtree/bld_devtree.C | 84 | ||||
-rw-r--r-- | src/usr/devtree/devtree.C | 25 | ||||
-rw-r--r-- | src/usr/devtree/devtree.H | 7 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/start_payload/start_payload.C | 25 |
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 |