diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2013-10-15 13:55:28 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-11-13 14:49:38 -0600 |
commit | dd2a474b7fc3a8937f45d1278e887b370ad81192 (patch) | |
tree | 00595698a572529ddcd00fc3c975b588b4ea67dc /src/usr/devtree | |
parent | 1aa8f7551005dd48078b91be173e8bcc7e339061 (diff) | |
download | blackbird-hostboot-dd2a474b7fc3a8937f45d1278e887b370ad81192.tar.gz blackbird-hostboot-dd2a474b7fc3a8937f45d1278e887b370ad81192.zip |
Add VPD support to HBRT
RTC: 79419
Change-Id: I6d00e52026084a68925691b96d7a491faaffb4ef
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/7004
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/usr/devtree')
-rw-r--r-- | src/usr/devtree/bld_devtree.C | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C index 3dc7f96d6..a79057680 100644 --- a/src/usr/devtree/bld_devtree.C +++ b/src/usr/devtree/bld_devtree.C @@ -44,6 +44,7 @@ $ */ #include "devtree.H" #include <sys/mmio.h> //THIRTYTWO_GB #include <intr/interrupt.H> +#include <vpd/vpd_if.H> trace_desc_t *g_trac_devtree = NULL; @@ -428,7 +429,11 @@ uint32_t bld_intr_node(devTree * i_dt, dtOffset_t & i_parentNode, return i_dt->getPhandle(intNode); } -void add_reserved_mem(devTree * i_dt, uint64_t i_homerAddr[], size_t i_num) + +void add_reserved_mem(devTree * i_dt, + uint64_t i_homerAddr[], + size_t i_num, + uint64_t i_vpd_addr) { /* * The reserved-names and reserve-names properties work hand in hand. @@ -454,21 +459,48 @@ void add_reserved_mem(devTree * i_dt, uint64_t i_homerAddr[], size_t i_num) dtOffset_t rootNode = i_dt->findNode("/"); const char* homerStr = "ibm,slw-occ-image"; - const char* reserve_strs[i_num+1]; - uint64_t homerRanges[i_num][2]; + const char* vpdStr = "ibm,hbrt-vpd-image"; + const char* reserve_strs[i_num+2]; + uint64_t ranges[i_num+1][2]; + uint64_t cell_count = sizeof(ranges) / sizeof(uint64_t); + uint64_t res_mem_addrs[i_num+1]; + uint64_t res_mem_sizes[i_num+1]; + for(size_t i = 0; i<i_num; i++) { reserve_strs[i] = homerStr; - homerRanges[i][0] = i_homerAddr[i]; - homerRanges[i][1] = VMM_HOMER_INSTANCE_SIZE; + ranges[i][0] = i_homerAddr[i]; + ranges[i][1] = VMM_HOMER_INSTANCE_SIZE; + res_mem_addrs[i] = i_homerAddr[i]; + res_mem_sizes[i] = VMM_HOMER_INSTANCE_SIZE; } - reserve_strs[i_num] = NULL; + if(i_vpd_addr) + { + reserve_strs[i_num] = vpdStr; + ranges[i_num][0] = i_vpd_addr; + ranges[i_num][1] = VMM_RT_VPD_SIZE; + + res_mem_addrs[i_num] = i_vpd_addr; + res_mem_sizes[i_num] = VMM_RT_VPD_SIZE; + + reserve_strs[i_num+1] = NULL; + } + else + { + reserve_strs[i_num] = NULL; + cell_count -= sizeof(ranges[0]); + } i_dt->addPropertyStrings(rootNode, "reserved-names", reserve_strs); i_dt->addPropertyCells64(rootNode, "reserved-ranges", - reinterpret_cast<uint64_t*>(homerRanges), - sizeof(homerRanges) / sizeof(uint64_t)); + reinterpret_cast<uint64_t*>(ranges), + cell_count); + + // added per comment from Dean Sanner + // cell_count has limit of DT_MAX_MEM_RESERVE = 16. Is this enough + // for all processors + 1 vpd area? + i_dt->populateReservedMem(res_mem_addrs, res_mem_sizes, cell_count); } @@ -538,8 +570,17 @@ errlHndl_t bld_fdt_cpu(devTree * i_dt) } } - //Add in reserved memory for HOMER images - add_reserved_mem(i_dt, l_homerAddr, l_cpuTargetList.size()); + // VPD + uint64_t l_vpd_addr = 0; + + errhdl = VPD::vpd_load_rt_image(l_vpd_addr); + + + //Add in reserved memory for HOMER images and VPD image + add_reserved_mem(i_dt, + l_homerAddr, + l_cpuTargetList.size(), + l_vpd_addr); return errhdl; } |