summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorBrian Silver <bsilver@us.ibm.com>2014-06-05 09:42:45 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2014-06-20 08:26:44 -0500
commit244f33086e5acfb2fa91b9438cdbc223c602dcb2 (patch)
tree6b5b4229cf5a17c3fa89b7de0ffedacebf1ae0c3 /src/usr
parent2c8fe1187f3fb93d57b07f4f94c5049c2dc62f56 (diff)
downloadtalos-hostboot-244f33086e5acfb2fa91b9438cdbc223c602dcb2.tar.gz
talos-hostboot-244f33086e5acfb2fa91b9438cdbc223c602dcb2.zip
Add node's base memory address to payload_base
Change-Id: I90c43d6e4d9397c4167789ae094d6aee068da456 RTC: 107804 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/11485 Tested-by: Jenkins Server Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/dram_initialization.C8
-rw-r--r--src/usr/targeting/common/common.mk3
-rw-r--r--src/usr/targeting/common/util.C47
3 files changed, 57 insertions, 1 deletions
diff --git a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
index b5e5e26ab..905df419a 100644
--- a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
+++ b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
@@ -847,6 +847,14 @@ void* call_proc_exit_cache_contained( void *io_pArgs )
true); // callout firmware
}
}
+ // If we're not mirrored, payloadBase is the lowest mem_base.
+ // Note that if we are mirrored, finding the correct mirror
+ // base yields the proper payloadBase. This should also work
+ // for sapphire as a single (working) node will return 0 for
+ // bottom_mem_addr.
+ else {
+ payloadBase += get_bottom_mem_addr()/MEGABYTE;
+ }
}
if(!l_errl)
diff --git a/src/usr/targeting/common/common.mk b/src/usr/targeting/common/common.mk
index 2648faf6b..7e7e42ea1 100644
--- a/src/usr/targeting/common/common.mk
+++ b/src/usr/targeting/common/common.mk
@@ -29,7 +29,8 @@
#
################################################################################
-COMMON_TARGETING_SUBDIRS += predicates
+CFLAGS += -D__STDC_LIMIT_MACROS
+COMMON_TARGETING_SUBDIRS += predicates
COMMON_TARGETING_SUBDIRS += iterators
PREDICATES_OBJS += predicatebase.o
diff --git a/src/usr/targeting/common/util.C b/src/usr/targeting/common/util.C
index 9bf93b64c..bb3eca946 100644
--- a/src/usr/targeting/common/util.C
+++ b/src/usr/targeting/common/util.C
@@ -30,6 +30,7 @@
//******************************************************************************
// Includes
//******************************************************************************
+#include <stdint.h>
#include <targeting/common/attributes.H>
#include <targeting/common/targetservice.H>
#include <targeting/common/utilFilter.H>
@@ -245,6 +246,52 @@ uint64_t get_top_mem_addr(void)
return top_addr;
}
+/**
+ * @brief Utility function to obtain the lowest known address in the system
+ */
+uint64_t get_bottom_mem_addr(void)
+{
+ uint64_t bottom_addr = UINT64_MAX;
+
+ 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];
+
+ uint64_t l_mem_bases[8] = {};
+ uint64_t l_mem_sizes[8] = {};
+ TARG_ASSERT(
+ l_pProc->tryGetAttr<TARGETING::ATTR_PROC_MEM_BASES>(l_mem_bases),
+ "Unable to get ATTR_PROC_MEM_BASES attribute");
+
+ TARG_ASSERT(
+ l_pProc->tryGetAttr<TARGETING::ATTR_PROC_MEM_SIZES>(l_mem_sizes),
+ "Unable to get ATTR_PROC_MEM_SIZES attribute");
+
+ for (size_t i=0; i< 8; i++)
+ {
+ if(l_mem_sizes[i]) //non zero means that there is memory present
+ {
+ bottom_addr = std::min(bottom_addr, l_mem_bases[i]);
+ }
+ }
+ }
+ }while(0);
+
+ // There's no reason the lowest address should be the largest
+ // 64 bit value
+ TARG_ASSERT(
+ bottom_addr < UINT64_MAX,
+ "Lowest address is maximum 64-bit value");
+
+ return bottom_addr;
+}
+
bool orderByNodeAndPosition( Target* i_firstProc,
Target* i_secondProc)
OpenPOWER on IntegriCloud