summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp
diff options
context:
space:
mode:
authorMark Wenning <wenning@us.ibm.com>2012-06-18 18:06:12 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-07-12 17:19:53 -0500
commit7f482f9ad23bd7689fdee5982ad91f8506b2dfb8 (patch)
treec519dd9a5712982bed3fc30c02d6c14c2bb17f0e /src/usr/hwpf/hwp
parent3b9899c9969d46d2faddca8f3d35fa5074e3097c (diff)
downloadtalos-hostboot-7f482f9ad23bd7689fdee5982ad91f8506b2dfb8.tar.gz
talos-hostboot-7f482f9ad23bd7689fdee5982ad91f8506b2dfb8.zip
Attribute Support for proc_setup_bars and mss_setup_bars
RTC: 42296 Change-Id: I9f470f9e41c22ed28bd0365aec23b91414258945 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1235 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Reviewed-by: Mark W. Wenning <wenning@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp')
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/dram_initialization.C345
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/makefile7
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/fapi_sbe_common.H70
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C285
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.H61
-rwxr-xr-xsrc/usr/hwpf/hwp/dram_initialization/proc_setup_bars/p8_scom_addresses.H1677
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.C288
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.H143
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_errors.xml41
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_fabric_attributes.xml54
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.C3253
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.H1184
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_errors.xml146
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_l3_attributes.xml71
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_memory_attributes.xml224
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_mmio_attributes.xml306
-rw-r--r--src/usr/hwpf/hwp/memory_attributes.xml16
17 files changed, 7962 insertions, 209 deletions
diff --git a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
index b6e41b75c..518bc8784 100644
--- a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
+++ b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
@@ -46,6 +46,7 @@
// targeting support
#include <targeting/common/commontargeting.H>
+#include <targeting/common/util.H>
#include <targeting/common/utilFilter.H>
// fapi support
@@ -60,7 +61,8 @@
// #include "mss_memdiag/mss_memdiag.H"
// #include "mss_scrub/mss_scrub.H"
// #include "mss_thermal_init/mss_thermal_init.H"
-// #include "proc_setup_bars/proc_setup_bars.H"
+#include "proc_setup_bars/mss_setup_bars.H"
+#include "proc_setup_bars/proc_setup_bars.H"
// #include "proc_pbus_epsilon/proc_pbus_epsilon.H"
#include "proc_exit_cache_contained/proc_exit_cache_contained.H"
@@ -136,24 +138,24 @@ void call_mss_extent_setup( void *io_pArgs )
{
errlHndl_t l_errl = NULL;
- TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"call_mss_extent_setup entry" );
- // call the HWP
+ // call the HWP
FAPI_INVOKE_HWP( l_errl, mss_extent_setup );
if ( l_errl )
{
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
"ERROR : failed executing mss_extent_setup returning error" );
}
else
{
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"SUCCESS : mss_extent_setup completed ok" );
}
- TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"call_mss_extent_setup exit" );
// end task, returning any errorlogs to IStepDisp
@@ -305,229 +307,172 @@ void call_proc_setup_bars( void *io_pArgs )
{
errlHndl_t l_errl = NULL;
+
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"call_proc_setup_bars entry" );
- // @@@@@ TEMPORARY SIMICS HACK for PHYP 6/1 milestone @@@@@
- // loop through all processor targets
- // 1) loop on associated MCSs
- // a) Get associated logical dimms, sum total size of memory
- // b) Write memory base addr/size out to MCFGP 0x02011800
- //Don't do this in VPO -- shouldn't be run anyway, but return as a precaution
- if( TARGETING::is_vpo() )
- {
- task_end2( l_errl );
- }
-
- // Get all functional processor targets
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "!!!!!!!!!WORKAROUND Memory BAR setup!!!!!!!!!!!" );
- TARGETING::PredicateIsFunctional l_isFunctional; //functional filter
- TARGETING::PredicateCTM l_Filter(CLASS_CHIP, TYPE_PROC); //Proc chip filter
- TARGETING::PredicatePostfixExpr l_goodFilter;
- l_goodFilter.push(&l_Filter).push(&l_isFunctional).And();
- TARGETING::TargetRangeFilter l_Procs(
- TARGETING::targetService().begin(),
- TARGETING::targetService().end(),
- &l_goodFilter );
-
- // Create a Class/Type/Model predicate to look for units
- TARGETING::PredicateCTM l_mcsPred(CLASS_UNIT, TYPE_MCS);
- TARGETING::PredicatePostfixExpr l_mcsFilter;
- l_mcsFilter.push(&l_mcsPred).push(&l_isFunctional).And();
-
- // Create a Class/Type/Model predicate to look for dimm cards
- TARGETING::PredicateCTM l_dimmPred(CLASS_LOGICAL_CARD,TYPE_DIMM);
- TARGETING::PredicatePostfixExpr l_dimmFilter;
- l_dimmFilter.push(&l_dimmPred).push(&l_isFunctional).And();
-
- // Create a vector of TARGETING::Target pointers
- TARGETING::TargetHandleList l_dimmList;
- TARGETING::TargetHandleList l_mcsList;
- uint64_t base_addr = 0x0;
-
-
- for ( ; l_Procs && !l_errl; ++l_Procs )
- {
- const TARGETING::Target * l_pTarget = *l_Procs;
- l_mcsList.clear();
+ // @@@@@ CUSTOM BLOCK: @@@@@
+ // Get all Centaur targets
+ TARGETING::TargetHandleList l_cpuTargetList;
+ getAllChips(l_cpuTargetList, TYPE_PROC );
- //Get MCS sub units for this proc
- TARGETING::targetService().getAssociated(l_mcsList, l_pTarget,
- TARGETING::TargetService::CHILD,
- TARGETING::TargetService::ALL,
- &l_mcsFilter);
- for (uint32_t i = 0; (i < l_mcsList.size()) && !l_errl; i++)
+ // -----------------------------------------------------------------------
+ // run mss_setup_bars on all CPUs.
+ // -----------------------------------------------------------------------
+ for ( size_t i = 0; i < l_cpuTargetList.size(); i++ )
+ {
+ // make a local copy of the target for ease of use
+ const TARGETING::Target* l_pCpuTarget = l_cpuTargetList[i];
+
+ TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "mss_setup_bars: proc %d", i );
+ // dump physical path to targets
+ EntityPath l_path;
+ l_path = l_pCpuTarget->getAttr<ATTR_PHYS_PATH>();
+ l_path.dump();
+
+ // cast OUR type of target to a FAPI type of target.
+ const fapi::Target l_fapi_pCpuTarget(
+ TARGET_TYPE_PROC_CHIP,
+ reinterpret_cast<void *>
+ (const_cast<TARGETING::Target*>
+ (l_pCpuTarget)) );
+
+ // call the HWP with each fapi::Target
+ FAPI_INVOKE_HWP( l_errl,
+ mss_setup_bars,
+ l_fapi_pCpuTarget );
+
+ if ( l_errl )
{
- uint32_t mem_size = 0;
- l_dimmList.clear();
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : mss_setup_bars" );
+ // break and return with error
+ break;
+ }
+ else
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS : mss_setup-bars" );
+ }
+ } // endfor
- //Get Dimms for this MCS
- TARGETING::targetService().getAssociated(l_dimmList, l_mcsList[i],
- TARGETING::TargetService::CHILD_BY_AFFINITY,
- TARGETING::TargetService::ALL, &l_dimmFilter);
- //Tally up the total dimm size
- for(uint32_t j=0; (j < l_dimmList.size()) && !l_errl; j++)
- {
- uint8_t dimm_den;
- size_t l_size = 0x1;
- l_errl = deviceRead(l_dimmList[j], &dimm_den, l_size,
- DEVICE_SPD_ADDRESS(SPD::DENSITY));
- if (l_errl)
- {
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "WORKAROUND: Memory BAR error getting dimm density");
-
- break;
- }
-
- /*
- Bit [3, 2, 1, 0] :
- 0000 = 256 Mb
- 0001 = 512 Mb
- 0010 = 1 Gb
- 0011 = 2 Gb
- 0100 = 4 Gb
- 0101 = 8 Gb
- 0110 = 16 Gb*/
- mem_size += (1<<dimm_den); //(smallest size is 256MB)
+ // ----------------------------------------------------------------------
+ // @@@@@ TEMPORARY SIMICS HACK for PHYP 6/1 milestone @@@@@
+ // ----------------------------------------------------------------------
+ if ( !TARGETING::is_vpo() )
+ {
+ //Now need to scom the L3 bar on my EX to trigger Simics cache contained exit
+ if (!l_errl)
+ {
+ // TODO: Remove workaround with RTC: 42922.
+ nanosleep(1,0); // workaround Simics race condition.
- }
+ TARGETING::Target* procTarget = NULL;
+ TARGETING::targetService().masterProcChipTargetHandle( procTarget );
- if(l_errl)
- {
- break;
- }
+ //Base scom address is 0x1001080b, need to place core id from cpuid
+ //EX chiplet is bits 4:7 of scom addr, EX unit in cpuid is bits 25:28
+ uint32_t scom_addr = 0x1001080b | (((task_getcpuid()) & 0x78) << 21);
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "EX L3 BAR1 addr [%08x]", scom_addr);
- /*check to see if total centaur siz is less than 4GB multiple
- Note that mem_size is in 256MB chunks
- 0x0000 0001 -- 256MB
- 0x0000 0010 -- 512MB
- 0x0000 0100 -- 1GB
- 0x0000 1000 -- 2GB
- 0x0001 0000 -- 4GB
- This is a workaround HACK -- so just emit a warning
- */
- if(mem_size & 0xF)
- {
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "WARNING -- CEC memory size less than 4GB on MCS[%08X]\n",
- TARGETING::get_huid(l_mcsList[i]));
- mem_size = 0x10;
- }
- uint64_t grp_size = (mem_size >>4)-1;
-
- /*build up MCFGP contents
- 0 -- enable 0b1
- 1:3 -- MCS/group 0x0
- 4:8 -- group id 0x0
- 9:10 -- HW settings 0b11
- 11:23 -- Group size
- 4 GB b0000000000000
- 8 GB b0000000000001
- 16 GB b0000000000011
- 32 GB b0000000000111
- 64 GB b0000000001111
- 128 GB b0000000011111
- 256 GB b0000000111111
- 512 GB b0000001111111
- 1 TB b0000011111111
- 2 TB b0000111111111
- 4 TB b0001111111111
- 8 TB b0011111111111
- 24:25 -- HW settings 0b11
- 26:43 -- Base address of group (addr 14:31)
- 44:63 -- Reserved 0x00000
- */
- uint64_t scom_data = 0x806000C000000000 |
- (grp_size << 40) | (base_addr << 20);
+ uint64_t scom_data = 0x0; //data doesn't matter, just the write
size_t size = sizeof(scom_data);
- TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "CEC memory base_addr[%lx], grp_size[%lx], scom[%lx]\n",
- base_addr, grp_size, scom_data);
-
- l_errl = deviceWrite( l_mcsList[i],
- &scom_data,
- size,
- DEVICE_SCOM_ADDRESS(0x02011800) );
- if(l_errl)
+ l_errl = deviceWrite( procTarget,
+ &scom_data,
+ size,
+ DEVICE_SCOM_ADDRESS(scom_addr) );
+ if (l_errl)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "Failed to write MCS MCFGP scoms addr\n");
+ "Failed to write EX %08x addr\n", scom_addr);
}
-
- base_addr += (mem_size >>4);
-
}
+ // @@@@@ end TEMPORARY SIMICS HACK for PHYP 6/1 milestone @@@@@
}
-
- //Now need to scom the L3 bar on my EX to trigger Simics cache contained exit
- if(!l_errl)
+// $$ #if 0
+ // $$$$$ @todo issue 44948
+ // proc_setup_bars crashes simics, remove check when we get it working
+ if ( !TARGETING::is_vpo() )
{
- // TODO: Remove workaround with RTC: 42922.
- nanosleep(1,0); // workaround Simics race condition.
-
- TARGETING::Target* procTarget = NULL;
- TARGETING::targetService().masterProcChipTargetHandle( procTarget );
-
- //Base scom address is 0x1001080b, need to place core id from cpuid
- //EX chiplet is bits 4:7 of scom addr, EX unit in cpuid is bits 25:28
- uint32_t scom_addr = 0x1001080b | (((task_getcpuid()) & 0x78) << 21);
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "EX L3 BAR1 addr [%08x]\n", scom_addr);
-
- uint64_t scom_data = 0x0; //data doesn't matter, just the write
- size_t size = sizeof(scom_data);
-
- l_errl = deviceWrite( procTarget,
- &scom_data,
- size,
- DEVICE_SCOM_ADDRESS(scom_addr) );
- if(l_errl)
- {
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "Failed to write EX %08x addr\n", scom_addr);
- }
+ "proc_setup_bars is disabled in simics, see issue 44948" );
+ task_end2(l_errl);
}
+ // $$$$$ @todo issue 44948
+// $$ #endif
-#if 0
- // @@@@@ CUSTOM BLOCK: @@@@@
- // figure out what targets we need
- // customize any other inputs
- // set up loops to go through all targets (if parallel, spin off a task)
- // dump physical path to targets
- EntityPath l_path;
- l_path = l_@targetN_target->getAttr<ATTR_PHYS_PATH>();
- l_path.dump();
+ if ( ! l_errl )
+ {
+ // -----------------------------------------------------------------------
+ // run proc_setup_bars on all CPUs
+ // -----------------------------------------------------------------------
+ std::vector<proc_setup_bars_proc_chip> l_proc_chips;
- // cast OUR type of target to a FAPI type of target.
- const fapi::Target l_fapi_@targetN_target(
- TARGET_TYPE_MEMBUF_CHIP,
- reinterpret_cast<void *>
- (const_cast<TARGETING::Target*>(l_@targetN_target)) );
+ for ( size_t i = 0; i < l_cpuTargetList.size(); i++ )
+ {
+ // make a local copy of the target for ease of use
+ const TARGETING::Target* l_pCpuTarget = l_cpuTargetList[i];
+
+ TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "proc_setup_bars: proc %d", i );
+ // dump physical path to targets
+ EntityPath l_path;
+ l_path = l_pCpuTarget->getAttr<ATTR_PHYS_PATH>();
+ l_path.dump();
+
+ // cast OUR type of target to a FAPI type of target.
+ const fapi::Target l_fapi_pCpuTarget(
+ TARGET_TYPE_MEMBUF_CHIP,
+ reinterpret_cast<void *>
+ (const_cast<TARGETING::Target*>
+ (l_pCpuTarget)) );
+ // @todo Create dummy aX targets
+ const fapi::Target l_a0_chip;
+ const fapi::Target l_a1_chip;
+ const fapi::Target l_a2_chip;
+
+
+ proc_setup_bars_proc_chip l_proc_chip ;
+ l_proc_chip.this_chip = l_fapi_pCpuTarget;
+ l_proc_chip.a0_chip = l_a0_chip;
+ l_proc_chip.a1_chip = l_a1_chip;
+ l_proc_chip.a2_chip = l_a2_chip;
+ l_proc_chip.process_f0 = true;
+ l_proc_chip.process_f1 = true;
+
+ l_proc_chips.push_back( l_proc_chip );
+
+ // call the HWP with each fapi::Target
+ FAPI_INVOKE_HWP( l_errl,
+ proc_setup_bars,
+ l_proc_chips,
+ true );
+
+ if ( l_errl )
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : proc_setup_bars" );
+ // break out with error
+ break;
+ }
+ else
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS : proc_setup-bars" );
+ }
+ } // endfor
+ } // end if !l_errl
- // call the HWP with each fapi::Target
- FAPI_INVOKE_HWP( l_errl, proc_setup_bars, _args_...);
- if ( l_errl )
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "ERROR : .........." );
- errlCommit( l_errl, HWPF_COMP_ID );
- }
- else
- {
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "SUCCESS : .........." );
- }
// @@@@@ END CUSTOM BLOCK: @@@@@
-#endif
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"call_proc_setup_bars exit" );
diff --git a/src/usr/hwpf/hwp/dram_initialization/makefile b/src/usr/hwpf/hwp/dram_initialization/makefile
index 8cc0cfc28..319309256 100644
--- a/src/usr/hwpf/hwp/dram_initialization/makefile
+++ b/src/usr/hwpf/hwp/dram_initialization/makefile
@@ -42,12 +42,16 @@ EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization
## EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/<HWP_dir>
EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/proc_exit_cache_contained
EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/mss_extent_setup
+EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars
## NOTE: add new object files when you add a new HWP
OBJS = dram_initialization.o \
proc_exit_cache_contained.o \
- mss_extent_setup.o
+ mss_extent_setup.o \
+ mss_setup_bars.o \
+ proc_fab_smp.o \
+ proc_setup_bars.o \
## NOTE: add a new directory onto the vpaths when you add a new HWP
@@ -55,6 +59,7 @@ OBJS = dram_initialization.o \
# VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/<HWP_dir>
VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/proc_exit_cache_contained
VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/mss_extent_setup
+VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars
include ${ROOTPATH}/config.mk
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/fapi_sbe_common.H b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/fapi_sbe_common.H
new file mode 100644
index 000000000..eea5054a4
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/fapi_sbe_common.H
@@ -0,0 +1,70 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/fapi_sbe_common.H $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+#ifndef __FAPI_SBE_COMMON_H
+#define __FAPI_SBE_COMMON_H
+
+// $Id: fapi_sbe_common.H,v 1.1 2012/04/16 23:55:37 bcbrock Exp $
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/fapi_sbe_common.H,v $
+//------------------------------------------------------------------------------
+// *! (C) Copyright International Business Machines Corp. 2011
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+//------------------------------------------------------------------------------
+// *! OWNER NAME : Email:
+
+/// \file fapi_sbe_common.H
+/// \brief Definitions common to FAPI and SBE procedures
+///
+/// Several preprocessor macros are required to have different definitions in
+/// C, C++ and SBE assembly procedures. These common forms are collected here.
+
+#if defined __ASSEMBLER__
+
+#define CONST_UINT8_T(name, expr) .set name, (expr)
+#define CONST_UINT32_T(name, expr) .set name, (expr)
+#define CONST_UINT64_T(name, expr) .set name, (expr)
+
+#define ULL(x) x
+
+#elif defined __cplusplus
+
+#include <stdint.h>
+
+#define CONST_UINT8_T(name, expr) const uint8_t name = (expr);
+#define CONST_UINT32_T(name, expr) const uint32_t name = (expr);
+#define CONST_UINT64_T(name, expr) const uint64_t name = (expr);
+
+#define ULL(x) x##ull
+
+#else // C code
+
+// CONST_UINT[8,3,64]_T() can't be used in C code/headers; Use
+//
+// #define <symbol> <value> [ or ULL(<value>) for 64-bit constants
+
+#define ULL(x) x##ull
+
+#endif // __ASSEMBLER__
+
+#endif // __FAPI_SBE_COMMON_H
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C
new file mode 100644
index 000000000..ebc941ce8
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C
@@ -0,0 +1,285 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+//------------------------------------------------------------------------------
+// *! (C) Copyright International Business Machines Corp. 2012
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+//------------------------------------------------------------------------------
+// *! TITLE : mss_setup_bars.C
+// *! DESCRIPTION : see additional comments below
+//------------------------------------------------------------------------------
+// Don't forget to create CVS comments when you check in your changes!
+//------------------------------------------------------------------------------
+//Owner :- Girisankar paulraj
+//Back-up owner :- Mark bellows
+//
+// CHANGE HISTORY:
+//------------------------------------------------------------------------------
+// Version:| Author: | Date: | Comment:
+//---------|----------|---------|-----------------------------------------------
+// 1.1 | gpaulraj | 03-19-12| First drop for centaur
+// 1.2 | gpaulraj | 05-07-12| 256 group configuration in
+// 1.3 | gpaulraj | 05-22-12| 2MCS/group supported for 128GB CDIMM
+// 1.4 | bellows | 06-05-12| Updates to Match First Configuration, work for P8 and Murano
+//----------------------------------------------------------------------
+// Includes
+//----------------------------------------------------------------------
+
+#include <mss_setup_bars.H>
+
+extern "C" {
+
+// PLAN:---
+// Parameter of the populated Dimm details for each MCS looper
+// Starts with Zero MCS base address. Identifies Dimm parameters belong to MCS
+// Configure the Group primary MCS0 Registers
+// Configure the Group seconary MCS0 Registers /// identifies it base address based on the Primary group size
+// Identify Mirror details setup accordingly
+// Set up each translation registry accordingly
+// SIM configuration
+// -------------------------|-----------------------------------|
+// ------- MCS0 ---------|-------------MCS1------------------|
+// -------------------------|-----------------------------------|
+// --- CH01 --- CH23 -----|-------- CH01 --- CH23 ----------|
+// D0- 32GB --- 32GB -----|---- D0- 32GB --- 32GB ----------|
+// D1- 32GB --- 32GB ----|-----D1- 32GB --- 32GB ---------|
+// -------------------------|-----------------------------------|
+// - Base address MCS0 - 0x0 Group Size - 128GB
+// - MCS0 - Grouping base address - 0GB Group size - 128GB
+// - MCS1 - Grouping base address - 128GB+ Group size - 128GB
+
+fapi::ReturnCode mss_setup_bars(
+ const fapi::Target& i_chip_target)
+{
+ fapi::ReturnCode rc;
+ std::vector<fapi::Target> l_mcs_chiplets;
+ ecmdDataBufferBase MCFGP_data(64);
+
+ // platform attributes which define base addresses for this chip:
+ uint64_t mem_base;
+ uint64_t mirror_base;
+
+ // storage for output attributes:
+ uint64_t mem_bases[8];
+ uint64_t l_memory_sizes[8];
+ uint64_t mirror_bases[4];
+ uint64_t l_mirror_sizes[4];
+ uint8_t groups[8];
+
+ do
+ {
+ //
+ // process non-mirrored ranges
+ //
+
+ // read chip base address attribute
+ rc = FAPI_ATTR_GET(ATTR_PROC_MEM_BASE, &i_chip_target, mem_base);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error reading ATTR_PROC_MEM_BASE");
+ break;
+ }
+
+ // base addresses for distinct non-mirrored ranges
+ mem_bases[0]=mem_base;
+ mem_bases[1]=0x0;
+ mem_bases[2]=0x0;
+ mem_bases[3]=0x0;
+ mem_bases[4]=0x0;
+ mem_bases[5]=0x0;
+ mem_bases[6]=0x0;
+ mem_bases[7]=0x0;
+
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[0]: %016llx", mem_bases[0]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[1]: %016llx", mem_bases[1]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[2]: %016llx", mem_bases[2]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[3]: %016llx", mem_bases[3]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[4]: %016llx", mem_bases[4]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[5]: %016llx", mem_bases[5]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[6]: %016llx", mem_bases[6]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES[7]: %016llx", mem_bases[7]);
+
+ rc = FAPI_ATTR_SET(ATTR_PROC_MEM_BASES, &i_chip_target, mem_bases);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MEM_BASES");
+ break;
+ }
+
+ // sizes for distinct non-mirrored ranges
+ l_memory_sizes[0]=128ULL*0x40000000ULL;
+ l_memory_sizes[1]=0x0;
+ l_memory_sizes[2]=0x0;
+ l_memory_sizes[3]=0x0;
+ l_memory_sizes[4]=0x0;
+ l_memory_sizes[5]=0x0;
+ l_memory_sizes[6]=0x0;
+ l_memory_sizes[7]=0x0;
+
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[0]: %016llx", l_memory_sizes[0]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[1]: %016llx", l_memory_sizes[1]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[2]: %016llx", l_memory_sizes[2]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[3]: %016llx", l_memory_sizes[3]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[4]: %016llx", l_memory_sizes[4]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[5]: %016llx", l_memory_sizes[5]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[6]: %016llx", l_memory_sizes[6]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES[7]: %016llx", l_memory_sizes[7]);
+
+ rc = FAPI_ATTR_SET(ATTR_PROC_MEM_SIZES, &i_chip_target, l_memory_sizes);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MEM_SIZES");
+ break;
+ }
+
+
+ //
+ // process mirrored ranges
+ //
+
+ // read chip base address attribute
+ rc = FAPI_ATTR_GET(ATTR_PROC_MIRROR_BASE, &i_chip_target, mirror_base);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error reading ATTR_PROC_MIRROR_BASE");
+ break;
+ }
+
+ // base addresses for distinct mirrored ranges
+ mirror_bases[0] = mirror_base;
+ mirror_bases[1] = 0x0;
+ mirror_bases[2] = 0x0;
+ mirror_bases[3] = 0x0;
+
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[0]: %016llx", mirror_bases[0]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[1]: %016llx", mirror_bases[1]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[2]: %016llx", mirror_bases[2]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[3]: %016llx", mirror_bases[3]);
+
+ rc = FAPI_ATTR_SET(ATTR_PROC_MIRROR_BASES, &i_chip_target, mirror_bases);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MIRROR_BASES");
+ break;
+ }
+
+ // sizes for distinct mirrored ranges
+ l_mirror_sizes[0]=0;
+ l_mirror_sizes[1]=0;
+ l_mirror_sizes[2]=0;
+ l_mirror_sizes[3]=0;
+
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[0]: %016llx", l_mirror_sizes[0]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[1]: %016llx", l_mirror_sizes[1]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[2]: %016llx", l_mirror_sizes[2]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[3]: %016llx", l_mirror_sizes[3]);
+
+ rc = FAPI_ATTR_SET(ATTR_PROC_MIRROR_SIZES, &i_chip_target, l_mirror_sizes);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MIRROR_SIZES");
+ break;
+ }
+
+
+ //
+ // process group configuration
+ //
+
+ groups[0]=0x0C;
+ groups[1]=0x00;
+ groups[2]=0x00;
+ groups[3]=0x00;
+ groups[4]=0x00;
+ groups[5]=0x00;
+ groups[6]=0x00;
+ groups[7]=0x00;
+ rc = FAPI_ATTR_SET(ATTR_MSS_MEM_MC_IN_GROUP, &i_chip_target, groups);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_MSS_MEM_MC_IN_GROUP");
+ break;
+ }
+
+
+ //
+ // write HW registers
+ //
+
+ // get child MCS chiplets
+ rc = fapiGetChildChiplets(i_chip_target,
+ fapi::TARGET_TYPE_MCS_CHIPLET,
+ l_mcs_chiplets,
+ fapi::TARGET_STATE_FUNCTIONAL);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error from fapiGetChildChiplets");
+ break;
+ }
+
+ // loop through & set configuration of each child
+ for (std::vector<fapi::Target>::iterator iter = l_mcs_chiplets.begin();
+ iter != l_mcs_chiplets.end();
+ iter++)
+ {
+ uint8_t mcs_pos = 0x0;
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS, &(*iter), mcs_pos);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error reading ATTR_CHIP_UNIT_POS");
+ break;
+ }
+
+ // set configuration registers (static to match VBU model for now)
+ if (mcs_pos == 4)
+ {
+ MCFGP_data.setDoubleWord(0, 0x90601FC000000000ULL);
+ }
+ else if (mcs_pos == 5)
+ {
+ MCFGP_data.setDoubleWord(0, 0x90E01FC000000000ULL);
+ }
+ else
+ {
+ MCFGP_data.setDoubleWord(0, 0x0060008000000000ULL);
+ }
+
+ // write MCFGP register
+ FAPI_DBG("Writing MCS %d MCFGP = 0x%llx",
+ mcs_pos, MCFGP_data.getDoubleWord(0));
+
+ rc = fapiPutScom(*iter, MCS_MCFGP_0x02011800, MCFGP_data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error from fapiPutScom (MCS_MCFGP_0x02011800)");
+ break;
+ }
+ }
+ } while(0);
+
+ return rc;
+}
+
+
+} // extern "C"
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.H b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.H
new file mode 100644
index 000000000..2affbd35f
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.H
@@ -0,0 +1,61 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.H $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+//------------------------------------------------------------------------------
+// *! (C) Copyright International Business Machines Corp. 2011
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+//------------------------------------------------------------------------------
+// *! TITLE : mss_setup_bars.H
+// *! DESCRIPTION : see additional comments below
+// *! OWNER NAME : Girisankar Paulraj Email: gpaulraj@in.ibm.com
+// *! BACKUP NAME : Mark Bellows Email: bellows@us.ibm.com
+// *! ADDITIONAL COMMENTS :
+//
+// Header file for mss_setup_bars.
+//
+//------------------------------------------------------------------------------
+// Don't forget to create CVS comments when you check in your changes!
+//------------------------------------------------------------------------------
+// CHANGE HISTORY:
+//------------------------------------------------------------------------------
+// Version:| Author: | Date: | Comment:
+//---------|----------|---------|-----------------------------------------------
+// 1.1 | gpaulraj | 03/19/12| Updated
+
+#ifndef MSS_SETUP_BARS_H_
+#define MSS_SETUP_BARS_H_
+
+#include <fapi.H>
+#include "p8_scom_addresses.H"
+
+typedef fapi::ReturnCode (*mss_setup_bars_FP_t)(const fapi::Target&);
+
+extern "C"
+{
+
+fapi::ReturnCode mss_setup_bars(const fapi::Target& i_chip_target);
+
+} // extern "C"
+
+#endif // MSS_SETUP_BARS_H_
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/p8_scom_addresses.H b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/p8_scom_addresses.H
new file mode 100755
index 000000000..1db4c4a9d
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/p8_scom_addresses.H
@@ -0,0 +1,1677 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/p8_scom_addresses.H $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+// $Id: p8_scom_addresses.H,v 1.77 2012/06/09 19:24:39 jmcgill Exp $
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/p8_scom_addresses.H,v $
+//------------------------------------------------------------------------------
+// *! (C) Copyright International Business Machines Corp. 2011
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+//------------------------------------------------------------------------------
+// *! TITLE : p8_scom_addresses.H
+// *! DESCRIPTION : Defines for P8 scom addresses
+// *! OWNER NAME : Jeshua Smith Email: jeshua@us.ibm.com
+// *! BACKUP NAME : Email: @us.ibm.com
+// #! ADDITIONAL COMMENTS :
+//
+// The purpose of this header is to define scom addresses for use by procedures.
+// This will help catch address typos at compile time, and will make it easy
+// to track down which procedures use each address
+//
+
+#ifndef P8_SCOM_ADDRESSES
+#define P8_SCOM_ADDRESSES
+
+//----------------------------------------------------------------------
+// Scom address overview
+//----------------------------------------------------------------------
+// P8 uses 64-bit scom addresses, which are classified into two formats:
+//
+// "Normal" (legacy) format
+//
+// 111111 11112222 22222233 33333333 44444444 44555555 55556666
+// 01234567 89012345 67890123 45678901 23456789 01234567 89012345 67890123
+// -------- -------- -------- -------- -------- -------- -------- --------
+// 00000000 00000000 00000000 00000000 0MCCCCCC ????PPPP 00LLLLLL LLLLLLLL
+// || | |
+// || | `-> Local Address*
+// || |
+// || `-> Port
+// ||
+// |`-> Chiplet ID**
+// |
+// `-> Multicast bit
+//
+// * Local address is composed of "00" + 4-bit ring + 10-bit ID
+// The 10-bit ID is usually 4-bit sat_id and 6-bit reg_id
+//
+// ** Chiplet ID turns into multicast operation type and group number
+// if the multicast bit is set
+//
+// "Indirect" format
+//
+//
+// 111111 11112222 22222233 33333333 44444444 44555555 55556666
+// 01234567 89012345 67890123 45678901 23456789 01234567 89012345 67890123
+// -------- -------- -------- -------- -------- -------- -------- --------
+// 10000000 0000IIII IIIIIGGG GGGLLLLL 0MCCCCCC ????PPPP 00LLLLLL LLLLLLLL
+// | | | || | |
+// | | | || | `-> Local Address*
+// | | | || |
+// | | | || `-> Port
+// | | | ||
+// | | | |`-> Chiplet ID**
+// | | | |
+// | | | `-> Multicast bit
+// | | |
+// | | `-> Lane ID
+// | |
+// | `-> RX or TX Group ID
+// |
+// `-> Indirect Register Address
+//
+// * Local address is composed of "00" + 4-bit ring + 4-bit sat_id + "111111"
+//
+// ** Chiplet ID turns into multicast operation type and group number
+// if the multicast bit is set
+//
+
+#include "common_scom_addresses.H"
+#include "fapi_sbe_common.H"
+
+/******************************************************************************/
+/********************************** CHIPLET *********************************/
+/******************************************************************************/
+// use for lpcs P0, <chipletID>
+CONST_UINT64_T( X_BUS_CHIPLET_0x04000000 , ULL(0x04000000) );
+CONST_UINT64_T( PCIE_CHIPLET_0x08000000 , ULL(0x08000000) );
+CONST_UINT64_T( A_BUS_CHIPLET_0x09000000 , ULL(0x09000000) );
+// EX00_CHIPLET - EX15_CHIPLET defined in the EX CHIPLET section
+// "Multicast" chiplets
+CONST_UINT64_T( ALL_CHIPLETS_OR_0x40000000 , ULL(0x40000000) );
+CONST_UINT64_T( ALL_CHIPLETS_AND_0x48000000 , ULL(0x48000000) );
+CONST_UINT64_T( ALL_CHIPLETS_BITX_0x50000000 , ULL(0x50000000) );
+CONST_UINT64_T( ALL_CHIPLETS_COMP_0x60000000 , ULL(0x60000000) );
+CONST_UINT64_T( ALL_CHIPLETS_WRITE_0x68000000 , ULL(0x68000000) );
+
+CONST_UINT64_T( ALL_EXS_OR_0x41000000 , ULL(0x41000000) );
+CONST_UINT64_T( ALL_EXS_AND_0x49000000 , ULL(0x49000000) );
+CONST_UINT64_T( ALL_EXS_BITX_0x51000000 , ULL(0x51000000) );
+CONST_UINT64_T( ALL_EXS_COMP_0x61000000 , ULL(0x61000000) );
+CONST_UINT64_T( ALL_EXS_WRITE_0x69000000 , ULL(0x69000000) );
+
+CONST_UINT64_T( ALL_CORES_OR_0x42000000 , ULL(0x42000000) );
+CONST_UINT64_T( ALL_CORES_AND_0x4A000000 , ULL(0x4A000000) );
+CONST_UINT64_T( ALL_CORES_BITX_0x52000000 , ULL(0x52000000) );
+CONST_UINT64_T( ALL_CORES_COMP_0x62000000 , ULL(0x62000000) );
+CONST_UINT64_T( ALL_CORES_WRITE_0x6A000000 , ULL(0x6A000000) );
+
+
+/******************************************************************************/
+/******************************** TP CHIPLET ********************************/
+/******************************************************************************/
+
+//------------------------------------------------------------------------------
+// OTPROM
+//------------------------------------------------------------------------------
+CONST_UINT64_T( ECID_PART_0_0x00018000 , ULL(0x00018000) );
+CONST_UINT64_T( ECID_PART_1_0x00018001 , ULL(0x00018001) );
+
+//------------------------------------------------------------------------------
+// PORE-GPE0
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PORE_GPE0_0x00060000 , ULL(0x00060000) );
+CONST_UINT64_T( PORE_GPE0_STATUS_0x00060000 , ULL(0x00060000) );
+CONST_UINT64_T( PORE_GPE0_CONTROL_0x00060001 , ULL(0x00060001) );
+CONST_UINT64_T( PORE_GPE0_RESET_0x00060002 , ULL(0x00060002) );
+CONST_UINT64_T( PORE_GPE0_ERROR_MASK_0x00060003 , ULL(0x00060003) );
+CONST_UINT64_T( PORE_GPE0_PRV_BASE_ADDRESS0_0x00060004 , ULL(0x00060004) );
+CONST_UINT64_T( PORE_GPE0_PRV_BASE_ADDRESS1_0x00060005 , ULL(0x00060005) );
+CONST_UINT64_T( PORE_GPE0_OCI_BASE_ADDRESS0_0x00060006 , ULL(0x00060006) );
+CONST_UINT64_T( PORE_GPE0_OCI_BASE_ADDRESS1_0x00060007 , ULL(0x00060007) );
+CONST_UINT64_T( PORE_GPE0_TABLE_BASE_ADDR_0x00060008 , ULL(0x00060008) );
+CONST_UINT64_T( PORE_GPE0_EXE_TRIGGER_0x00060009 , ULL(0x00060009) );
+CONST_UINT64_T( PORE_GPE0_SCRATCH0_0x0006000A , ULL(0x0006000A) );
+CONST_UINT64_T( PORE_GPE0_SCRATCH1_0x0006000B , ULL(0x0006000B) );
+CONST_UINT64_T( PORE_GPE0_SCRATCH2_0x0006000C , ULL(0x0006000C) );
+CONST_UINT64_T( PORE_GPE0_IBUF_01_0x0006000D , ULL(0x0006000D) );
+CONST_UINT64_T( PORE_GPE0_IBUF_2_0x0006000E , ULL(0x0006000E) );
+CONST_UINT64_T( PORE_GPE0_DBG0_0x0006000F , ULL(0x0006000F) );
+CONST_UINT64_T( PORE_GPE0_DBG1_0x00060010 , ULL(0x00060010) );
+CONST_UINT64_T( PORE_GPE0_PC_STACK0_0x00060011 , ULL(0x00060011) );
+CONST_UINT64_T( PORE_GPE0_PC_STACK1_0x00060012 , ULL(0x00060012) );
+CONST_UINT64_T( PORE_GPE0_PC_STACK2_0x00060013 , ULL(0x00060013) );
+CONST_UINT64_T( PORE_GPE0_ID_FLAGS_0x00060014 , ULL(0x00060014) );
+CONST_UINT64_T( PORE_GPE0_DATA0_0x00060015 , ULL(0x00060015) );
+CONST_UINT64_T( PORE_GPE0_MEMORY_RELOC_0x00060016 , ULL(0x00060016) );
+CONST_UINT64_T( PORE_GPE0_I2C_E0_PARAM_0x00060017 , ULL(0x00060017) );
+CONST_UINT64_T( PORE_GPE0_I2C_E1_PARAM_0x00060018 , ULL(0x00060018) );
+CONST_UINT64_T( PORE_GPE0_I2C_E2_PARAM_0x00060019 , ULL(0x00060019) );
+
+//------------------------------------------------------------------------------
+// PORE-GPE1
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PORE_GPE1_0x00060020 , ULL(0x00060020) );
+CONST_UINT64_T( PORE_GPE1_STATUS_0x00060020 , ULL(0x00060020) );
+CONST_UINT64_T( PORE_GPE1_CONTROL_0x00060021 , ULL(0x00060021) );
+CONST_UINT64_T( PORE_GPE1_RESET_0x00060022 , ULL(0x00060022) );
+CONST_UINT64_T( PORE_GPE1_ERROR_MASK_0x00060023 , ULL(0x00060023) );
+CONST_UINT64_T( PORE_GPE1_PRV_BASE_ADDRESS0_0x00060024 , ULL(0x00060024) );
+CONST_UINT64_T( PORE_GPE1_PRV_BASE_ADDRESS1_0x00060025 , ULL(0x00060025) );
+CONST_UINT64_T( PORE_GPE1_OCI_BASE_ADDRESS0_0x00060026 , ULL(0x00060026) );
+CONST_UINT64_T( PORE_GPE1_OCI_BASE_ADDRESS1_0x00060027 , ULL(0x00060027) );
+CONST_UINT64_T( PORE_GPE1_TABLE_BASE_ADDR_0x00060028 , ULL(0x00060028) );
+CONST_UINT64_T( PORE_GPE1_EXE_TRIGGER_0x00060029 , ULL(0x00060029) );
+CONST_UINT64_T( PORE_GPE1_SCRATCH0_0x0006002A , ULL(0x0006002A) );
+CONST_UINT64_T( PORE_GPE1_SCRATCH1_0x0006002B , ULL(0x0006002B) );
+CONST_UINT64_T( PORE_GPE1_SCRATCH2_0x0006002C , ULL(0x0006002C) );
+CONST_UINT64_T( PORE_GPE1_IBUF_01_0x0006002D , ULL(0x0006002D) );
+CONST_UINT64_T( PORE_GPE1_IBUF_2_0x0006002E , ULL(0x0006002E) );
+CONST_UINT64_T( PORE_GPE1_DBG0_0x0006002F , ULL(0x0006002F) );
+CONST_UINT64_T( PORE_GPE1_DBG1_0x00060030 , ULL(0x00060030) );
+CONST_UINT64_T( PORE_GPE1_PC_STACK0_0x00060031 , ULL(0x00060031) );
+CONST_UINT64_T( PORE_GPE1_PC_STACK1_0x00060032 , ULL(0x00060032) );
+CONST_UINT64_T( PORE_GPE1_PC_STACK2_0x00060033 , ULL(0x00060033) );
+CONST_UINT64_T( PORE_GPE1_ID_FLAGS_0x00060034 , ULL(0x00060034) );
+CONST_UINT64_T( PORE_GPE1_DATA0_0x00060035 , ULL(0x00060035) );
+CONST_UINT64_T( PORE_GPE1_MEMORY_RELOC_0x00060036 , ULL(0x00060036) );
+CONST_UINT64_T( PORE_GPE1_I2C_E0_PARAM_0x00060037 , ULL(0x00060037) );
+CONST_UINT64_T( PORE_GPE1_I2C_E1_PARAM_0x00060038 , ULL(0x00060038) );
+CONST_UINT64_T( PORE_GPE1_I2C_E2_PARAM_0x00060039 , ULL(0x00060039) );
+
+//------------------------------------------------------------------------------
+// PORE-SLW
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PORE_SLW_0x00068000 , ULL(0x00068000) );
+CONST_UINT64_T( PORE_SLW_STATUS_0x00068000 , ULL(0x00068000) );
+CONST_UINT64_T( PORE_SLW_CONTROL_0x00068001 , ULL(0x00068001) );
+CONST_UINT64_T( PORE_SLW_RESET_0x00068002 , ULL(0x00068002) );
+CONST_UINT64_T( PORE_SLW_ERROR_MASK_0x00068003 , ULL(0x00068003) );
+CONST_UINT64_T( PORE_SLW_PRV_BASE_ADDRESS0_0x00068004 , ULL(0x00068004) );
+CONST_UINT64_T( PORE_SLW_PRV_BASE_ADDRESS1_0x00068005 , ULL(0x00068005) );
+CONST_UINT64_T( PORE_SLW_OCI_BASE_ADDRESS0_0x00068006 , ULL(0x00068006) );
+CONST_UINT64_T( PORE_SLW_OCI_BASE_ADDRESS1_0x00068007 , ULL(0x00068007) );
+CONST_UINT64_T( PORE_SLW_TABLE_BASE_ADDR_0x00068008 , ULL(0x00068008) );
+CONST_UINT64_T( PORE_SLW_EXE_TRIGGER_0x00068009 , ULL(0x00068009) );
+CONST_UINT64_T( PORE_SLW_SCRATCH0_0x0006800A , ULL(0x0006800A) );
+CONST_UINT64_T( PORE_SLW_SCRATCH1_0x0006800B , ULL(0x0006800B) );
+CONST_UINT64_T( PORE_SLW_SCRATCH2_0x0006800C , ULL(0x0006800C) );
+CONST_UINT64_T( PORE_SLW_IBUF_01_0x0006800D , ULL(0x0006800D) );
+CONST_UINT64_T( PORE_SLW_IBUF_2_0x0006800E , ULL(0x0006800E) );
+CONST_UINT64_T( PORE_SLW_DBG0_0x0006800F , ULL(0x0006800F) );
+CONST_UINT64_T( PORE_SLW_DBG1_0x00068010 , ULL(0x00068010) );
+CONST_UINT64_T( PORE_SLW_PC_STACK0_0x00068011 , ULL(0x00068011) );
+CONST_UINT64_T( PORE_SLW_PC_STACK1_0x00068012 , ULL(0x00068012) );
+CONST_UINT64_T( PORE_SLW_PC_STACK2_0x00068013 , ULL(0x00068013) );
+CONST_UINT64_T( PORE_SLW_ID_FLAGS_0x00068014 , ULL(0x00068014) );
+CONST_UINT64_T( PORE_SLW_DATA0_0x00068015 , ULL(0x00068015) );
+CONST_UINT64_T( PORE_SLW_MEMORY_RELOC_0x00068016 , ULL(0x00068016) );
+CONST_UINT64_T( PORE_SLW_I2C_E0_PARAM_0x00068017 , ULL(0x00068017) );
+CONST_UINT64_T( PORE_SLW_I2C_E1_PARAM_0x00068018 , ULL(0x00068018) );
+CONST_UINT64_T( PORE_SLW_I2C_E2_PARAM_0x00068019 , ULL(0x00068019) );
+
+//------------------------------------------------------------------------------
+// OCC/OCB
+//------------------------------------------------------------------------------
+
+CONST_UINT64_T( OCC_CONTROL_0x0006B000 , ULL(0x0006B000) );
+CONST_UINT64_T( OCC_CONTROL_AND_0x0006B001 , ULL(0x0006B001) );
+CONST_UINT64_T( OCC_CONTROL_OR_0x0006B002 , ULL(0x0006B002) );
+CONST_UINT64_T( OCC_DEBUG_MODE_0x0006B003 , ULL(0x0006B003) );
+
+CONST_UINT64_T( OCB0_ADDRESS_0x0006B010 , ULL(0x0006B010) );
+CONST_UINT64_T( OCB0_STATUS_CONTROL_0x0006B011 , ULL(0x0006B011) );
+CONST_UINT64_T( OCB0_STATUS_CONTROL_AND_0x0006B012 , ULL(0x0006B012) );
+CONST_UINT64_T( OCB0_STATUS_CONTROL_OR_0x0006B013 , ULL(0x0006B013) );
+CONST_UINT64_T( OCB0_ERROR_STATUS_0x0006B014 , ULL(0x0006B014) );
+CONST_UINT64_T( OCB0_DATA_0x0006B015 , ULL(0x0006B015) );
+CONST_UINT64_T( OCB0_PULL_BASE_0x0006A200 , ULL(0x0006A200) );
+CONST_UINT64_T( OCB0_PULL_STATUS_CONTROL_0x0006A201 , ULL(0x0006A201) );
+CONST_UINT64_T( OCB0_PUSH_BASE_0x0006A203 , ULL(0x0006A203) );
+CONST_UINT64_T( OCB0_PUSH_STATUS_CONTROL_0x0006A204 , ULL(0x0006A204) );
+CONST_UINT64_T( OCB0_STREAM_ERR_STATUS_0x0006A206 , ULL(0x0006A206) );
+CONST_UINT64_T( OCB0_UNTRUSTED_CONTROL_0x0006A207 , ULL(0x0006A207) );
+CONST_UINT64_T( OCB0_LIN_WINDOW_CONTROL_0x0006A208 , ULL(0x0006A208) );
+CONST_UINT64_T( OCB0_LIN_WINDOW_BASE_0x0006A20C , ULL(0x0006A20C) );
+
+CONST_UINT64_T( OCB1_ADDRESS_0x0006B030 , ULL(0x0006B030) );
+CONST_UINT64_T( OCB1_STATUS_CONTROL_0x0006B031 , ULL(0x0006B031) );
+CONST_UINT64_T( OCB1_STATUS_CONTROL_AND_0x0006B032 , ULL(0x0006B032) );
+CONST_UINT64_T( OCB1_STATUS_CONTROL_OR_0x0006B033 , ULL(0x0006B033) );
+CONST_UINT64_T( OCB1_ERROR_STATUS_0x0006B034 , ULL(0x0006B034) );
+CONST_UINT64_T( OCB1_DATA_0x0006B035 , ULL(0x0006B035) );
+CONST_UINT64_T( OCB1_PULL_BASE_0x0006A210 , ULL(0x0006A210) );
+CONST_UINT64_T( OCB1_PULL_STATUS_CONTROL_0x0006A211 , ULL(0x0006A211) );
+CONST_UINT64_T( OCB1_PUSH_BASE_0x0006A213 , ULL(0x0006A213) );
+CONST_UINT64_T( OCB1_PUSH_STATUS_CONTROL_0x0006A214 , ULL(0x0006A214) );
+CONST_UINT64_T( OCB1_STREAM_ERR_STATUS_0x0006A216 , ULL(0x0006A216) );
+CONST_UINT64_T( OCB1_UNTRUSTED_CONTROL_0x0006A217 , ULL(0x0006A217) );
+CONST_UINT64_T( OCB1_LIN_WINDOW_CONTROL_0x0006A218 , ULL(0x0006A218) );
+CONST_UINT64_T( OCB1_LIN_WINDOW_BASE_0x0006A21C , ULL(0x0006A21C) );
+
+CONST_UINT64_T( OCB2_ADDRESS_0x0006B050 , ULL(0x0006B050) );
+CONST_UINT64_T( OCB2_STATUS_CONTROL_0x0006B051 , ULL(0x0006B051) );
+CONST_UINT64_T( OCB2_STATUS_CONTROL_AND_0x0006B052 , ULL(0x0006B052) );
+CONST_UINT64_T( OCB2_STATUS_CONTROL_OR_0x0006B053 , ULL(0x0006B053) );
+CONST_UINT64_T( OCB2_ERROR_STATUS_0x0006B054 , ULL(0x0006B054) );
+CONST_UINT64_T( OCB2_DATA_0x0006B055 , ULL(0x0006B055) );
+CONST_UINT64_T( OCB2_PULL_BASE_0x0006A220 , ULL(0x0006A220) );
+CONST_UINT64_T( OCB2_PULL_STATUS_CONTROL_0x0006A221 , ULL(0x0006A221) );
+CONST_UINT64_T( OCB2_PUSH_BASE_0x0006A223 , ULL(0x0006A223) );
+CONST_UINT64_T( OCB2_PUSH_STATUS_CONTROL_0x0006A224 , ULL(0x0006A224) );
+CONST_UINT64_T( OCB2_STREAM_ERR_STATUS_0x0006A226 , ULL(0x0006A226) );
+CONST_UINT64_T( OCB2_UNTRUSTED_CONTROL_0x0006A227 , ULL(0x0006A227) );
+CONST_UINT64_T( OCB2_LIN_WINDOW_CONTROL_0x0006A228 , ULL(0x0006A228) );
+CONST_UINT64_T( OCB2_LIN_WINDOW_BASE_0x0006A22C , ULL(0x0006A22C) );
+
+CONST_UINT64_T( OCB3_ADDRESS_0x0006B070 , ULL(0x0006B070) );
+CONST_UINT64_T( OCB3_STATUS_CONTROL_0x0006B071 , ULL(0x0006B071) );
+CONST_UINT64_T( OCB3_STATUS_CONTROL_AND_0x0006B072 , ULL(0x0006B072) );
+CONST_UINT64_T( OCB3_STATUS_CONTROL_OR_0x0006B073 , ULL(0x0006B073) );
+CONST_UINT64_T( OCB3_ERROR_STATUS_0x0006B074 , ULL(0x0006B074) );
+CONST_UINT64_T( OCB3_DATA_0x0006B075 , ULL(0x0006B075) );
+CONST_UINT64_T( OCB3_PULL_BASE_0x0006A230 , ULL(0x0006A230) );
+CONST_UINT64_T( OCB3_PULL_STATUS_CONTROL_0x0006A231 , ULL(0x0006A231) );
+CONST_UINT64_T( OCB3_PUSH_BASE_0x0006A233 , ULL(0x0006A233) );
+CONST_UINT64_T( OCB3_PUSH_STATUS_CONTROL_0x0006A234 , ULL(0x0006A234) );
+CONST_UINT64_T( OCB3_STREAM_ERR_STATUS_0x0006A236 , ULL(0x0006A236) );
+CONST_UINT64_T( OCB3_UNTRUSTED_CONTROL_0x0006A237 , ULL(0x0006A237) );
+CONST_UINT64_T( OCB3_LIN_WINDOW_CONTROL_0x0006A238 , ULL(0x0006A238) );
+CONST_UINT64_T( OCB3_LIN_WINDOW_BASE_0x0006A23C , ULL(0x0006A23C) );
+
+// sram registers
+CONST_UINT64_T( OCC_SRAM_BOOT_VEC0_0x00066004 , ULL(0x00066004) );
+CONST_UINT64_T( OCC_SRAM_BOOT_VEC1_0x00066005 , ULL(0x00066005) );
+CONST_UINT64_T( OCC_SRAM_BOOT_VEC2_0x00066006 , ULL(0x00066006) );
+CONST_UINT64_T( OCC_SRAM_BOOT_VEC3_0x00066007 , ULL(0x00066007) );
+
+//------------------------------------------------------------------------------
+// PMC
+//------------------------------------------------------------------------------
+// todo: the full set needs to be added. The ones below are for SLW at this time
+
+// PIB Space Addresses
+
+
+CONST_UINT64_T( PMC_SPIV_CTRL_REG0A_0x00062040 , ULL(0x00062040) );
+CONST_UINT64_T( PMC_SPIV_CTRL_REG0B_0x00062041 , ULL(0x00062041) );
+CONST_UINT64_T( PMC_SPIV_CTRL_REG1_0x00062042 , ULL(0x00062042) );
+CONST_UINT64_T( PMC_SPIV_CTRL_REG2_0x00062043 , ULL(0x00062043) );
+CONST_UINT64_T( PMC_SPIV_CTRL_REG3_0x00062044 , ULL(0x00062044) );
+CONST_UINT64_T( PMC_SPIV_CTRL_REG4_0x00062045 , ULL(0x00062045) );
+CONST_UINT64_T( PMC_SPIV_STATUS_REG_0x00062046 , ULL(0x00062046) );
+CONST_UINT64_T( PMC_SPIV_COMMAND_REG_0x00062047 , ULL(0x00062047) );
+
+
+CONST_UINT64_T( PMC_O2S_CTRL_REG0A_0x00062050 , ULL(0x00062050) );
+CONST_UINT64_T( PMC_O2S_CTRL_REG0B_0x00062051 , ULL(0x00062051) );
+CONST_UINT64_T( PMC_O2S_CTRL_REG1_0x00062052 , ULL(0x00062052) );
+CONST_UINT64_T( PMC_O2S_CTRL_REG2_0x00062053 , ULL(0x00062053) );
+CONST_UINT64_T( PMC_O2S_CTRL_REG4_0x00062055 , ULL(0x00062055) );
+CONST_UINT64_T( PMC_O2S_STATUS_REG_0x00062056 , ULL(0x00062056) );
+CONST_UINT64_T( PMC_O2S_COMMAND_REG_0x00062057 , ULL(0x00062057) );
+CONST_UINT64_T( PMC_O2S_WDATA_REG_0x00062058 , ULL(0x00062058) );
+CONST_UINT64_T( PMC_O2S_RDATA_REG_0x00062059 , ULL(0x00062059) );
+
+CONST_UINT64_T( PMC_PORE_REQ_STAT_REG_0x00062090 , ULL(0x00062090) );
+CONST_UINT64_T( PMC_MODE_REG_0x00062000 , ULL(0x00062000) );
+
+
+
+
+CONST_UINT64_T( SPIPSS_ADC_CTRL_REG0_0x00070000 , ULL(0x00070000) );
+CONST_UINT64_T( SPIPSS_ADC_CTRL_REG1_0x00070001 , ULL(0x00070001) );
+CONST_UINT64_T( SPIPSS_ADC_CTRL_REG2_0x00070002 , ULL(0x00070002) );
+CONST_UINT64_T( SPIPSS_ADC_STATUS_REG_0x00070003 , ULL(0x00070003) );
+CONST_UINT64_T( SPIPSS_ADC_CMD_REG_0x00070004 , ULL(0x00070004) );
+CONST_UINT64_T( SPIPSS_ADC_WDATA_REG_0x00070010 , ULL(0x00070010) );
+CONST_UINT64_T( SPIPSS_ADC_RDATA_REG0_0x00070020 , ULL(0x00070020) );
+CONST_UINT64_T( SPIPSS_ADC_RDATA_REG1_0x00070021 , ULL(0x00070021) );
+CONST_UINT64_T( SPIPSS_ADC_RDATA_REG2_0x00070022 , ULL(0x00070022) );
+CONST_UINT64_T( SPIPSS_ADC_RDATA_REG3_0x00070023 , ULL(0x00070023) );
+CONST_UINT64_T( SPIPSS_100NS_REG_0x00070028 , ULL(0x00070028) );
+CONST_UINT64_T( SPIPSS_P2S_CTRL_REG0_0x00070040 , ULL(0x00070040) );
+CONST_UINT64_T( SPIPSS_P2S_CTRL_REG1_0x00070041 , ULL(0x00070041) );
+CONST_UINT64_T( SPIPSS_P2S_CTRL_REG2_0x00070042 , ULL(0x00070042) );
+CONST_UINT64_T( SPIPSS_P2S_STATUS_REG_0x00070043 , ULL(0x00070043) );
+CONST_UINT64_T( SPIPSS_P2S_COMMAND_REG_0x00070044 , ULL(0x00070044) );
+CONST_UINT64_T( SPIPSS_P2S_WDATA_REG_0x00070050 , ULL(0x00070050) );
+CONST_UINT64_T( SPIPSS_P2S_RDATA_REG_0x00070060 , ULL(0x00070060) );
+CONST_UINT64_T( SPIPSS_ADC_RESET_REGISTER_0x00070005 , ULL(0x00070005) );
+CONST_UINT64_T( SPIPSS_P2S_RESET_REGISTER_0x00070045 , ULL(0x00070045) );
+
+
+// OCI Space Addresses
+CONST_UINT32_T( OCI_PMC_PORE_REQ_STAT_REG_0x40010480 , ULL(0x40010480) );
+
+
+//------------------------------------------------------------------------------
+// SPIADC
+//------------------------------------------------------------------------------
+CONST_UINT64_T( SPIADC_0x00070000 , ULL(0x00070000) );
+
+//------------------------------------------------------------------------------
+// PIB-ATTACHED MEMORY
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PIBMEM0_0x00080000 , ULL(0x00080000) );
+
+CONST_UINT64_T( PIBMEM_CONTROL_0x00088000 , ULL(0x00088000) );
+CONST_UINT64_T( PIBMEM_ADDRESS_0x00088001 , ULL(0x00088001) );
+CONST_UINT64_T( PIBMEM_DATA_0x00088002 , ULL(0x00088002) );
+CONST_UINT64_T( PIBMEM_DATA_INC_0x00088003 , ULL(0x00088003) );
+CONST_UINT64_T( PIBMEM_DATA_DEC_0x00088004 , ULL(0x00088004) );
+CONST_UINT64_T( PIBMEM_STATUS_0x00088005 , ULL(0x00088005) );
+CONST_UINT64_T( PIBMEM_RESET_0x00088006 , ULL(0x00088006) );
+CONST_UINT64_T( PIBMEM_REPAIR_LOAD_0x00088007 , ULL(0x00088007) );
+
+//------------------------------------------------------------------------------
+// I2C MASTER (MEMS1)
+//------------------------------------------------------------------------------
+CONST_UINT64_T( I2CMS_MEMS1_CONTROL_0x000A0020 , ULL(0x000A0020) );
+CONST_UINT64_T( I2CMS_MEMS1_RESET_0x000A0021 , ULL(0x000A0021) );
+CONST_UINT64_T( I2CMS_MEMS1_STATUS_0x000A0022 , ULL(0x000A0022) );
+CONST_UINT64_T( I2CMS_MEMS1_DATA_0x000A0023 , ULL(0x000A0023) );
+CONST_UINT64_T( I2CMS_MEMS1_COMMAND_0x000A0025 , ULL(0x000A0025) );
+
+//------------------------------------------------------------------------------
+// I2C MASTER (PCI)
+//------------------------------------------------------------------------------
+CONST_UINT64_T( I2CMS_PCI_0x000A0040 , ULL(0x000A0040) );
+CONST_UINT64_T( I2CMS_PCI_CONTROL_0x000A0040 , ULL(0x000A0040) );
+CONST_UINT64_T( I2CMS_PCI_RESET_0x000A0041 , ULL(0x000A0041) );
+CONST_UINT64_T( I2CMS_PCI_STATUS_0x000A0042 , ULL(0x000A0042) );
+CONST_UINT64_T( I2CMS_PCI_DATA_0x000A0043 , ULL(0x000A0043) );
+CONST_UINT64_T( I2CMS_PCI_COMMAND_0x000A0045 , ULL(0x000A0045) );
+
+//------------------------------------------------------------------------------
+// PORE-SBE
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PORE_SBE_0x000E0000 , ULL(0x000E0000) );
+CONST_UINT64_T( PORE_SBE_STATUS_0x000E0000 , ULL(0x000E0000) );
+CONST_UINT64_T( PORE_SBE_CONTROL_0x000E0001 , ULL(0x000E0001) );
+CONST_UINT64_T( PORE_SBE_RESET_0x000E0002 , ULL(0x000E0002) );
+CONST_UINT64_T( PORE_SBE_ERROR_MASK_0x000E0003 , ULL(0x000E0003) );
+CONST_UINT64_T( PORE_SBE_PRV_BASE_ADDRESS0_0x000E0004 , ULL(0x000E0004) );
+CONST_UINT64_T( PORE_SBE_PRV_BASE_ADDRESS1_0x000E0005 , ULL(0x000E0005) );
+CONST_UINT64_T( PORE_SBE_OCI_BASE_ADDRESS0_0x000E0006 , ULL(0x000E0006) );
+CONST_UINT64_T( PORE_SBE_OCI_BASE_ADDRESS1_0x000E0007 , ULL(0x000E0007) );
+CONST_UINT64_T( PORE_SBE_TABLE_BASE_ADDR_0x000E0008 , ULL(0x000E0008) );
+CONST_UINT64_T( PORE_SBE_EXE_TRIGGER_0x000E0009 , ULL(0x000E0009) );
+CONST_UINT64_T( PORE_SBE_SCRATCH0_0x000E000A , ULL(0x000E000A) );
+CONST_UINT64_T( PORE_SBE_SCRATCH1_0x000E000B , ULL(0x000E000B) );
+CONST_UINT64_T( PORE_SBE_SCRATCH2_0x000E000C , ULL(0x000E000C) );
+CONST_UINT64_T( PORE_SBE_IBUF_01_0x000E000D , ULL(0x000E000D) );
+CONST_UINT64_T( PORE_SBE_IBUF_2_0x000E000E , ULL(0x000E000E) );
+CONST_UINT64_T( PORE_SBE_DBG0_0x000E000F , ULL(0x000E000F) );
+CONST_UINT64_T( PORE_SBE_DBG1_0x000E0010 , ULL(0x000E0010) );
+CONST_UINT64_T( PORE_SBE_PC_STACK0_0x000E0011 , ULL(0x000E0011) );
+CONST_UINT64_T( PORE_SBE_PC_STACK1_0x000E0012 , ULL(0x000E0012) );
+CONST_UINT64_T( PORE_SBE_PC_STACK2_0x000E0013 , ULL(0x000E0013) );
+CONST_UINT64_T( PORE_SBE_ID_FLAGS_0x000E0014 , ULL(0x000E0014) );
+CONST_UINT64_T( PORE_SBE_DATA0_0x000E0015 , ULL(0x000E0015) );
+CONST_UINT64_T( PORE_SBE_MEMORY_RELOC_0x000E0016 , ULL(0x000E0016) );
+CONST_UINT64_T( PORE_SBE_I2C_E0_PARAM_0x000E0017 , ULL(0x000E0017) );
+CONST_UINT64_T( PORE_SBE_I2C_E1_PARAM_0x000E0018 , ULL(0x000E0018) );
+CONST_UINT64_T( PORE_SBE_I2C_E2_PARAM_0x000E0019 , ULL(0x000E0019) );
+
+//------------------------------------------------------------------------------
+// TP SCOM
+// ring 1 = Trace
+// ring 2 = OCC
+// ring 3 = PIB
+// ring 15 = OCCSEC
+//------------------------------------------------------------------------------
+
+
+/******************************************************************************/
+/******************************* NEST CHIPLET *******************************/
+/******************************************************************************/
+
+//------------------------------------------------------------------------------
+// NEST SCOM
+// ring 1 = Trace
+// ring 2 = TCBR
+// ring 3 = PB
+// ring 6 = MCL
+// MC0 MCS0 = 0x02011800
+// MC0 MCS1 = 0x02011880
+// MC1 MCS0 = 0x02011900
+// MC1 MCS0 = 0x02011980
+// IOMC0 = 0x02011A00
+// ring 7 = MCR
+// MC2 MCS0 = 0x02011C00
+// MC2 MCS1 = 0x02011C80
+// MC3 MCS0 = 0x02011D00
+// MC3 MCS1 = 0x02011D80
+// IOMC1 = 0x02011E00
+// ring 8 = PCIS0
+// ring 9 = PCIS1
+// ring 10 = PCIS2
+// ring 11 = PCIS3
+// ring 12 = NX
+// ring 13 = MCD
+// ring 15 = TCBRSEC
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// NEST TRACE
+//------------------------------------------------------------------------------
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T1_0x02010440 , ULL(0x02010440) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T1_0x02010441 , ULL(0x02010441) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T2_0x02010480 , ULL(0x02010480) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T2_0x02010481 , ULL(0x02010481) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T3_0x020104C0 , ULL(0x020104C0) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T3_0x020104C1 , ULL(0x020104C1) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T4_0x02010500 , ULL(0x02010500) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T4_0x02010501 , ULL(0x02010501) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T5_0x02010540 , ULL(0x02010540) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T5_0x02010541 , ULL(0x02010541) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T6_0x02010580 , ULL(0x02010580) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T6_0x02010581 , ULL(0x02010581) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T7_0x020105C0 , ULL(0x020105C0) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T7_0x020105C1 , ULL(0x020105C1) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T8_0x02010600 , ULL(0x02010600) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T8_0x02010601 , ULL(0x02010601) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_PB_T9_0x02010640 , ULL(0x02010640) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_PB_T9_0x02010641 , ULL(0x02010641) );
+CONST_UINT64_T( NEST_TRACE_DATA_HI_NX_0x02010A00 , ULL(0x02010A00) );
+CONST_UINT64_T( NEST_TRACE_DATA_LO_NX_0x02010A01 , ULL(0x02010A01) );
+
+//------------------------------------------------------------------------------
+// POWERBUS ACCESS BRIDGE (PBA)
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PBA_CC_SYNC_CONF_0x02030000 , ULL(0x02030000) );
+
+CONST_UINT64_T( PBA_FIR_0x02010840 , ULL(0x02010840) );
+CONST_UINT64_T( PBA_FIR_AND_0x02010841 , ULL(0x02010841) );
+CONST_UINT64_T( PBA_FIR_OR_0x02010842 , ULL(0x02010842) );
+CONST_UINT64_T( PBA_FIR_MASK_0x02010843 , ULL(0x02010843) );
+CONST_UINT64_T( PBA_FIR_MASK_AND_0x02010844 , ULL(0x02010844) );
+CONST_UINT64_T( PBA_FIR_MASK_OR_0x02010845 , ULL(0x02010845) );
+CONST_UINT64_T( PBA_FIR_ACTION0_0x02010846 , ULL(0x02010846) );
+CONST_UINT64_T( PBA_FIR_ACTION1_0x02010847 , ULL(0x02010847) );
+
+CONST_UINT64_T( PBA_OCC_ACTION_0x0201084A , ULL(0x0201084A) );
+CONST_UINT64_T( PBA_CONFIG_0x0201084B , ULL(0x0201084B) );
+CONST_UINT64_T( PBA_ERR_RPT0_0x0201084C , ULL(0x0201084C) );
+CONST_UINT64_T( PBA_ERR_RPT1_0x0201084D , ULL(0x0201084D) );
+CONST_UINT64_T( PBA_ERR_RPT2_0x0201084E , ULL(0x0201084E) );
+CONST_UINT64_T( PBA_RBUFVAL0_0x02010850 , ULL(0x02010850) );
+CONST_UINT64_T( PBA_RBUFVAL1_0x02010851 , ULL(0x02010851) );
+CONST_UINT64_T( PBA_RBUFVAL2_0x02010852 , ULL(0x02010852) );
+CONST_UINT64_T( PBA_RBUFVAL3_0x02010853 , ULL(0x02010853) );
+CONST_UINT64_T( PBA_RBUFVAL4_0x02010854 , ULL(0x02010854) );
+CONST_UINT64_T( PBA_RBUFVAL5_0x02010855 , ULL(0x02010855) );
+CONST_UINT64_T( PBA_WBUFVAL0_0x02010858 , ULL(0x02010858) );
+CONST_UINT64_T( PBA_WBUFVAL1_0x02010859 , ULL(0x02010859) );
+
+CONST_UINT64_T( PBA_MODE_0x00064000 , ULL(0x00064000) );
+CONST_UINT64_T( PBA_SLVRST_0x00064001 , ULL(0x00064001) );
+CONST_UINT64_T( PBA_SLVCTL0_0x00064004 , ULL(0x00064004) );
+CONST_UINT64_T( PBA_SLVCTL1_0x00064005 , ULL(0x00064005) );
+CONST_UINT64_T( PBA_SLVCTL2_0x00064006 , ULL(0x00064006) );
+CONST_UINT64_T( PBA_SLVCTL3_0x00064007 , ULL(0x00064007) );
+CONST_UINT64_T( PBA_BCDE_CTL_0x00064010 , ULL(0x00064010) );
+CONST_UINT64_T( PBA_BCDE_SET_0x00064011 , ULL(0x00064011) );
+CONST_UINT64_T( PBA_BCDE_STAT_0x00064012 , ULL(0x00064012) );
+CONST_UINT64_T( PBA_BCDE_PBADR_0x00064013 , ULL(0x00064013) );
+CONST_UINT64_T( PBA_BCDE_OCIBAR_0x00064014 , ULL(0x00064014) );
+CONST_UINT64_T( PBA_BCUE_CTL_0x00064015 , ULL(0x00064015) );
+CONST_UINT64_T( PBA_BCUE_SET_0x00064016 , ULL(0x00064016) );
+CONST_UINT64_T( PBA_BCUE_STAT_0x00064017 , ULL(0x00064017) );
+CONST_UINT64_T( PBA_BCUE_PBADR_0x00064018 , ULL(0x00064018) );
+CONST_UINT64_T( PBA_BCUE_OCIBAR_0x00064019 , ULL(0x00064019) );
+CONST_UINT64_T( PBA_PBOCR0_0x00064020 , ULL(0x00064020) );
+CONST_UINT64_T( PBA_PBOCR1_0x00064021 , ULL(0x00064021) );
+CONST_UINT64_T( PBA_PBOCR2_0x00064022 , ULL(0x00064022) );
+CONST_UINT64_T( PBA_PBOCR3_0x00064023 , ULL(0x00064023) );
+CONST_UINT64_T( PBA_PBOCR4_0x00064024 , ULL(0x00064024) );
+CONST_UINT64_T( PBA_PBOCR5_0x00064025 , ULL(0x00064025) );
+
+CONST_UINT64_T( PBA_BAR0_0x02013F00 , ULL(0x02013F00) );
+CONST_UINT64_T( PBA_BARMSK0_0x02013F04 , ULL(0x02013F04) );
+CONST_UINT64_T( PBA_BAR1_0x02013F01 , ULL(0x02013F01) );
+CONST_UINT64_T( PBA_BARMSK1_0x02013F05 , ULL(0x02013F05) );
+CONST_UINT64_T( PBA_BAR2_0x02013F02 , ULL(0x02013F02) );
+CONST_UINT64_T( PBA_BARMSK2_0x02013F06 , ULL(0x02013F06) );
+CONST_UINT64_T( PBA_BAR3_0x02013F03 , ULL(0x02013F03) );
+CONST_UINT64_T( PBA_BARMSK3_0x02013F07 , ULL(0x02013F07) );
+CONST_UINT64_T( PBA_TRUSTMODE_0x02013F08 , ULL(0x02013F08) );
+
+//------------------------------------------------------------------------------
+// PSI
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PSI_BRIDGE_BAR_0x0201090A , ULL(0x0201090A) );
+CONST_UINT64_T( PSI_FSP_BAR_0x0201090B , ULL(0x0201090B) );
+CONST_UINT64_T( PSI_FSP_MMR_0x0201090C , ULL(0x0201090C) );
+CONST_UINT64_T( PSI_BRIDGE_STATUS_CTL_0x0201090E , ULL(0x0201090E) );
+
+//------------------------------------------------------------------------------
+// INTERRUPT CONTROL PRESENTER (ICP)
+//------------------------------------------------------------------------------
+CONST_UINT64_T( ICP_BAR_0x020109CA , ULL(0x020109CA) );
+CONST_UINT64_T( ICP_INTR_INJECT_0x020109CC , ULL(0x020109CC) );
+
+
+//------------------------------------------------------------------------------
+// NEST PB EH
+//------------------------------------------------------------------------------
+// registers with multiple physical/shadow copies (all must be configured consistently)
+// west
+CONST_UINT64_T( PB_MODE_WEST_0x02010C0A , ULL(0x02010C0A) );
+CONST_UINT64_T( PB_HP_MODE_NEXT_WEST_0x02010C0B , ULL(0x02010C0B) );
+CONST_UINT64_T( PB_HP_MODE_CURR_WEST_0x02010C0C , ULL(0x02010C0C) );
+CONST_UINT64_T( PB_HPX_MODE_NEXT_WEST_0x02010C0D , ULL(0x02010C0D) );
+CONST_UINT64_T( PB_HPX_MODE_CURR_WEST_0x02010C0E , ULL(0x02010C0E) );
+CONST_UINT64_T( PB_FLMCFG0_WEST_0x02010C12 , ULL(0x02010C12) );
+CONST_UINT64_T( PB_FLMCFG1_WEST_0x02010C13 , ULL(0x02010C13) );
+CONST_UINT64_T( PB_FRMCFG0_WEST_0x02010C14 , ULL(0x02010C14) );
+CONST_UINT64_T( PB_FRMCFG1_WEST_0x02010C15 , ULL(0x02010C15) );
+// center
+CONST_UINT64_T( PB_MODE_CENT_0x02010C4A , ULL(0x02010C4A) );
+CONST_UINT64_T( PB_HP_MODE_NEXT_CENT_0x02010C4B , ULL(0x02010C4B) );
+CONST_UINT64_T( PB_HP_MODE_CURR_CENT_0x02010C4C , ULL(0x02010C4C) );
+CONST_UINT64_T( PB_HPX_MODE_NEXT_CENT_0x02010C4D , ULL(0x02010C4D) );
+CONST_UINT64_T( PB_HPX_MODE_CURR_CENT_0x02010C4E , ULL(0x02010C4E) );
+CONST_UINT64_T( PB_FLMCFG0_CENT_0x02010C5E , ULL(0x02010C5E) );
+CONST_UINT64_T( PB_FLMCFG1_CENT_0x02010C5F , ULL(0x02010C5F) );
+CONST_UINT64_T( PB_FRMCFG0_CENT_0x02010C60 , ULL(0x02010C60) );
+CONST_UINT64_T( PB_FRMCFG1_CENT_0x02010C61 , ULL(0x02010C61) );
+// east
+CONST_UINT64_T( PB_MODE_EAST_0x02010C8A , ULL(0x02010C8A) );
+CONST_UINT64_T( PB_HP_MODE_NEXT_EAST_0x02010C8B , ULL(0x02010C8B) );
+CONST_UINT64_T( PB_HP_MODE_CURR_EAST_0x02010C8C , ULL(0x02010C8C) );
+CONST_UINT64_T( PB_HPX_MODE_NEXT_EAST_0x02010C8D , ULL(0x02010C8D) );
+CONST_UINT64_T( PB_HPX_MODE_CURR_EAST_0x02010C8E , ULL(0x02010C8E) );
+CONST_UINT64_T( PB_FLMCFG0_EAST_0x02010C92 , ULL(0x02010C92) );
+CONST_UINT64_T( PB_FLMCFG1_EAST_0x02010C93 , ULL(0x02010C93) );
+CONST_UINT64_T( PB_FRMCFG0_EAST_0x02010C94 , ULL(0x02010C94) );
+CONST_UINT64_T( PB_FRMCFG1_EAST_0x02010C95 , ULL(0x02010C95) );
+
+// registers without shadow copies
+// center
+CONST_UINT64_T( PB_PMU_0x02010C4F , ULL(0x02010C4F) );
+CONST_UINT64_T( PB_NMPM_COUNT_0x02010C50 , ULL(0x02010C50) );
+CONST_UINT64_T( PB_LMPM_COUNT_0x02010C51 , ULL(0x02010C51) );
+CONST_UINT64_T( PB_RCMD_INTDAT_COUNT_0x02010C52 , ULL(0x02010C52) );
+CONST_UINT64_T( PB_EXTDAT_COUNT_0x02010C53 , ULL(0x02010C53) );
+CONST_UINT64_T( PB_PMU_COUNT0_0x02010C54 , ULL(0x02010C54) );
+CONST_UINT64_T( PB_PMU_COUNT1_0x02010C55 , ULL(0x02010C55) );
+CONST_UINT64_T( PB_PMU_COUNT2_0x02010C56 , ULL(0x02010C56) );
+CONST_UINT64_T( PB_PMU_COUNT3_0x02010C57 , ULL(0x02010C57) );
+CONST_UINT64_T( PB_RGMCFG00_0x02010C58 , ULL(0x02010C58) );
+CONST_UINT64_T( PB_RGMCFG01_0x02010C59 , ULL(0x02010C59) );
+CONST_UINT64_T( PB_RGMCFG10_0x02010C5A , ULL(0x02010C5A) );
+CONST_UINT64_T( PB_RGMCFGM00_0x02010C5B , ULL(0x02010C5B) );
+CONST_UINT64_T( PB_RGMCFGM01_0x02010C5C , ULL(0x02010C5C) );
+CONST_UINT64_T( PB_RGMCFGM10_0x02010C5D , ULL(0x02010C5D) );
+CONST_UINT64_T( PB_GP_CMD_RATE_DP0_0x02010C62 , ULL(0x02010C62) );
+CONST_UINT64_T( PB_GP_CMD_RATE_DP1_0x02010C63 , ULL(0x02010C63) );
+CONST_UINT64_T( PB_RGP_CMD_RATE_DP0_0x02010C64 , ULL(0x02010C64) );
+CONST_UINT64_T( PB_RGP_CMD_RATE_DP1_0x02010C65 , ULL(0x02010C65) );
+CONST_UINT64_T( PB_SP_CMD_RATE_DP0_0x02010C66 , ULL(0x02010C66) );
+CONST_UINT64_T( PB_SP_CMD_RATE_DP1_0x02010C67 , ULL(0x02010C67) );
+CONST_UINT64_T( PB_EVENT_TRACE_0x02010C68 , ULL(0x02010C68) );
+CONST_UINT64_T( PB_EVENT_COMPA_0x02010C69 , ULL(0x02010C69) );
+CONST_UINT64_T( PB_EVENT_COMPB_0x02010C6A , ULL(0x02010C6A) );
+CONST_UINT64_T( PB_CR_ERROR_0x02010C6B , ULL(0x02010C6B) );
+
+//------------------------------------------------------------------------------
+// NEST PB EH FIR
+//------------------------------------------------------------------------------
+// west FIR
+CONST_UINT64_T( PB_FIR_WEST_0x02010C00 , ULL(0x02010C00) );
+CONST_UINT64_T( PB_FIR_AND_WEST_0x02010C01 , ULL(0x02010C01) );
+CONST_UINT64_T( PB_FIR_OR_WEST_0x02010C02 , ULL(0x02010C02) );
+CONST_UINT64_T( PB_FIR_MASK_WEST_0x02010C03 , ULL(0x02010C03) );
+CONST_UINT64_T( PB_FIR_MASK_AND_WEST_0x02010C04 , ULL(0x02010C04) );
+CONST_UINT64_T( PB_FIR_MASK_OR_WEST_0x02010C05 , ULL(0x02010C05) );
+CONST_UINT64_T( PB_FIR_ACTION0_WEST_0x02010C06 , ULL(0x02010C06) );
+CONST_UINT64_T( PB_FIR_ACTION1_WEST_0x02010C07 , ULL(0x02010C07) );
+// center FIR
+CONST_UINT64_T( PB_FIR_CENT_0x02010C40 , ULL(0x02010C40) );
+CONST_UINT64_T( PB_FIR_AND_CENT_0x02010C41 , ULL(0x02010C41) );
+CONST_UINT64_T( PB_FIR_OR_CENT_0x02010C42 , ULL(0x02010C42) );
+CONST_UINT64_T( PB_FIR_MASK_CENT_0x02010C43 , ULL(0x02010C43) );
+CONST_UINT64_T( PB_FIR_MASK_AND_CENT_0x02010C44 , ULL(0x02010C44) );
+CONST_UINT64_T( PB_FIR_MASK_OR_CENT_0x02010C45 , ULL(0x02010C45) );
+CONST_UINT64_T( PB_FIR_ACTION0_CENT_0x02010C46 , ULL(0x02010C46) );
+CONST_UINT64_T( PB_FIR_ACTION1_CENT_0x02010C47 , ULL(0x02010C47) );
+// east FIR
+CONST_UINT64_T( PB_FIR_EAST_0x02010C80 , ULL(0x02010C80) );
+CONST_UINT64_T( PB_FIR_AND_EAST_0x02010C81 , ULL(0x02010C81) );
+CONST_UINT64_T( PB_FIR_OR_EAST_0x02010C82 , ULL(0x02010C82) );
+CONST_UINT64_T( PB_FIR_MASK_EAST_0x02010C83 , ULL(0x02010C83) );
+CONST_UINT64_T( PB_FIR_MASK_AND_EAST_0x02010C84 , ULL(0x02010C84) );
+CONST_UINT64_T( PB_FIR_MASK_OR_EAST_0x02010C85 , ULL(0x02010C85) );
+CONST_UINT64_T( PB_FIR_ACTION0_EAST_0x02010C86 , ULL(0x02010C86) );
+CONST_UINT64_T( PB_FIR_ACTION1_EAST_0x02010C87 , ULL(0x02010C87) );
+// RAS FIR
+CONST_UINT64_T( PB_RAS_FIR_0x02010C6C , ULL(0x02010C6C) );
+CONST_UINT64_T( PB_RAS_FIR_AND_0x02010C6D , ULL(0x02010C6D) );
+CONST_UINT64_T( PB_RAS_FIR_OR_0x02010C6E , ULL(0x02010C6E) );
+CONST_UINT64_T( PB_RAS_FIR_MASK_0x02010C6F , ULL(0x02010C6F) );
+CONST_UINT64_T( PB_RAS_FIR_MASK_AND_0x02010C70 , ULL(0x02010C70) );
+CONST_UINT64_T( PB_RAS_FIR_MASK_OR_0x02010C71 , ULL(0x02010C71) );
+CONST_UINT64_T( PB_RAS_FIR_ACTION0_0x02010C72 , ULL(0x02010C72) );
+CONST_UINT64_T( PB_RAS_FIR_ACTION1_0x02010C73 , ULL(0x02010C73) );
+
+//------------------------------------------------------------------------------
+// MCS
+//------------------------------------------------------------------------------
+CONST_UINT64_T( MCS_MCFGP_0x02011800 , ULL(0x02011800) );
+
+CONST_UINT64_T( MCS_MCIFIR_0x02011840 , ULL(0x02011840) );
+CONST_UINT64_T( MCS_MCIFIR_AND_0x02011841 , ULL(0x02011841) );
+CONST_UINT64_T( MCS_MCIFIR_OR_0x02011842 , ULL(0x02011842) );
+CONST_UINT64_T( MCS_MCIFIRMASK_0x02011843 , ULL(0x02011843) );
+CONST_UINT64_T( MCS_MCIFIRMASK_AND_0x02011844 , ULL(0x02011844) );
+CONST_UINT64_T( MCS_MCIFIRMASK_OR_0x02011845 , ULL(0x02011845) );
+
+CONST_UINT64_T( MCS_MCICFG_0x0201184A , ULL(0x0201184A) );
+CONST_UINT64_T( MCS_MCISTAT_0x0201184B , ULL(0x0201184B) );
+
+//------------------------------------------------------------------------------
+// NEST Alter-Diplay Unit (ADU)
+//------------------------------------------------------------------------------
+CONST_UINT64_T( ADU_CONTROL_0x02020000 , ULL(0x02020000) );
+CONST_UINT64_T( ADU_COMMAND_0x02020001 , ULL(0x02020001) );
+CONST_UINT64_T( ADU_STATUS_0x02020002 , ULL(0x02020002) );
+CONST_UINT64_T( ADU_DATA_0x02020003 , ULL(0x02020003) );
+CONST_UINT64_T( ADU_XSCOM_BASE_0x02020005 , ULL(0x02020005) );
+CONST_UINT64_T( ADU_FORCE_ECC_0x02020010 , ULL(0x02020010) );
+CONST_UINT64_T( ADU_PMISC_MODE_0x0202000B , ULL(0x0202000B) );
+CONST_UINT64_T( ADU_UNTRUSTED_BAR_0x02020015 , ULL(0x02020015) );
+CONST_UINT64_T( ADU_UNTRUSTED_BAR_MASK_0x02020016 , ULL(0x02020016) );
+
+//------------------------------------------------------------------------------
+// PCIe
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE0_NODAL_BAR0_0x02012010 , ULL(0x02012010) );
+CONST_UINT64_T( PCIE0_NODAL_BAR1_0x02012011 , ULL(0x02012011) );
+CONST_UINT64_T( PCIE0_GROUP_BAR0_0x02012012 , ULL(0x02012012) );
+CONST_UINT64_T( PCIE0_GROUP_BAR1_0x02012013 , ULL(0x02012013) );
+CONST_UINT64_T( PCIE0_NEAR_BAR_F0_0x02012014 , ULL(0x02012014) );
+CONST_UINT64_T( PCIE0_FAR_BAR_F0_0x02012015 , ULL(0x02012015) );
+CONST_UINT64_T( PCIE0_NEAR_BAR_F1_0x02012016 , ULL(0x02012016) );
+CONST_UINT64_T( PCIE0_FAR_BAR_F1_0x02012017 , ULL(0x02012017) );
+CONST_UINT64_T( PCIE0_IO_BAR0_0x02012040 , ULL(0x02012040) );
+CONST_UINT64_T( PCIE0_IO_BAR1_0x02012041 , ULL(0x02012041) );
+CONST_UINT64_T( PCIE0_IO_BAR2_0x02012042 , ULL(0x02012042) );
+CONST_UINT64_T( PCIE0_IO_MASK0_0x02012043 , ULL(0x02012043) );
+CONST_UINT64_T( PCIE0_IO_MASK1_0x02012044 , ULL(0x02012044) );
+CONST_UINT64_T( PCIE0_IO_BAR_EN_0x02012045 , ULL(0x02012045) );
+
+CONST_UINT64_T( PCIE1_NODAL_BAR0_0x02012410 , ULL(0x02012410) );
+CONST_UINT64_T( PCIE1_NODAL_BAR1_0x02012411 , ULL(0x02012411) );
+CONST_UINT64_T( PCIE1_GROUP_BAR0_0x02012412 , ULL(0x02012412) );
+CONST_UINT64_T( PCIE1_GROUP_BAR1_0x02012413 , ULL(0x02012413) );
+CONST_UINT64_T( PCIE1_NEAR_BAR_F0_0x02012414 , ULL(0x02012414) );
+CONST_UINT64_T( PCIE1_FAR_BAR_F0_0x02012415 , ULL(0x02012415) );
+CONST_UINT64_T( PCIE1_NEAR_BAR_F1_0x02012416 , ULL(0x02012416) );
+CONST_UINT64_T( PCIE1_FAR_BAR_F1_0x02012417 , ULL(0x02012417) );
+CONST_UINT64_T( PCIE1_IO_BAR0_0x02012440 , ULL(0x02012440) );
+CONST_UINT64_T( PCIE1_IO_BAR1_0x02012441 , ULL(0x02012441) );
+CONST_UINT64_T( PCIE1_IO_BAR2_0x02012442 , ULL(0x02012442) );
+CONST_UINT64_T( PCIE1_IO_MASK0_0x02012443 , ULL(0x02012443) );
+CONST_UINT64_T( PCIE1_IO_MASK1_0x02012444 , ULL(0x02012444) );
+CONST_UINT64_T( PCIE1_IO_BAR_EN_0x02012445 , ULL(0x02012445) );
+
+CONST_UINT64_T( PCIE2_NODAL_BAR0_0x02012810 , ULL(0x02012810) );
+CONST_UINT64_T( PCIE2_NODAL_BAR1_0x02012811 , ULL(0x02012811) );
+CONST_UINT64_T( PCIE2_GROUP_BAR0_0x02012812 , ULL(0x02012812) );
+CONST_UINT64_T( PCIE2_GROUP_BAR1_0x02012813 , ULL(0x02012813) );
+CONST_UINT64_T( PCIE2_NEAR_BAR_F0_0x02012814 , ULL(0x02012814) );
+CONST_UINT64_T( PCIE2_FAR_BAR_F0_0x02012815 , ULL(0x02012815) );
+CONST_UINT64_T( PCIE2_NEAR_BAR_F1_0x02012816 , ULL(0x02012816) );
+CONST_UINT64_T( PCIE2_FAR_BAR_F1_0x02012817 , ULL(0x02012817) );
+CONST_UINT64_T( PCIE2_IO_BAR0_0x02012840 , ULL(0x02012840) );
+CONST_UINT64_T( PCIE2_IO_BAR1_0x02012841 , ULL(0x02012841) );
+CONST_UINT64_T( PCIE2_IO_BAR2_0x02012842 , ULL(0x02012842) );
+CONST_UINT64_T( PCIE2_IO_MASK0_0x02012843 , ULL(0x02012843) );
+CONST_UINT64_T( PCIE2_IO_MASK1_0x02012844 , ULL(0x02012844) );
+CONST_UINT64_T( PCIE2_IO_BAR_EN_0x02012845 , ULL(0x02012845) );
+
+//------------------------------------------------------------------------------
+// NX
+//------------------------------------------------------------------------------
+CONST_UINT64_T( NX_APC_NODAL_BAR0_0x0201302D , ULL(0x0201302D) );
+CONST_UINT64_T( NX_APC_NODAL_BAR1_0x0201302E , ULL(0x0201302E) );
+CONST_UINT64_T( NX_APC_GROUP_BAR0_0x0201302F , ULL(0x0201302F) );
+CONST_UINT64_T( NX_APC_GROUP_BAR1_0x02013030 , ULL(0x02013030) );
+CONST_UINT64_T( NX_APC_NEAR_BAR_F0_0x02013031 , ULL(0x02013031) );
+CONST_UINT64_T( NX_APC_FAR_BAR_F0_0x02013032 , ULL(0x02013032) );
+CONST_UINT64_T( NX_APC_NEAR_BAR_F1_0x02013033 , ULL(0x02013033) );
+CONST_UINT64_T( NX_APC_FAR_BAR_F1_0x02013034 , ULL(0x02013034) );
+CONST_UINT64_T( NX_MMIO_BAR_0x0201308D , ULL(0x0201308D) );
+CONST_UINT64_T( NX_NODAL_BAR0_0x02013095 , ULL(0x02013095) );
+CONST_UINT64_T( NX_NODAL_BAR1_0x02013096 , ULL(0x02013096) );
+CONST_UINT64_T( NX_GROUP_BAR0_0x02013097 , ULL(0x02013097) );
+CONST_UINT64_T( NX_GROUP_BAR1_0x02013098 , ULL(0x02013098) );
+CONST_UINT64_T( NX_NEAR_BAR_F0_0x02013099 , ULL(0x02013099) );
+CONST_UINT64_T( NX_FAR_BAR_F0_0x0201309A , ULL(0x0201309A) );
+CONST_UINT64_T( NX_NEAR_BAR_F1_0x0201309B , ULL(0x0201309B) );
+CONST_UINT64_T( NX_FAR_BAR_F1_0x0201309C , ULL(0x0201309C) );
+
+//------------------------------------------------------------------------------
+// MCD
+//------------------------------------------------------------------------------
+CONST_UINT64_T( MCD_CN00_0x0201340C , ULL(0x0201340C) );
+CONST_UINT64_T( MCD_CN01_0x0201340D , ULL(0x0201340D) );
+CONST_UINT64_T( MCD_CN10_0x0201340E , ULL(0x0201340E) );
+CONST_UINT64_T( MCD_CN11_0x0201340F , ULL(0x0201340F) );
+
+
+/******************************************************************************/
+/****************************** X-BUS CHIPLET *******************************/
+/******************************************************************************/
+
+//------------------------------------------------------------------------------
+// X-BUS GPIO
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_GP0_0x04000000 , ULL(0x04000000) );
+CONST_UINT64_T( X_GP1_0x04000001 , ULL(0x04000001) );
+CONST_UINT64_T( X_GP2_0x04000002 , ULL(0x04000002) );
+
+//------------------------------------------------------------------------------
+// X-BUS SCOM
+// ring 1 = Trace 0
+// ring 2 = Trace 1
+// ring 3 = PBEN
+// ring 4 = IOX0
+// ring 5 = IOX1
+// ring 6 = IOX3
+// ring 7 = IOX2
+// ring 9 = IOPSI
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_SCOM_0x04010000 , ULL(0x04010000) );
+
+//------------------------------------------------------------------------------
+// X-BUS TRACE
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_TRACE_DATA_HI_T0_0x04010440 , ULL(0x04010440) );
+CONST_UINT64_T( X_TRACE_DATA_LO_T0_0x04010441 , ULL(0x04010441) );
+CONST_UINT64_T( X_TRACE_DATA_HI_T1_0x04010880 , ULL(0x04010880) );
+CONST_UINT64_T( X_TRACE_DATA_LO_T1_0x04010881 , ULL(0x04010881) );
+
+//------------------------------------------------------------------------------
+// X-BUS CLOCK CONTROL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_OPCG_CNTL0_0x04030002 , ULL(0x04030002) );
+CONST_UINT64_T( X_OPCG_CNTL1_0x04030003 , ULL(0x04030003) );
+CONST_UINT64_T( X_OPCG_CNTL2_0x04030004 , ULL(0x04030004) );
+CONST_UINT64_T( X_OPCG_CNTL3_0x04030005 , ULL(0x04030005) );
+CONST_UINT64_T( X_CLK_REGION_0x04030006 , ULL(0x04030006) );
+CONST_UINT64_T( X_CLK_SCANSEL_0x04030007 , ULL(0x04030007) );
+CONST_UINT64_T( X_CLK_STATUS_0x04030008 , ULL(0x04030008) );
+
+//------------------------------------------------------------------------------
+// X-BUS FIR
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_XSTOP_0x04040000 , ULL(0x04040000) );
+CONST_UINT64_T( X_RECOV_0x04040001 , ULL(0x04040001) );
+CONST_UINT64_T( X_FIR_MASK_0x04040002 , ULL(0x04040002) );
+CONST_UINT64_T( X_SPATTN_0x04040004 , ULL(0x04040004) );
+CONST_UINT64_T( X_SPATTN_AND_0x04040005 , ULL(0x04040005) );
+CONST_UINT64_T( X_SPATTN_OR_0x04040006 , ULL(0x04040006) );
+CONST_UINT64_T( X_SPATTN_MASK_0x04040007 , ULL(0x04040007) );
+CONST_UINT64_T( X_FIR_MODE_0x04040008 , ULL(0x04040008) );
+CONST_UINT64_T( X_PERV_LFIR_0x0404000A , ULL(0x0404000A) );
+CONST_UINT64_T( X_PERV_LFIR_AND_0x0404000B , ULL(0x0404000B) );
+CONST_UINT64_T( X_PERV_LFIR_OR_0x0404000C , ULL(0x0404000C) );
+CONST_UINT64_T( X_PERV_LFIR_MASK_0x0404000D , ULL(0x0404000D) );
+CONST_UINT64_T( X_PERV_LFIR_MASK_AND_0x0404000E , ULL(0x0404000E) );
+CONST_UINT64_T( X_PERV_LFIR_MASK_OR_0x0404000F , ULL(0x0404000F) );
+CONST_UINT64_T( X_PERV_LFIR_ACT0_0x04040010 , ULL(0x04040010) );
+CONST_UINT64_T( X_PERV_LFIR_ACT1_0x04040011 , ULL(0x04040011) );
+
+//------------------------------------------------------------------------------
+// X-BUS THERMAL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_THERM_0x04050000 , ULL(0x04050000) );
+
+//------------------------------------------------------------------------------
+// X-BUS PCB SLAVE
+//------------------------------------------------------------------------------
+//Multicast Group Registers
+CONST_UINT64_T( X_MCGR1_0x040F0001 , ULL(0x040F0001) );
+CONST_UINT64_T( X_MCGR2_0x040F0002 , ULL(0x040F0002) );
+CONST_UINT64_T( X_MCGR3_0x040F0003 , ULL(0x040F0003) );
+CONST_UINT64_T( X_MCGR4_0x040F0004 , ULL(0x040F0004) );
+//GP0 Register
+CONST_UINT64_T( X_GP0_AND_0x04000004 , ULL(0x04000004) );
+CONST_UINT64_T( X_GP0_OR_0x04000005 , ULL(0x04000005) );
+//GP3 Register
+CONST_UINT64_T( X_GP3_0x040F0012 , ULL(0x040F0012) );
+CONST_UINT64_T( X_GP3_AND_0x040F0013 , ULL(0x040F0013) );
+CONST_UINT64_T( X_GP3_OR_0x040F0014 , ULL(0x040F0014) );
+
+//------------------------------------------------------------------------------
+// X-BUS HANG DETECTION
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_HANG_P0_XBUS_0x040F0020 , ULL(0x040F0020) ); // XBUS : setup hang pulse register0
+CONST_UINT64_T( X_HANG_PRE_XBUS_0x040F0028 , ULL(0x040F0028) ); // XBUS : setup hang precounter (HEX:01)
+
+//------------------------------------------------------------------------------
+// X-BUS PBEN
+//------------------------------------------------------------------------------
+CONST_UINT64_T( X_PB_MODE_0x04010C0A , ULL(0x04010C0A) );
+
+
+/******************************************************************************/
+/****************************** A-BUS CHIPLET *******************************/
+/******************************************************************************/
+//------------------------------------------------------------------------------
+// A-BUS GPIO
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_GP0_0x08000000 , ULL(0x08000000) );
+CONST_UINT64_T( A_GP1_0x08000001 , ULL(0x08000001) );
+CONST_UINT64_T( A_GP2_0x08000002 , ULL(0x08000002) );
+
+//------------------------------------------------------------------------------
+// A-BUS SCOM
+// ring 1 = trace
+// ring 2 = PBES
+// ring 3 = IOA
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_SCOM_0x08010000 , ULL(0x08010000) );
+
+//------------------------------------------------------------------------------
+// A-BUS TRACE
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_TRACE_DATA_HI_0x08010440 , ULL(0x08010440) );
+CONST_UINT64_T( A_TRACE_DATA_LO_0x08010441 , ULL(0x08010441) );
+
+//------------------------------------------------------------------------------
+// A-BUS CLOCK CONTROL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_OPCG_CNTL0_0x08030002 , ULL(0x08030002) );
+CONST_UINT64_T( A_OPCG_CNTL1_0x08030003 , ULL(0x08030003) );
+CONST_UINT64_T( A_OPCG_CNTL2_0x08030004 , ULL(0x08030004) );
+CONST_UINT64_T( A_OPCG_CNTL3_0x08030005 , ULL(0x08030005) );
+CONST_UINT64_T( A_CLK_REGION_0x08030006 , ULL(0x08030006) );
+CONST_UINT64_T( A_CLK_SCANSEL_0x08030007 , ULL(0x08030007) );
+CONST_UINT64_T( A_CLK_STATUS_0x08030008 , ULL(0x08030008) );
+
+//------------------------------------------------------------------------------
+// A-BUS FIR
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_XSTOP_0x08040000 , ULL(0x08040000) );
+CONST_UINT64_T( A_RECOV_0x08040001 , ULL(0x08040001) );
+CONST_UINT64_T( A_FIR_MASK_0x08040002 , ULL(0x08040002) );
+CONST_UINT64_T( A_SPATTN_0x08040004 , ULL(0x08040004) );
+CONST_UINT64_T( A_SPATTN_AND_0x08040005 , ULL(0x08040005) );
+CONST_UINT64_T( A_SPATTN_OR_0x08040006 , ULL(0x08040006) );
+CONST_UINT64_T( A_SPATTN_MASK_0x08040007 , ULL(0x08040007) );
+CONST_UINT64_T( A_FIR_MODE_0x08040008 , ULL(0x08040008) );
+CONST_UINT64_T( A_PERV_LFIR_0x0804000A , ULL(0x0804000A) );
+CONST_UINT64_T( A_PERV_LFIR_AND_0x0804000B , ULL(0x0804000B) );
+CONST_UINT64_T( A_PERV_LFIR_OR_0x0804000C , ULL(0x0804000C) );
+CONST_UINT64_T( A_PERV_LFIR_MASK_0x0804000D , ULL(0x0804000D) );
+CONST_UINT64_T( A_PERV_LFIR_MASK_AND_0x0804000E , ULL(0x0804000E) );
+CONST_UINT64_T( A_PERV_LFIR_MASK_OR_0x0804000F , ULL(0x0804000F) );
+CONST_UINT64_T( A_PERV_LFIR_ACT0_0x08040010 , ULL(0x08040010) );
+CONST_UINT64_T( A_PERV_LFIR_ACT1_0x08040011 , ULL(0x08040011) );
+
+//------------------------------------------------------------------------------
+// A-BUS THERMAL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_THERM_0x08050000 , ULL(0x08050000) );
+
+//------------------------------------------------------------------------------
+// A-BUS PCB SLAVE
+//------------------------------------------------------------------------------
+//Multicast Group Registers
+CONST_UINT64_T( A_MCGR1_0x080F0001 , ULL(0x080F0001) );
+CONST_UINT64_T( A_MCGR2_0x080F0002 , ULL(0x080F0002) );
+CONST_UINT64_T( A_MCGR3_0x080F0003 , ULL(0x080F0003) );
+CONST_UINT64_T( A_MCGR4_0x080F0004 , ULL(0x080F0004) );
+//GP0 Register
+CONST_UINT64_T( A_GP0_AND_0x08000004 , ULL(0x08000004) );
+CONST_UINT64_T( A_GP0_OR_0x08000005 , ULL(0x08000005) );
+//GP3 Register
+CONST_UINT64_T( A_GP3_0x080F0012 , ULL(0x080F0012) );
+CONST_UINT64_T( A_GP3_AND_0x080F0013 , ULL(0x080F0013) );
+CONST_UINT64_T( A_GP3_OR_0x080F0014 , ULL(0x080F0014) );
+
+//------------------------------------------------------------------------------
+// A-BUS HANG DETECTION
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_HANG_P0_0x080F0020 , ULL(0x080F0020) ); // ABUS : setup hang pulse register0
+CONST_UINT64_T( A_HANG_PRE_0x080F0028 , ULL(0x080F0028) ); // ABUS : setup hang precounter (HEX:01)
+
+//------------------------------------------------------------------------------
+// A-BUS PBES
+//------------------------------------------------------------------------------
+CONST_UINT64_T( A_PB_MODE_0x0801080A , ULL(0x0801080A) );
+
+
+/******************************************************************************/
+/***************************** PCIE-BUS CHIPLET *****************************/
+/******************************************************************************/
+//------------------------------------------------------------------------------
+// PCIE-BUS GPIO
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE_GP0_0x09000000 , ULL(0x09000000) );
+CONST_UINT64_T( PCIE_GP1_0x09000001 , ULL(0x09000001) );
+CONST_UINT64_T( PCIE_GP2_0x09000002 , ULL(0x09000002) );
+
+CONST_UINT64_T( PCIE_GP0_AND_0x09000004 , ULL(0x09000004) );
+CONST_UINT64_T( PCIE_GP0_OR_0x09000005 , ULL(0x09000005) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS SCOM
+// ring 1 = trace
+// ring 2 = PBF
+// ring 5 = IOPCI0
+// ring 6 = IOPCI1
+// ring 7 = IOPCI2
+// ring 8 = PCI0
+// ring 9 = PCI1
+// ring 10 = PCI2
+// ring 11 = PCI3
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE_SCOM_0x09010000 , ULL(0x09010000) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS TRACE
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE_TRACE_DATA_HI_0x09010400 , ULL(0x09010400) );
+CONST_UINT64_T( PCIE_TRACE_DATA_LO_0x09010401 , ULL(0x09010401) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS BARS
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE0_ASB_BAR_0x0901200B , ULL(0x0901200B) );
+CONST_UINT64_T( PCIE1_ASB_BAR_0x0901240B , ULL(0x0901240B) );
+CONST_UINT64_T( PCIE2_ASB_BAR_0x0901280B , ULL(0x0901280B) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS CLOCK CONTROL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE_OPCG_CNTL0_0x09030002 , ULL(0x09030002) );
+CONST_UINT64_T( PCIE_OPCG_CNTL1_0x09030003 , ULL(0x09030003) );
+CONST_UINT64_T( PCIE_OPCG_CNTL2_0x09030004 , ULL(0x09030004) );
+CONST_UINT64_T( PCIE_OPCG_CNTL3_0x09030005 , ULL(0x09030005) );
+CONST_UINT64_T( PCIE_CLK_REGION_0x09030006 , ULL(0x09030006) );
+CONST_UINT64_T( PCIE_CLK_SCANSEL_0x09030007 , ULL(0x09030007) );
+CONST_UINT64_T( PCIE_CLK_STATUS_0x09030008 , ULL(0x09030008) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS FIR
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE_XSTOP_0x09040000 , ULL(0x09040000) );
+CONST_UINT64_T( PCIE_RECOV_0x09040001 , ULL(0x09040001) );
+CONST_UINT64_T( PCIE_FIR_MASK_0x09040002 , ULL(0x09040002) );
+CONST_UINT64_T( PCIE_SPATTN_0x09040004 , ULL(0x09040004) );
+CONST_UINT64_T( PCIE_SPATTN_AND_0x09040005 , ULL(0x09040005) );
+CONST_UINT64_T( PCIE_SPATTN_OR_0x09040006 , ULL(0x09040006) );
+CONST_UINT64_T( PCIE_SPATTN_MASK_0x09040007 , ULL(0x09040007) );
+CONST_UINT64_T( PCIE_FIR_MODE_0x09040008 , ULL(0x09040008) );
+CONST_UINT64_T( PCIE_PERV_LFIR_0x0904000A , ULL(0x0904000A) );
+CONST_UINT64_T( PCIE_PERV_LFIR_AND_0x0904000B , ULL(0x0904000B) );
+CONST_UINT64_T( PCIE_PERV_LFIR_OR_0x0904000C , ULL(0x0904000C) );
+CONST_UINT64_T( PCIE_PERV_LFIR_MASK_0x0904000D , ULL(0x0904000D) );
+CONST_UINT64_T( PCIE_PERV_LFIR_MASK_AND_0x0904000E , ULL(0x0904000E) );
+CONST_UINT64_T( PCIE_PERV_LFIR_MASK_OR_0x0904000F , ULL(0x0904000F) );
+CONST_UINT64_T( PCIE_PERV_LFIR_ACT0_0x09040010 , ULL(0x09040010) );
+CONST_UINT64_T( PCIE_PERV_LFIR_ACT1_0x09040011 , ULL(0x09040011) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS THERMAL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE_THERM_0x09050000 , ULL(0x09050000) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS PCB SLAVE
+//------------------------------------------------------------------------------
+//Multicast Group Registers
+CONST_UINT64_T( PCIE_MCGR1_0x090F0001 , ULL(0x090F0001) );
+CONST_UINT64_T( PCIE_MCGR2_0x090F0002 , ULL(0x090F0002) );
+CONST_UINT64_T( PCIE_MCGR3_0x090F0003 , ULL(0x090F0003) );
+CONST_UINT64_T( PCIE_MCGR4_0x090F0004 , ULL(0x090F0004) );
+//GP3 Register
+CONST_UINT64_T( PCIE_GP3_0x090F0012 , ULL(0x090F0012) );
+CONST_UINT64_T( PCIE_GP3_AND_0x090F0013 , ULL(0x090F0013) );
+CONST_UINT64_T( PCIE_GP3_OR_0x090F0014 , ULL(0x090F0014) );
+
+//------------------------------------------------------------------------------
+// PCIE-BUS HANG DETECTION
+//------------------------------------------------------------------------------
+CONST_UINT64_T( PCIE_HANG_PRE_0x090F0028 , ULL(0x090F0028) ); // PCIE : setup hang precounter (HEX:01)
+
+
+/******************************************************************************/
+/******************************** EX CHIPLET ********************************/
+/******************************************************************************/
+// Note: ECMD will require the use of these addresses, and it will update them
+// under the covers to point to the actual EX chiplet in question.
+//
+// Example: getscom pu.ex 10000001 -c3 ---> scom address 0x13000001
+
+//------------------------------------------------------------------------------
+// EX CHIPLET ID
+// use for lpcs P0, <chipletID>
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX00_CHIPLET_0x10000000 , ULL(0x10000000) );
+CONST_UINT64_T( EX01_CHIPLET_0x11000000 , ULL(0x11000000) );
+CONST_UINT64_T( EX02_CHIPLET_0x12000000 , ULL(0x12000000) );
+CONST_UINT64_T( EX03_CHIPLET_0x13000000 , ULL(0x13000000) );
+CONST_UINT64_T( EX04_CHIPLET_0x14000000 , ULL(0x14000000) );
+CONST_UINT64_T( EX05_CHIPLET_0x15000000 , ULL(0x15000000) );
+CONST_UINT64_T( EX06_CHIPLET_0x16000000 , ULL(0x16000000) );
+CONST_UINT64_T( EX07_CHIPLET_0x17000000 , ULL(0x17000000) );
+CONST_UINT64_T( EX08_CHIPLET_0x18000000 , ULL(0x18000000) );
+CONST_UINT64_T( EX09_CHIPLET_0x19000000 , ULL(0x19000000) );
+CONST_UINT64_T( EX10_CHIPLET_0x1A000000 , ULL(0x1A000000) );
+CONST_UINT64_T( EX11_CHIPLET_0x1B000000 , ULL(0x1B000000) );
+CONST_UINT64_T( EX12_CHIPLET_0x1C000000 , ULL(0x1C000000) );
+CONST_UINT64_T( EX13_CHIPLET_0x1D000000 , ULL(0x1D000000) );
+CONST_UINT64_T( EX14_CHIPLET_0x1E000000 , ULL(0x1E000000) );
+CONST_UINT64_T( EX15_CHIPLET_0x1F000000 , ULL(0x1F000000) );
+
+//------------------------------------------------------------------------------
+// EX GPIO
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX_GP0_0x10000000 , ULL(0x10000000) );
+CONST_UINT64_T( EX_GP0_AND_0x10000004 , ULL(0x10000004) );
+CONST_UINT64_T( EX_GP0_OR_0x10000005 , ULL(0x10000005) );
+CONST_UINT64_T( EX_GP1_0x10000001 , ULL(0x10000001) );
+CONST_UINT64_T( EX_GP2_0x10000002 , ULL(0x10000002) );
+
+//------------------------------------------------------------------------------
+// EX SCOM
+// ring 1 = ECO trace
+// ring 2 = L3
+// ring 3 = NC
+// ring 4 = HTM
+// ring 8 = L2 trace 0
+// ring 9 = L2 trace 1
+// ring 10 = L2
+// ring 11 = PC trace
+// ring 12 = PC
+// ring 15 = PC sec
+//------------------------------------------------------------------------------
+//L3
+CONST_UINT64_T( EX_L3_MODE_REG1_0x1001080A , ULL(0x1001080A) );
+CONST_UINT64_T( EX_L3_MODE_REG0_0x1001082B , ULL(0x1001082B) );
+//L2
+CONST_UINT64_T( EX_L2_FIR_REG_0x10012800 , ULL(0x10012800) );
+CONST_UINT64_T( EX_L2_CERRS_REG0_0x10012815 , ULL(0x10012815) );
+CONST_UINT64_T( EX_L2_CERRS_REG1_0x10012816 , ULL(0x10012816) );
+CONST_UINT64_T( EX_L2_MODE_REG0_0x1001280A , ULL(0x1001280A) );
+CONST_UINT64_T( EX_L2_PURGE_CMD_PRD_0x1001280E , ULL(0x1001280E) );
+CONST_UINT64_T( EX_L2_PURGE_CMD_PHYP_0x1001280F , ULL(0x1001280F) );
+
+//------------------------------------------------------------------------------
+// EX/CORE TRACE
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX_TRACE_DATA_HI_ECO_0x10010400 , ULL(0x10010400) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_ECO_0x10010401 , ULL(0x10010401) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_L2_T0_0x10012000 , ULL(0x10012000) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_L2_T0_0x10012001 , ULL(0x10012001) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_L2_T1_0x10012400 , ULL(0x10012400) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_L2_T1_0x10012401 , ULL(0x10012401) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_CORE_T0_0x10012C00 , ULL(0x10012C00) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_CORE_T0_0x10012C01 , ULL(0x10012C01) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_CORE_T1_0x10012C40 , ULL(0x10012C40) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_CORE_T1_0x10012C41 , ULL(0x10012C41) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_CORE_T2_0x10012C80 , ULL(0x10012C80) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_CORE_T2_0x10012C81 , ULL(0x10012C81) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_CORE_T3_0x10012CC0 , ULL(0x10012CC0) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_CORE_T3_0x10012CC1 , ULL(0x10012CC1) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_CORE_T4_0x10012D00 , ULL(0x10012D00) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_CORE_T4_0x10012D01 , ULL(0x10012D01) );
+CONST_UINT64_T( EX_TRACE_DATA_HI_CORE_T5_0x10012D40 , ULL(0x10012D40) );
+CONST_UINT64_T( EX_TRACE_DATA_LO_CORE_T5_0x10012D41 , ULL(0x10012D41) );
+
+
+//------------------------------------------------------------------------------
+// EX/CORE PERVASIVE THREAD CONTROLS
+// (chiplet/core set by P0 register)
+//------------------------------------------------------------------------------
+// TCTL Direct Controls (for each thread)
+CONST_UINT64_T( EX_PERV_TCTL0_DIRECT_0x10013000 , ULL(0x10013000) );
+CONST_UINT64_T( EX_PERV_TCTL1_DIRECT_0x10013010 , ULL(0x10013010) );
+CONST_UINT64_T( EX_PERV_TCTL2_DIRECT_0x10013020 , ULL(0x10013020) );
+CONST_UINT64_T( EX_PERV_TCTL3_DIRECT_0x10013030 , ULL(0x10013030) );
+CONST_UINT64_T( EX_PERV_TCTL4_DIRECT_0x10013040 , ULL(0x10013040) );
+CONST_UINT64_T( EX_PERV_TCTL5_DIRECT_0x10013050 , ULL(0x10013050) );
+CONST_UINT64_T( EX_PERV_TCTL6_DIRECT_0x10013060 , ULL(0x10013060) );
+CONST_UINT64_T( EX_PERV_TCTL7_DIRECT_0x10013070 , ULL(0x10013070) );
+
+// TCTL RAS Mode (for each thread)
+CONST_UINT64_T( EX_PERV_TCTL0_R_MODE_0x10013001 , ULL(0x10013001) );
+CONST_UINT64_T( EX_PERV_TCTL1_R_MODE_0x10013011 , ULL(0x10013011) );
+CONST_UINT64_T( EX_PERV_TCTL2_R_MODE_0x10013021 , ULL(0x10013021) );
+CONST_UINT64_T( EX_PERV_TCTL3_R_MODE_0x10013031 , ULL(0x10013031) );
+CONST_UINT64_T( EX_PERV_TCTL4_R_MODE_0x10013041 , ULL(0x10013041) );
+CONST_UINT64_T( EX_PERV_TCTL5_R_MODE_0x10013051 , ULL(0x10013051) );
+CONST_UINT64_T( EX_PERV_TCTL6_R_MODE_0x10013061 , ULL(0x10013061) );
+CONST_UINT64_T( EX_PERV_TCTL7_R_MODE_0x10013071 , ULL(0x10013071) );
+
+// TCTL RAS Status (for each thread)
+CONST_UINT64_T( EX_PERV_TCTL0_R_STAT_0x10013002 , ULL(0x10013002) );
+CONST_UINT64_T( EX_PERV_TCTL1_R_STAT_0x10013012 , ULL(0x10013012) );
+CONST_UINT64_T( EX_PERV_TCTL2_R_STAT_0x10013022 , ULL(0x10013022) );
+CONST_UINT64_T( EX_PERV_TCTL3_R_STAT_0x10013032 , ULL(0x10013032) );
+CONST_UINT64_T( EX_PERV_TCTL4_R_STAT_0x10013042 , ULL(0x10013042) );
+CONST_UINT64_T( EX_PERV_TCTL5_R_STAT_0x10013052 , ULL(0x10013052) );
+CONST_UINT64_T( EX_PERV_TCTL6_R_STAT_0x10013062 , ULL(0x10013062) );
+CONST_UINT64_T( EX_PERV_TCTL7_R_STAT_0x10013072 , ULL(0x10013072) );
+
+// Thread Active Status
+CONST_UINT64_T( EX_PERV_THREAD_ACTIVE_0x1001310E , ULL(0x1001310E) );
+
+// RAM Registers
+CONST_UINT64_T( EX_PERV_RAM_MODE_0x10013C00 , ULL(0x10013C00) );
+CONST_UINT64_T( EX_PERV_RAM_CTRL_0x10013C01 , ULL(0x10013C01) );
+CONST_UINT64_T( EX_PERV_RAM_STAT_0x10013C02 , ULL(0x10013C02) );
+
+// SPRC/SPRD/Scratch
+CONST_UINT64_T( EX_PERV_L0_SCOM_SPRC_10013280 , ULL(0x10013280) );
+CONST_UINT64_T( EX_PERV_SPR_MODE_10013281 , ULL(0x10013281) );
+CONST_UINT64_T( EX_PERV_SCRATCH0_10013283 , ULL(0x10013283) );
+CONST_UINT64_T( EX_PERV_SCRATCH1_10013284 , ULL(0x10013284) );
+CONST_UINT64_T( EX_PERV_SCRATCH2_10013285 , ULL(0x10013285) );
+CONST_UINT64_T( EX_PERV_SCRATCH3_10013286 , ULL(0x10013286) );
+CONST_UINT64_T( EX_PERV_SCRATCH4_10013287 , ULL(0x10013287) );
+CONST_UINT64_T( EX_PERV_SCRATCH5_10013288 , ULL(0x10013288) );
+CONST_UINT64_T( EX_PERV_SCRATCH6_10013289 , ULL(0x10013289) );
+CONST_UINT64_T( EX_PERV_SCRATCH7_1001328A , ULL(0x1001328A) );
+
+//------------------------------------------------------------------------------
+// EX OHA
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX_SCOM_0x10020000 , ULL(0x10020000) );
+CONST_UINT64_T( EX_OHA_ACTIVITY_SAMPLE_MODE_REG_RWx10020000 , ULL(0x10020000) );
+CONST_UINT64_T( EX_OHA_LOW_ACTIVITY_DETECT_MODE_REG_RWx10020003 , ULL(0x10020003) );
+CONST_UINT64_T( EX_OHA_PROXY_REG_0x10020006 , ULL(0x10020006) );
+CONST_UINT64_T( EX_OHA_PROXY_LEGACY_REG_0x10020007 , ULL(0x10020007) );
+CONST_UINT64_T( EX_OHA_SKITTER_CTRL_MODE_REG_0x10020008 , ULL(0x10020008) );
+CONST_UINT64_T( EX_OHA_CPM_CTRL_REG_0x1002000A , ULL(0x1002000A) );
+CONST_UINT64_T( EX_OHA_RO_STATUS_REG_0x1002000B , ULL(0x1002000B) );
+CONST_UINT64_T( EX_OHA_MODE_REG_RWx1002000D , ULL(0x1002000D) );
+CONST_UINT64_T( EX_OHA_ERROR_ERROR_MASK_REG_RWx1002000E , ULL(0x1002000E) );
+CONST_UINT64_T( EX_OHA_ARCH_IDLE_STATE_REG_RWx10020011 , ULL(0x10020011) );
+CONST_UINT64_T( EX_OHA_AISS_IO_REG_0x10020014 , ULL(0x10020014) );
+
+//------------------------------------------------------------------------------
+// EX CLOCK CONTROL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX_OPCG_CNTL0_0x10030002 , ULL(0x10030002) );
+CONST_UINT64_T( EX_OPCG_CNTL1_0x10030003 , ULL(0x10030003) );
+CONST_UINT64_T( EX_OPCG_CNTL2_0x10030004 , ULL(0x10030004) );
+CONST_UINT64_T( EX_OPCG_CNTL3_0x10030005 , ULL(0x10030005) );
+CONST_UINT64_T( EX_CLK_REGION_0x10030006 , ULL(0x10030006) );
+CONST_UINT64_T( EX_CLK_SCANSEL_0x10030007 , ULL(0x10030007) );
+CONST_UINT64_T( EX_CLK_STATUS_0x10030008 , ULL(0x10030008) );
+
+//------------------------------------------------------------------------------
+// EX FIR
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX_XSTOP_0x10040000 , ULL(0x10040000) );
+CONST_UINT64_T( EX_RECOV_0x10040001 , ULL(0x10040001) );
+CONST_UINT64_T( EX_FIR_MASK_0x10040002 , ULL(0x10040002) );
+CONST_UINT64_T( EX_SPATTN_0x10040004 , ULL(0x10040004) );
+CONST_UINT64_T( EX_SPATTN_AND_0x10040005 , ULL(0x10040005) );
+CONST_UINT64_T( EX_SPATTN_OR_0x10040006 , ULL(0x10040006) );
+CONST_UINT64_T( EX_SPATTN_MASK_0x10040007 , ULL(0x10040007) );
+CONST_UINT64_T( EX_FIR_MODE_0x10040008 , ULL(0x10040008) );
+CONST_UINT64_T( EX_PERV_LFIR_0x1004000A , ULL(0x1004000A) );
+CONST_UINT64_T( EX_PERV_LFIR_AND_0x1004000B , ULL(0x1004000B) );
+CONST_UINT64_T( EX_PERV_LFIR_OR_0x1004000C , ULL(0x1004000C) );
+CONST_UINT64_T( EX_PERV_LFIR_MASK_0x1004000D , ULL(0x1004000D) );
+CONST_UINT64_T( EX_PERV_LFIR_MASK_AND_0x1004000E , ULL(0x1004000E) );
+CONST_UINT64_T( EX_PERV_LFIR_MASK_OR_0x1004000F , ULL(0x1004000F) );
+CONST_UINT64_T( EX_PERV_LFIR_ACT0_0x10040010 , ULL(0x10040010) );
+CONST_UINT64_T( EX_PERV_LFIR_ACT1_0x10040011 , ULL(0x10040011) );
+
+//------------------------------------------------------------------------------
+// EX THERMAL
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX_THERM_0x10050000 , ULL(0x10050000) );
+
+//------------------------------------------------------------------------------
+// EX PCB SLAVE
+//------------------------------------------------------------------------------
+//Generic names (need to add in (cuTarget.chipUnitNum * 0x01000000)) when being used
+// special wakeup registers
+CONST_UINT64_T( PM_SPECIAL_WKUP_FSP_0x100F010B , ULL(0x100F010B) );
+CONST_UINT64_T( PM_SPECIAL_WKUP_OCC_0x100F010C , ULL(0x100F010C) );
+CONST_UINT64_T( PM_SPECIAL_WKUP_PHYP_0x100F010D , ULL(0x100F010D) );
+
+//Multicast Group Registers
+CONST_UINT64_T( EX_MCGR1_0x100F0001 , ULL(0x100F0001) );
+CONST_UINT64_T( EX_MCGR2_0x100F0002 , ULL(0x100F0002) );
+CONST_UINT64_T( EX_MCGR3_0x100F0003 , ULL(0x100F0003) );
+CONST_UINT64_T( EX_MCGR4_0x100F0004 , ULL(0x100F0004) );
+
+//GP3 Register
+CONST_UINT64_T( EX_GP3_0x100F0012 , ULL(0x100F0012) );
+CONST_UINT64_T( EX_GP3_AND_0x100F0013 , ULL(0x100F0013) );
+CONST_UINT64_T( EX_GP3_OR_0x100F0014 , ULL(0x100F0014) );
+
+//Chiplet specific names (probably won't ever be used)
+CONST_UINT64_T( EX00_GP3_0x100F0012 , ULL(0x100F0012) );
+CONST_UINT64_T( EX00_GP3_AND_0x100F0013 , ULL(0x100F0013) );
+CONST_UINT64_T( EX00_GP3_OR_0x100F0014 , ULL(0x100F0014) );
+
+CONST_UINT64_T( EX01_GP3_0x110F0012 , ULL(0x110F0012) );
+CONST_UINT64_T( EX01_GP3_AND_0x110F0013 , ULL(0x110F0013) );
+CONST_UINT64_T( EX01_GP3_OR_0x110F0014 , ULL(0x110F0014) );
+
+CONST_UINT64_T( EX02_GP3_0x120F0012 , ULL(0x120F0012) );
+CONST_UINT64_T( EX02_GP3_AND_0x120F0013 , ULL(0x120F0013) );
+CONST_UINT64_T( EX02_GP3_OR_0x120F0014 , ULL(0x120F0014) );
+
+CONST_UINT64_T( EX03_GP3_0x130F0012 , ULL(0x130F0012) );
+CONST_UINT64_T( EX03_GP3_AND_0x130F0013 , ULL(0x130F0013) );
+CONST_UINT64_T( EX03_GP3_OR_0x130F0014 , ULL(0x130F0014) );
+
+CONST_UINT64_T( EX04_GP3_0x140F0012 , ULL(0x140F0012) );
+CONST_UINT64_T( EX04_GP3_AND_0x140F0013 , ULL(0x140F0013) );
+CONST_UINT64_T( EX04_GP3_OR_0x140F0014 , ULL(0x140F0014) );
+
+CONST_UINT64_T( EX05_GP3_0x150F0012 , ULL(0x150F0012) );
+CONST_UINT64_T( EX05_GP3_AND_0x150F0013 , ULL(0x150F0013) );
+CONST_UINT64_T( EX05_GP3_OR_0x150F0014 , ULL(0x150F0014) );
+
+CONST_UINT64_T( EX06_GP3_0x160F0012 , ULL(0x160F0012) );
+CONST_UINT64_T( EX06_GP3_AND_0x160F0013 , ULL(0x160F0013) );
+CONST_UINT64_T( EX06_GP3_OR_0x160F0014 , ULL(0x160F0014) );
+
+CONST_UINT64_T( EX07_GP3_0x170F0012 , ULL(0x170F0012) );
+CONST_UINT64_T( EX07_GP3_AND_0x170F0013 , ULL(0x170F0013) );
+CONST_UINT64_T( EX07_GP3_OR_0x170F0014 , ULL(0x170F0014) );
+
+CONST_UINT64_T( EX08_GP3_0x180F0012 , ULL(0x180F0012) );
+CONST_UINT64_T( EX08_GP3_AND_0x180F0013 , ULL(0x180F0013) );
+CONST_UINT64_T( EX08_GP3_OR_0x180F0014 , ULL(0x180F0014) );
+
+CONST_UINT64_T( EX09_GP3_0x190F0012 , ULL(0x190F0012) );
+CONST_UINT64_T( EX09_GP3_AND_0x190F0013 , ULL(0x190F0013) );
+CONST_UINT64_T( EX09_GP3_OR_0x190F0014 , ULL(0x190F0014) );
+
+CONST_UINT64_T( EX10_GP3_0x1A0F0012 , ULL(0x1A0F0012) );
+CONST_UINT64_T( EX10_GP3_AND_0x1A0F0013 , ULL(0x1A0F0013) );
+CONST_UINT64_T( EX10_GP3_OR_0x1A0F0014 , ULL(0x1A0F0014) );
+
+CONST_UINT64_T( EX11_GP3_0x1B0F0012 , ULL(0x1B0F0012) );
+CONST_UINT64_T( EX11_GP3_AND_0x1B0F0013 , ULL(0x1B0F0013) );
+CONST_UINT64_T( EX11_GP3_OR_0x1B0F0014 , ULL(0x1B0F0014) );
+
+CONST_UINT64_T( EX12_GP3_0x1C0F0012 , ULL(0x1C0F0012) );
+CONST_UINT64_T( EX12_GP3_AND_0x1C0F0013 , ULL(0x1C0F0013) );
+CONST_UINT64_T( EX12_GP3_OR_0x1C0F0014 , ULL(0x1C0F0014) );
+
+CONST_UINT64_T( EX13_GP3_0x1D0F0012 , ULL(0x1D0F0012) );
+CONST_UINT64_T( EX13_GP3_AND_0x1D0F0013 , ULL(0x1D0F0013) );
+CONST_UINT64_T( EX13_GP3_OR_0x1D0F0014 , ULL(0x1D0F0014) );
+
+CONST_UINT64_T( EX14_GP3_0x1E0F0012 , ULL(0x1E0F0012) );
+CONST_UINT64_T( EX14_GP3_AND_0x1E0F0013 , ULL(0x1E0F0013) );
+CONST_UINT64_T( EX14_GP3_OR_0x1E0F0014 , ULL(0x1E0F0014) );
+
+CONST_UINT64_T( EX15_GP3_0x1F0F0012 , ULL(0x1F0F0012) );
+CONST_UINT64_T( EX15_GP3_AND_0x1F0F0013 , ULL(0x1F0F0013) );
+CONST_UINT64_T( EX15_GP3_OR_0x1F0F0014 , ULL(0x1F0F0014) );
+
+//------------------------------------------------------------------------------
+// EX PCB SLAVE PM
+//------------------------------------------------------------------------------
+//Generic names (need to add in (cuTarget.chipUnitNum * 0x01000000)) when being used
+//PMGP0 Register
+CONST_UINT64_T( EX_PMGP0_0x100F0100 , ULL(0x100F0100) );
+CONST_UINT64_T( EX_PMGP0_AND_0x100F0101 , ULL(0x100F0101) );
+CONST_UINT64_T( EX_PMGP0_OR_0x100F0102 , ULL(0x100F0102) );
+//PMGP1 Register
+CONST_UINT64_T( EX_PMGP1_0x100F0103 , ULL(0x100F0103) );
+CONST_UINT64_T( EX_PMGP1_AND_0x100F0104 , ULL(0x100F0104) );
+CONST_UINT64_T( EX_PMGP1_OR_0x100F0105 , ULL(0x100F0105) );
+
+CONST_UINT64_T( EX_PFET_CTL_REG_0x100F0106 , ULL(0x100F0106) );
+CONST_UINT64_T( EX_PFET_STAT_REG_0x100F0107 , ULL(0x100F0107) );
+CONST_UINT64_T( EX_PFET_CTL_REG_0x100F010E , ULL(0x100F010E) );
+
+
+CONST_UINT64_T( EX_IDLEGOTO_0x100F0114 , ULL(0x100F0114) );
+CONST_UINT64_T( EX_FREQCNTL_0x100F0151 , ULL(0x100F0151) );
+CONST_UINT64_T( EX_PMGP1_REG_0_RWXx100F0103 , ULL(0x100F0103) );
+CONST_UINT64_T( EX_PMGP1_REG_0_WANDx100F0104 , ULL(0x100F0104) );
+CONST_UINT64_T( EX_PMGP1_REG_0_WORx100F0105 , ULL(0x100F0105) );
+CONST_UINT64_T( EX_PFVddCntlStat_REG_0x100F0106 , ULL(0x100F0106) );
+CONST_UINT64_T( EX_PFVcsCntlStat_REG_0x100F010E , ULL(0x100F010E) );
+CONST_UINT64_T( EX_PMErrMask_REG_0x100F010A , ULL(0x100F010A) );
+CONST_UINT64_T( EX_PMSpcWkupFSP_REG_0x100F010B , ULL(0x100F010B) );
+CONST_UINT64_T( EX_PMSpcWkupOCC_REG_0x100F010C , ULL(0x100F010C) );
+CONST_UINT64_T( EX_PMSpcWkupPHYP_REG_0x100F010D , ULL(0x100F010D) );
+CONST_UINT64_T( EX_PMSTATEHISTPHYP_REG_0x100F0110 , ULL(0x100F0110) );
+CONST_UINT64_T( EX_PMSTATEHISTFSP_REG_0x100F0111 , ULL(0x100F0111) );
+CONST_UINT64_T( EX_PMSTATEHISTOCC_REG_0x100F0112 , ULL(0x100F0112) );
+CONST_UINT64_T( EX_PMSTATEHISTPERF_REG_0x100F0113 , ULL(0x100F0113) );
+CONST_UINT64_T( EX_IdleFSMGotoCmd_REG_0x100F0114 , ULL(0x100F0114) );
+CONST_UINT64_T( EX_CorePFPUDly_REG_0x100F012C , ULL(0x100F012C) );
+CONST_UINT64_T( EX_CorePFPDDly_REG_0x100F012D , ULL(0x100F012D) );
+CONST_UINT64_T( EX_CorePFVRET_REG_0x100F0130 , ULL(0x100F0130) );
+CONST_UINT64_T( EX_ECOPFPUDly_REG_0x100F014C , ULL(0x100F014C) );
+CONST_UINT64_T( EX_ECOPFPDDly_REG_0x100F014D , ULL(0x100F014D) );
+CONST_UINT64_T( EX_ECOPFVRET_REG_0x100F0150 , ULL(0x100F0150) );
+CONST_UINT64_T( EX_DPLL_CPM_PARM_REG_0x100F0152 , ULL(0x100F0152) );
+CONST_UINT64_T( EX_PCBS_POWER_MANAGEMENT_STATUS_REG_0x100F0153 , ULL(0x100F0153) ); //ROX
+CONST_UINT64_T( EX_PCBS_iVRM_Control_Status_Reg_0x100F0154 , ULL(0x100F0154) );
+CONST_UINT64_T( EX_PCBS_iVRM_Value_Setting_Reg_0x100F0155 , ULL(0x100F0155) );
+CONST_UINT64_T( EX_PCBSPM_MODE_REG_0x100F0156 , ULL(0x100F0156) );
+CONST_UINT64_T( EX_PCBS_iVRM_PFETSTR_Sense_Reg_0x100F0157 , ULL(0x100F0157) );
+CONST_UINT64_T( EX_PCBS_Power_Management_Idle_Control_Reg_0x100F0158 , ULL(0x100F0158) );
+CONST_UINT64_T( EX_PCBS_Power_Management_Control_Reg_0x100F0159 , ULL(0x100F0159) );
+CONST_UINT64_T( EX_PCBS_PMC_VF_CTRL_REG_0x100F015A , ULL(0x100F015A) );
+CONST_UINT64_T( EX_PCBS_UNDERVOLTING_REG_0x100F015B , ULL(0x100F015B) );
+CONST_UINT64_T( EX_PCBS_Pstate_Index_Bound_Reg_0x100F015C , ULL(0x100F015C) );
+CONST_UINT64_T( EX_PCBS_Power_Management_Bounds_Reg_0x100F015D , ULL(0x100F015D) );
+CONST_UINT64_T( EX_PCBS_PSTATE_TABLE_CTRL_REG_0x100F015E , ULL(0x100F015E) );
+CONST_UINT64_T( EX_PCBS_PSTATE_TABLE_REG_0x100F015F , ULL(0x100F015F) );
+CONST_UINT64_T( EX_PCBS_Pstate_Step_Target_Register_0x100F0160 , ULL(0x100F0160) );
+CONST_UINT64_T( EX_PCBS_iVRM_VID_Control_Reg0_0x100F0162 , ULL(0x100F0162) );
+CONST_UINT64_T( EX_PCBS_iVRM_VID_Control_Reg1_0x100F0163 , ULL(0x100F0163) );
+CONST_UINT64_T( EX_PCBS_OCC_Heartbeat_Reg_0x100F0164 , ULL(0x100F0164) );
+CONST_UINT64_T( EX_PCBS_Resonant_Clock_Control_Reg0_0x100F0165 , ULL(0x100F0165) );
+CONST_UINT64_T( EX_PCBS_Resonant_Clock_Control_Reg1_0x100F0166 , ULL(0x100F0166) );
+CONST_UINT64_T( EX_PCBS_Resonant_Clock_Status_Reg_0x100F0167 , ULL(0x100F0167) );
+CONST_UINT64_T( EX_PCBS_Local_Pstate_Frequency_Target_Control_Register_0x100F0168 , ULL(0x100F0168) );
+CONST_UINT64_T( EX_PCBS_FSM_MONITOR2_REG_0x100F0171 , ULL(0x100F0171) );
+
+//------------------------------------------------------------------------------
+// MULTICAST REGISTER DEFINITION
+//------------------------------------------------------------------------------
+CONST_UINT64_T( EX_WRITE_ALL_EX_PMGP1_REG_0_RWx690F0103 , ULL(0x690F0103) ); // PM GP1 Multicast Group1
+CONST_UINT64_T( EX_WRITE_ALL_EX_PMGP1_REG_0_WANDx690F0104 , ULL(0x690F0104) ); // PM GP1 Multicast Group1
+CONST_UINT64_T( EX_WRITE_ALL_EX_PMGP1_REG_0_WORx690F0105 , ULL(0x690F0105) ); // PM GP1 Multicast Group1
+CONST_UINT64_T( EX_WRITE_ALL_PCBSPM_MODE_REG_0x690F0156 , ULL(0x690F0156) ); // PCBSLV Mode Multicast Group1
+CONST_UINT64_T( EX_WRITE_ALL_PCBS_Power_Management_Bounds_Reg_0x690F015D , ULL(0x690F015D) ); // PCBSLV PM Bounds Multicast Group1
+
+
+
+//******************************************************************************/
+//********* MULTICAST REGISTER DEFINITIONS FOR PERVASIVE INITs ****************/
+//******************************************************************************/
+
+CONST_UINT64_T( WRITE_ALL_HPRE0_0x690F0020 , ULL(0x690F0020) ); // hang pulse register 0
+CONST_UINT64_T( WRITE_ALL_HPRE1_0x690F0021 , ULL(0x690F0021) ); // hang pulse register 1
+CONST_UINT64_T( WRITE_ALL_HPRE2_0x690F0022 , ULL(0x690F0022) ); // hang pulse register 2
+CONST_UINT64_T( WRITE_ALL_HPCRE_0x690F0028 , ULL(0x690F0028) ); // hang pulse count register
+
+CONST_UINT64_T( WRITE_EX_PMGP0_AND_0x690F0101 , ULL(0x690F0101) ); // PM GP0 initialization
+
+// other multicast constants were moved to common_scom_addresses.H 1/24/2010 mfred
+
+#endif
+
+
+/*
+*************** Do not edit this area ***************
+This section is automatically updated by CVS when you check in this file.
+Be sure to create CVS comments when you commit so that they can be included here.
+
+$Log: p8_scom_addresses.H,v $
+Revision 1.77 2012/06/09 19:24:39 jmcgill
+add ADU BAR registers
+
+Revision 1.76 2012/06/05 06:03:04 jmcgill
+add ADU XSCOM BAR register
+
+Revision 1.75 2012/06/01 02:45:26 jmcgill
+updates for MCS registers
+
+Revision 1.74 2012/05/30 12:28:52 kgungl
+issues resolved: scom addresses for pba
+
+Revision 1.73 2012/05/23 16:31:18 karm
+added EX core RAS_MODE
+
+Revision 1.72 2012/05/23 11:04:28 pchatnah
+updating pss spivid spwkup registers
+
+Revision 1.71 2012/05/18 17:59:24 jmcgill
+add addresses for proc_setup_bars
+
+Revision 1.70 2012/05/11 21:15:05 jeshua
+Added EX_PCBS_FSM_MONITOR2_REG
+
+Revision 1.69 2012/05/08 13:31:46 karm
+changes to RAM registers in EX PC unit
+
+Revision 1.68 2012/05/08 11:55:20 stillgs
+Added some additional PCBS-PM addresses
+
+Revision 1.67 2012/05/03 21:36:59 karm
+added core thread_active
+
+Revision 1.66 2012/05/02 21:37:42 jeshua
+Added ECID_PART_0 and ECID_PART_1
+
+Revision 1.65 2012/05/01 14:30:39 stillgs
+Add additional OHA registers
+
+Revision 1.64 2012/04/27 14:48:20 rmaier
+Added RESCLK_status_reg
+
+Revision 1.63 2012/04/26 22:47:18 karm
+added EX_PERV registers for ram and thread ctrl
+
+Revision 1.62 2012/04/16 23:55:37 bcbrock
+Corrected problems related to C/C++ and 32-bit/64-bit portability and Host
+Boot after initial review by FW team.
+
+o Renamed fapi_sbe_common.h to fapi_sbe_common.H
+o Renamed p8_scan_compression.[ch] to .[CH] since these are for use by C++
+ procedures only (no requirement to execute on OCC).
+o Modified sbe_xip_image.c to use the C99 standard way to print uint64_t
+ variables.
+o Added __cplusplus guards to sbe_xip_image.h
+
+Revision 1.61 2012/04/09 22:35:14 jeshua
+Added L2 FIR and CERR registers
+
+Revision 1.60 2012/03/21 08:15:53 rmaier
+Added OHA_ARCH_IDLE_STATE_REG
+
+Revision 1.59 2012/03/14 11:50:03 stillgs
+Added PMC O2S and SPIVID control regs for use by proc_pmc_init.C and proc_sbe_set_pvid.S
+
+Revision 1.58 2012/03/02 21:41:45 jimyac
+added additional OCB Indirect Channel 0-3 Registers
+
+Revision 1.57 2012/03/01 16:09:20 rmaier
+Added PCBS/OHA constants
+
+Revision 1.56 2012/02/29 22:57:24 bcbrock
+Added PIBMEM control registers to p8_scom_addresses.H
+
+Revision 1.55 2012/02/10 23:09:52 jmcgill
+add trace array addresses
+
+Revision 1.54 2012/01/30 16:08:40 jimyac
+added OCC SRAM Boot Vector0-3 registers
+
+Revision 1.53 2012/01/30 15:59:43 jimyac
+added ocb channel0-3 push & pull register and fixed typo in ocb addressed where address in variable name did not match actual address value
+
+Revision 1.52 2012/01/24 21:59:42 mfred
+Moved common multicast address constants to common_scom_accresses.H
+
+Revision 1.51 2012/01/18 12:55:03 koenig
+Added PBA clock sync reg
+
+Revision 1.50 2012/01/06 22:20:53 jmcgill
+move shared/common addresses to common_scom_addresses.H, general cleanup
+
+Revision 1.49 2012/01/05 22:07:47 jeshua
+Updated ring numbers for most chiplets
+
+Revision 1.48 2012/01/05 21:38:17 jmcgill
+adjust EX SCOM ring comments, pervasive thread control/status register addresses
+
+Revision 1.47 2012/01/05 20:18:16 jmcgill
+adjust L2 SCOM addresses
+
+Revision 1.46 2011/12/15 17:49:30 bcbrock
+Added the PIBMEM base address to p8_scom_addresses.H
+
+Revision 1.45 2011/11/07 23:52:21 bcbrock
+Added GENERIC_CLK_SCANDATA0_0x00038000
+
+Revision 1.44 2011/11/07 05:49:06 jmcgill
+update PBA trusted SCOM ring and PB X mode register addresses, add GP0 and/or addresses for A bus chiplet
+
+Revision 1.43 2011/09/28 12:49:47 stillgs
+Added some PCBS-PM addresses for early PM FAPI work
+
+Revision 1.42 2011/09/16 16:01:34 jeshua
+Added MBOX_SBEVITAL
+
+Revision 1.41 2011/09/16 16:00:26 jeshua
+Undo Ralph's X-bus change. The X-bus is now chiplet 4, not chiplet 3.
+
+Revision 1.40 2011/09/16 10:28:56 rkoester
+wrong X-BUS addresses corrected, changed from 0b04 to 0b03
+
+Revision 1.39 2011/09/09 21:00:33 jeshua
+X_BUS is now chiplet 4 (as of 051 chip)
+
+Revision 1.37 2011/09/02 18:45:46 dan
+Added scan_time_rep
+
+Revision 1.36 2011/09/01 20:37:17 jmcgill
+add PBA config register, shift L2 scom addresses for HW170113, fix L3 Mode Reg0 address
+
+Revision 1.35 2011/08/30 22:07:37 jeshua
+Added NEST_GP0_AND
+
+Revision 1.34 2011/08/29 21:11:31 jmcgill
+add generic PM GP0 OR constant
+
+Revision 1.33 2011/08/26 15:51:38 jeshua
+Added chiplet defines for multicast operations
+
+Revision 1.32 2011/08/26 12:53:27 gweber
+added constant SCAN_ALLSCANEXPRV_IMM
+
+Revision 1.31 2011/08/11 20:56:24 dan
+removed redundant GENERIC_PMGP0_AND_0x000F0101.
+added WRITE_ALL_GP0_AND_0x6B000004, WRITE_ALL_GP0_OR_0x6B000005
+
+Revision 1.30 2011/07/28 16:36:30 jmcgill
+add comment regarding L2 SCOM addresses which need to be adjusted when model fixes arrive (HW170113)
+
+Revision 1.29 2011/07/27 12:28:55 dan
+Added scan0 defines.
+
+Revision 1.28 2011/07/25 22:31:03 venton
+Added back in global addresses still used in SBe procs from version 1.24
+
+Revision 1.27 2011/07/25 20:52:58 jmcgill
+temporary workaround for L2 Purge Register SCOM access
+
+Revision 1.26 2011/07/25 17:30:35 dan
+Added some generic registers.
+
+Revision 1.25 2011/07/25 13:05:09 gweber
+moved centaur constants to cen_scom_addresses.H
+
+Revision 1.23 2011/07/20 15:32:10 gweber
+added some centaur constants
+
+Revision 1.22 2011/07/15 20:50:13 jeshua
+Added chiplet and some generic addresses
+
+Revision 1.21 2011/07/15 20:24:14 jeshua
+TP_GP3_0x01000003 should be TP_GP4_0x01000003
+
+Revision 1.20 2011/07/08 19:49:01 jeshua
+Moved some addresses to their appropriate sections
+Fixes some addresses that didn't match their name
+Added EX08-15 generics
+Removed some non-generic EX01 addresses
+
+Revision 1.19 2011/07/07 21:36:11 rkoester
+more addresses added
+
+Revision 1.18 2011/07/07 16:27:49 karm
+added chiplet_core_pervasive registers for start and status, added chiplet id
+
+Revision 1.17 2011/07/07 12:24:49 rkoester
+addresses added
+
+Revision 1.16 2011/07/06 20:03:46 jmcgill
+updates to handle TP design modifications which changed SCOM access method for subset of PBA facilities
+
+Revision 1.15 2011/07/06 15:01:36 bcbrock
+Fix header file name
+
+Revision 1.14 2011/07/06 04:06:49 bcbrock
+Added a common header for FAPI/SBE #defines, fapi_sbe_common.h
+
+Revision 1.13 2011/07/01 15:13:16 rkoester
+addresses added for mailbox register
+
+Revision 1.12 2011/06/30 09:50:28 rkoester
+private version of .H file released back to LIB, MBOX addresses added
+
+Revision 1.11 2011/06/15 22:46:26 jeshua
+Added Mailbox registers
+
+Revision 1.10 2011/06/14 15:55:46 rkoester
+move SCOM addresses from porinit.C to p8_scom_addresses.H
+
+Revision 1.9 2011/06/14 04:57:04 bcbrock
+Latest version of PGAS and PORE inline tools; Added PORE SCOM addresses
+
+Revision 1.8 2011/06/07 21:26:49 jeshua
+Updated OCB names to have the correct addresses
+
+Revision 1.7 2011/06/02 14:28:26 jmcgill
+add PB EH scom addresses, L3 mode register1 address
+
+Revision 1.6 2011/05/31 22:09:47 jeshua
+Updated the ULL macro, because the previous one didn't work with the assembler
+
+Revision 1.5 2011/05/27 21:49:13 jeshua
+Switch to constants instead of #defines
+Added in a macro to allow PORE assembler to use this header as well
+
+Revision 1.4 2011/05/24 19:01:58 jmcgill
+add addresses from OCC/OCB/PBA
+
+Revision 1.3 2011/04/21 19:48:23 jeshua
+Added L2 and L3 Mode Reg 0
+
+Revision 1.2 2011/04/06 18:27:01 jmcgill
+fixup ADU Control Register name, add ADU PMISC Mode Register address
+
+Revision 1.1 2011/02/23 17:09:44 jeshua
+Initial version
+
+
+
+*/
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.C b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.C
new file mode 100644
index 000000000..cf4ed8646
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.C
@@ -0,0 +1,288 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.C $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+// $Id: proc_fab_smp.C,v 1.4 2012/05/18 18:07:44 jmcgill Exp $
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_fab_smp.C,v $
+//------------------------------------------------------------------------------
+// *|
+// *! (C) Copyright International Business Machines Corp. 2011
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *|
+// *! TITLE : proc_fab_smp.C
+// *! DESCRIPTION : Common fabric structure defintions/utility functions (FAPI)
+// *!
+// *! OWNER NAME : Joe McGill Email: jmcgill@us.ibm.com
+// *!
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------
+#include "proc_fab_smp.H"
+
+extern "C" {
+
+using namespace fapi;
+//------------------------------------------------------------------------------
+// Function definitions
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+// function: utility function to read & return fabric node ID attribute
+// parameters: i_target => pointer to chip target
+// o_node_id => structure encapsulating node ID value
+// returns: FAPI_RC_SUCCESS if attribute read is successful & value is valid,
+// RC_PROC_FAB_SMP_FABRIC_NODE_ID_ATTR_ERR if attribute value is
+// invalid,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_fab_smp_get_node_id_attr(
+ const fapi::Target* i_target,
+ proc_fab_smp_node_id& o_node_id)
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint8_t node_id_attr;
+
+ // mark function entry
+ FAPI_DBG("proc_fab_smp_get_node_id_attr: Start");
+
+ do
+ {
+ // retrieve node ID attribute
+ rc = FAPI_ATTR_GET(ATTR_FABRIC_NODE_ID,
+ i_target,
+ node_id_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_fab_smp_get_node_id_attr: Error querying ATTR_FABRIC_NODE_ID");
+ break;
+ }
+
+ // print attribute value
+ FAPI_DBG("proc_fab_smp_get_node_id_attr: ATTR_FABRIC_NODE_ID = 0x%X",
+ node_id_attr);
+
+ // translate to enum
+ switch (node_id_attr)
+ {
+ case 0:
+ o_node_id = FBC_NODE_ID_0;
+ break;
+ case 1:
+ o_node_id = FBC_NODE_ID_1;
+ break;
+ case 2:
+ o_node_id = FBC_NODE_ID_2;
+ break;
+ case 3:
+ o_node_id = FBC_NODE_ID_3;
+ break;
+ case 4:
+ o_node_id = FBC_NODE_ID_4;
+ break;
+ case 5:
+ o_node_id = FBC_NODE_ID_5;
+ break;
+ case 6:
+ o_node_id = FBC_NODE_ID_6;
+ break;
+ case 7:
+ o_node_id = FBC_NODE_ID_7;
+ break;
+ default:
+ FAPI_ERR("proc_fab_smp_get_node_id_attr: Invalid fabric node ID attribute value 0x%02X",
+ node_id_attr);
+ const uint8_t& ATTR_DATA = node_id_attr;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_FAB_SMP_FABRIC_NODE_ID_ATTR_ERR);
+ break;
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_fab_smp_get_node_id_attr: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: utility function to read & return fabric chip ID attribute
+// parameters: i_target => pointer to chip target
+// o_chip_id => structure encapsulating chip ID value
+// returns: FAPI_RC_SUCCESS if attribute read is successful & value is valid,
+// RC_PROC_FAB_SMP_FABRIC_CHIP_ID_ATTR_ERR if attribute value is
+// invalid,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_fab_smp_get_chip_id_attr(
+ const fapi::Target* i_target,
+ proc_fab_smp_chip_id& o_chip_id)
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint8_t chip_id_attr;
+
+ // mark function entry
+ FAPI_DBG("proc_fab_smp_get_chip_id_attr: Start");
+
+ do
+ {
+ // retrieve chip ID attribute
+ rc = FAPI_ATTR_GET(ATTR_FABRIC_CHIP_ID,
+ i_target,
+ chip_id_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_fab_smp_get_chip_id_attr: Error querying ATTR_FABRIC_CHIP_ID");
+ break;
+ }
+
+ // print attribute value
+ FAPI_DBG("proc_fab_smp_get_chip_id_attr: ATTR_FABRIC_CHIP_ID = 0x%X",
+ chip_id_attr);
+
+ // translate to enum
+ switch (chip_id_attr)
+ {
+ case 0:
+ o_chip_id = FBC_CHIP_ID_0;
+ break;
+ case 1:
+ o_chip_id = FBC_CHIP_ID_1;
+ break;
+ case 2:
+ o_chip_id = FBC_CHIP_ID_2;
+ break;
+ case 3:
+ o_chip_id = FBC_CHIP_ID_3;
+ break;
+ case 4:
+ o_chip_id = FBC_CHIP_ID_4;
+ break;
+ case 5:
+ o_chip_id = FBC_CHIP_ID_5;
+ break;
+ case 6:
+ o_chip_id = FBC_CHIP_ID_6;
+ break;
+ case 7:
+ o_chip_id = FBC_CHIP_ID_7;
+ break;
+ default:
+ FAPI_ERR("proc_fab_smp_get_chip_id_attr: Invalid fabric chip ID attribute value 0x%02X",
+ chip_id_attr);
+ const uint8_t& ATTR_DATA = chip_id_attr;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_FAB_SMP_FABRIC_CHIP_ID_ATTR_ERR);
+ break;
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_fab_smp_get_chip_id_attr: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: utility function to read & return PCIe/DSMP mux attribute values
+// parameters: i_target => pointer to chip target
+// o_pcie_not_f_link => vector of boolean values representing state
+// of PCIe/DSMP mux settings (one value per
+// foreign link, true=PCIe function, false=
+// DSMP function)
+// returns: FAPI_RC_SUCCESS if attribute read is successful & value is valid,
+// RC_PROC_FAB_SMP_PCIE_NOT_F_LINK_ATTR_ERR if attribute value is
+// invalid,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_fab_smp_get_pcie_dsmp_mux_attrs(
+ const fapi::Target* i_target,
+ bool o_pcie_not_f_link[PROC_FAB_SMP_NUM_F_LINKS])
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint8_t pcie_not_f_link_attr[PROC_FAB_SMP_NUM_F_LINKS];
+
+ // mark function entry
+ FAPI_DBG("proc_fab_smp_get_pcie_dsmp_mux_attrs: Start");
+
+ do
+ {
+ // retrieve PCIe/DSMP mux attributes
+ rc = FAPI_ATTR_GET(ATTR_PROC_PCIE_NOT_F_LINK,
+ i_target,
+ pcie_not_f_link_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_fab_smp_get_pcie_dsmp_mux_attrs: Error querying ATTR_PROC_PCIE_NOT_F_LINK");
+ break;
+ }
+
+ // loop over all links
+ for (uint8_t l = 0;
+ l < PROC_FAB_SMP_NUM_F_LINKS;
+ l++)
+ {
+ // print attribute value
+ FAPI_DBG("proc_fab_smp_get_pcie_dsmp_mux_attrs: ATTR_PROC_PCIE_NOT_F_LINK[%d] = 0x%X",
+ l, pcie_not_f_link_attr[l]);
+
+ // validate attribute value
+ switch (pcie_not_f_link_attr[l])
+ {
+ case 0:
+ o_pcie_not_f_link[l] = false;
+ break;
+ case 1:
+ o_pcie_not_f_link[l] = true;
+ break;
+ default:
+ FAPI_ERR("proc_fab_smp_get_pcie_dsmp_mux_attrs: Invalid PCIe/DSMP mux attribute value 0x%02X",
+ pcie_not_f_link_attr[l]);
+ const uint8_t& ATTR_DATA = pcie_not_f_link_attr[l];
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_FAB_SMP_PCIE_NOT_F_LINK_ATTR_ERR);
+ break;
+ }
+ if (!rc.ok())
+ {
+ break;
+ }
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_fab_smp_get_pcie_dsmp_mux_attrs: End");
+ return rc;
+}
+
+
+} // extern "C"
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.H b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.H
new file mode 100644
index 000000000..bf5383199
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.H
@@ -0,0 +1,143 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp.H $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+// $Id: proc_fab_smp.H,v 1.3 2012/05/18 18:07:49 jmcgill Exp $
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_fab_smp.H,v $
+//------------------------------------------------------------------------------
+// *|
+// *! (C) Copyright International Business Machines Corp. 2011
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *|
+// *! TITLE : proc_fab_smp.H
+// *! DESCRIPTION : Common fabric structure defintions/utility functions (FAPI)
+// *!
+// *! OWNER NAME : Joe McGill Email: jmcgill@us.ibm.com
+// *!
+//------------------------------------------------------------------------------
+
+#ifndef _PROC_FAB_SMP_H_
+#define _PROC_FAB_SMP_H_
+
+//------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------
+
+#include <fapi.H>
+
+
+//------------------------------------------------------------------------------
+// Structure definitions
+//------------------------------------------------------------------------------
+
+// define set of supported fabric node ID values
+enum proc_fab_smp_node_id
+{
+ FBC_NODE_ID_0 = 0,
+ FBC_NODE_ID_1 = 1,
+ FBC_NODE_ID_2 = 2,
+ FBC_NODE_ID_3 = 3,
+ FBC_NODE_ID_4 = 4,
+ FBC_NODE_ID_5 = 5,
+ FBC_NODE_ID_6 = 6,
+ FBC_NODE_ID_7 = 7
+};
+
+// define set of supported fabric chip ID values
+enum proc_fab_smp_chip_id
+{
+ FBC_CHIP_ID_0 = 0,
+ FBC_CHIP_ID_1 = 1,
+ FBC_CHIP_ID_2 = 2,
+ FBC_CHIP_ID_3 = 3,
+ FBC_CHIP_ID_4 = 4,
+ FBC_CHIP_ID_5 = 5,
+ FBC_CHIP_ID_6 = 6,
+ FBC_CHIP_ID_7 = 7
+};
+
+
+//------------------------------------------------------------------------------
+// Constant definitions
+//------------------------------------------------------------------------------
+
+// largest representable fabric real address given HW implementation
+const uint64_t PROC_FAB_SMP_MAX_ADDRESS = ((1ULL << 50)-1ULL);
+
+// number of F links supported per chip
+const uint8_t PROC_FAB_SMP_NUM_F_LINKS = 2;
+
+
+extern "C"
+{
+
+//------------------------------------------------------------------------------
+// Function prototypes
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// function: utility function to read & return fabric node ID attribute
+// parameters: i_target => pointer to P8 chip target
+// o_node_id => structure encapsulating node ID value
+// returns: FAPI_RC_SUCCESS if attribute read is successful & value is valid,
+// RC_PROC_FAB_SMP_FABRIC_NODE_ID_ATTR_ERR if attribute value is
+// invalid,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_fab_smp_get_node_id_attr(
+ const fapi::Target* i_target,
+ proc_fab_smp_node_id& o_node_id);
+
+//------------------------------------------------------------------------------
+// function: utility function to read & return fabric chip ID attribute
+// parameters: i_target => pointer to P8 chip target
+// o_chip_id => structure encapsulating chip ID value
+// returns: FAPI_RC_SUCCESS if attribute read is successful & value is valid,
+// RC_PROC_FAB_SMP_FABRIC_CHIP_ID_ATTR_ERR if attribute value is
+// invalid,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_fab_smp_get_chip_id_attr(
+ const fapi::Target* i_target,
+ proc_fab_smp_chip_id& o_chip_id);
+
+//------------------------------------------------------------------------------
+// function: utility function to read & return PCIe/DSMP mux attribute values
+// parameters: i_target => pointer to P8 chip target
+// o_pcie_not_f_link => vector of boolean values representing state
+// of PCIe/DSMP mux settings (one value per
+// foreign link, true=PCIe function, false=
+// DSMP function)
+// returns: FAPI_RC_SUCCESS if attribute read is successful & value is valid,
+// RC_PROC_FAB_SMP_PCIE_NOT_F_LINK_ATTR_ERR if attribute value is
+// invalid,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_fab_smp_get_pcie_dsmp_mux_attrs(
+ const fapi::Target* i_target,
+ bool o_pcie_not_f_link[PROC_FAB_SMP_NUM_F_LINKS]);
+
+
+} // extern "C"
+
+#endif // _PROC_FAB_SMP_H_
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_errors.xml b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_errors.xml
new file mode 100644
index 000000000..5d590c998
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_errors.xml
@@ -0,0 +1,41 @@
+<!-- IBM_PROLOG_BEGIN_TAG
+ This is an automatically generated prolog.
+
+ $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_errors.xml $
+
+ IBM CONFIDENTIAL
+
+ COPYRIGHT International Business Machines Corp. 2012
+
+ p1
+
+ Object Code Only (OCO) source materials
+ Licensed Internal Code Source Materials
+ IBM HostBoot Licensed Internal Code
+
+ The source code for this program is not published or other-
+ wise divested of its trade secrets, irrespective of what has
+ been deposited with the U.S. Copyright Office.
+
+ Origin: 30
+
+ IBM_PROLOG_END_TAG -->
+<!-- Error definitions for proc_fab_smp -->
+<hwpErrors>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>RC_PROC_FAB_SMP_PCIE_NOT_F_LINK_ATTR_ERR</rc>
+ <description>Invalid definition for PCIe/DSMP mux attribute value.</description>
+ <ffdc>ATTR_DATA</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_FAB_SMP_FABRIC_NODE_ID_ATTR_ERR</rc>
+ <description>Invalid definition for fabric node ID attribute value.</description>
+ <ffdc>ATTR_DATA</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_FAB_SMP_FABRIC_CHIP_ID_ATTR_ERR</rc>
+ <description>Invalid definition for fabric chip ID attribute value.</description>
+ <ffdc>ATTR_DATA</ffdc>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_fabric_attributes.xml b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_fabric_attributes.xml
new file mode 100644
index 000000000..ac9ab578c
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_fabric_attributes.xml
@@ -0,0 +1,54 @@
+<!-- IBM_PROLOG_BEGIN_TAG
+ This is an automatically generated prolog.
+
+ $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_fab_smp_fabric_attributes.xml $
+
+ IBM CONFIDENTIAL
+
+ COPYRIGHT International Business Machines Corp. 2012
+
+ p1
+
+ Object Code Only (OCO) source materials
+ Licensed Internal Code Source Materials
+ IBM HostBoot Licensed Internal Code
+
+ The source code for this program is not published or other-
+ wise divested of its trade secrets, irrespective of what has
+ been deposited with the U.S. Copyright Office.
+
+ Origin: 30
+
+ IBM_PROLOG_END_TAG -->
+<!-- proc_fab_smp_fabric_attributes.xml -->
+<attributes>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_FREQ_CORE</id>
+ <targetType>TARGET_TYPE_SYSTEM</targetType>
+ <description>
+ firmware notes:
+ Nominal processor's core DPLL frequency (MHz).
+ Default value provided by Machine Readable Workbook.
+ This attribute is the current value.
+ </description>
+ <valueType>uint32</valueType>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_PCIE_NOT_F_LINK</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>
+ firmware notes:
+ Set IPL time mux/switch between PCIE PHB/F link function
+ (one per foreign link)
+ </description>
+ <valueType>uint8</valueType>
+ <array>2</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+</attributes> \ No newline at end of file
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.C b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.C
new file mode 100644
index 000000000..e64236331
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.C
@@ -0,0 +1,3253 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.C $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+// $Id: proc_setup_bars.C,v 1.3 2012/06/12 02:44:04 jmcgill Exp $
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_setup_bars.C,v $
+//------------------------------------------------------------------------------
+// *|
+// *! (C) Copyright International Business Machines Corp. 2011
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *|
+// *! TITLE : proc_setup_bars.C
+// *! DESCRIPTION : Program nest base address registers (BARs) (FAPI)
+// *!
+// *! OWNER NAME : Joe McGill Email: jmcgill@us.ibm.com
+// *!
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------
+#include "proc_setup_bars.H"
+
+//------------------------------------------------------------------------------
+// Constant definitions
+//------------------------------------------------------------------------------
+
+// logical size->physical encoding translation maps
+const std::map<uint64_t, uint64_t> proc_setup_bars_nf_bar_size::xlate_map =
+ proc_setup_bars_nf_bar_size::create_map();
+
+const std::map<uint64_t, uint64_t> proc_setup_bars_f_bar_size::xlate_map =
+ proc_setup_bars_f_bar_size::create_map();
+
+const std::map<uint64_t, uint64_t> proc_setup_bars_fsp_bar_size::xlate_map =
+ proc_setup_bars_fsp_bar_size::create_map();
+
+const std::map<uint64_t, uint64_t> proc_setup_bars_fsp_mmio_mask_size::xlate_map =
+ proc_setup_bars_fsp_mmio_mask_size::create_map();
+
+const std::map<uint64_t, uint64_t> proc_setup_bars_nx_mmio_bar_size::xlate_map =
+ proc_setup_bars_nx_mmio_bar_size::create_map();
+
+const std::map<uint64_t, uint64_t> proc_setup_bars_mcd_bar_size::xlate_map =
+ proc_setup_bars_mcd_bar_size::create_map();
+
+const std::map<uint64_t, uint64_t> proc_setup_bars_pcie_bar_size::xlate_map =
+ proc_setup_bars_pcie_bar_size::create_map();
+
+
+extern "C" {
+
+//------------------------------------------------------------------------------
+// Function definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// function: utility function to display address range/BAR information and
+// check properties
+// parameters: i_bar_def => structure encapsulating address range/BAR
+// properties
+// i_bar_addr_range => structure encapsulating address range
+// returns: true if any properties specified by i_bar_def are violated,
+// false otherwise
+//------------------------------------------------------------------------------
+bool proc_setup_bars_common_check_bar(
+ const proc_setup_bars_bar_def& i_bar_def,
+ const proc_setup_bars_addr_range& i_bar_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ // set if error should be logged at end of function
+ bool error = false;
+
+ do
+ {
+ // print range information
+ i_bar_addr_range.print();
+
+ // only check if BAR enable attribute is set
+ if (i_bar_addr_range.enabled)
+ {
+ // ensure that address range lies in fabric real address space
+ if (!i_bar_addr_range.is_in_fbc_range())
+ {
+ FAPI_ERR("proc_setup_bars_common_check_bar: BAR range is not wholly contained in FBC real address space");
+ error = true;
+ break;
+ }
+ // ensure that base address value lies in implemented address space
+ if (i_bar_addr_range.base_addr &
+ i_bar_def.base_addr_mask)
+ {
+ FAPI_ERR("proc_setup_bars_common_check_bar: BAR base address attribute value is out-of-range");
+ error = true;
+ break;
+ }
+ // ensure that address range size is in range
+ if ((i_bar_addr_range.size < i_bar_def.size_min) ||
+ (i_bar_addr_range.size > i_bar_def.size_max))
+ {
+ FAPI_ERR("proc_setup_bars_common_check_bar: BAR size attribute value is out-of-range");
+ error = true;
+ break;
+ }
+ // check that base address range and mask are aligned
+ if (i_bar_def.check_aligned &&
+ !i_bar_addr_range.is_aligned())
+ {
+ FAPI_ERR("proc_setup_bars_common_check_bar: BAR base address/size range values are not aligned");
+ error = true;
+ break;
+ }
+ }
+ } while(0);
+
+ return error;
+}
+
+
+//------------------------------------------------------------------------------
+// function: utility function to check for overlapping address ranges
+// parameters: i_ranges => vector of pointers to address range structures that
+// should be checked
+// returns: true if any ranges overlap, false otherwise
+//------------------------------------------------------------------------------
+bool proc_setup_bars_common_do_ranges_overlap(
+ const std::vector<proc_setup_bars_addr_range*> i_ranges)
+{
+ bool overlap = false;
+ FAPI_DBG("proc_setup_bars_common_do_ranges_overlap: Start");
+
+ // check that ranges are non-overlapping
+ if (i_ranges.size() > 1)
+ {
+ for (uint8_t r = 0; (r < i_ranges.size()-1) && !overlap; r++)
+ {
+ for (uint8_t x = r+1; x < i_ranges.size(); x++)
+ {
+ if (i_ranges[r]->overlaps(*(i_ranges[x])))
+ {
+ overlap = true;
+ break;
+ }
+ }
+ }
+ }
+
+ FAPI_DBG("proc_setup_bars_common_do_ranges_overlap: End");
+ return overlap;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining non-mirrored memory range
+// parameters: i_target => pointer to chip target
+// io_addr_range => address range structure encapsulating attribute
+// values (size will be rounded up to nearest
+// power of two)
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ATTR_ERR if chip non-mirrored
+// attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_OVERLAP_ATTR_ERR if chip
+// non-mirrored range attributes specify overlapping ranges,
+// RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ERR if chip non-mirrored
+// processed range content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_memory_get_non_mirrored_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range& io_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint64_t non_mirrored_base_attrs[PROC_SETUP_BARS_NUM_NON_MIRRORED_RANGES];
+ uint64_t non_mirrored_size_attrs[PROC_SETUP_BARS_NUM_NON_MIRRORED_RANGES];
+ proc_setup_bars_addr_range non_mirrored_ranges[PROC_SETUP_BARS_NUM_NON_MIRRORED_RANGES];
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_memory_get_non_mirrored_attrs: Start");
+
+ do
+ {
+ // retrieve non-mirrored memory base address/size attributes
+ rc = FAPI_ATTR_GET(ATTR_PROC_MEM_BASES,
+ i_target,
+ non_mirrored_base_attrs);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_non_mirrored_attrs: Error querying ATTR_PROC_MEM_BASES");
+ break;
+ }
+ rc = FAPI_ATTR_GET(ATTR_PROC_MEM_SIZES,
+ i_target,
+ non_mirrored_size_attrs);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_non_mirrored_attrs: Error querying ATTR_PROC_MEM_SIZES");
+ break;
+ }
+
+ // process attributes into range structures
+ for (uint8_t r = 0; r < PROC_SETUP_BARS_NUM_NON_MIRRORED_RANGES; r++)
+ {
+ // build range content
+ non_mirrored_ranges[r].base_addr = non_mirrored_base_attrs[r];
+ non_mirrored_ranges[r].size = non_mirrored_size_attrs[r];
+ // consider range enabled if size is non-zero
+ non_mirrored_ranges[r].enabled = (non_mirrored_size_attrs[r] != 0x0);
+ // check attribute content
+ FAPI_DBG("proc_setup_bars_memory_get_non_mirrored_attrs: Range %d", r);
+ if (proc_setup_bars_common_check_bar(
+ non_mirrored_range_def,
+ non_mirrored_ranges[r]) != false)
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_non_mirrored_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = non_mirrored_ranges[r].base_addr;
+ const uint64_t& SIZE = non_mirrored_ranges[r].size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ATTR_ERR);
+ break;
+ }
+ }
+ if (!rc.ok())
+ {
+ break;
+ }
+
+ // check that ranges are non-overlapping
+ std::vector<proc_setup_bars_addr_range*> check_ranges;
+ for (uint8_t r = 0; r < PROC_SETUP_BARS_NUM_NON_MIRRORED_RANGES; r++)
+ {
+ check_ranges.push_back(&non_mirrored_ranges[r]);
+ }
+ if (proc_setup_bars_common_do_ranges_overlap(check_ranges))
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_non_mirrored_attrs: Non-mirrored range attributes specify overlapping address regions");
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_OVERLAP_ATTR_ERR);
+ break;
+ }
+
+ // ranges are non-overlapping, merge to single range
+ for (uint8_t r = 0; r < PROC_SETUP_BARS_NUM_NON_MIRRORED_RANGES; r++)
+ {
+ // merge to build single range
+ io_addr_range.merge(non_mirrored_ranges[r]);
+ }
+
+ // ensure range is power of 2 aligned
+ if (io_addr_range.enabled && !io_addr_range.is_power_of_2())
+ {
+ io_addr_range.round_next_power_of_2();
+ }
+
+ // check final range content
+ if (proc_setup_bars_common_check_bar(
+ non_mirrored_range_def,
+ io_addr_range) != false)
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_non_mirrored_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_range.base_addr;
+ const uint64_t& SIZE = io_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ERR);
+ break;
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_setup_bars_memory_get_non_mirrored_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining mirrored memory range
+// parameters: i_target => pointer to chip target
+// io_addr_range => address range structure encapsulating attribute
+// values (ranges will be merged and size rounded
+// up to the nearest power of two)
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_MIRRORED_RANGE_ATTR_ERR if individual chip
+// mirrored range attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_MIRRORED_RANGE_OVERLAP_ATTR_ERR if chip mirrored
+// range attributes specify overlapping ranges,
+// RC_PROC_SETUP_BARS_MIRRORED_RANGE_ERR if chip mirrored processed
+// range content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_memory_get_mirrored_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range& io_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint64_t mirrored_base_attrs[PROC_SETUP_BARS_NUM_MIRRORED_RANGES];
+ uint64_t mirrored_size_attrs[PROC_SETUP_BARS_NUM_MIRRORED_RANGES];
+ proc_setup_bars_addr_range mirrored_ranges[PROC_SETUP_BARS_NUM_MIRRORED_RANGES];
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_memory_get_mirrored_attrs: Start");
+
+ do
+ {
+ // retrieve mirrored memory base address/size attributes
+ rc = FAPI_ATTR_GET(ATTR_PROC_MIRROR_BASES,
+ i_target,
+ mirrored_base_attrs);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_mirrored_attrs: Error querying ATTR_PROC_MIRROR_BASE");
+ break;
+ }
+ rc = FAPI_ATTR_GET(ATTR_PROC_MIRROR_SIZES,
+ i_target,
+ mirrored_size_attrs);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_mirrored_attrs: Error querying ATTR_PROC_MIRROR_SIZE");
+ break;
+ }
+
+ // process attributes into range structures
+ for (uint8_t r = 0; r < PROC_SETUP_BARS_NUM_MIRRORED_RANGES; r++)
+ {
+ // build range content
+ mirrored_ranges[r].base_addr = mirrored_base_attrs[r];
+ mirrored_ranges[r].size = mirrored_size_attrs[r];
+ // consider range enabled if size is non-zero
+ mirrored_ranges[r].enabled = (mirrored_size_attrs[r] != 0x0);
+ // check attribute content
+ FAPI_DBG("proc_setup_bars_memory_get_mirrored_attrs: Range %d", r);
+ if (proc_setup_bars_common_check_bar(
+ mirrored_range_def,
+ mirrored_ranges[r]) != false)
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_mirrored_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = mirrored_ranges[r].base_addr;
+ const uint64_t& SIZE = mirrored_ranges[r].size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_MIRRORED_RANGE_ATTR_ERR);
+ break;
+ }
+ }
+ if (!rc.ok())
+ {
+ break;
+ }
+
+ // check that ranges are non-overlapping
+ std::vector<proc_setup_bars_addr_range*> check_ranges;
+ for (uint8_t r = 0; r < PROC_SETUP_BARS_NUM_MIRRORED_RANGES; r++)
+ {
+ check_ranges.push_back(&mirrored_ranges[r]);
+ }
+ if (proc_setup_bars_common_do_ranges_overlap(check_ranges))
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_mirrored_attrs: Mirrored range attributes specify overlapping address regions");
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_MIRRORED_RANGE_OVERLAP_ATTR_ERR);
+ break;
+ }
+
+ // ranges are non-overlapping, merge to single range
+ for (uint8_t r = 0; r < PROC_SETUP_BARS_NUM_MIRRORED_RANGES; r++)
+ {
+ // merge to build single range
+ io_addr_range.merge(mirrored_ranges[r]);
+ }
+
+ // ensure range is power of 2 aligned
+ if (io_addr_range.enabled && !io_addr_range.is_power_of_2())
+ {
+ io_addr_range.round_next_power_of_2();
+ }
+
+ // check final range content
+ if (proc_setup_bars_common_check_bar(
+ mirrored_range_def,
+ io_addr_range) != false)
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_mirrored_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_range.base_addr;
+ const uint64_t& SIZE = io_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_MIRRORED_RANGE_ERR);
+ break;
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_setup_bars_memory_get_mirrored_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining foreign near memory range
+// parameters: i_target => pointer to chip target
+// io_addr_ranges => array of address range structures
+// encapsulating attribute values
+// (one per foreign link)
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_FOREIGN_NEAR_RANGE_ATTR_ERR if individual chip
+// foriegn near range attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_memory_get_foreign_near_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range io_addr_ranges[PROC_FAB_SMP_NUM_F_LINKS])
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint64_t foreign_near_base_attr[PROC_FAB_SMP_NUM_F_LINKS];
+ uint64_t foreign_near_size_attr[PROC_FAB_SMP_NUM_F_LINKS];
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_memory_get_foreign_near_attrs: Start");
+
+ do
+ {
+ // retrieve foreign near base address/size attributes
+ rc = FAPI_ATTR_GET(ATTR_PROC_FOREIGN_NEAR_BASE,
+ i_target,
+ foreign_near_base_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_foreign_near_attrs: Error querying ATTR_PROC_FOREIGN_NEAR_BASE");
+ break;
+ }
+ rc = FAPI_ATTR_GET(ATTR_PROC_FOREIGN_NEAR_SIZE,
+ i_target,
+ foreign_near_size_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_foreign_near_attrs: Error querying ATTR_PROC_FOREIGN_NEAR_SIZE");
+ break;
+ }
+
+ // process attributes into range structures
+ for (uint8_t r = 0; r < PROC_FAB_SMP_NUM_F_LINKS; r++)
+ {
+ // build range content
+ io_addr_ranges[r].base_addr = foreign_near_base_attr[r];
+ io_addr_ranges[r].size = foreign_near_size_attr[r];
+ io_addr_ranges[r].enabled = (foreign_near_size_attr[r] != 0x0);
+
+ // check attribute content
+ FAPI_DBG("proc_setup_bars_memory_get_foreign_near_attrs: Link %d", r);
+ if (proc_setup_bars_common_check_bar(
+ common_f_scope_bar_def,
+ io_addr_ranges[r]) != false)
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_foreign_near_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_ranges[r].base_addr;
+ const uint64_t& SIZE = io_addr_ranges[r].size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_FOREIGN_NEAR_RANGE_ATTR_ERR);
+ break;
+ }
+ }
+ } while(0);
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_memory_get_foreign_near_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining foreign far memory range
+// parameters: i_target => pointer to chip target
+// io_addr_ranges => array of address range structures
+// encapsulating attribute values
+// (one per foreign link)
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_FOREIGN_FAR_RANGE_ATTR_ERR if individual chip
+// foreign far range attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_memory_get_foreign_far_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range io_addr_ranges[PROC_FAB_SMP_NUM_F_LINKS])
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint64_t foreign_far_base_attr[PROC_FAB_SMP_NUM_F_LINKS];
+ uint64_t foreign_far_size_attr[PROC_FAB_SMP_NUM_F_LINKS];
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_memory_get_foreign_far_attrs: Start");
+
+ do
+ {
+ // retrieve foreign far base address/size attributes
+ rc = FAPI_ATTR_GET(ATTR_PROC_FOREIGN_FAR_BASE,
+ i_target,
+ foreign_far_base_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_foreign_far_attrs: Error querying ATTR_PROC_FOREIGN_FAR_BASE");
+ break;
+ }
+ rc = FAPI_ATTR_GET(ATTR_PROC_FOREIGN_FAR_SIZE,
+ i_target,
+ foreign_far_size_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_foreign_far_attrs: Error querying ATTR_PROC_FOREIGN_FAR_SIZE");
+ break;
+ }
+
+ // process attributes into range structures
+ for (uint8_t r = 0; r < PROC_FAB_SMP_NUM_F_LINKS; r++)
+ {
+ // build range content
+ io_addr_ranges[r].base_addr = foreign_far_base_attr[r];
+ io_addr_ranges[r].size = foreign_far_size_attr[r];
+ io_addr_ranges[r].enabled = (foreign_far_size_attr[r] != 0x0);
+
+ // check attribute content
+ FAPI_DBG("proc_setup_bars_memory_get_foreign_far_attrs: Link %d", r);
+ if (proc_setup_bars_common_check_bar(
+ common_f_scope_bar_def,
+ io_addr_ranges[r]) != false)
+ {
+ FAPI_ERR("proc_setup_bars_memory_get_foreign_far_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_ranges[r].base_addr;
+ const uint64_t& SIZE = io_addr_ranges[r].size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_FOREIGN_FAR_RANGE_ATTR_ERR);
+ break;
+ }
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_setup_bars_memory_get_foreign_far_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining PSI BAR programming
+// parameters: i_target => pointer to chip target
+// io_addr_range => address range structure encapsulating
+// attribute values
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_PSI_BAR_ATTR_ERR if chip PSI range
+// attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_psi_get_bar_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range& io_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint8_t bar_enabled;
+
+ FAPI_DBG("proc_setup_bars_psi_get_bar_attrs: Start");
+ do
+ {
+ // BAR base address
+ rc = FAPI_ATTR_GET(ATTR_PROC_PSI_BRIDGE_BAR_BASE_ADDR,
+ i_target,
+ io_addr_range.base_addr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_psi_get_bar_attrs: Error querying ATTR_PROC_PSI_BRIDGE_BAR_BASE_ADDR");
+ break;
+ }
+
+ // BAR enable
+ rc = FAPI_ATTR_GET(ATTR_PROC_PSI_BRIDGE_BAR_ENABLE,
+ i_target,
+ bar_enabled);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_psi_get_bar_attrs: Error querying ATTR_PROC_PSI_BRIDGE_BAR_ENABLE");
+ break;
+ }
+ io_addr_range.enabled = (bar_enabled == 0x1);
+
+ // BAR size (implied to be 1MB)
+ io_addr_range.size = PROC_SETUP_BARS_SIZE_1_MB;
+
+ // check BAR attribute content
+ if (proc_setup_bars_common_check_bar(
+ psi_bridge_bar_def,
+ io_addr_range) != false)
+ {
+ FAPI_ERR("proc_setup_bars_psi_get_bar_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_range.base_addr;
+ const uint64_t& SIZE = io_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_PSI_BAR_ATTR_ERR);
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_psi_get_bar_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining FSP BAR programming
+// parameters: i_target => pointer to chip target
+// io_addr_range => address range structure encapsulating
+// attribute values
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_FSP_BAR_ATTR_ERR if chip FSP range
+// attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_fsp_get_bar_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range& io_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint8_t bar_enabled;
+
+ FAPI_DBG("proc_setup_bars_fsp_get_bar_attrs: Start");
+ do
+ {
+ // BAR base address
+ rc = FAPI_ATTR_GET(ATTR_PROC_FSP_BAR_BASE_ADDR,
+ i_target,
+ io_addr_range.base_addr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_fsp_get_bar_attrs: Error querying ATTR_PROC_FSP_BAR_BASE_ADDR");
+ break;
+ }
+
+ // BAR enable
+ rc = FAPI_ATTR_GET(ATTR_PROC_FSP_BAR_ENABLE,
+ i_target,
+ bar_enabled);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_fsp_get_bar_attrs: Error querying ATTR_PROC_FSP_BAR_ENABLE");
+ break;
+ }
+ io_addr_range.enabled = (bar_enabled == 0x1);
+
+ // BAR size
+ rc = FAPI_ATTR_GET(ATTR_PROC_FSP_BAR_SIZE,
+ i_target,
+ io_addr_range.size);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_fsp_get_bar_attrs: Error querying ATTR_PROC_FSP_BAR_SIZE");
+ break;
+ }
+
+ // check BAR attribute content
+ if (proc_setup_bars_common_check_bar(
+ fsp_bar_def,
+ io_addr_range) != false)
+ {
+ FAPI_ERR("proc_setup_bars_fsp_get_bar_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_range.base_addr;
+ const uint64_t& SIZE = io_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_FSP_BAR_ATTR_ERR);
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_fsp_get_bar_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining FSP MMIO mask programming
+// parameters: i_target => pointer to chip target
+// io_addr_range => address range structure encapsulating
+// attribute values
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_FSP_MMIO_MASK_ATTR_ERR if chip MMIO mask
+// attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_fsp_get_mmio_mask_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range& io_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_fsp_get_mmio_mask_attrs: Start");
+ do
+ {
+ // BAR base address (unused)
+ io_addr_range.base_addr = 0x0ULL;
+
+ // BAR enable (unused)
+ io_addr_range.enabled = true;
+
+ // BAR size
+ rc = FAPI_ATTR_GET(ATTR_PROC_FSP_MMIO_MASK_SIZE,
+ i_target,
+ io_addr_range.size);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_fsp_get_mmio_mask_attrs: Error querying ATTR_PROC_FSP_MMIO_MASK_SIZE");
+ break;
+ }
+
+ // check BAR attribute content
+ if (proc_setup_bars_common_check_bar(
+ fsp_mmio_mask_def,
+ io_addr_range) != false)
+ {
+ FAPI_ERR("proc_setup_bars_fsp_get_mmio_mask_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& SIZE = io_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_FSP_MMIO_MASK_ATTR_ERR);
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_fsp_get_mmio_mask_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining INTP BAR programming
+// parameters: i_target => pointer to chip target
+// io_addr_range => address range structure encapsulating
+// attribute values
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_INTP_BAR_ATTR_ERR if chip INTP range
+// attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_intp_get_bar_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range& io_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint8_t bar_enabled;
+
+ FAPI_DBG("proc_setup_bars_intp_get_bar_attrs: Start");
+ do
+ {
+ // BAR base address
+ rc = FAPI_ATTR_GET(ATTR_PROC_INTP_BAR_BASE_ADDR,
+ i_target,
+ io_addr_range.base_addr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_intp_get_bar_attrs: Error querying ATTR_PROC_INTP_BAR_BASE_ADDR");
+ break;
+ }
+
+ // BAR enable
+ rc = FAPI_ATTR_GET(ATTR_PROC_INTP_BAR_ENABLE,
+ i_target,
+ bar_enabled);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_intp_get_bar_attrs: Error querying ATTR_PROC_INTP_BAR_ENABLE");
+ break;
+ }
+ io_addr_range.enabled = (bar_enabled == 0x1);
+
+ // BAR size (implied to be 1MB)
+ io_addr_range.size = PROC_SETUP_BARS_SIZE_1_MB;
+
+ // check BAR attribute content
+ if (proc_setup_bars_common_check_bar(
+ intp_bar_def,
+ io_addr_range) != false)
+ {
+ FAPI_ERR("proc_setup_bars_intp_get_bar_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_range.base_addr;
+ const uint64_t& SIZE = io_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_INTP_BAR_ATTR_ERR);
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_intp_get_bar_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining NX MMIO BAR programming
+// parameters: i_target => pointer to chip target
+// io_addr_range => address range structure encapsulating
+// attribute values
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_NX_MMIO_BAR_ATTR_ERR if chip NX MMIO range
+// attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_nx_get_mmio_bar_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range& io_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint8_t bar_enabled;
+
+ FAPI_DBG("proc_setup_bars_nx_get_mmio_bar_attrs: Start");
+ do
+ {
+ // BAR base address
+ rc = FAPI_ATTR_GET(ATTR_PROC_NX_MMIO_BAR_BASE_ADDR,
+ i_target,
+ io_addr_range.base_addr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_nx_get_mmio_bar_attrs: Error querying ATTR_PROC_NX_MMIO_BAR_BASE_ADDR");
+ break;
+ }
+
+ // BAR enable
+ rc = FAPI_ATTR_GET(ATTR_PROC_NX_MMIO_BAR_ENABLE,
+ i_target,
+ bar_enabled);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_nx_get_mmio_bar_attrs: Error querying ATTR_PROC_NX_MMIO_BAR_ENABLE");
+ break;
+ }
+ io_addr_range.enabled = (bar_enabled == 0x1);
+
+ // BAR size
+ rc = FAPI_ATTR_GET(ATTR_PROC_NX_MMIO_BAR_SIZE,
+ i_target,
+ io_addr_range.size);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_fsp_get_bar_attrs: Error querying ATTR_PROC_NX_MMIO_BAR_SIZE");
+ break;
+ }
+
+ // check BAR attribute content
+ if (proc_setup_bars_common_check_bar(
+ nx_mmio_bar_def,
+ io_addr_range) != false)
+ {
+ FAPI_ERR("proc_setup_bars_nx_get_mmio_bar_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint64_t& BASE_ADDR = io_addr_range.base_addr;
+ const uint64_t& SIZE = io_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NX_MMIO_BAR_ATTR_ERR);
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_nx_get_mmio_bar_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: retrieve attributes defining PCIe IO BAR programming
+// parameters: i_target => pointer to chip target
+// io_addr_ranges => 2D array of address range structures
+// encapsulating attribute values
+// (first dimension = unit, second dimension =
+// links per unit)
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// RC_PROC_SETUP_BARS_PCIE_BAR_ATTR_ERR if individual chip PCIe IO
+// range attribute content violates expected behavior,
+// else FAPI_ATTR_GET return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_pcie_get_bar_attrs(
+ const fapi::Target* i_target,
+ proc_setup_bars_addr_range io_addr_ranges[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT])
+{
+ // return code
+ fapi::ReturnCode rc;
+ // temporary attribute storage used to build procedure data structures
+ uint64_t pcie_bar_addr[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT];
+ uint64_t pcie_bar_size[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT];
+ uint8_t pcie_bar_en[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT];
+
+ FAPI_DBG("proc_setup_bars_pcie_get_bar_attrs: Start");
+ do
+ {
+ // IO BAR base addresses
+ rc = FAPI_ATTR_GET(ATTR_PROC_PCIE_BAR_BASE_ADDR,
+ i_target,
+ pcie_bar_addr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_get_bar_attrs: Error querying ATTR_PROC_PCIE_BAR_BASE_ADDR");
+ break;
+ }
+
+ // IO BAR enable
+ rc = FAPI_ATTR_GET(ATTR_PROC_PCIE_BAR_ENABLE,
+ i_target,
+ pcie_bar_en);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_get_bar_attrs: Error querying ATTR_PROC_PCIE_BAR_ENABLE");
+ break;
+ }
+
+ // IO BAR sizes
+ rc = FAPI_ATTR_GET(ATTR_PROC_PCIE_BAR_SIZE,
+ i_target,
+ pcie_bar_size);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_get_bar_attrs: Error querying ATTR_PROC_PCIE_BAR_SIZE");
+ break;
+ }
+
+ // loop over all units
+ for (uint8_t u = 0;
+ (u < PROC_SETUP_BARS_PCIE_NUM_UNITS) && (rc.ok());
+ u++)
+ {
+ for (uint8_t r = 0;
+ r < PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT;
+ r++)
+ {
+ // fill chip range structures
+ io_addr_ranges[u][r].base_addr = pcie_bar_addr[u][r];
+ io_addr_ranges[u][r].size = pcie_bar_size[u][r];
+ io_addr_ranges[u][r].enabled = pcie_bar_en[u][r];
+ // check BAR attribute content
+ FAPI_DBG("proc_setup_bars_pcie_get_bar_attrs: Unit %d Range %d",
+ u, r);
+ if (proc_setup_bars_common_check_bar(
+ ((PROC_SETUP_BARS_PCIE_RANGE_TYPE_MMIO[r])?
+ (pcie_mmio_bar_def):
+ (pcie_phb_bar_def)),
+ io_addr_ranges[u][r]) != false)
+ {
+ FAPI_ERR("proc_setup_bars_pcie_get_bar_attrs: Error from proc_setup_bars_common_check_bar");
+ const uint8_t& UNIT = u;
+ const uint8_t& RANGE = r;
+ const uint64_t& BASE_ADDR = io_addr_ranges[u][r].base_addr;
+ const uint64_t& SIZE = io_addr_ranges[u][r].size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_PCIE_BAR_ATTR_ERR);
+ break;
+ }
+ }
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_pcie_get_bar_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to call all BAR attribute query functions
+// parameters: io_smp_chip => structure encapsulating single chip in SMP
+// topology (containing target for attribute
+// query and storage for all address ranges)
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// else failing return code from attribute query function
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_get_bar_attrs(
+ proc_setup_bars_smp_chip& io_smp_chip)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Start");
+
+ do
+ {
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for non-mirrored memory range");
+ rc = proc_setup_bars_memory_get_non_mirrored_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_memory_get_non_mirrored_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for mirrored memory range");
+ rc = proc_setup_bars_memory_get_mirrored_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_memory_get_mirrored_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for foreign near memory ranges");
+ rc = proc_setup_bars_memory_get_foreign_near_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.foreign_near_ranges);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_memory_get_foreign_near_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for foreign far memory ranges");
+ rc = proc_setup_bars_memory_get_foreign_far_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.foreign_far_ranges);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_memory_get_foreign_far_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for PSI address range");
+ rc = proc_setup_bars_psi_get_bar_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.psi_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_psi_get_bar_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for FSP address range");
+ rc = proc_setup_bars_fsp_get_bar_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.fsp_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_fsp_get_bar_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for FSP MMIO mask");
+ rc = proc_setup_bars_fsp_get_mmio_mask_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.fsp_mmio_mask_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_fsp_get_mmio_mask_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for INTP address range");
+ rc = proc_setup_bars_intp_get_bar_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.intp_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_intp_get_bar_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for NX MMIO address range");
+ rc = proc_setup_bars_nx_get_mmio_bar_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.nx_mmio_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_intp_get_bar_attrs");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: Querying base address/size attributes for PCIe address ranges");
+ rc = proc_setup_bars_pcie_get_bar_attrs(
+ &(io_smp_chip.chip->this_chip),
+ io_smp_chip.pcie_ranges);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_get_bar_attrs: Error from proc_setup_bars_pcie_get_bar_attrs");
+ break;
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_setup_bars_get_bar_attrs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to call all chip attribute query functions
+// (fabric configuration/node/position/BARs)
+// parameters: i_proc_chip => pointer to HWP input structure for this chip
+// io_smp_chip => fully specified structure encapsulating
+// single chip in SMP topology
+// returns: FAPI_RC_SUCCESS if all attribute reads are successful & values
+// are valid,
+// else failing return code from attribute query function
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_process_chip(
+ proc_setup_bars_proc_chip* i_proc_chip,
+ proc_setup_bars_smp_chip& io_smp_chip)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_process_chip: Start");
+
+ do
+ {
+ // set HWP input pointer
+ io_smp_chip.chip = i_proc_chip;
+
+ // display target information for this chip
+ FAPI_DBG("proc_setup_bars_process_chip: Target: %s",
+ io_smp_chip.chip->this_chip.toEcmdString());
+
+ // get PCIe/DSMP mux attributes
+ FAPI_DBG("proc_setup_bars_process_chip: Querying PCIe/DSMP mux attribute");
+ rc = proc_fab_smp_get_pcie_dsmp_mux_attrs(&(io_smp_chip.chip->this_chip),
+ io_smp_chip.pcie_not_f_link);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_process_chip: Error from proc_fab_smp_get_pcie_dsmp_mux_attrs");
+ break;
+ }
+
+ // get node ID attribute
+ FAPI_DBG("proc_setup_bars_process_chip: Querying node ID attribute");
+ rc = proc_fab_smp_get_node_id_attr(&(io_smp_chip.chip->this_chip),
+ io_smp_chip.node_id);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_process_chip: Error from proc_fab_smp_get_node_id_attr");
+ break;
+ }
+
+ // get chip ID attribute
+ FAPI_DBG("proc_setup_bars_process_chip: Querying chip ID attribute");
+ rc = proc_fab_smp_get_chip_id_attr(&(io_smp_chip.chip->this_chip),
+ io_smp_chip.chip_id);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_process_chip: Error from proc_fab_smp_get_chip_id_attr");
+ break;
+ }
+
+ // get BAR attributes
+ rc = proc_setup_bars_get_bar_attrs(io_smp_chip);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_process_chip: Error from proc_fab_smp_get_mem_attrs");
+ break;
+ }
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_setup_bars_process_chip: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: insert chip structure into proper position within SMP model based
+// on its fabric node/chip ID
+// chip non-mirrored/mirrored range information will be merged
+// with those of its enclosing node
+// parameters: i_smp_chip => structure encapsulating single chip in SMP topology
+// io_smp => structure encapsulating full SMP
+// returns: FAPI_RC_SUCCESS if insertion is successful and merged node ranges
+// are valid,
+// RC_PROC_SETUP_BARS_NODE_ADD_INTERNAL_ERR if node map insert fails,
+// RC_PROC_SETUP_BARS_DUPLICATE_FABRIC_ID_ERR if chips with duplicate
+// fabric node/chip IDs are detected,
+// RC_PROC_SETUP_BARS_NODE_NON_MIRRORED_RANGE_OVERLAP_ERR if overlap
+// is detected between existing node non-mirrored range
+// and that of new chip being processed,
+// RC_PROC_SETUP_BARS_NODE_MIRRORED_RANGE_OVERLAP_ERR if overlap
+// is detected between existing node mirrored range
+// and that of new chip being processed
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_insert_chip(
+ proc_setup_bars_smp_chip& i_smp_chip,
+ proc_setup_bars_smp_system& io_smp)
+{
+ // return code
+ fapi::ReturnCode rc;
+ // node/chip ID
+ proc_fab_smp_node_id node_id = i_smp_chip.node_id;
+ proc_fab_smp_chip_id chip_id = i_smp_chip.chip_id;
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_insert_chip: Start");
+
+ do
+ {
+ FAPI_DBG("proc_setup_bars_insert_chip: Inserting n%d p%d",
+ node_id, chip_id);
+
+ // search to see if node structure already exists for the node ID
+ // associated with this chip
+ std::map<proc_fab_smp_node_id, proc_setup_bars_smp_node>::iterator
+ n_iter;
+ n_iter = io_smp.nodes.find(node_id);
+ // no matching node found, create one
+ if (n_iter == io_smp.nodes.end())
+ {
+ FAPI_DBG("proc_setup_bars_insert_chip: No matching node found, inserting new node structure");
+ proc_setup_bars_smp_node n;
+ std::pair<
+ std::map<proc_fab_smp_node_id, proc_setup_bars_smp_node>::iterator,
+ bool> ret;
+ ret = io_smp.nodes.insert(
+ std::pair<proc_fab_smp_node_id, proc_setup_bars_smp_node>
+ (node_id, n));
+ n_iter = ret.first;
+ if (!ret.second)
+ {
+ FAPI_ERR("proc_setup_bars_insert_chip: Error encountered adding node to SMP");
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NODE_ADD_INTERNAL_ERR);
+ break;
+ }
+ }
+
+ // search to see if match exists in this node for the chip ID associated
+ // with this chip
+ std::map<proc_fab_smp_chip_id, proc_setup_bars_smp_chip>::iterator
+ p_iter;
+ p_iter = io_smp.nodes[node_id].chips.find(chip_id);
+ // matching chip ID & node ID already found, flag an error
+ if (p_iter != io_smp.nodes[node_id].chips.end())
+ {
+ FAPI_ERR("proc_setup_bars_insert_chip: Duplicate fabric node ID / chip ID found");
+ const uint8_t& NODE_ID = node_id;
+ const uint8_t& CHIP_ID = chip_id;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_DUPLICATE_FABRIC_ID_ERR);
+ break;
+ }
+ // insert chip into SMP
+ io_smp.nodes[node_id].chips[chip_id] = i_smp_chip;
+
+ // update node address regions
+ // before merging, check that non-mirrored & mirrored ranges
+ // are non-overlapping with new ranges from this chip
+ FAPI_DBG("proc_setup_bars_insert_chip: Non-mirrored ranges prior to merging:");
+ io_smp.nodes[node_id].non_mirrored_range.print();
+ i_smp_chip.non_mirrored_range.print();
+ if (io_smp.nodes[node_id].non_mirrored_range.overlaps(
+ i_smp_chip.non_mirrored_range))
+ {
+ FAPI_ERR("proc_setup_bars_insert_chip: Existing node non-mirrored range overlaps chip non-mirrored range");
+ const uint64_t& NODE_BASE_ADDR =
+ io_smp.nodes[node_id].non_mirrored_range.base_addr;
+ const uint64_t& NODE_SIZE =
+ io_smp.nodes[node_id].non_mirrored_range.size;
+ const uint64_t& CHIP_BASE_ADDR =
+ i_smp_chip.non_mirrored_range.base_addr;
+ const uint64_t& CHIP_SIZE =
+ i_smp_chip.non_mirrored_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NODE_NON_MIRRORED_RANGE_OVERLAP_ERR);
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_insert_chip: Mirrored ranges prior to merging:");
+ io_smp.nodes[node_id].mirrored_range.print();
+ i_smp_chip.mirrored_range.print();
+ if (io_smp.nodes[node_id].mirrored_range.overlaps(
+ i_smp_chip.mirrored_range))
+ {
+ FAPI_ERR("proc_setup_bars_insert_chip: Existing node mirrored range overlaps chip mirrored range");
+ const uint64_t& NODE_BASE_ADDR =
+ io_smp.nodes[node_id].mirrored_range.base_addr;
+ const uint64_t& NODE_SIZE =
+ io_smp.nodes[node_id].mirrored_range.size;
+ const uint64_t& CHIP_BASE_ADDR =
+ i_smp_chip.mirrored_range.base_addr;
+ const uint64_t& CHIP_SIZE =
+ i_smp_chip.mirrored_range.size;
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NODE_MIRRORED_RANGE_OVERLAP_ERR);
+ break;
+ }
+
+ // update node address ranges (non-mirrored & mirrored)
+ FAPI_DBG("proc_setup_bars_insert_chip: Ranges after merging:");
+ io_smp.nodes[node_id].non_mirrored_range.merge(
+ i_smp_chip.non_mirrored_range);
+ io_smp.nodes[node_id].non_mirrored_range.print();
+
+ io_smp.nodes[node_id].mirrored_range.merge(
+ i_smp_chip.mirrored_range);
+ io_smp.nodes[node_id].mirrored_range.print();
+ } while(0);
+
+ // mark function exit
+ FAPI_DBG("proc_setup_bars_insert_chip: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to process all HWP input structures and build
+// SMP data structure
+// parameters: i_proc_chips => vector of HWP input structures (one entry per
+// chip in SMP)
+// io_smp => fully specified structure encapsulating full SMP
+// returns: FAPI_RC_SUCCESS if all processing is successful,
+// else failing return code from chip processing/insertion wrapper
+// functions
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_process_chips(
+ std::vector<proc_setup_bars_proc_chip>& i_proc_chips,
+ proc_setup_bars_smp_system& io_smp)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ // mark function entry
+ FAPI_DBG("proc_setup_bars_process_chips: Start");
+
+ // loop over all chips passed from platform to HWP
+ std::vector<proc_setup_bars_proc_chip>::iterator iter;
+ for (iter = i_proc_chips.begin();
+ iter != i_proc_chips.end();
+ iter++)
+ {
+ // process platform provided data in chip argument,
+ // query chip specific attributes
+ proc_setup_bars_smp_chip smp_chip;
+ rc = proc_setup_bars_process_chip(&(*iter),
+ smp_chip);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_process_chips: Error from proc_setup_bars_process_chip");
+ break;
+ }
+
+ // insert chip into SMP data structure given node & chip ID
+ rc = proc_setup_bars_insert_chip(smp_chip,
+ io_smp);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_process_chips: Error from proc_setup_bars_insert_chip");
+ break;
+ }
+ }
+
+ // mark function exit
+ FAPI_DBG("proc_setup_bars_process_chips: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: utility function to write HW BAR register given address range
+// structure and register definition structure
+// parameters: i_target => chip target
+// i_scom_addr => BAR SCOM address
+// i_bar_reg_def => structure defining rules to format address
+// range content into register layout
+// i_addr_range => structure defining BAR address range
+// (enable/base/size)
+// returns: FAPI_RC_SUCCESS if register write is successful,
+// RC_PROC_SETUP_BARS_INVALID_BAR_REG_DEF if BAR register definition
+// structure is invalid,
+// RC_PROC_SETUP_BARS_SIZE_XLATE_ERR if logical->physical size
+// translation is unsuccessful,
+// else failing return code from SCOM/data buffer manipulation
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_common_write_bar_reg(
+ const fapi::Target& i_target,
+ const uint32_t& i_scom_addr,
+ const proc_setup_bars_bar_reg_def& i_bar_reg_def,
+ const proc_setup_bars_addr_range& i_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+ // BAR register data buffer
+ ecmdDataBufferBase bar_data(64);
+ ecmdDataBufferBase bar_data_mask(64);
+ ecmdDataBufferBase size_data(64);
+ ecmdDataBufferBase static_data(64);
+ ecmdDataBufferBase static_data_mask(64);
+
+ FAPI_DBG("proc_setup_bars_common_write_bar_reg: Start");
+ do
+ {
+ // write base address
+ if (i_bar_reg_def.has_base)
+ {
+ // previous checking ensures zeroes for all non-implemented bits
+ rc_ecmd |= bar_data.setDoubleWord(0, i_addr_range.base_addr);
+ // shift position to proper location in register
+ if (i_bar_reg_def.base_shift == PROC_SETUP_BARS_SHIFT_LEFT)
+ {
+ rc_ecmd |= bar_data.shiftLeft(i_bar_reg_def.base_shift_amount);
+ }
+ else if (i_bar_reg_def.base_shift == PROC_SETUP_BARS_SHIFT_RIGHT)
+ {
+ rc_ecmd |= bar_data.shiftRight(i_bar_reg_def.base_shift_amount);
+ }
+ else if (i_bar_reg_def.base_shift != PROC_SETUP_BARS_SHIFT_NONE)
+ {
+ FAPI_ERR("proc_setup_bars_common_write_bar_reg: Invalid base shift value in register definition");
+ FAPI_SET_HWP_ERROR(
+ rc,
+ RC_PROC_SETUP_BARS_INVALID_BAR_REG_DEF);
+ break;
+ }
+ // set mask
+ rc_ecmd |= bar_data_mask.setBit(i_bar_reg_def.base_start_bit,
+ (i_bar_reg_def.base_end_bit -
+ i_bar_reg_def.base_start_bit + 1));
+ }
+
+ // write enable bit
+ if (i_bar_reg_def.has_enable)
+ {
+ rc_ecmd |= bar_data.writeBit(i_bar_reg_def.enable_bit,
+ i_addr_range.enabled ? 1 : 0);
+ rc_ecmd |= bar_data_mask.setBit(i_bar_reg_def.enable_bit);
+ }
+
+ // write size field
+ if (i_bar_reg_def.has_size)
+ {
+ // encoded size value for register programming
+ std::map<uint64_t, uint64_t>::const_iterator s;
+ uint64_t size_xlate;
+ // translate size into register encoding
+ s = i_bar_reg_def.xlate_map->find(i_addr_range.size);
+ if (s == i_bar_reg_def.xlate_map->end())
+ {
+ FAPI_ERR("proc_setup_bars_common_write_bar_reg: Unsupported BAR size 0x%016llX",
+ i_addr_range.size);
+ const uint64_t& SIZE = i_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SETUP_BARS_SIZE_XLATE_ERR);
+ break;
+ }
+ size_xlate = s->second;
+
+ rc_ecmd |= size_data.setDoubleWord(0, size_xlate);
+ rc_ecmd |= size_data.shiftLeft(63 - i_bar_reg_def.size_end_bit);
+ rc_ecmd |= bar_data.merge(size_data);
+ rc_ecmd |= bar_data_mask.setBit(i_bar_reg_def.size_start_bit,
+ (i_bar_reg_def.size_end_bit -
+ i_bar_reg_def.size_start_bit + 1));
+ }
+
+ // merge static data & mask
+ rc_ecmd |= static_data.setDoubleWord(
+ 0,
+ i_bar_reg_def.static_data);
+ rc_ecmd |= static_data_mask.setDoubleWord(
+ 0,
+ i_bar_reg_def.static_data_mask);
+
+ rc_ecmd |= bar_data.merge(static_data);
+ rc_ecmd |= bar_data_mask.merge(static_data_mask);
+
+ // check buffer manipulation return codes
+ if (rc_ecmd)
+ {
+ FAPI_ERR("proc_setup_bars_common_write_bar_reg: Error 0x%X setting up BAR data buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+
+ // write BAR register with updated content
+ rc = fapiPutScomUnderMask(i_target,
+ i_scom_addr,
+ bar_data,
+ bar_data_mask);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_common_f_scope_write_bar_reg: fapiPutScomUnderMask error (%08X)",
+ i_scom_addr);
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_common_write_bar_reg: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: write L3 BAR attributes (consumed by winkle image creation
+// procedures) specific to enabled local chip
+// non-mirrored/mirrored memory ranges
+// parameters: i_target => chip target
+// i_is_non_mirrored_range => boolean idenitfying range type
+// (true=non-mirrored, false=mirrored)
+// i_addr_range => structure representing chip
+// non-mirrored/mirrored range
+// returns: FAPI_RC_SUCCESS if attribute writes are successful,
+// RC_PROC_SETUP_BARS_SIZE_XLATE_ERR if logical->physical size
+// translation is unsuccessful,
+// else failing return code from attribute/data buffer manipulation
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_l3_write_local_chip_memory_bar_attr(
+ const fapi::Target* i_target,
+ const bool& i_is_non_mirrored_range,
+ const proc_setup_bars_addr_range& i_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+ // BAR1 register data buffer
+ ecmdDataBufferBase bar_data(64);
+ ecmdDataBufferBase bar_size_data(64);
+ uint64_t bar_attr_data;
+
+ FAPI_DBG("proc_setup_bars_l3_write_local_chip_memory_bar_attr: Start");
+ do
+ {
+ // previous checking ensures zeroes for all non-implemented bits
+ rc_ecmd |= bar_data.setDoubleWord(0, i_addr_range.base_addr);
+ rc_ecmd |= bar_data.shiftLeft(L3_BAR12_BASE_ADDR_LEFT_SHIFT_AMOUNT);
+
+ // encoded size value for register programming
+ std::map<uint64_t, uint64_t>::const_iterator s;
+ uint64_t size_xlate;
+ // translate size into register encoding
+ s = proc_setup_bars_nf_bar_size::xlate_map.find(i_addr_range.size);
+ if (s == proc_setup_bars_nf_bar_size::xlate_map.end())
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_chip_memory_bar_attr: Unsupported BAR size 0x%016llX",
+ i_addr_range.size);
+ const uint64_t& SIZE = i_addr_range.size;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SETUP_BARS_SIZE_XLATE_ERR);
+ break;
+ }
+ size_xlate = s->second;
+ rc_ecmd |= bar_size_data.setDoubleWord(0, size_xlate);
+ rc_ecmd |= bar_size_data.shiftLeft(63 - L3_BAR12_SIZE_END_BIT);
+ rc_ecmd |= bar_data.merge(bar_size_data);
+
+ // enable bit only in BAR2
+ if (!i_is_non_mirrored_range)
+ {
+ rc_ecmd |= bar_data.writeBit(L3_BAR2_ENABLE_BIT,
+ i_addr_range.enabled ? 1 : 0);
+ }
+
+ // check buffer manipulation return codes
+ if (rc_ecmd)
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_chip_memory_bar_attr: Error 0x%X setting up BAR data buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+
+ // set data for attribute push
+ bar_attr_data = bar_data.getDoubleWord(0);
+
+ if (i_is_non_mirrored_range)
+ {
+ // L3 BAR1 (non-mirrored)
+ FAPI_DBG("proc_setup_bars_l3_write_local_chip_memory_bar_attr: Setting ATTR_PROC_L3_BAR1_REG = %016llX",
+ bar_attr_data);
+ rc = FAPI_ATTR_SET(ATTR_PROC_L3_BAR1_REG,
+ i_target,
+ bar_attr_data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_chip_memory_bar_attr: Error setting ATTR_PROC_L3_BAR1_REG");
+ break;
+ }
+ }
+ else
+ {
+ // L3 BAR2 (mirrored)
+ FAPI_DBG("proc_setup_bars_l3_write_local_chip_memory_bar_attr: Setting ATTR_PROC_L3_BAR2_REG = %016llX",
+ bar_attr_data);
+ rc = FAPI_ATTR_SET(ATTR_PROC_L3_BAR2_REG,
+ i_target,
+ bar_attr_data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_chip_memory_bar_attr: Error setting ATTR_PROC_L3_BAR2_REG");
+ break;
+ }
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_l3_write_local_chip_memory_bar_attr: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write PCIe BARs specific to enabled local
+// chip non-mirrored/mirrored memory ranges
+// parameters: i_target => chip target
+// i_non_mirrored_range => structure representing chip non-mirrored
+// address range
+// i_mirrored_range => structure representing chip mirrored
+// address range
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_pcie_write_local_chip_memory_bars(
+ const fapi::Target& i_target,
+ const proc_setup_bars_addr_range& i_non_mirrored_range,
+ const proc_setup_bars_addr_range& i_mirrored_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_pcie_write_local_chip_memory_bars: Start");
+ // loop over all units
+ for (uint8_t u = 0;
+ u < PROC_SETUP_BARS_PCIE_NUM_UNITS;
+ u++)
+ {
+ if (i_non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_pcie_write_local_chip_memory_bars: Writing PCIe %d Nodal Non-Mirrored BAR register",
+ u);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_CHIP_NON_MIRRORED_BAR[u],
+ common_nf_scope_bar_reg_def,
+ i_non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_local_chip_memory_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ if (i_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_pcie_write_local_chip_memory_bars: Writing PCIe %d Nodal Mirrored BAR register",
+ u);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_CHIP_MIRRORED_BAR[u],
+ common_nf_scope_bar_reg_def,
+ i_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_local_chip_memory_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ }
+
+ FAPI_DBG("proc_setup_bars_pcie_write_local_chip_memory_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: write L3 BAR attributes (consumed by winkle image creation
+// procedures) specific to enabled local node
+// non-mirrored/mirrored memory ranges
+// parameters: i_target => chip target
+// i_is_non_mirrored_range => boolean idenitfying range type
+// (true=non-mirrored, false=mirrored)
+// i_node_addr_range => structure representing node
+// non-mirrored/mirrored range
+// i_chip_addr_range => structure representing chip
+// non-mirrored/mirrored range
+// returns: FAPI_RC_SUCCESS if attribute writes are successful,
+// else failing return code from attribute/data buffer manipulation
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_l3_write_local_node_memory_bar_attr(
+ const fapi::Target* i_target,
+ const bool& i_is_non_mirrored_range,
+ const proc_setup_bars_addr_range& i_node_addr_range,
+ const proc_setup_bars_addr_range& i_chip_addr_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+ ecmdDataBufferBase base(64);
+ ecmdDataBufferBase diff(64);
+ ecmdDataBufferBase mask(64);
+ uint64_t mask_attr = 0x0;
+
+ FAPI_DBG("proc_setup_bars_l3_write_local_node_memory_bar_attr: Start");
+
+ do
+ {
+ // retrieve mask register attribute
+ rc = FAPI_ATTR_GET(ATTR_PROC_L3_BAR_GROUP_MASK_REG,
+ i_target,
+ mask_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_node_memory_bar_attr: Error querying ATTR_PROC_L3_BAR_GROUP_MASK_REG");
+ break;
+ }
+ FAPI_DBG("proc_setup_bars_l3_write_local_node_memory_bar_attr: Read ATTR_PROC_L3_BAR_GROUP_MASK_REG = %016llX",
+ mask_attr);
+ // push current value into data buffer
+ rc_ecmd |= mask.setDoubleWord(0, mask_attr);
+
+ // set group mask based on first difference between
+ // node start/end addresses
+ uint32_t first_diff_bit = 0;
+ // load base address
+ rc_ecmd |= base.setDoubleWord(0, i_node_addr_range.base_addr);
+ // load end address
+ rc_ecmd |= diff.setDoubleWord(0, i_node_addr_range.end_addr());
+ // XOR base/end address
+ rc_ecmd |= diff.setXor(base, 0, 64);
+
+ // walk range of XOR result over group mask, stop at first 1 found
+ bool match_found = false;
+ for (first_diff_bit = L3_BAR_GROUP_MASK_RA_DIFF_START_BIT;
+ first_diff_bit <= L3_BAR_GROUP_MASK_RA_DIFF_END_BIT;
+ first_diff_bit++)
+ {
+ if (diff.getBit(first_diff_bit))
+ {
+ match_found = true;
+ break;
+ }
+ }
+
+ if (match_found)
+ {
+ // set all group mask bits to a 1, starting from first bit which
+ // was found to be different, to the end of the mask range
+ uint32_t mask_set_start_bit = (i_is_non_mirrored_range)?
+ L3_BAR_GROUP_MASK_NON_MIRROR_MASK_START_BIT:
+ L3_BAR_GROUP_MASK_MIRROR_MASK_START_BIT;
+
+ mask_set_start_bit += (first_diff_bit-
+ L3_BAR_GROUP_MASK_RA_DIFF_START_BIT);
+
+ uint32_t mask_set_num_bits = (i_is_non_mirrored_range)?
+ L3_BAR_GROUP_MASK_NON_MIRROR_MASK_END_BIT:
+ L3_BAR_GROUP_MASK_MIRROR_MASK_END_BIT;
+
+ mask_set_num_bits -= (mask_set_start_bit-1);
+
+ rc_ecmd |= mask.setBit(mask_set_start_bit,
+ mask_set_num_bits);
+ }
+
+ // enable bit only for mirorred region
+ if (!i_is_non_mirrored_range)
+ {
+ rc_ecmd |= mask.writeBit(L3_BAR_GROUP_MASK_MIRROR_ENABLE_BIT,
+ i_node_addr_range.enabled ? 1 : 0);
+ }
+
+ // check buffer manipulation return codes
+ if (rc_ecmd)
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_node_memory_bar_attr: Error 0x%X setting up BAR mask data buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+
+ // push current data buffer state back into attribute
+ mask_attr = mask.getDoubleWord(0);
+ FAPI_DBG("proc_setup_bars_l3_write_local_node_memory_bar_attr: Setting ATTR_PROC_L3_BAR_GROUP_MASK_REG = %016llX",
+ mask_attr);
+ rc = FAPI_ATTR_SET(ATTR_PROC_L3_BAR_GROUP_MASK_REG,
+ i_target,
+ mask_attr);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_node_memory_bar_attr: Error setting ATTR_PROC_L3_BAR_GROUP_MASK_REG");
+ break;
+ }
+
+ // if no memory is installed on the local chip, fill the shared
+ // BAR address with the node base
+ if (!i_chip_addr_range.enabled)
+ {
+ // clear size mask
+ proc_setup_bars_addr_range base_addr_range = i_node_addr_range;
+ base_addr_range.size = PROC_SETUP_BARS_SIZE_4_GB;
+
+ rc = proc_setup_bars_l3_write_local_chip_memory_bar_attr(
+ i_target,
+ i_is_non_mirrored_range,
+ base_addr_range);
+
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_l3_write_local_node_memory_bar_attr: Error from proc_setup_bars_l3_write_local_chip_memory_bar_attr");
+ break;
+ }
+ }
+ } while(0);
+
+
+ FAPI_DBG("proc_setup_bars_l3_write_local_node_memory_bar_attr: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write PCIe BARs specific to enabled local
+// node non-mirrored/mirrored memory ranges
+// parameters: i_target => chip target
+// i_non_mirrored_range => structure representing node non-mirrored
+// address range
+// i_mirrored_range => structure representing node mirrored
+// address range
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_pcie_write_local_node_memory_bars(
+ const fapi::Target& i_target,
+ const proc_setup_bars_addr_range& i_non_mirrored_range,
+ const proc_setup_bars_addr_range& i_mirrored_range)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_pcie_write_local_node_memory_bars: Start");
+ // loop over all units
+ for (uint8_t u = 0;
+ u < PROC_SETUP_BARS_PCIE_NUM_UNITS;
+ u++)
+ {
+ if (i_non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_pcie_write_local_node_memory_bars: Writing PCIe %d Group Non-Mirrored BAR register",
+ u);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_NODE_NON_MIRRORED_BAR[u],
+ common_nf_scope_bar_reg_def,
+ i_non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_local_node_memory_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ if (i_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_pcie_write_local_node_memory_bars: Writing PCIe %d Group Mirrored BAR register",
+ u);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_NODE_MIRRORED_BAR[u],
+ common_nf_scope_bar_reg_def,
+ i_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_local_node_memory_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ }
+
+ FAPI_DBG("proc_setup_bars_pcie_write_local_node_memory_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write PCIe BARs specific to enabled local
+// chip near/far foreign memory ranges
+// NOTE: only links which are marked for processing will be acted on
+// parameters: i_target => chip target
+// i_process_links => array of boolean values dictating which
+// links should be acted on (one per link)
+// i_foreign_near_ranges => array of structures representing
+// near foreign address range (one per link)
+// i_foreign_far_ranges => array of structures representing
+// far foreign address range (one per link)
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_pcie_write_foreign_memory_bars(
+ const fapi::Target& i_target,
+ const bool i_process_links[PROC_FAB_SMP_NUM_F_LINKS],
+ const proc_setup_bars_addr_range i_foreign_near_ranges[PROC_FAB_SMP_NUM_F_LINKS],
+ const proc_setup_bars_addr_range i_foreign_far_ranges[PROC_FAB_SMP_NUM_F_LINKS])
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_pcie_write_foreign_memory_bars: Start");
+
+ // loop over all units
+ for (uint8_t u = 0;
+ (u < PROC_SETUP_BARS_PCIE_NUM_UNITS) && (rc.ok());
+ u++)
+ {
+ // process ranges
+ for (uint8_t r = 0;
+ (r < PROC_FAB_SMP_NUM_F_LINKS) && (rc.ok());
+ r++)
+ {
+ if (i_foreign_near_ranges[r].enabled && i_process_links[r])
+ {
+ FAPI_DBG("proc_setup_bars_pcie_write_foreign_memory_bars: Writing PCIe %d Foreign F%d Near BAR register",
+ u, r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_FOREIGN_NEAR_BAR[u][r],
+ common_f_scope_bar_reg_def,
+ i_foreign_near_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_foreign_memory_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ if (i_foreign_far_ranges[r].enabled && i_process_links[r])
+ {
+ FAPI_DBG("proc_setup_bars_pcie_write_foreign_memory_bars: Writing PCIe %d Foreign F%d Far BAR register",
+ u, r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_FOREIGN_FAR_BAR[u][r],
+ common_f_scope_bar_reg_def,
+ i_foreign_far_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_foreign_memory_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ }
+ }
+
+ FAPI_DBG("proc_setup_bars_pcie_write_foreign_memory_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write enabled PCIe IO BARs
+// parameters: i_target => chip target
+// io_addr_ranges => 2D array of address range structures
+// encapsulating attribute values
+// (first dimension = unit, second dimension =
+// links per unit)
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function or
+// data buffer manipulation
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars_pcie_write_io_bar_regs(
+ const fapi::Target& i_target,
+ const proc_setup_bars_addr_range addr_ranges[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT])
+{
+ // return code
+ fapi::ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+
+ FAPI_DBG("proc_setup_bars_pcie_write_io_bar_regs: Start");
+ // loop over all units
+ for (uint8_t u = 0;
+ u < PROC_SETUP_BARS_PCIE_NUM_UNITS;
+ u++)
+ {
+ // enable bit/mask bit per range
+ ecmdDataBufferBase enable_data(64);
+ ecmdDataBufferBase enable_mask(64);
+
+ // loop over all ranges
+ for (uint8_t r = 0;
+ r < PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT;
+ r++)
+ {
+ if (addr_ranges[u][r].enabled)
+ {
+ // MMIO range (BAR + mask)
+ if (PROC_SETUP_BARS_PCIE_RANGE_TYPE_MMIO[r])
+ {
+ // write BAR register
+ FAPI_DBG("proc_setup_bars_pcie_write_io_bar_regs: Writing PCIe %d MMIO BAR%d register",
+ u, r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_BAR_REGS_MMIO[u][r],
+ pcie_mmio_bar_reg_def,
+ addr_ranges[u][r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_io_bar_regs: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // write BAR mask register
+ FAPI_DBG("proc_setup_bars_pcie_write_io_bar_regs: Writing PCIe %d MMIO BAR%d Mask register",
+ u, r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_BAR_MASK_REGS_MMIO[u][r],
+ pcie_mmio_bar_mask_reg_def,
+ addr_ranges[u][r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_io_bar_regs: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ // PHB range (only BAR, mask is implied)
+ else
+ {
+ for (uint8_t i = 0;
+ i < PROC_SETUP_BARS_PCIE_REGS_PER_PHB_RANGE;
+ i++)
+ {
+ FAPI_DBG("proc_setup_bars_pcie_write_io_bar_regs: Writing PCIe %d PHB BAR (%s) register",
+ u, (i == 0)?("Nest"):("PCIe"));
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_BAR_REGS_PHB[u][i],
+ pcie_phb_bar_reg_def,
+ addr_ranges[u][r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_io_bar_regs: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ }
+ // set enable bit data/mask
+ rc_ecmd |= enable_data.setBit(
+ PROC_SETUP_BARS_PCIE_BAR_EN_BIT[r]);
+ rc_ecmd |= enable_mask.setBit(
+ PROC_SETUP_BARS_PCIE_BAR_EN_BIT[r]);
+ // check buffer manipulation return codes
+ if (rc_ecmd)
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_io_bar_regs: Error 0x%X setting up BAR Enable data buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ }
+ }
+ if (!rc.ok())
+ {
+ break;
+ }
+
+ if (enable_data.getDoubleWord(0) != 0x0ULL)
+ {
+ // set static data field with BAR enable bits
+ proc_setup_bars_bar_reg_def pcie_bar_en_reg_def =
+ {
+ false, // base: other reg
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 0,
+ 0,
+ false, // enable: static data
+ 0,
+ false, // size: other reg
+ 0,
+ 0,
+ NULL,
+ enable_data.getDoubleWord(0),
+ enable_mask.getDoubleWord(0)
+ };
+ proc_setup_bars_addr_range pcie_bar_en_dummy_range;
+
+ // write BAR enable register (do last, when all unit BAR content is set)
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_target,
+ PROC_SETUP_BARS_PCIE_BAR_EN_REGS[u],
+ pcie_bar_en_reg_def,
+ pcie_bar_en_dummy_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_pcie_write_io_bar_regs: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ }
+
+ FAPI_DBG("proc_setup_bars_pcie_write_io_bar_regs: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write all BARs tied to local chip region
+// (non-mirrored/mirrored/MMIO regions)
+// parameters: i_smp_chip => structure encapsulating single chip in SMP topology
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function
+//------------------------------------------------------------------------------
+//
+// Local chip region BARs:
+//
+// PSI/FSP
+// PSI Bridge BAR (PSI_BRIDGE_BAR_0x0201090A)
+// FSP BAR (PSI_FSP_BAR_0x0201090B)
+// FSP Memory Mask (PSI_FSP_MMR_0x0201090C)
+// FSP MMIO Mask (PSI_BRIDGE_STATUS_CTL_0x0201090E)
+//
+// INTP
+// INTP BAR (ICP_BAR_0x020109CA)
+//
+// L3 (transmitted via attributes)
+// L3 BAR1 (Non-Mirrored) (EX_L3_BAR1_0x1001080B)
+// L3 BAR2 (Mirrored) (EX_L3_BAR2_0x10010813)
+//
+// NX
+// NX MMIO BAR (NX_MMIO_BAR_0x0201308D)
+// NX APC Nodal Non-Mirrored BAR (NX_APC_NODAL_BAR0_0x0201302D)
+// NX Nodal Non-Mirrored BAR (NX_NODAL_BAR0_0x02013095)
+// NX APC Nodal Mirrored BAR (NX_APC_NODAL_BAR1_0x0201302E)
+// NX Nodal Mirrored BAR (NX_NODAL_BAR1_0x02013096)
+//
+// MCD
+// MCD Configuration 0 (Non-Mirrored) (MCD_CN00_0x0201340C)
+// MCD Configuration 1 (Mirrored) (MCD_CN01_0x0201340D)
+//
+// PCIe
+// PCIE0 Nodal Non-Mirrored BAR (PCIE0_NODAL_BAR0_0x02012010)
+// PCIE0 Nodal Mirrored BAR (PCIE0_NODAL_BAR1_0x02012011)
+// PCIE0 IO BAR0 (PCIE0_IO_BAR0_0x02012040)
+// PCIE0 IO BAR0 Mask (PCIE0_IO_MASK0_0x02012043)
+// PCIE0 IO BAR1 (PCIE0_IO_BAR1_0x02012041)
+// PCIE0 IO BAR1 Mask (PCIE0_IO_MASK1_0x02012044)
+// PCIE0 IO BAR2 (PCIE0_IO_BAR2_0x02012042)
+// PCIE0 IO BAR Enable (PCIE0_IO_BAR_EN_0x02012045)
+//
+// PCIE1 Nodal Non-Mirrored BAR (PCIE1_NODAL_BAR0_0x02012410)
+// PCIE1 Nodal Mirrored BAR (PCIE1_NODAL_BAR1_0x02012411)
+// PCIE1_IO BAR0 (PCIE1_IO_BAR0_0x02012440)
+// PCIE1_IO BAR0 Mask (PCIE1_IO_MASK0_0x02012443)
+// PCIE1_IO BAR1 (PCIE1_IO_BAR1_0x02012441)
+// PCIE1_IO BAR1 Mask (PCIE1_IO_MASK1_0x02012444)
+// PCIE1_IO BAR2 (PCIE1_IO_BAR2_0x02012442)
+// PCIE1_IO BAR Enable (PCIE1_IO_BAR_EN_0x02012445)
+//
+// PCIE2 Nodal Non-Mirrored BAR (PCIE2_NODAL_BAR0_0x02012810)
+// PCIE2 Nodal Mirrored BAR (PCIE2_NODAL_BAR1_0x02012811)
+// PCIE2 IO BAR0 (PCIE2_IO_BAR0_0x02012840)
+// PCIE2 IO BAR0 Mask (PCIE2_IO_MASK0_0x02012843)
+// PCIE2 IO BAR1 (PCIE2_IO_BAR1_0x02012841)
+// PCIE2 IO BAR1 Mask (PCIE2_IO_MASK1_0x02012844)
+// PCIE2 IO BAR2 (PCIE2_IO_BAR2_0x02012842)
+// PCIE2 IO BAR Enable (PCIE2_IO_BAR_EN_0x02012845)
+//
+//------------------------------------------------------------------------------
+fapi::ReturnCode
+proc_setup_bars_write_local_chip_region_bars(
+ proc_setup_bars_smp_chip& i_smp_chip)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Start");
+
+ do
+ {
+ // PSI
+ if (i_smp_chip.psi_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing PSI Bridge BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PSI_BRIDGE_BAR_0x0201090A,
+ psi_bridge_bar_reg_def,
+ i_smp_chip.psi_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // FSP
+ if (i_smp_chip.fsp_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing FSP BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PSI_FSP_BAR_0x0201090B,
+ fsp_bar_reg_def,
+ i_smp_chip.fsp_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing FSP Memory Mask register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PSI_FSP_MMR_0x0201090C,
+ fsp_bar_mask_reg_def,
+ i_smp_chip.fsp_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing PSI Bridge Status Control register (FSP BAR enable)");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PSI_BRIDGE_STATUS_CTL_0x0201090E,
+ fsp_bar_en_reg_def,
+ i_smp_chip.fsp_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ if (i_smp_chip.fsp_mmio_mask_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing PSI Bridge Status Control register (FSP MMIO mask)");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PSI_BRIDGE_STATUS_CTL_0x0201090E,
+ fsp_mmio_mask_reg_def,
+ i_smp_chip.fsp_mmio_mask_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ }
+
+ // INTP
+ if (i_smp_chip.intp_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing INTP BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ ICP_BAR_0x020109CA,
+ intp_bar_reg_def,
+ i_smp_chip.intp_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // NX (MMIO)
+ if (i_smp_chip.nx_mmio_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing NX MMIO BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_MMIO_BAR_0x0201308D,
+ nx_mmio_bar_reg_def,
+ i_smp_chip.nx_mmio_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // NX (non-mirrored)
+ if (i_smp_chip.non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing NX APC Nodal Non-Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_APC_NODAL_BAR0_0x0201302D,
+ common_nf_scope_bar_reg_def,
+ i_smp_chip.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing NX Nodal Non-Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_NODAL_BAR0_0x02013095,
+ common_nf_scope_bar_reg_def,
+ i_smp_chip.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // NX (mirrored)
+ if (i_smp_chip.mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing NX APC Nodal Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_APC_NODAL_BAR1_0x0201302E,
+ common_nf_scope_bar_reg_def,
+ i_smp_chip.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing NX Nodal Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_NODAL_BAR1_0x02013096,
+ common_nf_scope_bar_reg_def,
+ i_smp_chip.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // MCD (non-mirrored)
+ // TODO: potential optimization if DSMP links are known to be disabled?
+ if (i_smp_chip.non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing MCD Configuration 0 (Non-Mirrored) register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ MCD_CN00_0x0201340C,
+ mcd_nf_bar_reg_def,
+ i_smp_chip.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // MCD (mirrored)
+ // TODO: potential optimization if DSMP links are known to be disabled?
+ if (i_smp_chip.mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing MCD Configuration 1 (Mirrored) register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ MCD_CN01_0x0201340D,
+ mcd_nf_bar_reg_def,
+ i_smp_chip.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // L3 (non-mirrored)
+ if (i_smp_chip.non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing L3 BAR1 (Non-Mirrored) attribute");
+ rc = proc_setup_bars_l3_write_local_chip_memory_bar_attr(
+ &(i_smp_chip.chip->this_chip),
+ true,
+ i_smp_chip.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_l3_write_local_chip_memory_bar_attr");
+ break;
+ }
+ }
+
+ // L3 (mirrored)
+ if (i_smp_chip.mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: Writing L3 BAR2 (Mirrored) attribute");
+ rc = proc_setup_bars_l3_write_local_chip_memory_bar_attr(
+ &(i_smp_chip.chip->this_chip),
+ false,
+ i_smp_chip.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_l3_write_local_chip_memory_bar_attr");
+ break;
+ }
+ }
+
+ // PCIe (non-mirrored/mirrored)
+ rc = proc_setup_bars_pcie_write_local_chip_memory_bars(
+ i_smp_chip.chip->this_chip,
+ i_smp_chip.non_mirrored_range,
+ i_smp_chip.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_pcie_write_local_chip_memory_bars");
+ break;
+ }
+
+ // PCIe (IO)
+ rc = proc_setup_bars_pcie_write_io_bar_regs(
+ i_smp_chip.chip->this_chip,
+ i_smp_chip.pcie_ranges);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_pcie_write_io_bar_regs");
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_write_local_chip_region_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write all BARs tied to local node region
+// (non-mirrored/mirrored regions)
+// parameters: i_smp_chip => structure encapsulating single chip in SMP topology
+// i_smp_node => structure encapsulating node which this chip
+// resides in
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function
+//------------------------------------------------------------------------------
+//
+// Local node region BARs:
+//
+// L3 (transmitted via attributes)
+// L3 BAR Group Mask (EX_L3_BAR_GROUP_MASK_0x10010816)
+//
+// NX
+// NX APC Group Non-Mirorred BAR (NX_APC_GROUP_BAR0_0x0201302F)
+// NX Group Non-Mirorred BAR (NX_GROUP_BAR0_0x02013097)
+// NX APC Group Mirrored BAR (NX_APC_GROUP_BAR1_0x02013030)
+// NX Group Mirrored BAR (NX_GROUP_BAR1_0x02013098)
+//
+// PCIe
+// PCIE0 Group Non-Mirrored BAR (PCIE0_GROUP_BAR0_0x02012012)
+// PCIE0 Group Mirrored BAR (PCIE0_GROUP_BAR1_0x02012013)
+//
+// PCIE1 Group Non-Mirrored BAR (PCIE1_GROUP_BAR0_0x02012412)
+// PCIE1 Group Mirrored BAR (PCIE1_GROUP_BAR1_0x02012413)
+//
+// PCIE2 Group Non-Mirrored BAR (PCIE2_GROUP_BAR0_0x02012812)
+// PCIE2 Group Mirrored BAR (PCIE2_GROUP_BAR1_0x02012813)
+//
+//------------------------------------------------------------------------------
+fapi::ReturnCode
+proc_setup_bars_write_local_node_region_bars(
+ proc_setup_bars_smp_chip& i_smp_chip,
+ proc_setup_bars_smp_node& i_smp_node)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_write_local_node_region_bars: Start");
+
+ do
+ {
+ // NX (non-mirrored)
+ if (i_smp_node.non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_node_region_bars: Writing NX APC Group Non-Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_APC_GROUP_BAR0_0x0201302F,
+ common_nf_scope_bar_reg_def,
+ i_smp_node.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_write_local_node_region_bars: Writing NX Group Non-Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_GROUP_BAR0_0x02013097,
+ common_nf_scope_bar_reg_def,
+ i_smp_node.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // NX (mirrored)
+ if (i_smp_node.mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_local_node_region_bars: Writing NX APC Group Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_APC_GROUP_BAR1_0x02013030,
+ common_nf_scope_bar_reg_def,
+ i_smp_node.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ FAPI_DBG("proc_setup_bars_write_local_node_region_bars: Writing NX Group Mirrored BAR register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ NX_GROUP_BAR1_0x02013098,
+ common_nf_scope_bar_reg_def,
+ i_smp_node.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // L3 (non-mirrored)
+ if (i_smp_node.non_mirrored_range.enabled)
+ {
+ rc = proc_setup_bars_l3_write_local_node_memory_bar_attr(
+ &(i_smp_chip.chip->this_chip),
+ true,
+ i_smp_node.non_mirrored_range,
+ i_smp_chip.non_mirrored_range);
+
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_node_region_bars: Error from proc_setup_bars_l3_write_local_node_memory_bar_attr");
+ break;
+ }
+ }
+
+ // L3 (mirrored)
+ if (i_smp_node.mirrored_range.enabled)
+ {
+ rc = proc_setup_bars_l3_write_local_node_memory_bar_attr(
+ &(i_smp_chip.chip->this_chip),
+ false,
+ i_smp_node.mirrored_range,
+ i_smp_chip.mirrored_range);
+
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_node_region_bars: Error from proc_setup_bars_l3_write_local_node_memory_bar_attr");
+ break;
+ }
+ }
+
+ // PCIe (non-mirrored/mirrored)
+ rc = proc_setup_bars_pcie_write_local_node_memory_bars(
+ i_smp_chip.chip->this_chip,
+ i_smp_node.non_mirrored_range,
+ i_smp_node.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_node_region_bars: Error from proc_setup_bars_pcie_write_local_node_memory_bars");
+ break;
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_write_local_node_region_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write all BARs tied to remote node regions
+// (non-mirrored/mirrored regions)
+// parameters: i_smp_chip => structure encapsulating single chip in SMP
+// topology
+// i_smp_node_a0 => structure encapsulating node reachable from
+// A0 link on this chip
+// i_smp_node_a1 => structure encapsulating node reachable from
+// A1 link on this chip
+// i_smp_node_a2 => structure encapsulating node reachable from
+// A2 link on this chip
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function
+//------------------------------------------------------------------------------
+//
+// Remote node region BARs:
+//
+// PB
+// PB Remote Group (A0) Non-Mirrored BAR (PB_RGMCFG00_0x02010C58)
+// PB Remote Group (A0) Mirrored BAR (PB_RGMCFGM00_0x02010C5B)
+// PB Remote Group (A1) Non-Mirrored BAR (PB_RGMCFG01_0x02010C59)
+// PB Remote Group (A1) Mirrored BAR (PB_RGMCFGM01_0x02010C5C)
+// PB Remote Group (A2) Non-Mirrored BAR (PB_RGMCFG10_0x02010C5A)
+// PB Remote Group (A2) Mirrored BAR (PB_RGMCFGM10_0x02010C5D)
+//
+//------------------------------------------------------------------------------
+fapi::ReturnCode
+proc_setup_bars_write_remote_node_region_bars(
+ proc_setup_bars_smp_chip& i_smp_chip,
+ proc_setup_bars_smp_node& i_smp_node_a0,
+ proc_setup_bars_smp_node& i_smp_node_a1,
+ proc_setup_bars_smp_node& i_smp_node_a2)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: Start");
+
+ do
+ {
+ // A0 (non-mirrored)
+ if (i_smp_node_a0.non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: Writing PB Remote Group (A0) Non-Mirrored Configuration register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PB_RGMCFG00_0x02010C58,
+ common_nf_scope_bar_reg_def,
+ i_smp_node_a0.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_remote_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // A0 (mirrored)
+ if (i_smp_node_a0.mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: Writing PB Remote Group (A0) Mirrored Configuration register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PB_RGMCFGM00_0x02010C5B,
+ common_nf_scope_bar_reg_def,
+ i_smp_node_a0.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_remote_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // A1 (non-mirrored)
+ if (i_smp_node_a1.non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: Writing PB Remote Group (A1) Non-Mirrored Configuration register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PB_RGMCFG01_0x02010C59,
+ common_nf_scope_bar_reg_def,
+ i_smp_node_a1.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_remote_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // A1 (mirrored)
+ if (i_smp_node_a1.mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: Writing PB Remote Group (A1) Mirrored Configuration register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PB_RGMCFGM01_0x02010C5C,
+ common_nf_scope_bar_reg_def,
+ i_smp_node_a1.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_remote_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // A2 (non-mirrored)
+ if (i_smp_node_a2.non_mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: Writing PB Remote Group (A2) Non-Mirrored Configuration register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PB_RGMCFG10_0x02010C5A,
+ common_nf_scope_bar_reg_def,
+ i_smp_node_a2.non_mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_remote_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // A2 (mirrored)
+ if (i_smp_node_a2.mirrored_range.enabled)
+ {
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: Writing PB Remote Group (A2) Mirrored Configuration register");
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ PB_RGMCFGM10_0x02010C5D,
+ common_nf_scope_bar_reg_def,
+ i_smp_node_a2.mirrored_range);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_remote_node_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_write_remote_node_region_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write all BARs tied to local chip foreign
+// regions (near/far)
+// parameters: i_smp_chip => structure encapsulating single chip in SMP
+// topology
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from common BAR write function
+//------------------------------------------------------------------------------
+//
+// Foreign region BARs:
+//
+// PB
+// PB F0 Near BAR (West) (PB_FLMCFG0_WEST_0x02010C12)
+// PB F0 Near BAR (Center) (PB_FLMCFG0_CENT_0x02010C5E)
+// PB F0 Near BAR (East) (PB_FLMCFG0_EAST_0x02010C92)
+// PB F0 Far BAR (West) (PB_FRMCFG0_WEST_0x02010C14)
+// PB F0 Far BAR (Center) (PB_FRMCFG0_CENT_0x02010C60)
+// PB F0 Far BAR (East) (PB_FRMCFG0_EAST_0x02010C94)
+// PB F1 Near BAR (West) (PB_FLMCFG1_WEST_0x02010C13)
+// PB F1 Near BAR (Center) (PB_FLMCFG1_CENT_0x02010C5F)
+// PB F1 Near BAR (East) (PB_FLMCFG1_EAST_0x02010C93)
+// PB F1 Far BAR (West) (PB_FRMCFG1_WEST_0x02010C15)
+// PB F1 Far BAR (Center) (PB_FRMCFG1_CENT_0x02010C61)
+// PB F1 Far BAR (East) (PB_FRMCFG1_EAST_0x02010C95)
+//
+// NX
+// NX APC F0 Near BAR (NX_APC_NEAR_BAR_F0_0x02013031)
+// NX APC F0 Far BAR (NX_APC_FAR_BAR_F0_0x02013032)
+// NX APC F1 Near BAR (NX_APC_NEAR_BAR_F1_0x02013033)
+// NX APC F1 Far BAR (NX_APC_FAR_BAR_F1_0x02013034)
+// NX F0 Near BAR (NX_NEAR_BAR_F0_0x02013099)
+// NX F0 Far BAR (NX_FAR_BAR_F0_0x0201309A)
+// NX F1 Near BAR (NX_NEAR_BAR_F1_0x0201309B)
+// NX F1 Far BAR (NX_FAR_BAR_F1_0x0201309C)
+//
+// MCD
+// MCD Configuration 2 (F0) (MCD_CN10_0x0201340E)
+// MCD Configuration 3 (F1) (MCD_CN11_0x0201340F)
+//
+// PCIe
+// PCIE0 F0 Near BAR (PCIE0_NEAR_BAR_F0_0x02012014)
+// PCIE0 F0 Far BAR (PCIE0_FAR_BAR_F0_0x02012015)
+// PCIE0 F1 Near BAR (PCIE0_NEAR_BAR_F1_0x02012016)
+// PCIE0 F1 Far BAR (PCIE0_FAR_BAR_F1_0x02012017)
+//
+// PCIE1 F0 Near BAR (PCIE1_NEAR_BAR_F0_0x02012414)
+// PCIE1 F0 Far BAR (PCIE1_FAR_BAR_F0_0x02012415)
+// PCIE1 F1 Near BAR (PCIE1_NEAR_BAR_F1_0x02012416)
+// PCIE1 F1 Far BAR (PCIE1_FAR_BAR_F1_0x02012417)
+//
+// PCIE2 F0 Near BAR (PCIE2_NEAR_BAR_F0_0x02012484)
+// PCIE2 F0 Far BAR (PCIE2_FAR_BAR_F0_0x02012815)
+// PCIE2 F1 Near BAR (PCIE2_NEAR_BAR_F1_0x02012816)
+// PCIE2 F1 Far BAR (PCIE2_FAR_BAR_F1_0x02012817)
+//
+//------------------------------------------------------------------------------
+fapi::ReturnCode
+proc_setup_bars_write_foreign_region_bars(
+ proc_setup_bars_smp_chip& i_smp_chip)
+{
+ // return code
+ fapi::ReturnCode rc;
+
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Start");
+
+ do
+ {
+ bool process_links[PROC_FAB_SMP_NUM_F_LINKS] =
+ {
+ i_smp_chip.chip->process_f0,
+ i_smp_chip.chip->process_f1
+ };
+
+ // PCIe (near/far)
+ rc = proc_setup_bars_pcie_write_foreign_memory_bars(
+ i_smp_chip.chip->this_chip,
+ process_links,
+ i_smp_chip.foreign_near_ranges,
+ i_smp_chip.foreign_far_ranges);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_foreign_region_bars: Error from proc_setup_bars_pcie_write_foreign_memory_bars");
+ break;
+ }
+
+ // process ranges
+ for (uint8_t r = 0;
+ (r < PROC_FAB_SMP_NUM_F_LINKS) && (rc.ok());
+ r++)
+ {
+ // near
+ if (process_links[r] &&
+ i_smp_chip.foreign_near_ranges[r].enabled)
+ {
+ // PB (near, west)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing PB F%d Near BAR (West) register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ PB_FLMCFG0_WEST_0x02010C12:
+ PB_FLMCFG1_WEST_0x02010C13,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_near_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // PB (near, cent)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing PB F%d Near BAR (Center) register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ PB_FLMCFG0_CENT_0x02010C5E:
+ PB_FLMCFG1_CENT_0x02010C5F,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_near_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // PB (near, east)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing PB F%d Near BAR (East) register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ PB_FLMCFG0_EAST_0x02010C92:
+ PB_FLMCFG1_EAST_0x02010C93,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_near_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // NX APC (near)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing NX APC F%d Near BAR register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ NX_APC_NEAR_BAR_F0_0x02013031:
+ NX_APC_NEAR_BAR_F1_0x02013033,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_near_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // NX (near)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing NX F%d Near BAR register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ NX_NEAR_BAR_F0_0x02013099:
+ NX_NEAR_BAR_F1_0x0201309B,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_near_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // MCD (near only)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing MCD Configuration %d (F%d) register",
+ r+1, r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ MCD_CN10_0x0201340E:
+ MCD_CN11_0x0201340F,
+ (r == 0)?
+ mcd_f0_bar_reg_def:
+ mcd_f1_bar_reg_def,
+ i_smp_chip.foreign_near_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+
+ // far
+ if (process_links[r] &&
+ i_smp_chip.foreign_near_ranges[r].enabled)
+ {
+ // PB (far, west)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing PB F%d Far BAR (West) register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ PB_FRMCFG0_WEST_0x02010C14:
+ PB_FRMCFG1_WEST_0x02010C15,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_far_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // PB (far, center)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing PB F%d Far BAR (Center) register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ PB_FRMCFG0_CENT_0x02010C60:
+ PB_FRMCFG1_CENT_0x02010C61,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_far_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // PB (far, east)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing PB F%d Far BAR (East) register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ PB_FRMCFG0_EAST_0x02010C94:
+ PB_FRMCFG1_EAST_0x02010C95,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_far_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // NX APC (far)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing NX APC F%d Far BAR register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ NX_APC_FAR_BAR_F0_0x02013032:
+ NX_APC_FAR_BAR_F1_0x02013034,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_far_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+
+ // NX (far)
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: Writing NX F%d Far BAR register",
+ r);
+ rc = proc_setup_bars_common_write_bar_reg(
+ i_smp_chip.chip->this_chip,
+ (r == 0)?
+ NX_FAR_BAR_F0_0x0201309A:
+ NX_FAR_BAR_F1_0x0201309C,
+ common_f_scope_bar_reg_def,
+ i_smp_chip.foreign_far_ranges[r]);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_local_chip_region_bars: Error from proc_setup_bars_common_write_bar_reg");
+ break;
+ }
+ }
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_write_foreign_region_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: utility function to find node structure associated with a given
+// target
+// parameters: i_target => chip target
+// i_smp => structure encapsulating SMP topology
+// o_node => node structure associated with chip target input
+// returns: FAPI_RC_SUCCESS if matching node is found
+// RC_PROC_SETUP_BARS_NODE_FIND_INTERNAL_ERR if node map lookup is
+// unsuccessful,
+// else failing return code from node ID attribute query function
+//------------------------------------------------------------------------------
+fapi::ReturnCode
+proc_setup_bars_find_node(
+ const fapi::Target& i_target,
+ proc_setup_bars_smp_system& i_smp,
+ proc_setup_bars_smp_node& o_node)
+{
+ // return code
+ fapi::ReturnCode rc;
+ proc_fab_smp_node_id node_id;
+
+ FAPI_DBG("proc_setup_bars_find_node: Start");
+
+ do
+ {
+ // get node ID attribute
+ FAPI_DBG("proc_setup_find_node: Querying node ID attribute");
+ rc = proc_fab_smp_get_node_id_attr(&(i_target),
+ node_id);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_process_chip: Error from proc_fab_smp_get_node_id_attr");
+ break;
+ }
+
+ // search to see if node structure already exists for the node ID
+ // associated with this chip
+ std::map<proc_fab_smp_node_id, proc_setup_bars_smp_node>::iterator
+ n_iter;
+ n_iter = i_smp.nodes.find(node_id);
+ // no match node found, exit
+ if (n_iter == i_smp.nodes.end())
+ {
+ FAPI_ERR("proc_setup_bars_process_chip: insert_chip: Error encountered finding node in SMP");
+ FAPI_SET_HWP_ERROR(rc,
+ RC_PROC_SETUP_BARS_NODE_FIND_INTERNAL_ERR);
+ break;
+ }
+ o_node = n_iter->second;
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_find_node: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: wrapper function to write all chip BARs
+// parameters: i_smp => structure encapsulating fully
+// specified SMP topology
+// i_init_local_chip_local_node => boolean qualifying application
+// of local chip/local node range
+// specific BAR resources
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// else failing return code from lower level BAR write/node search
+// functions
+//------------------------------------------------------------------------------
+fapi::ReturnCode
+proc_setup_bars_write_bars(
+ proc_setup_bars_smp_system& i_smp,
+ const bool& i_init_local_chip_local_node)
+{
+ // return code
+ fapi::ReturnCode rc;
+ std::map<proc_fab_smp_node_id, proc_setup_bars_smp_node>::iterator n_iter;
+ std::map<proc_fab_smp_chip_id, proc_setup_bars_smp_chip>::iterator p_iter;
+
+ FAPI_DBG("proc_setup_bars_write_bars: Start");
+
+ do
+ {
+ for (n_iter = i_smp.nodes.begin();
+ (n_iter != i_smp.nodes.end()) && (rc.ok());
+ n_iter++)
+ {
+ for (p_iter = n_iter->second.chips.begin();
+ (p_iter != n_iter->second.chips.end()) && (rc.ok());
+ p_iter++)
+ {
+ // init local chip/local node resources?
+ if (i_init_local_chip_local_node)
+ {
+ rc = proc_setup_bars_write_local_chip_region_bars(
+ p_iter->second);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_bars: Error from proc_setup_bars_write_local_chip_region_bars");
+ break;
+ }
+
+ rc = proc_setup_bars_write_local_node_region_bars(
+ p_iter->second,
+ n_iter->second);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_bars: Error from proc_setup_bars_write_local_node_region_bars");
+ break;
+ }
+ }
+
+ // determine which remote node ranges should be initialized
+ proc_setup_bars_smp_node smp_node_a0;
+ proc_setup_bars_smp_node smp_node_a1;
+ proc_setup_bars_smp_node smp_node_a2;
+ if (p_iter->second.chip->a0_chip.getType() != fapi::TARGET_TYPE_NONE)
+ {
+ rc = proc_setup_bars_find_node(
+ p_iter->second.chip->a0_chip,
+ i_smp,
+ smp_node_a0);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_write_bars: Error from proc_setup_bars_find_node");
+ break;
+ }
+ }
+ if (p_iter->second.chip->a1_chip.getType() != fapi::TARGET_TYPE_NONE)
+ {
+ rc = proc_setup_bars_find_node(
+ p_iter->second.chip->a1_chip,
+ i_smp,
+ smp_node_a1);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_write_bars: Error from proc_setup_bars_find_node");
+ break;
+ }
+ }
+ if (p_iter->second.chip->a2_chip.getType() != fapi::TARGET_TYPE_NONE)
+ {
+ rc = proc_setup_bars_find_node(
+ p_iter->second.chip->a2_chip,
+ i_smp,
+ smp_node_a2);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_write_bars: Error from proc_setup_bars_find_node");
+ break;
+ }
+ }
+
+ // initialize remote node related ranges
+ rc = proc_setup_bars_write_remote_node_region_bars(
+ p_iter->second,
+ smp_node_a0,
+ smp_node_a1,
+ smp_node_a2);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_bars: Error from proc_setup_bars_write_remote_node_region_bars");
+ break;
+ }
+
+ // initialize foreign link related regions
+ rc = proc_setup_bars_write_foreign_region_bars(
+ p_iter->second);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars_write_bars: Error from proc_setup_bars_write_foreign_region_bars");
+ break;
+ }
+ }
+ }
+ } while(0);
+
+ FAPI_DBG("proc_setup_bars_write_bars: End");
+ return rc;
+}
+
+
+//------------------------------------------------------------------------------
+// function: proc_setup_bars HWP entry point
+// NOTE: see comments above function prototype in header
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars(
+ std::vector<proc_setup_bars_proc_chip>& i_proc_chips,
+ const bool& i_init_local_chip_local_node)
+{
+ // return code
+ fapi::ReturnCode rc;
+ // SMP model
+ proc_setup_bars_smp_system smp;
+
+ // mark HWP entry
+ FAPI_IMP("proc_setup_bars: Entering ...");
+
+ do
+ {
+ // process all chips passed from platform to HWP, query chip
+ // specific attributes and insert into system SMP data structure
+ // given logical node & chip ID
+ rc = proc_setup_bars_process_chips(i_proc_chips,
+ smp);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars: Error from proc_setup_bars_process_chips");
+ break;
+ }
+
+ // TODO: add more extensive range checking
+
+ // write BAR registers
+ rc = proc_setup_bars_write_bars(smp,
+ i_init_local_chip_local_node);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_setup_bars: Error from proc_setup_bars_write_bars");
+ break;
+ }
+
+ } while(0);
+
+ // log function exit
+ FAPI_IMP("proc_setup_bars: Exiting ...");
+ return rc;
+}
+
+
+} // extern "C"
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.H b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.H
new file mode 100644
index 000000000..439bfe21d
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.H
@@ -0,0 +1,1184 @@
+/* IBM_PROLOG_BEGIN_TAG
+ * This is an automatically generated prolog.
+ *
+ * $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars.H $
+ *
+ * IBM CONFIDENTIAL
+ *
+ * COPYRIGHT International Business Machines Corp. 2012
+ *
+ * p1
+ *
+ * Object Code Only (OCO) source materials
+ * Licensed Internal Code Source Materials
+ * IBM HostBoot Licensed Internal Code
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ *
+ * Origin: 30
+ *
+ * IBM_PROLOG_END_TAG
+ */
+// $Id: proc_setup_bars.H,v 1.2 2012/06/12 02:44:02 jmcgill Exp $
+// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_setup_bars.H,v $
+//------------------------------------------------------------------------------
+// *|
+// *! (C) Copyright International Business Machines Corp. 2011
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *|
+// *! TITLE : proc_setup_bars.H
+// *! DESCRIPTION : Program nest base address registers (BARs) (FAPI)
+// *!
+// *! OWNER NAME : Joe McGill Email: jmcgill@us.ibm.com
+// *!
+// *! ADDITIONAL COMMENTS:
+// *!
+// *! Program nest unit BAR registers, driven by attributes representing system
+// *! memory map (including MMIO).
+// *!
+// *! High level execution flow:
+// *! proc_setup_bars()
+// *! proc_setup_bars_process_chips()
+// *! proc_setup_bars_process_chip()
+// *! proc_fab_smp_get_pcie_dsmp_mux_attrs()
+// *! proc_fab_smp_get_node_id_attr()
+// *! proc_fab_smp_get_chip_id_attr()
+// *! proc_setup_bars_get_bar_attrs()
+// *! proc_setup_bars_memory_get_non_mirrored_attrs()
+// *! proc_setup_bars_memory_get_mirrored_attrs()
+// *! proc_setup_bars_memory_get_foreign_near_attrs()
+// *! proc_setup_bars_memory_get_foreign_far_attrs()
+// *! proc_setup_bars_psi_get_bar_attrs()
+// *! proc_setup_bars_fsp_get_bar_attrs()
+// *! proc_setup_bars_fsp_get_mmio_mask_attrs()
+// *! proc_setup_bars_intp_get_bar_attrs()
+// *! proc_setup_bars_pcie_get_bar_attrs()
+// *! proc_setup_bars_insert_chip()
+// *! proc_setup_bars_write_bars()
+// *! proc_setup_bars_write_local_chip_region_bars()
+// *! proc_setup_bars_write_local_node_region_bars()
+// *! proc_setup_bars_find_remote_node()
+// *! proc_setup_bars_write_remote_node_region_bars()
+// *! proc_setup_bars_write_foreign_region_bars()
+// *!
+// *! Platform Notes:
+// *! This HWP has multiple IPL use cases. In all cases the HWP input
+// *! is expected to contain an entry for each chip in the SMP at the
+// *! time/scope of the invocation:
+// *!
+// *! 1. HBI (drawer scope):
+// *! All local chip/local node resources should be initialized
+// *! at this time (HWP boolean flag controlling this function
+// *! set to true).
+// *!
+// *! All A links active in the scope of the drawer should be
+// *! reflected in the per-chip HWP input structures.
+// *!
+// *! 2. FSP (drawer integration):
+// *! All local chip/local node resources should already have
+// *! been initialized in each drawer, so the HWP boolean flag
+// *! controlling this function should be set to false.
+// *!
+// *! Only 'new' A links which cross previously initialized
+// *! drawers should be reflected in the per-chip HWP input
+// *! structures.
+// *!
+//------------------------------------------------------------------------------
+
+#ifndef _PROC_SETUP_BARS_H_
+#define _PROC_SETUP_BARS_H_
+
+//------------------------------------------------------------------------------
+// Includes
+//------------------------------------------------------------------------------
+
+#include <vector>
+#include <map>
+#include <fapi.H>
+#include "proc_fab_smp.H"
+#include "p8_scom_addresses.H"
+
+
+//------------------------------------------------------------------------------
+// Constant definitions
+//------------------------------------------------------------------------------
+
+// address range size definition constants
+const uint64_t PROC_SETUP_BARS_SIZE_1_PB = 0x0004000000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_512_TB = 0x0002000000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_256_TB = 0x0001000000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_128_TB = 0x0000800000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_64_TB = 0x0000400000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_32_TB = 0x0000200000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_16_TB = 0x0000100000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_8_TB = 0x0000080000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_4_TB = 0x0000040000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_2_TB = 0x0000020000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_1_TB = 0x0000010000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_512_GB = 0x0000008000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_256_GB = 0x0000004000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_128_GB = 0x0000002000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_64_GB = 0x0000001000000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_32_GB = 0x0000000800000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_16_GB = 0x0000000400000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_8_GB = 0x0000000200000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_4_GB = 0x0000000100000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_2_GB = 0x0000000080000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_1_GB = 0x0000000040000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_512_MB = 0x0000000020000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_256_MB = 0x0000000010000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_128_MB = 0x0000000008000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_64_MB = 0x0000000004000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_32_MB = 0x0000000002000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_16_MB = 0x0000000001000000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_8_MB = 0x0000000000800000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_4_MB = 0x0000000000400000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_2_MB = 0x0000000000200000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_1_MB = 0x0000000000100000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_512_KB = 0x0000000000080000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_256_KB = 0x0000000000040000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_128_KB = 0x0000000000020000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_64_KB = 0x0000000000010000ULL;
+const uint64_t PROC_SETUP_BARS_SIZE_4_KB = 0x0000000000001000ULL;
+
+// memory (non-mirrored/mirrored) constants
+const uint8_t PROC_SETUP_BARS_NUM_NON_MIRRORED_RANGES = 8;
+const uint8_t PROC_SETUP_BARS_NUM_MIRRORED_RANGES = 4;
+
+// PCIe unit contstants
+const uint8_t PROC_SETUP_BARS_PCIE_NUM_UNITS = 3;
+const uint8_t PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT = 3;
+
+
+//------------------------------------------------------------------------------
+// Structure definitions
+//------------------------------------------------------------------------------
+
+// HWP argument structure defining properties of this chip
+// and links which should be considered in this invocation (A/F)
+struct proc_setup_bars_proc_chip
+{
+ // target for this chip
+ fapi::Target this_chip;
+
+ // targets defining A link connected chips
+ // qualify which remote node based BAR resources should be initalized on
+ // this chip
+ fapi::Target a0_chip;
+ fapi::Target a1_chip;
+ fapi::Target a2_chip;
+
+ // init F link related BARs for this chip?
+ bool process_f0;
+ bool process_f1;
+};
+
+// function pointer typedef definition for HWP call support
+typedef fapi::ReturnCode
+(*proc_setup_bars_FP_t)(std::vector<proc_setup_bars_proc_chip>&,
+ const bool&);
+
+// structure to represent range of FBC real address space
+struct proc_setup_bars_addr_range
+{
+ // default constructor (mark range disabled)
+ proc_setup_bars_addr_range() :
+ enabled(false),
+ base_addr(0),
+ size(0)
+ {
+ }
+
+ // constructor
+ proc_setup_bars_addr_range(
+ const uint64_t& range_base_addr,
+ const uint64_t& range_size) :
+ enabled(range_size != 0),
+ base_addr(range_base_addr),
+ size(range_size)
+ {
+ }
+
+ // determine if region size is power of 2 aligned
+ bool is_power_of_2() const
+ {
+ return ((size != 0) && !(size & (size - 1)));
+ }
+
+ // round region size to next largest power of 2
+ void round_next_power_of_2()
+ {
+ uint64_t size_round;
+ // if size is zero/one, leave as is
+ if ((size != 0) && (size != 1))
+ {
+ // shift until new size is greater than or
+ // equal to existing size
+ for (size_round = 0x1ULL;
+ size_round < size;
+ size_round = (size_round << 1))
+ {
+ }
+ size = size_round;
+ }
+ }
+
+ // return ending address of range
+ uint64_t end_addr() const
+ {
+ return(base_addr + size - 1);
+ }
+
+ // check for overlapping ranges
+ bool overlaps(const proc_setup_bars_addr_range& range_compare) const
+ {
+ // if either range is disabled, consider them non-overlapping
+ return(!(!enabled ||
+ !range_compare.enabled ||
+ ((end_addr() < range_compare.base_addr) ||
+ (base_addr > range_compare.end_addr()))));
+ }
+
+ // merge two ranges (span breadth of both ranges)
+ void merge(const proc_setup_bars_addr_range& range_new)
+ {
+ // if range is disabled, set values to track those of new
+ // range (which may also be disabled)
+ if (!enabled)
+ {
+ enabled = range_new.enabled;
+ base_addr = range_new.base_addr;
+ size = range_new.size;
+ }
+ // if new range is disabled, leave as-is
+ // otherwise merge two valid ranges
+ else if (range_new.enabled)
+ {
+ uint64_t new_start_addr;
+ uint64_t new_end_addr;
+
+ // calculate new base address (smaller of the two start addresses)
+ if (base_addr < range_new.base_addr)
+ {
+ new_start_addr = base_addr;
+ }
+ else
+ {
+ new_start_addr = range_new.base_addr;
+ }
+ // calculate new end address (larger of the two end addresses)
+ if (end_addr() > range_new.end_addr())
+ {
+ new_end_addr = end_addr();
+ }
+ else
+ {
+ new_end_addr = range_new.end_addr();
+ }
+ // set new range values
+ base_addr = new_start_addr;
+ size = (new_end_addr - new_start_addr + 1);
+ }
+ }
+
+ // check that if region size aligns exactly to base address range
+ // (i.e., no overlap between BAR and size)
+ bool is_aligned() const
+ {
+ return ((base_addr & (size - 1)) == 0x0ULL);
+ }
+
+ // does range lie completely within FBC address range?
+ bool is_in_fbc_range() const
+ {
+ return ((base_addr < PROC_FAB_SMP_MAX_ADDRESS) &&
+ (end_addr() < PROC_FAB_SMP_MAX_ADDRESS));
+ }
+
+ // utility function to display address range information
+ void print() const
+ {
+ FAPI_DBG("proc_setup_bars_print_addr_range: %s :: [ %016llX-%016llX ]",
+ (enabled)?("E"):("D"),
+ base_addr,
+ end_addr());
+ }
+
+ bool enabled;
+ uint64_t base_addr;
+ uint64_t size;
+};
+
+// structure to represent fabric connectivty & properites for a single chip
+// in the SMP topology
+struct proc_setup_bars_smp_chip
+{
+ // associated HWP input structure
+ proc_setup_bars_proc_chip* chip;
+
+ // chip properties/attributes:
+ // fabric chip/node ID
+ proc_fab_smp_chip_id chip_id;
+ proc_fab_smp_node_id node_id;
+ // select for PCIe/DSMP mux (one per link)
+ bool pcie_not_f_link[PROC_FAB_SMP_NUM_F_LINKS];
+ // real address ranges covered by resources on this chip
+ proc_setup_bars_addr_range non_mirrored_range;
+ proc_setup_bars_addr_range mirrored_range;
+ proc_setup_bars_addr_range foreign_near_ranges[PROC_FAB_SMP_NUM_F_LINKS];
+ proc_setup_bars_addr_range foreign_far_ranges[PROC_FAB_SMP_NUM_F_LINKS];
+ proc_setup_bars_addr_range psi_range;
+ proc_setup_bars_addr_range fsp_range;
+ proc_setup_bars_addr_range fsp_mmio_mask_range;
+ proc_setup_bars_addr_range intp_range;
+ proc_setup_bars_addr_range nx_mmio_range;
+ proc_setup_bars_addr_range pcie_ranges[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT];
+};
+
+// structure to represent properties for a single node in the SMP topology
+struct proc_setup_bars_smp_node
+{
+ // chips which reside in this node
+ std::map<proc_fab_smp_chip_id, proc_setup_bars_smp_chip> chips;
+
+ // node properties/attributes:
+ // fabric node ID
+ proc_fab_smp_node_id node_id;
+ // real address ranges covered for mirrored & non-mirrored regions
+ // considering all chips in node)
+ proc_setup_bars_addr_range non_mirrored_range;
+ proc_setup_bars_addr_range mirrored_range;
+};
+
+// structure to represent collection of nodes in SMP topology
+struct proc_setup_bars_smp_system
+{
+ // nodes which reside in this SMP
+ std::map<proc_fab_smp_node_id, proc_setup_bars_smp_node> nodes;
+};
+
+// define set of shared design non-foreign BAR sizes
+struct proc_setup_bars_nf_bar_size
+{
+ static std::map<uint64_t, uint64_t> create_map()
+ {
+ std::map<uint64_t, uint64_t> m;
+ m[PROC_SETUP_BARS_SIZE_64_TB] = 0x3FFFULL;
+ m[PROC_SETUP_BARS_SIZE_32_TB] = 0x1FFFULL;
+ m[PROC_SETUP_BARS_SIZE_16_TB] = 0x0FFFULL;
+ m[PROC_SETUP_BARS_SIZE_8_TB] = 0x07FFULL;
+ m[PROC_SETUP_BARS_SIZE_4_TB] = 0x03FFULL;
+ m[PROC_SETUP_BARS_SIZE_2_TB] = 0x01FFULL;
+ m[PROC_SETUP_BARS_SIZE_1_TB] = 0x00FFULL;
+ m[PROC_SETUP_BARS_SIZE_512_GB] = 0x007FULL;
+ m[PROC_SETUP_BARS_SIZE_256_GB] = 0x003FULL;
+ m[PROC_SETUP_BARS_SIZE_128_GB] = 0x001FULL;
+ m[PROC_SETUP_BARS_SIZE_64_GB] = 0x000FULL;
+ m[PROC_SETUP_BARS_SIZE_32_GB] = 0x0007ULL;
+ m[PROC_SETUP_BARS_SIZE_16_GB] = 0x0003ULL;
+ m[PROC_SETUP_BARS_SIZE_8_GB] = 0x0001ULL;
+ m[PROC_SETUP_BARS_SIZE_4_GB] = 0x0000ULL;
+ return m;
+ }
+ static const std::map<uint64_t, uint64_t> xlate_map;
+};
+
+// define set of shared design foreign BAR sizes
+struct proc_setup_bars_f_bar_size
+{
+ static std::map<uint64_t, uint64_t> create_map()
+ {
+ std::map<uint64_t, uint64_t> m;
+ m[PROC_SETUP_BARS_SIZE_8_TB] = 0x7FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_4_TB] = 0x3FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_2_TB] = 0x1FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_1_TB] = 0x0FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_512_GB] = 0x07FFFULL;
+ m[PROC_SETUP_BARS_SIZE_256_GB] = 0x03FFFULL;
+ m[PROC_SETUP_BARS_SIZE_128_GB] = 0x01FFFULL;
+ m[PROC_SETUP_BARS_SIZE_64_GB] = 0x00FFFULL;
+ m[PROC_SETUP_BARS_SIZE_32_GB] = 0x007FFULL;
+ m[PROC_SETUP_BARS_SIZE_16_GB] = 0x003FFULL;
+ m[PROC_SETUP_BARS_SIZE_8_GB] = 0x001FFULL;
+ m[PROC_SETUP_BARS_SIZE_4_GB] = 0x000FFULL;
+ m[PROC_SETUP_BARS_SIZE_2_GB] = 0x0007FULL;
+ m[PROC_SETUP_BARS_SIZE_1_GB] = 0x0003FULL;
+ m[PROC_SETUP_BARS_SIZE_512_MB] = 0x0001FULL;
+ m[PROC_SETUP_BARS_SIZE_256_MB] = 0x0000FULL;
+ m[PROC_SETUP_BARS_SIZE_128_MB] = 0x00007ULL;
+ m[PROC_SETUP_BARS_SIZE_64_MB] = 0x00003ULL;
+ m[PROC_SETUP_BARS_SIZE_32_MB] = 0x00001ULL;
+ m[PROC_SETUP_BARS_SIZE_16_MB] = 0x00000ULL;
+ return m;
+ }
+ static const std::map<uint64_t, uint64_t> xlate_map;
+};
+
+// define set of FSP BAR sizes
+struct proc_setup_bars_fsp_bar_size
+{
+ static std::map<uint64_t, uint64_t> create_map()
+ {
+ std::map<uint64_t, uint64_t> m;
+ m[PROC_SETUP_BARS_SIZE_4_GB] = 0x000ULL;
+ m[PROC_SETUP_BARS_SIZE_2_GB] = 0x800ULL;
+ m[PROC_SETUP_BARS_SIZE_1_GB] = 0xC00ULL;
+ m[PROC_SETUP_BARS_SIZE_512_MB] = 0xE00ULL;
+ m[PROC_SETUP_BARS_SIZE_256_MB] = 0xF00ULL;
+ m[PROC_SETUP_BARS_SIZE_128_MB] = 0xF80ULL;
+ m[PROC_SETUP_BARS_SIZE_64_MB] = 0xFC0ULL;
+ m[PROC_SETUP_BARS_SIZE_32_MB] = 0xFE0ULL;
+ m[PROC_SETUP_BARS_SIZE_16_MB] = 0xFF0ULL;
+ m[PROC_SETUP_BARS_SIZE_8_MB] = 0xFF8ULL;
+ m[PROC_SETUP_BARS_SIZE_4_MB] = 0xFFCULL;
+ m[PROC_SETUP_BARS_SIZE_2_MB] = 0xFFEULL;
+ m[PROC_SETUP_BARS_SIZE_1_MB] = 0xFFFULL;
+ return m;
+ }
+ static const std::map<uint64_t, uint64_t> xlate_map;
+};
+
+// define set of FSP MMIO mask sizes
+struct proc_setup_bars_fsp_mmio_mask_size
+{
+ static std::map<uint64_t, uint64_t> create_map()
+ {
+ std::map<uint64_t, uint64_t> m;
+ m[PROC_SETUP_BARS_SIZE_4_GB] = 0xF;
+ m[PROC_SETUP_BARS_SIZE_2_GB] = 0x7;
+ m[PROC_SETUP_BARS_SIZE_1_GB] = 0x3;
+ m[PROC_SETUP_BARS_SIZE_512_MB] = 0x1;
+ m[PROC_SETUP_BARS_SIZE_256_MB] = 0x0;
+ return m;
+ }
+ static const std::map<uint64_t, uint64_t> xlate_map;
+};
+
+// define set of NX MMIO mask sizes
+struct proc_setup_bars_nx_mmio_bar_size
+{
+ static std::map<uint64_t, uint64_t> create_map()
+ {
+ std::map<uint64_t, uint64_t> m;
+ m[PROC_SETUP_BARS_SIZE_16_GB] = 0x2;
+ m[PROC_SETUP_BARS_SIZE_16_MB] = 0x4;
+ m[PROC_SETUP_BARS_SIZE_1_MB] = 0x3;
+ m[PROC_SETUP_BARS_SIZE_64_KB] = 0x1;
+ m[PROC_SETUP_BARS_SIZE_4_KB] = 0x0;
+ return m;
+ }
+ static const std::map<uint64_t, uint64_t> xlate_map;
+};
+
+// define set of MCD BAR sizes
+struct proc_setup_bars_mcd_bar_size
+{
+ static std::map<uint64_t, uint64_t> create_map()
+ {
+ std::map<uint64_t, uint64_t> m;
+ m[PROC_SETUP_BARS_SIZE_32_TB] = 0x1FFFFFULL;
+ m[PROC_SETUP_BARS_SIZE_16_TB] = 0x0FFFFFULL;
+ m[PROC_SETUP_BARS_SIZE_8_TB] = 0x07FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_4_TB] = 0x03FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_2_TB] = 0x01FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_1_TB] = 0x00FFFFULL;
+ m[PROC_SETUP_BARS_SIZE_512_GB] = 0x007FFFULL;
+ m[PROC_SETUP_BARS_SIZE_256_GB] = 0x003FFFULL;
+ m[PROC_SETUP_BARS_SIZE_128_GB] = 0x001FFFULL;
+ m[PROC_SETUP_BARS_SIZE_64_GB] = 0x000FFFULL;
+ m[PROC_SETUP_BARS_SIZE_32_GB] = 0x0007FFULL;
+ m[PROC_SETUP_BARS_SIZE_16_GB] = 0x0003FFULL;
+ m[PROC_SETUP_BARS_SIZE_8_GB] = 0x0001FFULL;
+ m[PROC_SETUP_BARS_SIZE_4_GB] = 0x0000FFULL;
+ m[PROC_SETUP_BARS_SIZE_2_GB] = 0x00007FULL;
+ m[PROC_SETUP_BARS_SIZE_1_GB] = 0x00003FULL;
+ m[PROC_SETUP_BARS_SIZE_512_MB] = 0x00001FULL;
+ m[PROC_SETUP_BARS_SIZE_256_MB] = 0x00000FULL;
+ m[PROC_SETUP_BARS_SIZE_128_MB] = 0x000007ULL;
+ m[PROC_SETUP_BARS_SIZE_64_MB] = 0x000003ULL;
+ m[PROC_SETUP_BARS_SIZE_32_MB] = 0x000001ULL;
+ m[PROC_SETUP_BARS_SIZE_16_MB] = 0x000000ULL;
+ return m;
+ }
+ static const std::map<uint64_t, uint64_t> xlate_map;
+};
+
+// define set of PCIe MMIO BAR (BAR0/1 only) sizes
+struct proc_setup_bars_pcie_bar_size
+{
+ static std::map<uint64_t, uint64_t> create_map()
+ {
+ std::map<uint64_t, uint64_t> m;
+ m[PROC_SETUP_BARS_SIZE_1_PB] = 0x000000000ULL;
+ m[PROC_SETUP_BARS_SIZE_512_TB] = 0x200000000ULL;
+ m[PROC_SETUP_BARS_SIZE_256_TB] = 0x300000000ULL;
+ m[PROC_SETUP_BARS_SIZE_128_TB] = 0x380000000ULL;
+ m[PROC_SETUP_BARS_SIZE_64_TB] = 0x3C0000000ULL;
+ m[PROC_SETUP_BARS_SIZE_32_TB] = 0x3E0000000ULL;
+ m[PROC_SETUP_BARS_SIZE_16_TB] = 0x3F0000000ULL;
+ m[PROC_SETUP_BARS_SIZE_8_TB] = 0x3F8000000ULL;
+ m[PROC_SETUP_BARS_SIZE_4_TB] = 0x3FC000000ULL;
+ m[PROC_SETUP_BARS_SIZE_2_TB] = 0x3FE000000ULL;
+ m[PROC_SETUP_BARS_SIZE_1_TB] = 0x3FF000000ULL;
+ m[PROC_SETUP_BARS_SIZE_512_GB] = 0x3FF800000ULL;
+ m[PROC_SETUP_BARS_SIZE_256_GB] = 0x3FFC00000ULL;
+ m[PROC_SETUP_BARS_SIZE_128_GB] = 0x3FFE00000ULL;
+ m[PROC_SETUP_BARS_SIZE_64_GB] = 0x3FFF00000ULL;
+ m[PROC_SETUP_BARS_SIZE_32_GB] = 0x3FFF80000ULL;
+ m[PROC_SETUP_BARS_SIZE_16_GB] = 0x3FFFC0000ULL;
+ m[PROC_SETUP_BARS_SIZE_8_GB] = 0x3FFFE0000ULL;
+ m[PROC_SETUP_BARS_SIZE_4_GB] = 0x3FFFF0000ULL;
+ m[PROC_SETUP_BARS_SIZE_2_GB] = 0x3FFFF8000ULL;
+ m[PROC_SETUP_BARS_SIZE_1_GB] = 0x3FFFFC000ULL;
+ m[PROC_SETUP_BARS_SIZE_512_MB] = 0x3FFFFE000ULL;
+ m[PROC_SETUP_BARS_SIZE_256_MB] = 0x3FFFFF000ULL;
+ m[PROC_SETUP_BARS_SIZE_128_MB] = 0x3FFFFF800ULL;
+ m[PROC_SETUP_BARS_SIZE_64_MB] = 0x3FFFFFC00ULL;
+ m[PROC_SETUP_BARS_SIZE_32_MB] = 0x3FFFFFE00ULL;
+ m[PROC_SETUP_BARS_SIZE_16_MB] = 0x3FFFFFF00ULL;
+ m[PROC_SETUP_BARS_SIZE_8_MB] = 0x3FFFFFF80ULL;
+ m[PROC_SETUP_BARS_SIZE_4_MB] = 0x3FFFFFFC0ULL;
+ m[PROC_SETUP_BARS_SIZE_2_MB] = 0x3FFFFFFE0ULL;
+ m[PROC_SETUP_BARS_SIZE_1_MB] = 0x3FFFFFFF0ULL;
+ m[PROC_SETUP_BARS_SIZE_512_KB] = 0x3FFFFFFF8ULL;
+ m[PROC_SETUP_BARS_SIZE_256_KB] = 0x3FFFFFFFCULL;
+ m[PROC_SETUP_BARS_SIZE_128_KB] = 0x3FFFFFFFEULL;
+ m[PROC_SETUP_BARS_SIZE_64_KB] = 0x3FFFFFFFFULL;
+ return m;
+ }
+ static const std::map<uint64_t, uint64_t> xlate_map;
+};
+
+// structure to represent logical HW BAR properties
+struct proc_setup_bars_bar_def
+{
+ // mask for implemented base address bits (1 for all non implemented bits)
+ uint64_t base_addr_mask;
+ // minimum/maximum supported size values
+ uint64_t size_min;
+ uint64_t size_max;
+ // check that base address/size are aligned?
+ bool check_aligned;
+};
+
+// define set of supported shift operations for aligning logical
+// BAR base address to physical position in HW register
+enum proc_setup_bars_shift_base
+{
+ PROC_SETUP_BARS_SHIFT_LEFT,
+ PROC_SETUP_BARS_SHIFT_RIGHT,
+ PROC_SETUP_BARS_SHIFT_NONE
+};
+
+// structure to represent physical HW BAR register programming
+struct proc_setup_bars_bar_reg_def
+{
+ // base address programming information
+ bool has_base;
+ proc_setup_bars_shift_base base_shift;
+ uint8_t base_shift_amount;
+ uint8_t base_start_bit;
+ uint8_t base_end_bit;
+ // enable programming information
+ bool has_enable;
+ uint8_t enable_bit;
+ // size programming information
+ bool has_size;
+ uint8_t size_start_bit;
+ uint8_t size_end_bit;
+ // translate logical size to register programming
+ const std::map<uint64_t, uint64_t>* xlate_map;
+ // static value/mask to be written along with BAR content
+ uint64_t static_data;
+ uint64_t static_data_mask;
+};
+
+//------------------------------------------------------------------------------
+// Constant definitions
+//------------------------------------------------------------------------------
+
+const proc_setup_bars_bar_def non_mirrored_range_def =
+{
+ 0xFFFC0000FFFFFFFFULL, // base: RA 14:63
+ PROC_SETUP_BARS_SIZE_4_GB, // size (min): 4 GB
+ PROC_SETUP_BARS_SIZE_4_TB, // size (max): 4 TB
+ false
+};
+
+const proc_setup_bars_bar_def mirrored_range_def =
+{
+ 0xFFFC0000FFFFFFFFULL, // base: RA 14:63
+ PROC_SETUP_BARS_SIZE_2_GB, // size (min): 2 GB
+ PROC_SETUP_BARS_SIZE_2_TB, // size (max): 2 TB
+ false
+};
+
+// shared non-foreign BAR design (mirrored/non-mirrored regions) constants
+const proc_setup_bars_bar_def common_nf_scope_bar_def =
+{
+ 0xFFFC0000FFFFFFFFULL, // base: RA 14:31
+ PROC_SETUP_BARS_SIZE_4_GB, // size (min): 4 GB
+ PROC_SETUP_BARS_SIZE_64_TB, // size (min): 64 TB
+ true
+};
+
+const proc_setup_bars_bar_reg_def common_nf_scope_bar_reg_def =
+{
+ true, // base: bits 15:32
+ PROC_SETUP_BARS_SHIFT_RIGHT,
+ 1,
+ 15,
+ 32,
+ true, // enable: bit 0
+ 0,
+ true, // size: bits 1:14
+ 1,
+ 14,
+ &proc_setup_bars_nf_bar_size::xlate_map,
+ 0x0ULL,
+ 0x0ULL
+};
+
+// shared foreign BAR design (near/far regions) constants
+const proc_setup_bars_bar_def common_f_scope_bar_def =
+{
+ 0xFFFC000000FFFFFFULL, // base: RA 14:39
+ PROC_SETUP_BARS_SIZE_16_MB, // size (min): 16 MB
+ PROC_SETUP_BARS_SIZE_8_TB, // size (min): 8 TB
+ true
+};
+
+const proc_setup_bars_bar_reg_def common_f_scope_bar_reg_def =
+{
+ true, // base: bits 20:45
+ PROC_SETUP_BARS_SHIFT_RIGHT,
+ 6,
+ 20,
+ 45,
+ true, // enable: bit 0
+ 0,
+ true, // size: bits 1:19
+ 1,
+ 19,
+ &proc_setup_bars_f_bar_size::xlate_map,
+ 0x0ULL,
+ 0x0ULL
+};
+
+// PSI BAR constants
+const proc_setup_bars_bar_def psi_bridge_bar_def =
+{
+ 0xFFFC0000000FFFFFULL, // base: RA 14:43
+ PROC_SETUP_BARS_SIZE_1_MB, // size (min): 1 MB
+ PROC_SETUP_BARS_SIZE_1_MB, // size (max): 1 MB
+ true
+};
+
+const proc_setup_bars_bar_reg_def psi_bridge_bar_reg_def =
+{
+ true, // base: bits 14:43
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 14,
+ 43,
+ true, // enable: bit 63
+ 63,
+ false, // size: implied
+ 0,
+ 0,
+ NULL,
+ 0x0ULL,
+ 0x0ULL
+};
+
+// FSP BAR constants
+const proc_setup_bars_bar_def fsp_bar_def =
+{
+ 0xFFFC0000000FFFFFULL, // base: RA 14:43
+ PROC_SETUP_BARS_SIZE_1_MB, // size (min): 1 MB
+ PROC_SETUP_BARS_SIZE_4_GB, // size (max): 4 GB
+ true
+};
+
+const proc_setup_bars_bar_reg_def fsp_bar_reg_def =
+{
+ true, // base: bits 14:43
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 14,
+ 43,
+ false, // enable: other reg
+ 0,
+ false, // size: other reg
+ 0,
+ 0,
+ NULL,
+ 0x0ULL,
+ 0x0ULL
+};
+
+const proc_setup_bars_bar_reg_def fsp_bar_mask_reg_def =
+{
+ false, // base: other reg
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 0,
+ 0,
+ false, // enable: other reg
+ 0,
+ true, // size: 32:43
+ 32,
+ 43,
+ &proc_setup_bars_fsp_bar_size::xlate_map,
+ 0x0ULL,
+ 0x0ULL
+};
+
+const proc_setup_bars_bar_reg_def fsp_bar_en_reg_def =
+{
+ false, // base: other reg
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 0,
+ 0,
+ true, // enable: bit 1
+ 1,
+ false, // size: other reg
+ 0,
+ 0,
+ NULL,
+ 0x0ULL,
+ 0x0ULL
+};
+
+// FSP MMIO mask constants
+const proc_setup_bars_bar_def fsp_mmio_mask_def =
+{
+ 0xFFFFFFFFFFFFFFFFULL, // base: unused
+ PROC_SETUP_BARS_SIZE_256_MB, // size (min): 256 MB
+ PROC_SETUP_BARS_SIZE_4_GB, // size (max): 4 GB
+ true
+};
+
+const proc_setup_bars_bar_reg_def fsp_mmio_mask_reg_def =
+{
+ false, // base: unused
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 0,
+ 0,
+ false, // enable: unused
+ 0,
+ true, // size: bits 8:11
+ 8,
+ 11,
+ &proc_setup_bars_fsp_mmio_mask_size::xlate_map,
+ 0x0ULL,
+ 0x0ULL
+};
+
+// INTP BAR constants
+const proc_setup_bars_bar_def intp_bar_def =
+{
+ 0xFFFC0000000FFFFFULL, // base: RA 14:43
+ PROC_SETUP_BARS_SIZE_1_MB, // size (min): 1 MB
+ PROC_SETUP_BARS_SIZE_1_MB, // size (max): 1 MB
+ true
+};
+
+const proc_setup_bars_bar_reg_def intp_bar_reg_def =
+{
+ true, // base: bits 0:29
+ PROC_SETUP_BARS_SHIFT_LEFT,
+ 14,
+ 0,
+ 29,
+ true, // enable: bit 30
+ 30,
+ false, // size: implied
+ 0,
+ 0,
+ NULL,
+ 0x0ULL,
+ 0x0ULL
+};
+
+// L3 BAR constants
+const uint32_t L3_BAR12_BASE_ADDR_LEFT_SHIFT_AMOUNT = 14;
+const uint32_t L3_BAR12_SIZE_END_BIT = 34;
+const uint32_t L3_BAR2_ENABLE_BIT = 35;
+
+const uint32_t L3_BAR_GROUP_MASK_RA_DIFF_START_BIT = 18;
+const uint32_t L3_BAR_GROUP_MASK_RA_DIFF_END_BIT = 31;
+
+const uint32_t L3_BAR_GROUP_MASK_NON_MIRROR_MASK_START_BIT = 3;
+const uint32_t L3_BAR_GROUP_MASK_NON_MIRROR_MASK_END_BIT = 16;
+
+const uint32_t L3_BAR_GROUP_MASK_MIRROR_MASK_START_BIT = 20;
+const uint32_t L3_BAR_GROUP_MASK_MIRROR_MASK_END_BIT = 33;
+const uint32_t L3_BAR_GROUP_MASK_MIRROR_ENABLE_BIT = 34;
+
+// NX MMIO BAR constants
+const proc_setup_bars_bar_def nx_mmio_bar_def =
+{
+ 0xFFFC000000000FFFULL, // base: RA 14:51
+ PROC_SETUP_BARS_SIZE_4_KB, // size (min): 4 KB
+ PROC_SETUP_BARS_SIZE_16_GB, // size (max): 16 GB
+ true
+};
+
+const proc_setup_bars_bar_reg_def nx_mmio_bar_reg_def =
+{
+ true, // base: bits 14:51
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 14,
+ 51,
+ true, // enable: bit 52
+ 52,
+ true, // size: bits 53:55
+ 53,
+ 55,
+ &proc_setup_bars_nx_mmio_bar_size::xlate_map,
+ 0x0ULL,
+ 0x0ULL
+};
+
+// MCD Configuration Register constants
+const proc_setup_bars_bar_def mcd_bar_def =
+{
+ 0xFFFC000000FFFFFFULL, // base: RA 14:39
+ PROC_SETUP_BARS_SIZE_16_MB, // size (min): 16 MB
+ PROC_SETUP_BARS_SIZE_32_TB, // size (max): 32 TB
+ true
+};
+
+const proc_setup_bars_bar_reg_def mcd_nf_bar_reg_def =
+{
+ true, // base: bits 30:55
+ PROC_SETUP_BARS_SHIFT_RIGHT,
+ 16,
+ 30,
+ 55,
+ true, // enable: bit 0
+ 0,
+ true, // size: bits 9:29
+ 9,
+ 29,
+ &proc_setup_bars_mcd_bar_size::xlate_map,
+ 0x4000000000000000ULL, // 1 config/group, system scope
+ 0x780000000000001CULL
+};
+
+const proc_setup_bars_bar_reg_def mcd_f0_bar_reg_def =
+{
+ true, // base: bits 30:55
+ PROC_SETUP_BARS_SHIFT_RIGHT,
+ 16,
+ 30,
+ 55,
+ true, // enable: bit 0
+ 0,
+ true, // size: bits 9:29
+ 9,
+ 29,
+ &proc_setup_bars_mcd_bar_size::xlate_map,
+ 0x4000000000000010ULL, // 1 config/group, foreign scope, f0 link
+ 0x780000000000001CULL
+};
+
+const proc_setup_bars_bar_reg_def mcd_f1_bar_reg_def =
+{
+ true, // base: bits 30:55
+ PROC_SETUP_BARS_SHIFT_RIGHT,
+ 16,
+ 30,
+ 55,
+ true, // enable: bit 0
+ 0,
+ true, // size: bits 9:29
+ 9,
+ 29,
+ &proc_setup_bars_mcd_bar_size::xlate_map,
+ 0x4000000000000014ULL, // 1 config/group, foreign scope, f1 link
+ 0x780000000000001CULL
+};
+
+// PCIe BAR constants
+// TODO: investigate development of PCIe chip unit support
+const uint32_t PROC_SETUP_BARS_PCIE_CHIP_NON_MIRRORED_BAR[PROC_SETUP_BARS_PCIE_NUM_UNITS] =
+{
+ PCIE0_NODAL_BAR0_0x02012010,
+ PCIE1_NODAL_BAR0_0x02012410,
+ PCIE2_NODAL_BAR0_0x02012810
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_CHIP_MIRRORED_BAR[PROC_SETUP_BARS_PCIE_NUM_UNITS] =
+{
+ PCIE0_NODAL_BAR1_0x02012011,
+ PCIE1_NODAL_BAR1_0x02012411,
+ PCIE2_NODAL_BAR1_0x02012811
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_NODE_NON_MIRRORED_BAR[PROC_SETUP_BARS_PCIE_NUM_UNITS] =
+{
+ PCIE0_GROUP_BAR0_0x02012012,
+ PCIE1_GROUP_BAR0_0x02012412,
+ PCIE2_GROUP_BAR0_0x02012812
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_NODE_MIRRORED_BAR[PROC_SETUP_BARS_PCIE_NUM_UNITS] =
+{
+ PCIE0_GROUP_BAR1_0x02012013,
+ PCIE1_GROUP_BAR1_0x02012413,
+ PCIE2_GROUP_BAR1_0x02012813
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_FOREIGN_NEAR_BAR[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_FAB_SMP_NUM_F_LINKS] =
+{
+ {
+ PCIE0_NEAR_BAR_F0_0x02012014,
+ PCIE0_NEAR_BAR_F1_0x02012016
+ },
+ {
+ PCIE1_NEAR_BAR_F0_0x02012414,
+ PCIE1_NEAR_BAR_F1_0x02012416
+ },
+ {
+ PCIE2_NEAR_BAR_F0_0x02012814,
+ PCIE2_NEAR_BAR_F1_0x02012816
+ }
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_FOREIGN_FAR_BAR[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_FAB_SMP_NUM_F_LINKS] =
+{
+ {
+ PCIE0_FAR_BAR_F0_0x02012015,
+ PCIE0_FAR_BAR_F1_0x02012017
+ },
+ {
+ PCIE1_FAR_BAR_F0_0x02012415,
+ PCIE1_FAR_BAR_F1_0x02012417
+ },
+ {
+ PCIE2_FAR_BAR_F0_0x02012815,
+ PCIE2_FAR_BAR_F1_0x02012817
+ }
+};
+
+const uint8_t PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT_MMIO = 2;
+const uint8_t PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT_PHB = 1;
+const uint8_t PROC_SETUP_BARS_PCIE_REGS_PER_PHB_RANGE = 2;
+
+const uint8_t PROC_SETUP_BARS_PCIE_RANGE_TYPE_MMIO[PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT] =
+{
+ true, // BAR 0 = MMIO (primary)
+ true, // BAR 1 = MMIO (backup/failover)
+ false, // BAR 2 = PHB
+};
+
+const proc_setup_bars_bar_def pcie_mmio_bar_def =
+{
+ 0xFFFC00000000FFFFULL, // base: RA 14:47
+ PROC_SETUP_BARS_SIZE_64_KB, // size (min): 64 KB
+ PROC_SETUP_BARS_SIZE_1_PB, // size (min): 1 PB
+ true
+};
+
+const proc_setup_bars_bar_reg_def pcie_mmio_bar_reg_def =
+{
+ true, // base: bits 0:33
+ PROC_SETUP_BARS_SHIFT_LEFT,
+ 14,
+ 0,
+ 33,
+ false, // enable: other reg
+ 0,
+ false, // size: other reg
+ 0,
+ 0,
+ NULL,
+ 0x0ULL,
+ 0x0ULL
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_BAR_REGS_MMIO[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT_MMIO] =
+{
+ {
+ PCIE0_IO_BAR0_0x02012040,
+ PCIE0_IO_BAR1_0x02012041
+ },
+ {
+ PCIE1_IO_BAR0_0x02012440,
+ PCIE1_IO_BAR1_0x02012441
+ },
+ {
+ PCIE2_IO_BAR0_0x02012840,
+ PCIE2_IO_BAR1_0x02012841
+ }
+};
+
+const proc_setup_bars_bar_reg_def pcie_mmio_bar_mask_reg_def =
+{
+ false, // base: other reg
+ PROC_SETUP_BARS_SHIFT_NONE,
+ 0,
+ 0,
+ 0,
+ false, // enable: other reg
+ 0,
+ true, // size: bits 0:33
+ 0,
+ 33,
+ &proc_setup_bars_pcie_bar_size::xlate_map,
+ 0x0ULL,
+ 0x0ULL,
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_BAR_MASK_REGS_MMIO[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_RANGES_PER_UNIT_MMIO] =
+{
+ {
+ PCIE0_IO_MASK0_0x02012043,
+ PCIE0_IO_MASK1_0x02012044
+ },
+ {
+ PCIE1_IO_MASK0_0x02012443,
+ PCIE1_IO_MASK1_0x02012444
+ },
+ {
+ PCIE2_IO_MASK0_0x02012843,
+ PCIE2_IO_MASK1_0x02012844
+ }
+};
+
+const proc_setup_bars_bar_def pcie_phb_bar_def =
+{
+ 0xFFFC000000000FFFULL, // base: RA 14:51
+ PROC_SETUP_BARS_SIZE_4_KB, // size (min): 4 KB
+ PROC_SETUP_BARS_SIZE_4_KB, // size (min): 4 KB
+ true
+};
+
+const proc_setup_bars_bar_reg_def pcie_phb_bar_reg_def =
+{
+ true, // base: bits 0:37
+ PROC_SETUP_BARS_SHIFT_LEFT,
+ 14,
+ 0,
+ 37,
+ false, // enable: other reg
+ 0,
+ false, // size: implied
+ 0,
+ 33,
+ NULL,
+ 0x0ULL,
+ 0x0ULL
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_BAR_REGS_PHB[PROC_SETUP_BARS_PCIE_NUM_UNITS][PROC_SETUP_BARS_PCIE_REGS_PER_PHB_RANGE] =
+{
+ {
+ PCIE0_IO_BAR2_0x02012042,
+ PCIE0_ASB_BAR_0x0901200B
+ },
+ {
+ PCIE1_IO_BAR2_0x02012442,
+ PCIE1_ASB_BAR_0x0901240B
+ },
+ {
+ PCIE2_IO_BAR2_0x02012842,
+ PCIE2_ASB_BAR_0x0901280B
+ }
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_BAR_EN_BIT[PROC_SETUP_BARS_PCIE_NUM_UNITS] =
+{
+ 0x0,
+ 0x1,
+ 0x2
+};
+
+const uint32_t PROC_SETUP_BARS_PCIE_BAR_EN_REGS[PROC_SETUP_BARS_PCIE_NUM_UNITS] =
+{
+ PCIE0_IO_BAR_EN_0x02012045,
+ PCIE1_IO_BAR_EN_0x02012445,
+ PCIE2_IO_BAR_EN_0x02012845
+};
+
+
+extern "C"
+{
+
+//------------------------------------------------------------------------------
+// Function prototypes
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// function: program nest unit BAR registers, driven by attributes representing
+// system memory map (including MMIO)
+// parameters: i_proc_chips => vector of structures defining properties of each
+// chip and links which should be considered in
+// this invocation to drive initialization of BARs
+// tied to remote node regions (A links) and
+// foreign regions (F links)
+// i_init_local_chip_local_node => boolean qualifying initilization
+// of BARs tied to local chip/local
+// node regions
+// returns: FAPI_RC_SUCCESS if all register writes are successful,
+// RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ATTR_ERR if chip non-mirrored
+// attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_OVERLAP_ATTR_ERR if chip
+// non-mirrored range attributes specify overlapping ranges,
+// RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ERR if chip non-mirrored
+// processed range content violates expected behavior,
+// RC_PROC_SETUP_BARS_MIRRORED_RANGE_ATTR_ERR if individual chip
+// mirrored range attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_MIRRORED_RANGE_OVERLAP_ATTR_ERR if chip mirrored
+// range attributes specify overlapping ranges,
+// RC_PROC_SETUP_BARS_MIRRORED_RANGE_ERR if chip mirrored processed
+// range content violates expected behavior,
+// RC_PROC_SETUP_BARS_FOREIGN_NEAR_RANGE_ATTR_ERR if individual chip
+// foriegn near range attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_FOREIGN_FAR_RANGE_ATTR_ERR if individual chip
+// foreign far range attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_PSI_BAR_ATTR_ERR if chip PSI range
+// attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_FSP_BAR_ATTR_ERR if chip FSP range
+// attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_FSP_MMIO_MASK_ATTR_ERR if chip MMIO mask
+// attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_INTP_BAR_ATTR_ERR if chip INTP range
+// attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_NX_MMIO_BAR_ATTR_ERR if chip NX MMIO range
+// attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_PCIE_BAR_ATTR_ERR if individual chip PCIe IO
+// range attribute content violates expected behavior,
+// RC_PROC_SETUP_BARS_NODE_ADD_INTERNAL_ERR if node map insert fails,
+// RC_PROC_SETUP_BARS_NODE_FIND_INTERNAL_ERR if node map lookup is
+// unsuccessful,
+// RC_PROC_SETUP_BARS_DUPLICATE_FABRIC_ID_ERR if chips with duplicate
+// fabric node/chip IDs are detected,
+// RC_PROC_SETUP_BARS_NODE_NON_MIRRORED_RANGE_OVERLAP_ERR if overlap
+// is detected between existing node non-mirrored range
+// and that of new chip being processed,
+// RC_PROC_SETUP_BARS_NODE_MIRRORED_RANGE_OVERLAP_ERR if overlap
+// is detected between existing node mirrored range
+// and that of new chip being processed,
+// RC_PROC_SETUP_BARS_INVALID_BAR_REG_DEF if BAR register definition
+// structure is invalid,
+// RC_PROC_SETUP_BARS_SIZE_XLATE_ERR if logical->physical size
+// translation is unsuccessful,
+// else failing return code
+//------------------------------------------------------------------------------
+fapi::ReturnCode proc_setup_bars(
+ std::vector<proc_setup_bars_proc_chip>& i_proc_chips,
+ const bool& i_init_local_chip_local_node);
+
+} // extern "C"
+
+
+#endif // _PROC_SETUP_BARS_H_
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_errors.xml b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_errors.xml
new file mode 100644
index 000000000..512fa602d
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_errors.xml
@@ -0,0 +1,146 @@
+<!-- IBM_PROLOG_BEGIN_TAG
+ This is an automatically generated prolog.
+
+ $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_errors.xml $
+
+ IBM CONFIDENTIAL
+
+ COPYRIGHT International Business Machines Corp. 2012
+
+ p1
+
+ Object Code Only (OCO) source materials
+ Licensed Internal Code Source Materials
+ IBM HostBoot Licensed Internal Code
+
+ The source code for this program is not published or other-
+ wise divested of its trade secrets, irrespective of what has
+ been deposited with the U.S. Copyright Office.
+
+ Origin: 30
+
+ IBM_PROLOG_END_TAG -->
+<!-- Error definitions for proc_setup_bars -->
+<hwpErrors>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ATTR_ERR</rc>
+ <description>Invalid definition for non-mirrored address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_OVERLAP_ATTR_ERR</rc>
+ <description>Invalid definition for non-mirrored address ranges (from platform attributes), two or more ranges on this chip overlap.</description>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NON_MIRRORED_RANGE_ERR</rc>
+ <description>Invalid definition for non-mirrored address range.</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_MIRRORED_RANGE_ATTR_ERR</rc>
+ <description>Invalid definition for mirrored address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_MIRRORED_RANGE_OVERLAP_ATTR_ERR</rc>
+ <description>Invalid definition for mirrored address ranges (from platform attributes), two or more ranges on this chip overlap.</description>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_MIRRORED_RANGE_ERR</rc>
+ <description>Invalid definition for mirrored address range.</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_FOREIGN_NEAR_RANGE_ATTR_ERR</rc>
+ <description>Invalid definition for foreign near address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_FOREIGN_FAR_RANGE_ATTR_ERR</rc>
+ <description>Invalid definition for foreign far address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_PSI_BAR_ATTR_ERR</rc>
+ <description>Invalid definition for PSI Bridge BAR address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_FSP_BAR_ATTR_ERR</rc>
+ <description>Invalid definition for FSP BAR address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_FSP_MMIO_MASK_ATTR_ERR</rc>
+ <description>Invalid definition for FSP MMIO Mask address range (from platform attributes).</description>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_INTP_BAR_ATTR_ERR</rc>
+ <description>Invalid definition for INTP BAR address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NX_MMIO_BAR_ATTR_ERR</rc>
+ <description>Invalid definition for NX MMIO BAR address range (from platform attributes).</description>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_PCIE_BAR_ATTR_ERR</rc>
+ <description>Invalid definition for PCIe BAR address range (from platform attributes).</description>
+ <ffdc>UNIT</ffdc>
+ <ffdc>RANGE</ffdc>
+ <ffdc>BASE_ADDR</ffdc>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NODE_ADD_INTERNAL_ERR</rc>
+ <description>Internal Error. Error encountered adding node to SMP structure.</description>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NODE_FIND_INTERNAL_ERR</rc>
+ <description>Internal Error. Error encountered attempting to find node in SMP structure.</description>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_DUPLICATE_FABRIC_ID_ERR</rc>
+ <description>Multiple chips found with identifcal fabric node/chip ID attribute values.</description>
+ <ffdc>NODE_ID</ffdc>
+ <ffdc>CHIP_ID</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NODE_NON_MIRRORED_RANGE_OVERLAP_ERR</rc>
+ <description>Existing node non-mirrored range overlaps chip non-mirrored range.</description>
+ <ffdc>NODE_BASE_ADDR</ffdc>
+ <ffdc>NODE_SIZE</ffdc>
+ <ffdc>CHIP_BASE_ADDR</ffdc>
+ <ffdc>CHIP_SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_NODE_MIRRORED_RANGE_OVERLAP_ERR</rc>
+ <description>Existing node mirrored range overlaps chip mirrored range.</description>
+ <ffdc>NODE_BASE_ADDR</ffdc>
+ <ffdc>NODE_SIZE</ffdc>
+ <ffdc>CHIP_BASE_ADDR</ffdc>
+ <ffdc>CHIP_SIZE</ffdc>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_INVALID_BAR_REG_DEF</rc>
+ <description>Internal error. Invalid proc_setup_bars_bar_reg_def structure content.</description>
+ </hwpError>
+ <hwpError>
+ <rc>RC_PROC_SETUP_BARS_SIZE_XLATE_ERR</rc>
+ <description>Internal error. Unsupported size translation for proc_setup_bars_bar_reg_def structure.</description>
+ <ffdc>SIZE</ffdc>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_l3_attributes.xml b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_l3_attributes.xml
new file mode 100644
index 000000000..7d72575db
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_l3_attributes.xml
@@ -0,0 +1,71 @@
+<!-- IBM_PROLOG_BEGIN_TAG
+ This is an automatically generated prolog.
+
+ $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_l3_attributes.xml $
+
+ IBM CONFIDENTIAL
+
+ COPYRIGHT International Business Machines Corp. 2012
+
+ p1
+
+ Object Code Only (OCO) source materials
+ Licensed Internal Code Source Materials
+ IBM HostBoot Licensed Internal Code
+
+ The source code for this program is not published or other-
+ wise divested of its trade secrets, irrespective of what has
+ been deposited with the U.S. Copyright Office.
+
+ Origin: 30
+
+ IBM_PROLOG_END_TAG -->
+<!-- proc_setup_bars_l3_attributes.xml -->
+<attributes>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_L3_BAR1_REG</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>L3 BAR1 register value
+ creator: proc_setup_bars
+ consumer: winkle image setup procedures
+ notes:
+ 64-bit register value
+ SCOM address: 0x1001080B
+ </description>
+ <valueType>uint64</valueType>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_L3_BAR2_REG</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>L3 BAR2 register value
+ creator: proc_setup_bars
+ consumer: winkle image setup procedures
+ notes:
+ 64-bit register value
+ SCOM address: 0x10010813
+ </description>
+ <valueType>uint64</valueType>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_L3_BAR_GROUP_MASK_REG</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>L3 BAR Group Mask register value
+ creator: proc_setup_bars
+ consumer: winkle image setup procedures
+ notes:
+ 64-bit register value
+ SCOM address: 0x10010816
+ </description>
+ <valueType>uint64</valueType>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+</attributes> \ No newline at end of file
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_memory_attributes.xml b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_memory_attributes.xml
new file mode 100644
index 000000000..aa4cf90f9
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_memory_attributes.xml
@@ -0,0 +1,224 @@
+<!-- IBM_PROLOG_BEGIN_TAG
+ This is an automatically generated prolog.
+
+ $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_memory_attributes.xml $
+
+ IBM CONFIDENTIAL
+
+ COPYRIGHT International Business Machines Corp. 2012
+
+ p1
+
+ Object Code Only (OCO) source materials
+ Licensed Internal Code Source Materials
+ IBM HostBoot Licensed Internal Code
+
+ The source code for this program is not published or other-
+ wise divested of its trade secrets, irrespective of what has
+ been deposited with the U.S. Copyright Office.
+
+ Origin: 30
+
+ IBM_PROLOG_END_TAG -->
+<!-- proc_setup_bars_memory_attributes.xml -->
+<attributes>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_MEM_BASE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Base address for non-mirrored memory regions
+ creator: platform (proc_config_base_addr)
+ consumer: mss_setup_bars
+ firmware notes:
+ 64-bit RA
+ </description>
+ <valueType>uint64</valueType>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_MEM_BASES</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Non-mirrored memory base addresses
+ creator: mss_setup_bars
+ consumer: proc_setup_bars, platform
+ firmware notes:
+ 64-bit RA
+ eight independent non-mirrored segments are supported
+ (max number based on Venice design)
+ </description>
+ <valueType>uint64</valueType>
+ <array>8</array>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_MEM_SIZES</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Size of non-mirrored memory regions
+ creator: mss_setup_bars
+ consumer: proc_setup_bars, platform
+ firmware notes:
+ for given index value, address space assumed to be contiguous
+ from ATTR_PROC_MEM_BASES value at matching index
+ eight independent non-mirrored segments are supported
+ (max number based on Venice design)
+ </description>
+ <valueType>uint64</valueType>
+ <array>8</array>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_MIRROR_BASE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Base address for mirrored memory regions
+ creator: platform (proc_config_base_addr)
+ consumer: mss_setup_bars
+ firmware notes:
+ 64-bit RA
+ </description>
+ <valueType>uint64</valueType>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_MIRROR_BASES</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Mirrored memory base addresses
+ creator: mss_setup_bars
+ consumer: proc_setup_bars, platform
+ firmware notes:
+ 64-bit RA
+ four independent mirrored segments are supported
+ (max number based on Venice design)
+ </description>
+ <valueType>uint64</valueType>
+ <array>4</array>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_MIRROR_SIZES</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Size of mirrored memory region
+ creator: mss_setup_bars
+ consumer: proc_setup_bars, platform
+ firmware notes:
+ for given index value, address space assumed to be contiguous
+ from ATTR_PROC_MIRROR_BASES value at matching index
+ four independent mirrored segments are supported
+ (max number based on Venice design)
+ </description>
+ <valueType>uint64</valueType>
+ <array>4</array>
+ <writeable/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FOREIGN_NEAR_BASE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Foreign (near) address region base address
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ 64-bit RA
+ two independent regions are supported
+ (one per foreign link)
+ </description>
+ <valueType>uint64</valueType>
+ <array>2</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FOREIGN_NEAR_SIZE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Size of foreign (near) region
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ address space assumed to be contiguous from associated
+ ATTR_PROC_FOREIGN_NEAR_BASE for given index value
+ two independent regions are supported
+ (one per foreign link)
+ </description>
+ <valueType>uint64</valueType>
+ <array>2</array>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FOREIGN_FAR_BASE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Foreign (far) address region base address
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ 64-bit RA
+ two independent regions are supported
+ (one per foreign link)
+ </description>
+ <valueType>uint64</valueType>
+ <array>2</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FOREIGN_FAR_SIZE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Size of foreign (far) region
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ address space assumed to be contiguous from associated
+ ATTR_PROC_FOREIGN_FAR_BASE for given index value
+ two independent regions are supported
+ (one per foreign link)
+ </description>
+ <valueType>uint64</valueType>
+ <array>2</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_HA_BASE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>HA logging base address
+ firmware notes:
+ 64-bit RA
+ eight independent segments are supported
+ (max number based on Venice design)
+ </description>
+ <valueType>uint64</valueType>
+ <array>8</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_HA_SIZE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>Size of HA memory region
+ firmware notes:
+ address space assumed to be contiguous from associated
+ ATTR_PROC_HA_BASE for given index value
+ eight independent segments are supported
+ (max number based on Venice design)
+ </description>
+ <valueType>uint64</valueType>
+ <array>8</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+</attributes>
diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_mmio_attributes.xml b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_mmio_attributes.xml
new file mode 100644
index 000000000..efede3a78
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_mmio_attributes.xml
@@ -0,0 +1,306 @@
+<!-- IBM_PROLOG_BEGIN_TAG
+ This is an automatically generated prolog.
+
+ $Source: src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/proc_setup_bars_mmio_attributes.xml $
+
+ IBM CONFIDENTIAL
+
+ COPYRIGHT International Business Machines Corp. 2012
+
+ p1
+
+ Object Code Only (OCO) source materials
+ Licensed Internal Code Source Materials
+ IBM HostBoot Licensed Internal Code
+
+ The source code for this program is not published or other-
+ wise divested of its trade secrets, irrespective of what has
+ been deposited with the U.S. Copyright Office.
+
+ Origin: 30
+
+ IBM_PROLOG_END_TAG -->
+<!-- proc_setup_bars_mmio_attributes.xml -->
+<attributes>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_PSI_BRIDGE_BAR_ENABLE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>PSI Bridge BAR enable
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes: none
+ </description>
+ <valueType>uint8</valueType>
+ <enum>DISABLE = 0x0, ENABLE = 0x1</enum>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_PSI_BRIDGE_BAR_BASE_ADDR</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>PSI Bridge BAR base address value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ 64-bit address representing BAR RA
+ NOTE: BAR register covers RA 14:43
+ NOTE: Implied size of 1MB
+ </description>
+ <valueType>uint64</valueType>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FSP_BAR_ENABLE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>FSP BAR enable
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes: none
+ </description>
+ <valueType>uint8</valueType>
+ <enum>DISABLE = 0x0, ENABLE = 0x1</enum>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FSP_BAR_BASE_ADDR</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>FSP BAR base address value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ 64-bit address representing BAR RA
+ NOTE: BAR register covers RA 14:43
+ </description>
+ <valueType>uint64</valueType>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FSP_BAR_SIZE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>FSP BAR size value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes: none
+ </description>
+ <valueType>uint64</valueType>
+ <enum>
+ 4_GB = 0x0000000100000000,
+ 2_GB = 0x0000000080000000,
+ 1_GB = 0x0000000040000000,
+ 512_MB = 0x0000000020000000,
+ 256_MB = 0x0000000010000000,
+ 128_MB = 0x0000000008000000,
+ 64_MB = 0x0000000004000000,
+ 32_MB = 0x0000000002000000,
+ 16_MB = 0x0000000001000000,
+ 8_MB = 0x0000000000800000,
+ 4_MB = 0x0000000000400000,
+ 2_MB = 0x0000000000200000,
+ 1_MB = 0x0000000000100000
+ </enum>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_FSP_MMIO_MASK_SIZE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>FSP MMIO mask size value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ AND mask applied to RA 32:35 when transmitting address to FSP
+ NOTE: RA 14:31 are always replaced with zero
+ </description>
+ <valueType>uint64</valueType>
+ <enum>
+ 4_GB = 0x0000000100000000,
+ 2_GB = 0x0000000080000000,
+ 1_GB = 0x0000000040000000,
+ 512_MB = 0x0000000020000000,
+ 256_MB = 0x0000000010000000
+ </enum>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_INTP_BAR_ENABLE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>INTP BAR enable
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes: none
+ </description>
+ <valueType>uint8</valueType>
+ <enum>DISABLE = 0x0, ENABLE = 0x1</enum>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_INTP_BAR_BASE_ADDR</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>INTP BAR base address value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ 64-bit address representing BAR RA
+ NOTE: BAR register covers RA 14:43
+ NOTE: Implied size of 1MB
+ </description>
+ <valueType>uint64</valueType>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_NX_MMIO_BAR_ENABLE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>NX MMIO BAR enable
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes: none
+ </description>
+ <valueType>uint8</valueType>
+ <enum>DISABLE = 0x0, ENABLE = 0x1</enum>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_NX_MMIO_BAR_BASE_ADDR</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>NX MMIO BAR base address value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ 64-bit address representing BAR RA
+ NOTE: BAR register covers RA 14:51
+ </description>
+ <valueType>uint64</valueType>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_NX_MMIO_BAR_SIZE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>NX MMIO BAR size value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes: none
+ </description>
+ <valueType>uint64</valueType>
+ <enum>
+ 16_GB = 0x0000000400000000,
+ 16_MB = 0x0000000001000000,
+ 1_MB = 0x0000000000100000,
+ 64_KB = 0x0000000000010000,
+ 4_KB = 0x0000000000001000
+ </enum>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_PCIE_BAR_ENABLE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>PCIE BAR enable
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ first dimension: PCIE unit number (0:2)
+ second dimension: BAR number (0:2)
+ </description>
+ <valueType>uint8</valueType>
+ <enum>DISABLE = 0x0, ENABLE = 0x1</enum>
+ <array>3,3</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_PCIE_BAR_BASE_ADDR</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>PCIE BAR base address value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ 64-bit address representing BAR RA
+ first dimension: PCIE unit number (0:2)
+ second dimension: BAR number (0:2)
+ NOTE: BAR0/1 registers cover RA 14:47
+ NOTE: BAR2 registers covers RA 14:51
+ </description>
+ <valueType>uint64</valueType>
+ <array>3,3</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+ <attribute>
+ <id>ATTR_PROC_PCIE_BAR_SIZE</id>
+ <targetType>TARGET_TYPE_PROC_CHIP</targetType>
+ <description>PCIE BAR size value
+ creator: platform
+ consumer: proc_setup_bars
+ firmware notes:
+ first dimension: PCIE unit number (0:2)
+ second dimension: BAR number (0:2)
+ NOTE: supported BAR0/1 sizes are from 64KB-1PB
+ NOTE: only supported BAR2 size is 4KB
+ </description>
+ <valueType>uint64</valueType>
+ <enum>
+ 1_PB = 0x0004000000000000,
+ 512_TB = 0x0002000000000000,
+ 256_TB = 0x0001000000000000,
+ 128_TB = 0x0000800000000000,
+ 64_TB = 0x0000400000000000,
+ 32_TB = 0x0000200000000000,
+ 16_TB = 0x0000100000000000,
+ 8_TB = 0x0000080000000000,
+ 4_TB = 0x0000040000000000,
+ 2_TB = 0x0000020000000000,
+ 1_TB = 0x0000010000000000,
+ 512_GB = 0x0000008000000000,
+ 256_GB = 0x0000004000000000,
+ 128_GB = 0x0000002000000000,
+ 64_GB = 0x0000001000000000,
+ 32_GB = 0x0000000800000000,
+ 16_GB = 0x0000000400000000,
+ 8_GB = 0x0000000200000000,
+ 4_GB = 0x0000000100000000,
+ 2_GB = 0x0000000080000000,
+ 1_GB = 0x0000000040000000,
+ 512_MB = 0x0000000020000000,
+ 256_MB = 0x0000000010000000,
+ 128_MB = 0x0000000008000000,
+ 64_MB = 0x0000000004000000,
+ 32_MB = 0x0000000002000000,
+ 16_MB = 0x0000000001000000,
+ 8_MB = 0x0000000000800000,
+ 4_MB = 0x0000000000400000,
+ 2_MB = 0x0000000000200000,
+ 1_MB = 0x0000000000100000,
+ 512_KB = 0x0000000000080000,
+ 256_KB = 0x0000000000040000,
+ 128_KB = 0x0000000000020000,
+ 64_KB = 0x0000000000010000,
+ 4_KB = 0x0000000000001000
+ </enum>
+ <array>3,3</array>
+ <platInit/>
+ <persistRuntime/>
+ </attribute>
+ <!-- ********************************************************************* -->
+</attributes> \ No newline at end of file
diff --git a/src/usr/hwpf/hwp/memory_attributes.xml b/src/usr/hwpf/hwp/memory_attributes.xml
index 7b13b1d67..8e8499941 100644
--- a/src/usr/hwpf/hwp/memory_attributes.xml
+++ b/src/usr/hwpf/hwp/memory_attributes.xml
@@ -1,25 +1,25 @@
<!-- IBM_PROLOG_BEGIN_TAG
This is an automatically generated prolog.
-
+
$Source: src/usr/hwpf/hwp/memory_attributes.xml $
-
+
IBM CONFIDENTIAL
-
+
COPYRIGHT International Business Machines Corp. 2012
-
+
p1
-
+
Object Code Only (OCO) source materials
Licensed Internal Code Source Materials
IBM HostBoot Licensed Internal Code
-
+
The source code for this program is not published or other-
wise divested of its trade secrets, irrespective of what has
been deposited with the U.S. Copyright Office.
-
+
Origin: 30
-
IBM_PROLOG_END_TAG -->
+
<attributes>
<!-- DO NOT EDIT THIS FILE DIRECTLY PLEASE UPDATE THE ODS FILE AND FOLLOW THE INSTRUCTION TAB -->
<!-- PLEASE SEE MARK BELLOWS (BELLOWS.IBM.COM) OR OTHERS ON MEMORY TEAM FOR HELP -->
OpenPOWER on IntegriCloud