Updates to generate witherspoon pnor successfully
- Update witherspoon.mk to use processMrw and point to the latest xml
- Update hostboot's witherspoon.config
- Add patches for processMrw and dvpd fix
diff --git a/openpower/configs/hostboot/witherspoon.config b/openpower/configs/hostboot/witherspoon.config
index ff2a828..5e1197d 100755
--- a/openpower/configs/hostboot/witherspoon.config
+++ b/openpower/configs/hostboot/witherspoon.config
@@ -1,6 +1,7 @@
# The Serial Flash Controller is the AST2400 BMC.
set SFC_IS_AST2500
-unset BMC_DOES_SFC_INIT
+unset SFC_IS_AST2400
+unset BMC_DOES_SFC_INIT
unset SFC_IS_IBM_DPSS
set ALLOW_MICRON_PNOR
set ALLOW_MACRONIX_PNOR
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index f03890b..2fc2051 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
#
################################################################################
HOSTBOOT_VERSION_BRANCH_MASTER_P8 ?= 09cfacbaf1cd18da4e6e9072afcc8db28ca56ffe
-HOSTBOOT_VERSION_BRANCH_MASTER ?= 41a7ef20f6aaf52c3939bde7d5ad9adc86514fc0
+HOSTBOOT_VERSION_BRANCH_MASTER ?= 6ae28349bf7658efece45325f27e802a19ec308b
HOSTBOOT_VERSION ?= $(if $(BR2_OPENPOWER_POWER9),$(HOSTBOOT_VERSION_BRANCH_MASTER),$(HOSTBOOT_VERSION_BRANCH_MASTER_P8))
HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
diff --git a/openpower/package/hostboot/p9Patches/hostboot-0003-processMRW-updates-for-witherspoon.patch b/openpower/package/hostboot/p9Patches/hostboot-0003-processMRW-updates-for-witherspoon.patch
new file mode 100644
index 0000000..8ca8e7a
--- /dev/null
+++ b/openpower/package/hostboot/p9Patches/hostboot-0003-processMRW-updates-for-witherspoon.patch
@@ -0,0 +1,1267 @@
+From 7ad7fc3bf87ae43c917dda3d8fc6e81747f7816c Mon Sep 17 00:00:00 2001
+From: Prachi Gupta <pragupta@us.ibm.com>
+Date: Mon, 26 Sep 2016 10:04:58 -0500
+Subject: [PATCH 1/2] processMRW updates for witherspoon
+
+Change-Id: Idf410eedf5214de5c106c5d5fa6503458c17f115
+RTC:143114
+Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/30511
+Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
+Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
+Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
+Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
+---
+ src/usr/targeting/common/Targets.pm | 741 ++++++++++++++++-----
+ src/usr/targeting/common/processMrw.pl | 176 +++--
+ .../targeting/common/xmltohb/attribute_types.xml | 2 +-
+ src/usr/targeting/common/xmltohb/target_types.xml | 6 +
+ 4 files changed, 685 insertions(+), 240 deletions(-)
+
+diff --git a/src/usr/targeting/common/Targets.pm b/src/usr/targeting/common/Targets.pm
+index 32a789e..fc18675 100644
+--- a/src/usr/targeting/common/Targets.pm
++++ b/src/usr/targeting/common/Targets.pm
+@@ -28,6 +28,40 @@ use strict;
+ use XML::Simple;
+ use XML::Parser;
+ use Data::Dumper;
++use feature "state";
++
++use constant
++{
++ MAX_PROC_PER_NODE => 8,
++ MAX_CORE_PER_PROC => 24,
++ MAX_EX_PER_PROC => 12,
++ MAX_EQ_PER_PROC => 6,
++ MAX_ABUS_PER_PROC => 3,
++ MAX_XBUS_PER_PROC => 3,
++ MAX_MCS_PER_PROC => 4,
++ MAX_MCA_PER_PROC => 8,
++ MAX_MCBIST_PER_PROC => 2,
++ MAX_PEC_PER_PROC => 3, # PEC is same as PBCQ
++ MAX_PHB_PER_PROC => 6, # PHB is same as PCIE
++ MAX_MBA_PER_MEMBUF => 2,
++ MAX_OBUS_PER_PROC => 4,
++ MAX_PPE_PER_PROC => 51, #Only 21, but they are sparsely populated
++ MAX_PERV_PER_PROC => 56, #Only 42, but they are sparsely populated
++ MAX_CAPP_PER_PROC => 2,
++ MAX_SBE_PER_PROC => 1,
++ MAX_NV_PER_PROC => 1, # FW only for GARD purposes
++ MAX_MI_PER_PROC => 4,
++ PERVASIVE_PARENT_CORE_OFFSET => 32,
++ PERVASIVE_PARENT_EQ_OFFSET => 16,
++ PERVASIVE_PARENT_XBUS_OFFSET => 6,
++ PERVASIVE_PARENT_OBUS_OFFSET => 9,
++ PERVASIVE_PARENT_MCBIST_OFFSET => 7,
++ PERVASIVE_PARENT_MCS_OFFSET => 7,
++ PERVASIVE_PARENT_MCA_OFFSET => 7,
++ PERVASIVE_PARENT_PEC_OFFSET => 13,
++ PERVASIVE_PARENT_PHB_OFFSET => 13,
++ PERVASIVE_PARENT_NV_OFFSET => 5,
++};
+
+ sub new
+ {
+@@ -152,11 +186,19 @@ sub printTarget
+ my $target = shift;
+
+ my $target_ptr = $self->getTarget($target);
++
++ if ($target eq "")
++ {
++ return;
++ }
++
+ print $fh "<targetInstance>\n";
+ my $target_id = $self->getAttribute($target, "PHYS_PATH");
+ $target_id = substr($target_id, 9);
+ $target_id =~ s/\///g;
+ $target_id =~ s/\-//g;
++
++
+ print $fh "\t<id>" . $target_id . "</id>\n";
+ print $fh "\t<type>" . $self->getTargetType($target) . "</type>\n";
+
+@@ -179,35 +221,142 @@ sub printAttribute
+ # TODO RTC: TBD
+ # temporary until we converge attribute types
+ my %filter;
+- $filter{MRW_TYPE} = 1;
+- $filter{INSTANCE_PATH} = 1;
+- $filter{SYSTEM_NAME} = 1;
+- $filter{BUS_TYPE} = 1;
+- $filter{DIRECTION} = 1;
+- $filter{ENABLE_CAPI} = 1;
+- $filter{PCIE_CONFIG_NUM} = 1;
+- $filter{PCIE_LANE_MASK} = 1;
+- $filter{PCIE_LANE_SET} = 1;
+- $filter{PCIE_NUM_LANES} = 1;
+- $filter{PHB_NUM} = 1;
+- $filter{IOP_NUM} = 1;
+- $filter{LOCATION_CODE} = 1;
+- $filter{MCS_NUM} = 1;
+- $filter{SCHEMATIC_INTERFACE} = 1;
+- $filter{ENTITY_ID} = 1;
+- $filter{CLASS} = 1;
+- $filter{MODEL} = 1;
+- $filter{TYPE} = 1;
+- $filter{CDM_POLICIES} = 1;
+- $filter{CDM_POLICIES_BITMASK} = 1;
+- $filter{ENTITY_ID_LOOKUP} = 1;
+- $filter{ENTITY_INSTANCE} = 1;
+- $filter{MBA_NUM} = 1;
+- $filter{IPMI_NAME} = 1;
+- $filter{INSTANCE_ID} = 1;
+- $filter{IO_CONFIG_SELECT} = 1;
+- $filter{FRU_NAME} = 1;
+-
++ $filter{MRW_TYPE} = 1;
++ $filter{SYSTEM_NAME} = 1;
++ $filter{BUS_TYPE} = 1;
++ $filter{DIRECTION} = 1;
++ $filter{ENABLE_CAPI} = 1;
++ $filter{PCIE_CONFIG_NUM} = 1;
++ $filter{PCIE_LANE_MASK} = 1;
++ $filter{PCIE_LANE_SET} = 1;
++ $filter{PCIE_NUM_LANES} = 1;
++ $filter{PHB_NUM} = 1;
++ $filter{IOP_NUM} = 1;
++ $filter{LOCATION_CODE} = 1;
++ $filter{LOCATION_CODE_TYPE} = 1;
++ $filter{MCS_NUM} = 1;
++ $filter{SCHEMATIC_INTERFACE} = 1;
++ $filter{ENTITY_ID} = 1;
++ $filter{CLASS} = 1;
++ $filter{MODEL} = 1;
++ $filter{TYPE} = 1;
++ $filter{CDM_POLICIES} = 1;
++ $filter{CDM_POLICIES_BITMASK} = 1;
++ $filter{ENTITY_ID_LOOKUP} = 1;
++ $filter{ENTITY_INSTANCE} = 1;
++ $filter{MBA_NUM} = 1;
++ $filter{IPMI_NAME} = 1;
++ $filter{INSTANCE_ID} = 1;
++ $filter{INSTANCE_PATH} = 1;
++ $filter{IO_CONFIG_SELECT} = 1;
++ $filter{FRU_NAME} = 1;
++ $filter{TPM_BACKUP_INFO} = 1;
++ $filter{TPM_PRIMARY_INFO} = 1;
++ $filter{ALL_MCS_IN_INTERLEAVING_GROUP} = 1;
++ $filter{AVERAGE_IPL_TIME} = 1;
++ $filter{CHECK_SCRIPT} = 1;
++ $filter{DMI_DFE_OVERRIDE} = 1;
++ $filter{FREQ_A} = 1;
++ $filter{FREQ_NEST_HFT} = 1;
++ $filter{FREQ_PB} = 1;
++ $filter{FREQ_PB_HFT} = 1;
++ $filter{FREQ_PCIE} = 1;
++ $filter{FREQ_X} = 1;
++ $filter{FREQ_X_HFT} = 1;
++ $filter{LED_ON_DEFAULT_GPIO_VALUE} = 1;
++ $filter{LED_STRATEGY} = 1;
++ $filter{MSS_MCA_HASH_MODE} = 1;
++ $filter{MRW_ENHANCED_GROUPING_NO_MIRRORING} = 1;
++ $filter{MRW_MEM_MIRRORING_ALLOWED} = 1;
++ $filter{MRW_MEM_MIRRORING_ENABLE_DEFAULT} = 1;
++ $filter{MRW_MEM_POWER_CONTROL_USAGE} = 1;
++ $filter{MRW_VMEM_REGULATOR_MEMORY_POWER_LIMIT_PER_DIMM} = 1;
++ $filter{MRW_VMEM_REGULATOR_MEMORY_POWER_LIMIT_PER_DIMM_DDR4} = 1;
++ $filter{MRW_VMEM_REGULATOR_POWER_LIMIT_PER_DIMM_ADJ_ENABLE} = 1;
++ $filter{MSS_VOLT_VDDR_OFFSET_DISABLE} = 1;
++ $filter{OCC_LOAD_TIMEOUT} = 1;
++ $filter{OCC_RESET_TIMEOUT} = 1;
++ $filter{PCIE_DEFAULT_HDDW_SLOT_COUNT} = 1;
++ $filter{PCIE_MIN_HDDW_SLOT_COUNT} = 1;
++ $filter{PCIE_MAX_HDDW_SLOT_COUNT} = 1;
++ $filter{REDUNDANT_FSPS} = 1;
++ $filter{SYSTEM_MTM} = 1;
++ $filter{PM_EXTERNAL_VRM_STEPSIZE} = 1;
++ $filter{PM_EXTERNAL_VRM_STEPDELAY} = 1;
++ $filter{PM_SPIPSS_FREQUENCY} = 1;
++ $filter{PM_SYSTEM_IVRMS_ENABLED} = 1;
++ $filter{NUMERIC_POD_TYPE_TEST} = 1;
++ $filter{CARD_TYPE} = 1;
++ $filter{PROC_PCIE_DSMP_CAPABLE} = 1;
++ $filter{PROC_PCIE_IOP_CONFIG} = 1;
++ $filter{PROC_PCIE_IOP_G2_PLL_CONTROL0} = 1;
++ $filter{PROC_PCIE_IOP_G3_PLL_CONTROL0} = 1;
++ $filter{PROC_PCIE_IOP_PCS_CONTROL0} = 1;
++ $filter{PROC_PCIE_IOP_PCS_CONTROL1} = 1;
++ $filter{PROC_PCIE_IOP_PLL_GLOBAL_CONTROL0} = 1;
++ $filter{PROC_PCIE_IOP_PLL_GLOBAL_CONTROL1} = 1;
++ $filter{PROC_PCIE_IOP_REVERSAL} = 1;
++ $filter{PROC_PCIE_IOP_REVERSAL_BIFURCATED} = 1;
++ $filter{PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED} = 1;
++ $filter{PROC_PCIE_IOP_RX_PEAK} = 1;
++ $filter{PROC_PCIE_IOP_RX_SDL} = 1;
++ $filter{PROC_PCIE_IOP_RX_VGA_CONTROL2} = 1;
++ $filter{PROC_PCIE_IOP_TX_BWLOSS1} = 1;
++ $filter{PROC_PCIE_IOP_TX_FFE_GEN1} = 1;
++ $filter{PROC_PCIE_IOP_TX_FFE_GEN2} = 1;
++ $filter{PROC_PCIE_IOP_TX_FIFO_OFFSET} = 1;
++ $filter{PROC_PCIE_IOP_TX_RCVRDETCNTL} = 1;
++ $filter{PROC_PCIE_IOP_ZCAL_CONTROL} = 1;
++ $filter{NPU_MMIO_BAR_SIZE} = 1;
++ $filter{NPU_MMIO_BAR_BASE_ADDR} = 1;
++ $filter{PROC_PCIE_REFCLOCK_ENABLE} = 1;
++ $filter{PSI_HB_ESP_ADDR} = 1;
++ $filter{TPM_INFO} = 1;
++ $filter{STANDBY_PLUGGABLE} = 1;
++ $filter{CPM_INFLECTION_POINTS} = 1;
++ $filter{PROC_FABRIC_X_ATTACHED_CHIP_CNFG} = 1;
++ $filter{PROC_PCIE_HOTPLUG_DISABLE_ACTIONS} = 1;
++ $filter{SYSTEM_RESCLK_VALUE} = 1;
++ $filter{HWAS_STATE} = 1;
++ $filter{PROC_MIRROR_SIZES} = 1;
++ $filter{PROC_FABRIC_X_ADDR_DIS} = 1;
++ $filter{PROC_PCIE_HOTPLUG_ENABLE_ACTIONS} = 1;
++ $filter{PROC_FABRIC_A_ATTACHED_LINK_ID} = 1;
++ $filter{PROC_MEM_BASES} = 1;
++ $filter{UNIT_TEST_MCA_MEMORY_SIZES} = 1;
++ $filter{SYSTEM_RESCLK_L3_VALUE} = 1;
++ $filter{PROC_CHTM_BAR_SIZES} = 1;
++ $filter{SYSTEM_RESCLK_FREQ_REGIONS} = 1;
++ $filter{PROC_MIRROR_SIZES_ACK} = 1;
++ $filter{PROC_FABRIC_X_ATTACHED_LINK_ID} = 1;
++ $filter{PROC_FABRIC_A_ATTACHED_LINK_ID} = 1;
++ $filter{PROC_FABRIC_A_ATTACHED_CHIP_ID} = 1;
++ $filter{PROC_MEM_SIZES} = 1;
++ $filter{PROC_FABRIC_OPTICS_CONFIG_MODE} = 1;
++ $filter{PROC_PCIE_LANE_EQUALIZATION} = 1;
++ $filter{HOT_PLUG_POWER_CONTROLLER_INFO} = 1;
++ $filter{PROC_MEM_BASES_ACK} = 1;
++ $filter{PROC_FABRIC_A_ATTACHED_CHIP_CNFG} = 1;
++ $filter{CHTM_TRACE_TYPE} = 1;
++ $filter{PROC_PCIE_NOT_F_LINK} = 1;
++ $filter{PROC_FABRIC_X_ATTACHED_CHIP_ID} = 1;
++ $filter{PROC_FABRIC_A_ADDR_DIS} = 1;
++ $filter{MSS_MCS_GROUP_32} = 1;
++ $filter{PROC_MIRROR_BASES_ACK} = 1;
++ $filter{DELETE_AFFINITY_PATH} = 1;
++ $filter{PROC_MIRROR_BASES} = 1;
++ $filter{PROC_FABRIC_A_LINK_DELAY} = 1;
++ $filter{PROC_MEM_SIZES_ACK} = 1;
++ $filter{SYSTEM_RESCLK_FREQ_REGION_INDEX} = 1;
++ $filter{PROC_FABRIC_X_LINK_DELAY} = 1;
++ $filter{PROC_CHTM_BAR_BASE_ADDR} = 1;
++ $filter{TOD_CPU_DATA} = 1;
++ $filter{MSS_VOLT} = 1;
++ $filter{EFF_READ_DBI} = 1;
++ $filter{RU_TYPE} = 1;
++ $filter{STANDBY_PLUGGABLE} = 1;
++ $filter{MANUFACTURER} = 1;
++ $filter{HWAS_STATE_CHANGED_SUBSCRIPTION_MASK} = 1;
+ if ($filter{$attribute} == 1)
+ {
+ return;
+@@ -313,6 +462,7 @@ sub buildHierarchy
+ {
+ $baseptr = $self->{xml}->{'targetInstances'}->{'targetInstance'};
+ }
++
+ if ($target eq "")
+ {
+ ## find system target
+@@ -453,189 +603,441 @@ sub buildHierarchy
+ ## HOSTBOOT expected hierarchy: sys/node/proc/<unit>
+ ## sys/node/proc/mcs/membuf/<unit>
+ ## sys/node/proc/mcs/membuf/mba/dimm
++## This function also sets the common attributes for all the targets
++## Common attributes include:
++## - FAPI_NAME
++## - PHYS_PATH
++## - AFFINITY_PATH
++## - ORDINAL_ID
++## - HUID
+
+ sub buildAffinity
+ {
+ my $self = shift;
+- my $node = -1;
+- my $tpm = -1;
+- my $proc = -1;
+- my $node_phys = "";
+- my $node_aff = "";
+- my $core_num = 0;
++ my $node = -1;
++ my $proc = -1;
++ my $tpm = -1;
++ my $sys_phys = "";
++ my $node_phys = "";
++ my $node_aff = "";
++ my $sys_pos = -1;
++ my $mcbist = -1;
++
+ $self->{membuf_inst_num}=0;
++
+ foreach my $target (sort keys %{ $self->{data}->{TARGETS} })
+ {
+ my $target_ptr = $self->{data}->{TARGETS}{$target};
+ my $type = $self->getType($target);
+ my $type_id = $self->getEnumValue("TYPE", $type);
++ my $pos = $self->{data}->{TARGETS}{$target}{TARGET}{position};
++ $sys_pos = $pos if ($type eq "SYS");
++
+ if ($type_id eq "") { $type_id = 0; }
+
+ if ($type eq "SYS")
+ {
+ $proc = -1;
+ $node = -1;
+-
+ $self->{targeting}{SYS}[0]{KEY} = $target;
+- $self->setAttribute($target, "AFFINITY_PATH",
+- "affinity:".$self->{TOP_LEVEL});
+- $self->setAttribute($target, "PHYS_PATH",
+- "physical:".$self->{TOP_LEVEL});
+- $self->setAttribute($target, "ENTITY_INSTANCE","0");
++
++ #SYS target has PHYS_PATH and AFFINITY_PATH defined in the XML
++ #Also, there is no HUID for SYS
++ $self->setAttribute($target,"FAPI_NAME",getFapiName($type));
++ $self->setAttribute($target,"FAPI_POS", $pos);
++ $self->setAttribute($target,"ORDINAL_ID", $pos);
++ $sys_phys = $self->getAttribute($target, "PHYS_PATH");
++ $sys_phys = substr($sys_phys, 9);
+ }
+ elsif ($type eq "NODE")
+ {
+- $core_num = 0;
+- $proc = -1;
+- $self->{dimm_tpos} = 0;
+- $self->{membuf_inst_num}=0;
++ $proc = -1;
++ $self->{membuf_inst_num} = 0;
+ $node++;
+- $node_phys = "physical:".$self->{TOP_LEVEL}."/node-$node";
+- $node_aff = "affinity:".$self->{TOP_LEVEL}."/node-$node";
++
++ $node_phys = "physical:".$sys_phys."/node-$node";
++ $node_aff = "affinity:".$sys_phys."/node-$node";
++
+ $self->{targeting}{SYS}[0]{NODES}[$node]{KEY} = $target;
+- $self->setAttribute($target, "AFFINITY_PATH",
+- "affinity:".$self->{TOP_LEVEL}."/node-$node");
+- $self->setAttribute($target, "PHYS_PATH",
+- "physical:".$self->{TOP_LEVEL}."/node-$node");
+- $self->setHuid($target, 0, $node);
+- $self->setAttribute($target, "ENTITY_INSTANCE",$node);
++
++ $self->setHuid($target, $sys_pos, $node);
++ $self->setAttribute($target, "FAPI_NAME",getFapiName($type));
++ $self->setAttribute($target, "FAPI_POS", $pos);
++ $self->setAttribute($target, "PHYS_PATH", $node_phys);
++ $self->setAttribute($target, "AFFINITY_PATH", $node_aff);
++ $self->setAttribute($target, "ORDINAL_ID", $pos);
+ }
+ elsif ($type eq "TPM")
+ {
+ $tpm++;
++
+ $self->{targeting}{SYS}[0]{NODES}[$node]{TPMS}[$tpm]{KEY} = $target;
+- $self->setAttribute($target, "AFFINITY_PATH",
+- "affinity:".$self->{TOP_LEVEL}.
+- "/node-$node/tpm-$tpm");
+- $self->setAttribute($target, "PHYS_PATH",
+- "physical:".$self->{TOP_LEVEL}.
+- "/node-$node/tpm-$tpm");
+- $self->setHuid($target, 0, $tpm);
+- $self->setAttribute($target, "ENTITY_INSTANCE",$tpm);
++
++ my $tpm_phys = $node_phys . "/tpm-$tpm";
++ my $tpm_aff = $node_aff . "/tpm-$tpm";
++
++
++ $self->setHuid($target, $sys_pos, $tpm);
++ $self->setAttribute($target, "FAPI_NAME",getFapiName($type));
++ $self->setAttribute($target, "FAPI_POS", $pos);
++ $self->setAttribute($target, "PHYS_PATH", $tpm_phys);
++ $self->setAttribute($target, "AFFINITY_PATH", $tpm_aff);
++ $self->setAttribute($target, "ORDINAL_ID", $pos);
++ }
++ elsif ($type eq "MCS")
++ {
++ $self->setAttribute($target, "VPD_REC_NUM", 0);
++ $self->setAttribute($target, "MEMVPD_POS",
++ $self->getAttribute($target, "CHIP_UNIT"));
++ }
++ elsif ($type eq "MCA")
++ {
++ my $ddrs = $self->findConnections($target,"DDR4","");
++ $self->processDimms($ddrs, $sys_pos, $node_phys, $node, $proc);
+ }
+ elsif ($type eq "PROC")
+ {
+ $proc++;
+- my $num_mcs = 0;
+- ### count number of MCSs
+- foreach my $unit (@{ $self->{data}->{TARGETS}{$target}{CHILDREN} })
+- {
+- my $unit_type = $self->getType($unit);
+- if ($unit_type eq "MCS")
+- {
+- $num_mcs++;
+- }
+- }
+- if ($num_mcs > $self->{MAX_MCS})
+- {
+- $self->{MAX_MCS} = $num_mcs;
+- }
++
+ $self->{NUM_PROCS_PER_NODE} = $proc + 1;
++
+ $self->{targeting}->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{KEY} =
+- $target;
+-
+- $self->setHuid($target, 0, $node);
+- my $socket = $self->getTargetParent(
+- $self->getTargetParent($target));
+- my $parent_affinity = "affinity:".$self->{TOP_LEVEL}
+- ."/node-$node/proc-$proc";
+- my $parent_physical = "physical:".$self->{TOP_LEVEL}
+- ."/node-$node/proc-$proc";
+- $self->setAttribute($target, "AFFINITY_PATH", $parent_affinity);
+- $self->setAttribute($target, "PHYS_PATH", $parent_physical);
+- $self->setAttribute($target, "POSITION", $proc);
+- $self->setAttribute($target, "ENTITY_INSTANCE",$proc);
++ $target;
++
++ my $socket=$self->getTargetParent($self->getTargetParent($target));
++ my $parent_affinity = $node_aff . "/proc-$proc";
++ my $parent_physical = $node_phys . "/proc-$proc";
++
++ my $fapi_name = getFapiName($type, $node, $proc);
++
++ $self->setHuid($target, $sys_pos, $node);
++ $self->setAttribute($target, "FAPI_NAME", $fapi_name);
++ $self->setAttribute($target, "PHYS_PATH", $parent_physical);
++ $self->setAttribute($target, "AFFINITY_PATH", $parent_affinity);
++ $self->setAttribute($target, "ORDINAL_ID", $pos);
++ $self->setAttribute($target, "POSITION", $pos);
++
+ $self->setAttribute($target, "FABRIC_GROUP_ID",
+ $self->getAttribute($socket,"FABRIC_GROUP_ID"));
+ $self->setAttribute($target, "FABRIC_CHIP_ID",
+ $self->getAttribute($socket,"FABRIC_CHIP_ID"));
+-
+ $self->setAttribute($target, "VPD_REC_NUM", $proc);
+
++ $self->iterateOverChiplets($target, $sys_pos, $node, $proc);
++ }
++ }
++}
+
+- foreach my $unit (@{ $self->{data}->{TARGETS}{$target}{CHILDREN} })
+- {
+- my $unit_ptr = $self->getTarget($unit);
+- my $unit_type = $self->getType($unit);
+- my $unit_type_id = $self->getEnumValue("TYPE", $unit_type);
+- if ( $unit_type_id eq "" || $unit_type eq "FSI"
+- || $unit_type eq "MCS")
+- {
+- $unit_type_id = 0;
+- }
+
+- ## don't want non-hostboot targets
+- if ($unit_type_id > 0)
+- {
++sub iterateOverChiplets
++{
++ my $self = shift;
++ my $target = shift;
++ my $sys = shift;
++ my $node = shift;
++ my $proc = shift;
++ my $tgt_ptr = $self->getTarget($target);
++ my $tgt_type = $self->getType($target);
+
+- push(@{$self->{targeting}
+- ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{$unit_type}},
+- { 'KEY' => $unit });
+- my $affinity_path =
+- $parent_affinity . "/"
+- . $self->getTarget($unit)->{TARGET}->{instance_name};
+- my $physical_path =
+- $parent_physical . "/"
+- . $self->getTarget($unit)->{TARGET}->{instance_name};
+- $self->setAttribute($unit, "AFFINITY_PATH",$affinity_path);
+- $self->setAttribute($unit, "PHYS_PATH", $physical_path);
+- $self->setHuid($unit, 0, $node);
+- if ($unit_type eq "OCC")
+- {
+- $self->setAttribute($unit, "ENTITY_INSTANCE",$proc);
+- }
+- ## export core
+- if ($unit_type eq "EX")
+- {
+- my $core_unit_num = $self->getAttribute($unit,
+- "CHIP_UNIT");
+-
+- my $core_unit =
+- $self->{data}->{TARGETS}{$unit}{CHILDREN}[0];
+- push(
+- @{
+- $self->{targeting}
+- ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{CORE}
+- },
+- { 'KEY' => $core_unit }
+- );
+- my $core_affinity_path =
+- $affinity_path . "/"
+- . $self->getTarget($core_unit)->{TARGET}
+- ->{instance_name};
+- my $core_physical_path =
+- $physical_path . "/"
+- . $self->getTarget($core_unit)->{TARGET}
+- ->{instance_name};
+- $self->setAttribute($core_unit, "AFFINITY_PATH",
+- $core_affinity_path);
+- $self->setAttribute($core_unit, "PHYS_PATH",
+- $core_physical_path);
+- $self->setAttribute($core_unit, "CHIP_UNIT",
+- $core_unit_num);
+- $self->setHuid($core_unit, 0, $node);
+- $self->setAttribute($core_unit, "ENTITY_INSTANCE",
+- $core_num);
+- $core_num++;
+- }
+- }
+- elsif ($unit_type eq "MCS")
+- {
+- $self->processMcs($unit, $node, $proc, $parent_affinity,
+- $parent_physical, $node_phys);
++ my $target_children = $self->getTargetChildren($target);
++ my $prev_target = "PROC";
+
+- }
++ if ($target_children eq "")
++ {
++ return "";
++ }
++ else
++ {
++ foreach my $child (@{ $self->getTargetChildren($target) })
++ {
++ my $unit_ptr = $self->getTarget($child);
++ my $unit_type = $self->getType($child);
++ #System XML has some sensor target as hidden children
++ #of targets. We don't care for sensors in this function
++ #So, we can avoid them with this conditional
++ if ($unit_type ne "NA" && $unit_type ne "FSI" &&
++ $unit_type ne "PCI")
++ {
++ #set common attrs for child
++ $self->setCommonAttrForChiplet($child, $sys, $node, $proc);
++ $self->iterateOverChiplets($child, $sys, $node, $proc);
+ }
+ }
+ }
+ }
+
++sub setCommonAttrForChiplet
++{
++ my $self = shift;
++ my $target = shift;
++ my $sys = shift;
++ my $node = shift;
++ my $proc = shift;
++
++ my $tgt_ptr = $self->getTarget($target);
++ my $tgt_type = $self->getType($target);
++
++ push(@{$self->{targeting}
++ ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{$tgt_type}},
++ { 'KEY' => $target });
++
++ #This is a static variable. Persists over time
++ #everything that is a grand_children of proc
++ state %grand_children;
++ if (not %grand_children)
++ {
++ $grand_children{"EX"} = 1;
++ $grand_children{"CORE"} = 1;
++ $grand_children{"MCS"} = 1;
++ $grand_children{"MCA"} = 1;
++ }
++
++ my $pos = $self->getAttribute($target, "CHIP_UNIT");
++ my $unit_pos = $pos;
++
++ #HB expects chiplets' positions in AFFINITY_PATH to be relative to the
++ #parent, serverwiz outputs it unique/absolute.
++ #Since, in P9, each of the chiplets only have
++ #up to two children (each eq has 2 ex, each ex has 2 cores, each mcbist has
++ #two mcs, etc), we can simply calculate this by (absolute_Pos%2)
++ #CHIP_UNIT is absolute position
++ if ($grand_children{$tgt_type} eq 1)
++ {
++ $unit_pos = $pos%2;
++ }
++
++ my $parent_affinity = $self->getAttribute(
++ $self->getTargetParent($target),"AFFINITY_PATH");
++ my $parent_physical = $self->getAttribute(
++ $self->getTargetParent($target),"PHYS_PATH");
++
++ my $affinity_path = $parent_affinity . "/" . lc $tgt_type ."-". $unit_pos;
++ my $physical_path = $parent_physical . "/" . lc $tgt_type ."-". $unit_pos;
++
++ my $fapi_name = getFapiName($tgt_type, $node, $proc, $pos);
++
++ $self->{huid_idx}->{$tgt_type} = $pos;
++ $self->setHuid($target, $sys, $node);
++ $self->setAttribute($target, "FAPI_NAME", $fapi_name);
++ $self->setAttribute($target, "PHYS_PATH", $physical_path);
++ $self->setAttribute($target, "AFFINITY_PATH", $affinity_path);
++ $self->setAttribute($target, "ORDINAL_ID", $pos);
++ $self->setAttribute($target, "FAPI_POS", $pos);
++ $self->setAttribute($target, "REL_POS", $pos);
++
++ my $pervasive_parent= getPervasiveForUnit("$tgt_type$pos");
++ if ($pervasive_parent ne "")
++ {
++ my $perv_parent_val =
++ "physical:sys-$sys/node-$node/proc-$proc/perv-$pervasive_parent";
++ $self->setAttribute($target, "PARENT_PERVASIVE", $perv_parent_val);
++ }
++}
++
++sub getFapiName
++{
++ my $target = shift;
++ my $node = shift;
++ my $chipPos = shift;
++ my $chipletPos = shift;
++
++ if ($target eq "")
++ {
++ die "getFapiName: ERROR: Please specify a taget name\n";
++ }
++
++ #This is a static variable. Persists over time
++ state %nonFapiTargets;
++ if (not %nonFapiTargets)
++ {
++ $nonFapiTargets{"NODE"} = "NA";
++ $nonFapiTargets{"TPM"} = "NA";
++ $nonFapiTargets{"NVBUS"} = "NA";
++ $nonFapiTargets{"OCC"} = "NA";
++ }
++
++ if ($nonFapiTargets{$target} eq "NA")
++ {
++ return $nonFapiTargets{$target};
++ }
++ elsif ($target eq "SYS")
++ {
++ return "k0";
++ }
++ elsif ($target eq "PROC" || $target eq "DIMM")
++ {
++ if ($node eq "" || $chipPos eq "")
++ {
++ die "getFapiName: ERROR: Must specify node and chipPos for $target
++ current node: $node, chipPos: $chipPos\n";
++ }
++
++ my $chip_name = ($target eq "PROC") ? "pu" : "dimm";
++
++ my $fapi_name = sprintf("%s:k0:n%d:s0:p%02d",$chip_name,$node,$chipPos);
++ return $fapi_name;
++ }
++ else
++ {
++ if ($node eq "" || $chipPos eq "" || $chipletPos eq "")
++ {
++ die "getFapiName: ERROR: Must specify node, chipPos,
++ chipletPos for $target. Current node: $node, chipPos: $chipPos
++ chipletPos: $chipletPos\n";
++ }
++
++ $target = lc $target;
++ my $fapi_name = sprintf("pu.$target:k0:n%d:s0:p%02d:c%d",
++ $node, $chipPos, $chipletPos);
++ return $fapi_name;
++ }
++}
++
++sub getPervasiveForUnit
++{
++ # Input should be of the form <type><chip unit>, example: "core0"
++ my ($unit) = @_;
++
++ # The mapping is a static variable that is preserved across new calls to
++ # the function to speed up the mapping performance
++ state %unitToPervasive;
++
++ if ( not %unitToPervasive )
++ {
++ for my $core (0..MAX_CORE_PER_PROC-1)
++ {
++ $unitToPervasive{"CORE$core"} = PERVASIVE_PARENT_CORE_OFFSET+$core;
++ }
++ for my $eq (0..MAX_EQ_PER_PROC-1)
++ {
++ $unitToPervasive{"EQ$eq"} = PERVASIVE_PARENT_EQ_OFFSET + $eq;
++ }
++ for my $xbus (0..MAX_XBUS_PER_PROC-1)
++ {
++ $unitToPervasive{"XBUS$xbus"} = PERVASIVE_PARENT_XBUS_OFFSET;
++ }
++ for my $obus (0..MAX_OBUS_PER_PROC-1)
++ {
++ $unitToPervasive{"OBUS$obus"} = PERVASIVE_PARENT_OBUS_OFFSET+$obus;
++ }
++ for my $capp (0..MAX_CAPP_PER_PROC-1)
++ {
++ $unitToPervasive{"CAPP$capp"} = 2 * ($capp+1);
++ }
++ for my $mcbist (0..MAX_MCBIST_PER_PROC-1)
++ {
++ $unitToPervasive{"MCBIST$mcbist"} =
++ PERVASIVE_PARENT_MCBIST_OFFSET + $mcbist;
++ }
++ for my $mcs (0..MAX_MCS_PER_PROC-1)
++ {
++ $unitToPervasive{"MCS$mcs"} =
++ PERVASIVE_PARENT_MCS_OFFSET + ($mcs > 1);
++ }
++ for my $mca (0..MAX_MCA_PER_PROC-1)
++ {
++ $unitToPervasive{"MCA$mca"} =
++ PERVASIVE_PARENT_MCA_OFFSET + ($mca > 3);
++ }
++ for my $pec (0..MAX_PEC_PER_PROC-1)
++ {
++ $unitToPervasive{"PEC$pec"} =
++ PERVASIVE_PARENT_PEC_OFFSET + $pec;
++ }
++ for my $phb (0..MAX_PHB_PER_PROC-1)
++ {
++ $unitToPervasive{"PHB$phb"} =
++ PERVASIVE_PARENT_PHB_OFFSET + ($phb>0) + ($phb>2);
++ }
++ for my $nv (0..MAX_NV_PER_PROC-1)
++ {
++ $unitToPervasive{"NV$nv"} = PERVASIVE_PARENT_NV_OFFSET;
++ }
++ }
++
++ my $pervasive = "";
++ if(exists $unitToPervasive{$unit})
++ {
++ $pervasive = $unitToPervasive{$unit};
++ }
++
++ return $pervasive
++}
++sub processDimms
++{
++ my $self = shift;
++ my $ddrs = shift;
++ my $sys = shift;
++ my $node_phys = shift;
++ my $node = shift;
++ my $proc = shift;
++
++ if ($ddrs ne "")
++ {
++ #There should be 2 Connections
++ #Each MCA has 2 ddr channels
++ foreach my $dimms (@{$ddrs->{CONN}})
++ {
++ my $ddr = $dimms->{SOURCE};
++ my $port_num = $self->getAttribute($ddr,"MBA_PORT");
++ my $dimm_num = $self->getAttribute($ddr,"MBA_DIMM");
++ my $dimm=$dimms->{DEST_PARENT};
++
++ #proc->mcbist->mcs->mca->ddr
++ my $mca_target = $self->getTargetParent($ddr);
++ my $mcs_target = $self->getTargetParent($mca_target);
++ my $mcbist_target = $self->getTargetParent($mcs_target);
++ my $proc_target = $self->getTargetParent($mcbist_target);
++ my $dimm_connector_tgt = $self->getTargetParent($dimm);
++
++ my $mca = $self->getAttribute($mca_target, "CHIP_UNIT");
++ my $mcs = $self->getAttribute($mcs_target, "CHIP_UNIT");
++ my $mcbist = $self->getAttribute($mcbist_target, "CHIP_UNIT");
++ my $dimm_pos= $self->getAttribute($dimm_connector_tgt, "POSITION");
++
++ $dimm_pos = ($dimm_pos*2) + $port_num;
++
++ $self->setAttribute($dimm, "AFFINITY_PATH",
++ $self->getAttribute($mcbist_target, "AFFINITY_PATH")
++ . "/mcs-$mcs/mca-$mca/dimm-$port_num"
++ );
++
++ $self->setAttribute($dimm, "PHYS_PATH",
++ $node_phys . "/dimm-" . $dimm_pos);
++
++ my $type = $self->getType($dimm);
++
++ $self->setAttribute($dimm,"FAPI_NAME",
++ getFapiName($type, $node, $dimm_pos));
++
++ $self->setAttribute($dimm, "FAPI_POS", $dimm_pos);
++ $self->setAttribute($dimm, "ORDINAL_ID",$dimm_pos);
++ $self->setAttribute($dimm, "POSITION", $dimm_pos);
++ $self->setAttribute($dimm, "VPD_REC_NUM", $dimm_pos);
++
++ $self->{huid_idx}->{$type} = $dimm_pos;
++ $self->setHuid($dimm, $sys, $node);
++
++ $self->{targeting}
++ ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{MCBISTS}[$mcbist]
++ {MCSS}[$mcs]{MCAS}[$mca]{DIMMS}[$dimm_pos]{KEY}
++ = $dimm;
++ }
++
++ }
++
++}
+ sub processMcs
+ {
++#@TODO RTC:163874
++#Most of the nimmbus functionality is already in incorporated in other
++#functions. Leaving this in as we may need this code for centaur/cumulus.
++=begin
+ my $self = shift;
+ my $unit = shift;
+ my $node = shift;
+ my $proc = shift;
++ my $mcbist = shift;
+ my $parent_affinity = shift;
+ my $parent_physical = shift;
+ my $node_phys = shift;
+@@ -646,12 +1048,12 @@ sub processMcs
+ $self->setAttribute($unit, "PHYS_PATH", $parent_physical . "/mcs-$mcs");
+ $self->setAttribute($unit, "MCS_NUM", $mcs);
+ $self->setHuid($unit, 0, $node);
+- $self->{targeting}->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{MCSS}[$mcs]{KEY} =
+- $unit;
++ $self->{targeting}{SYS}[0]{NODES}[$node]{MCBISTS}{$mcbist}{MCSS}[$mcs]{KEY}
++ = $unit;
+
+- $self->setAttribute($unit, "EI_BUS_TX_LANE_INVERT","0");
+- $self->setAttribute($unit, "EI_BUS_TX_MSBSWAP","0");
+- $self->setAttribute($unit, "DMI_REFCLOCK_SWIZZLE","0");
++# $self->setAttribute($unit, "EI_BUS_TX_LANE_INVERT","0");
++# $self->setAttribute($unit, "EI_BUS_TX_MSBSWAP","0");
++# $self->setAttribute($unit, "DMI_REFCLOCK_SWIZZLE","0");
+
+ ## Find connected membufs
+ my $membuf_dmi = $self->{data}->{TARGETS}{$unit}{CONNECTION}{DEST}[0];
+@@ -719,7 +1121,8 @@ sub processMcs
+ $self->setHuid($child, 0, $node);
+ }
+
+- if ($self->getType($child) eq "MBA")
++
++ if ($self->getType($child) eq "MCA")
+ {
+ my $mba = $self->getAttribute($child,"MBA_NUM");
+ $self->setAttribute($child, "AFFINITY_PATH",
+@@ -732,9 +1135,10 @@ sub processMcs
+ {MBAS}[$mba]{KEY} = $child;
+
+ ## Trace the DDR busses to find connected DIMM
+- my $ddrs = $self->findConnections($child,"DDR3","");
++ my $ddrs = $self->findConnections($child,"DDR4","");
+ if ($ddrs ne "")
+ {
++
+ my $affinitypos=0;
+ foreach my $dimms (@{$ddrs->{CONN}})
+ {
+@@ -771,6 +1175,7 @@ sub processMcs
+ }
+ }
+ }
++=cut
+ }
+
+ sub setFsiAttributes
+@@ -808,7 +1213,6 @@ sub setFsiAttributes
+ $self->setAttribute($target, "ALTFSI_MASTER_PORT", $fsi_port);
+ }
+
+- #my $phys_path = $targetObj->getAttribute($parentTarget, "PHYS_PATH");
+ $self->setAttributeField($target, "FSI_OPTION_FLAGS","flipPort",
+ $flip_port);
+ $self->setAttributeField($target, "FSI_OPTION_FLAGS","reserved", "0");
+@@ -928,10 +1332,10 @@ sub findConnections
+ my $target = shift;
+ my $bus_type = shift;
+ my $end_type = shift;
+-
+ my %connections;
+ my $num=0;
+ my $target_children = $self->getTargetChildren($target);
++
+ if ($target_children eq "")
+ {
+ return "";
+@@ -949,6 +1353,7 @@ sub findConnections
+ my $type = $self->getMrwType($dest_parent);
+ my $dest_type = $self->getType($dest_parent);
+ my $dest_class = $self->getAttribute($dest_parent,"CLASS");
++
+ if ($type eq "NA")
+ {
+ $type = $dest_type;
+@@ -1184,6 +1589,8 @@ sub setAttributeField
+ my $value = shift;
+ $self->{data}->{TARGETS}->{$target}->{ATTRIBUTES}->{$attribute}->{default}
+ ->{field}->{$field}->{value} = $value;
++
++ $self->log($target, "Setting Attribute: $attribute ($field) =$value");
+ }
+ ## returns complex attribute value
+ sub getAttributeField
+diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
+index 6086371..f898500 100644
+--- a/src/usr/targeting/common/processMrw.pl
++++ b/src/usr/targeting/common/processMrw.pl
+@@ -107,10 +107,6 @@ foreach my $target (sort keys %{ $targetObj->getAllTargets() })
+ {
+ processMembuf($targetObj, $target);
+ }
+- elsif ($type eq "FSP")
+- {
+- processBmc($targetObj, $target);
+- }
+ elsif ($type eq "APSS")
+ {
+ processApss($targetObj, $target);
+@@ -119,7 +115,6 @@ foreach my $target (sort keys %{ $targetObj->getAllTargets() })
+ processIpmiSensors($targetObj,$target);
+ }
+
+-
+ ## check topology
+ foreach my $n (keys %{$targetObj->{TOPOLOGY}}) {
+ foreach my $p (keys %{$targetObj->{TOPOLOGY}->{$n}}) {
+@@ -386,48 +381,29 @@ sub convertNegativeNumbers
+ $targetObj->setAttribute($target,$attribute,$new_offset)
+ }
+
+-sub processBmc
+-{
+- my $targetObj = shift;
+- my $target = shift;
+- my $i2cs=$targetObj->findConnections($target,"I2C","PROC");
+- if ($i2cs ne "")
+- {
+- foreach my $i2c (@{$i2cs->{CONN}})
+- {
+- my $addr=$targetObj->getBusAttribute(
+- $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_ADDRESS");
+- $targetObj->setAttribute(
+- $i2c->{DEST_PARENT},"I2C_SLAVE_ADDRESS",$addr);
+- }
+- }
+- my $lpcs=$targetObj->findConnections($target,"LPC","PROC");
+- if ($lpcs ne "")
+- {
+- my $lpc=$lpcs->{CONN}->[0];
+- $targetObj->setMasterProc($lpc->{DEST_PARENT});
+- }
+-}
+-
+-
+ sub parseBitwise
+ {
+ my $targetObj = shift;
+ my $target = shift;
+ my $attribute = shift;
+-
+ my $mask = 0;
+- foreach my $e (keys %{ $targetObj->getEnumHash($attribute) }) {
+- my $field = $targetObj->getAttributeField(
+- $target,$attribute."_BITMASK",$e);
+- my $val=hex($targetObj->getEnumValue($attribute,$e));
+- if ($field eq "true")
++
++ #if CDM_POLICIES_BITMASK is not a bad attribute, aka if it is defined
++ if (!$targetObj->isBadAttribute($target, $attribute."_BITMASK"))
++ {
++ foreach my $e (keys %{ $targetObj->getEnumHash($attribute)})
+ {
+- $mask=$mask | $val;
++ my $field = $targetObj->getAttributeField(
++ $target,$attribute."_BITMASK",$e);
++ my $val=hex($targetObj->getEnumValue($attribute,$e));
++ if ($field eq "true")
++ {
++ $mask=$mask | $val;
++ }
+ }
++ $targetObj->setAttribute($target,$attribute,$mask);
+ }
+- $targetObj->setAttribute($target,$attribute,$mask);
+- }
++}
+ #--------------------------------------------------
+ ## Processor
+ ##
+@@ -455,7 +431,10 @@ sub processProcessor
+ foreach my $attr (sort (keys
+ %{ $targetObj->getTarget($module_target)->{TARGET}->{attribute} }))
+ {
+- $targetObj->copyAttribute($module_target,$target,$attr);
++ if (($attr ne "TYPE") && ($attr ne "PHYS_PATH"))
++ {
++ $targetObj->copyAttribute($module_target,$target,$attr);
++ }
+ }
+
+ ## Copy PCIE attributes from socket
+@@ -473,11 +452,22 @@ sub processProcessor
+ }
+ }
+
++ $targetObj->log($target,"Finding master proc");
++ my $lpcs=$targetObj->findConnections($target,"LPC","FSP");
++ if ($lpcs ne "")
++ {
++ $targetObj->log ($target, "Setting master proc to $target");
++ $targetObj->setMasterProc($target);
++ }
++
+ $targetObj->log($target, "Processing PROC");
+ foreach my $child (@{ $targetObj->getTargetChildren($target) })
+ {
+- $targetObj->log($target, "Processing PROC child: $child");
+ my $child_type = $targetObj->getType($child);
++
++ $targetObj->log($target,
++ "Processing PROC child: $child Type: $child_type");
++
+ if ($child_type eq "NA" || $child_type eq "FSI")
+ {
+ $child_type = $targetObj->getMrwType($child);
+@@ -498,12 +488,13 @@ sub processProcessor
+ {
+ foreach my $pci_child (@{ $targetObj->getTargetChildren($child) })
+ {
+- processPcie($targetObj, $pci_child, $target);
++ #@TODO RTC:161404
++ #processPcie($targetObj, $pci_child, $target);
+ }
+ }
+- elsif ($child_type eq "MCS")
++ elsif ($child_type eq "MCBIST")
+ {
+- processMcs($targetObj, $child, $target);
++ processMcbist($targetObj, $child, $target);
+ }
+ elsif ($child_type eq "OCC")
+ {
+@@ -589,10 +580,14 @@ sub processI2cSpeeds
+ $i2c->{SOURCE},"I2C_ENGINE"));
+ my $bus_speed=$targetObj->getBusAttribute(
+ $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_SPEED");
++
++ #@todo RTC:164224 > currently the bus_speed fields are empty in the xml
++=begin
+ if ($bus_speed eq "" || $bus_speed==0) {
+ print "ERROR: I2C bus speed not defined for $i2c->{SOURCE}\n";
+ $targetObj->myExit(3);
+ }
++=cut
+ ## choose lowest bus speed
+ if ($bus_speeds[$engine][$port] eq "" ||
+ $bus_speeds[$engine][$port]==0 ||
+@@ -640,7 +635,7 @@ sub setupBars
+ "NVIDIA_NPU_PRIVILEGED_ADDR","NVIDIA_NPU_USER_REG_ADDR",
+ "NVIDIA_PHY0_REG_ADDR","NVIDIA_PHY1_REG_ADDR",
+ "XIVE_CONTROLLER_BAR_ADDR","XIVE_PRESENTATION_BAR_ADDR",
+- "PSI_HB_ESP_ADDR","NX_RNG_ADDR");
++ "NX_RNG_ADDR");
+
+ # Attribute only valid in naples-based systems
+ if (!$targetObj->isBadAttribute($target,"NPU_MMIO_BAR_BASE_ADDR") ) {
+@@ -689,26 +684,71 @@ sub processMcs
+ my $targetObj = shift;
+ my $target = shift;
+ my $parentTarget = shift;
++ my $group = shift;
++ my $proc = shift;
++
++#@TODO RTC:163874 -- maybe needed for centaur support
++
++
++# my ($base,$group_offset,$proc_offset,$offset) = split(/,/,
++# $targetObj->getAttribute($target,"IBSCOM_MCS_BASE_ADDR"));
++# my $i_base = Math::BigInt->new($base);
++# my $i_node_offset = Math::BigInt->new($group_offset);
++# my $i_proc_offset = Math::BigInt->new($proc_offset);
++# my $i_offset = Math::BigInt->new($offset);
++
++# my $mcs = $targetObj->getAttribute($target, "MCS_NUM");
++# #Note: Hex convert method avoids overflow on 32bit machines
++# my $mcsStr=sprintf("0x%016s",substr((
++# $i_base+$i_node_offset*$group+
++# $i_proc_offset*$proc+$i_offset*$mcs)->as_hex(),2));
++# $targetObj->setAttribute($target, "IBSCOM_MCS_BASE_ADDR", $mcsStr);
++}
++
++
++## MCBIST
++sub processMcbist
++{
++ my $targetObj = shift;
++ my $target = shift;
++ my $parentTarget = shift;
+
+ my $group = $targetObj->getAttribute($parentTarget, "FABRIC_GROUP_ID");
+ my $proc = $targetObj->getAttribute($parentTarget, "FABRIC_CHIP_ID");
++#@TODO RTC:163874 -- maybe needed for centaur support
++# my ($base,$group_offset,$proc_offset,$offset) = split(/,/,
++# $targetObj->getAttribute($target,"IBSCOM_MCS_BASE_ADDR"));
++# my $i_base = Math::BigInt->new($base);
++# my $i_node_offset = Math::BigInt->new($group_offset);
++# my $i_proc_offset = Math::BigInt->new($proc_offset);
++# my $i_offset = Math::BigInt->new($offset);
+
+- my ($base,$group_offset,$proc_offset,$offset) = split(/,/,
+- $targetObj->getAttribute($target,"IBSCOM_MCS_BASE_ADDR"));
+- my $i_base = Math::BigInt->new($base);
+- my $i_node_offset = Math::BigInt->new($group_offset);
+- my $i_proc_offset = Math::BigInt->new($proc_offset);
+- my $i_offset = Math::BigInt->new($offset);
+-
+- my $mcs = $targetObj->getAttribute($target, "MCS_NUM");
+- #Note: Hex convert method avoids overflow on 32bit machines
+- my $mcsStr=sprintf("0x%016s",substr((
+- $i_base+$i_node_offset*$group+
+- $i_proc_offset*$proc+$i_offset*$mcs)->as_hex(),2));
+- $targetObj->setAttribute($target, "IBSCOM_MCS_BASE_ADDR", $mcsStr);
+-}
+
++ foreach my $child (@{ $targetObj->getTargetChildren($target) })
++ {
++ my $child_type = $targetObj->getType($child);
++
++ $targetObj->log($target,
++ "Processing MCBIST child: $child Type: $child_type");
+
++ if ($child_type eq "NA" || $child_type eq "FSI")
++ {
++ $child_type = $targetObj->getMrwType($child);
++ }
++ if ($child_type eq "MCS")
++ {
++ processMcs($targetObj, $child, $target, $group, $proc);
++ }
++ }
++
++#@TODO RTC:163874 -- maybe needed for centaur support
++# my $mcs = $targetObj->getAttribute($target, "MCS_NUM");
++# #Note: Hex convert method avoids overflow on 32bit machines
++# my $mcsStr=sprintf("0x%016s",substr((
++# $i_base+$i_node_offset*$group+
++# $i_proc_offset*$proc+$i_offset*$mcs)->as_hex(),2));
++# $targetObj->setAttribute($target, "IBSCOM_MCS_BASE_ADDR", $mcsStr);
++}
+ #--------------------------------------------------
+ ## XBUS
+ ##
+@@ -1091,8 +1131,6 @@ sub processMembufVpdAssociation
+ foreach my $group_assoc (@{$group_assocs->{CONN}}) {
+ my $mb_target = $group_assoc->{DEST_PARENT};
+ my $group_target = $targetObj->getTargetParent($mb_target);
+- setEepromAttributes($targetObj,
+- "EEPROM_VPD_PRIMARY_INFO",$group_target,$vpd);
+ $targetObj->setAttribute($group_target,
+ "VPD_REC_NUM",$targetObj->{vpd_num});
+ }
+@@ -1107,7 +1145,7 @@ sub processMembufVpdAssociation
+ ## Finds I2C connections to DIMM and creates EEPROM attributes
+ ## FYI: I had to handle DMI busses in framework because they
+ ## define affinity path
+-
++#@TODO RTC:163874 -- centaur support
+ sub processMembuf
+ {
+ my $targetObj = shift;
+@@ -1188,7 +1226,8 @@ sub processMembuf
+ "MRW_MEM_SENSOR_CACHE_ADDR_MAP","0x".join("",@addr_map));
+
+ ## Update bus speeds
+- processI2cSpeeds($targetObj,$target);
++ #@TODO RTC:163874 -- centaur support
++ #processI2cSpeeds($targetObj,$target);
+
+ ## Do MBA port mapping
+ my %mba_port_map;
+@@ -1307,11 +1346,9 @@ sub errorCheck
+ ## also error checking after processing is complete vs during
+ ## processing is easier
+ my %attribute_checks = (
+- SYS => ['SYSTEM_NAME','OPAL_MODEL'],
+- PROC_MASTER => ['I2C_SLAVE_ADDRESS'],
+- PROC => ['FSI_MASTER_CHIP','I2C_SLAVE_ADDRESS'],
+- MEMBUF => [ 'PHYS_PATH', 'EI_BUS_TX_MSBSWAP', 'FSI_MASTER_PORT|0xFF' ],
+- DIMM => ['EEPROM_VPD_PRIMARY_INFO/devAddr'],
++ SYS => ['SYSTEM_NAME'],#'OPAL_MODEL'],
++ PROC => ['FSI_MASTER_CHIP', 'EEPROM_VPD_PRIMARY_INFO/devAddr'],
++ MEMBUF => [ 'PHYS_PATH', 'EI_BUS_TX_MSBSWAP', 'FSI_MASTER_PORT|0xFF' ],
+ );
+ my %error_msg = (
+ 'EEPROM_VPD_PRIMARY_INFO/devAddr' =>
+@@ -1321,14 +1358,9 @@ sub errorCheck
+ 'EI_BUS_TX_MSBSWAP' =>
+ 'DMI connection is missing to this membuf from processor',
+ 'PHYS_PATH' =>'DMI connection is missing to this membuf from processor',
+- 'I2C_SLAVE_ADDRESS' =>'I2C connection is missing from BMC to processor',
+ );
+
+ my @errors;
+- if ($targetObj->getMasterProc() eq $target)
+- {
+- $type = "PROC_MASTER";
+- }
+ foreach my $attr (@{ $attribute_checks{$type} })
+ {
+ my ($a, $v) = split(/\|/, $attr);
+diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml
+index b98d4e2..8f61774 100644
+--- a/src/usr/targeting/common/xmltohb/attribute_types.xml
++++ b/src/usr/targeting/common/xmltohb/attribute_types.xml
+@@ -16333,7 +16333,7 @@ Measured in GB</description>
+ <name>PD_AND_STR</name>
+ <value>3</value>
+ </enumerator>
+- <default>NONE</default>
++ <default>OFF</default>
+ </enumerationType>
+
+ <attribute>
+diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
+index 573a428..315fb65 100755
+--- a/src/usr/targeting/common/xmltohb/target_types.xml
++++ b/src/usr/targeting/common/xmltohb/target_types.xml
+@@ -527,6 +527,11 @@
+ </targetType>
+
+ <targetType>
++ <id>lcard-dimm-ddr4</id>
++ <parent>lcard-dimm</parent>
++</targetType>
++
++<targetType>
+ <id>occ</id>
+ <parent>unit</parent>
+ <attribute>
+@@ -930,6 +935,7 @@
+ <attribute><id>MRW_DDR4_VDDR_MAX_LIMIT_EFF_CONFIG</id></attribute>
+ <attribute><id>HDAT_HBRT_NUM_SECTIONS</id></attribute>
+ <attribute><id>HDAT_HBRT_SECTION_SIZE</id></attribute>
++ <attribute><id>VPD_REC_NUM</id></attribute>
+ </targetType>
+
+ <!-- chip-tpm-cectpm -->
+--
+1.8.2.2
+
diff --git a/openpower/package/hostboot/p9Patches/hostboot-0004-Include-pvpd-header-file-when-reading-from-pnor.patch b/openpower/package/hostboot/p9Patches/hostboot-0004-Include-pvpd-header-file-when-reading-from-pnor.patch
new file mode 100644
index 0000000..3d4ae13
--- /dev/null
+++ b/openpower/package/hostboot/p9Patches/hostboot-0004-Include-pvpd-header-file-when-reading-from-pnor.patch
@@ -0,0 +1,28 @@
+From 736a9f4abae56b795754d2e41d96a20ebcade574 Mon Sep 17 00:00:00 2001
+From: Prachi Gupta <pragupta@us.ibm.com>
+Date: Thu, 17 Nov 2016 22:14:58 -0600
+Subject: [PATCH] Include pvpd header file when reading from pnor in dvpd.C
+
+Change-Id: Idfe1438c80d779cd6dbc0ac6f6bd8def8f64d7b7
+---
+ src/usr/vpd/dvpd.C | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/usr/vpd/dvpd.C b/src/usr/vpd/dvpd.C
+index 9ce0999..fdd25c4 100644
+--- a/src/usr/vpd/dvpd.C
++++ b/src/usr/vpd/dvpd.C
+@@ -44,7 +44,9 @@
+ #include "cvpd.H"
+ #include "vpd.H"
+ #include <initservice/initserviceif.H>
+-
++#ifdef CONFIG_PVPD_READ_FROM_PNOR
++#include "pvpd.H"
++#endif
+
+ // ----------------------------------------------
+ // Trace definitions
+--
+1.8.2.2
+
diff --git a/openpower/package/hostboot/p9Patches/hostboot-0005-Makefile-changes-for-OP-Build-CI-Witherspoon.patch b/openpower/package/hostboot/p9Patches/hostboot-0005-Makefile-changes-for-OP-Build-CI-Witherspoon.patch
new file mode 100644
index 0000000..68ac856
--- /dev/null
+++ b/openpower/package/hostboot/p9Patches/hostboot-0005-Makefile-changes-for-OP-Build-CI-Witherspoon.patch
@@ -0,0 +1,35 @@
+From 699c082748e66cbc696bf44991952de600880dba Mon Sep 17 00:00:00 2001
+From: Elizabeth Liner <eliner@us.ibm.com>
+Date: Mon, 14 Nov 2016 17:07:50 -0600
+Subject: [PATCH] Makefile changes for OP Build CI Witherspoon
+
+Change-Id: Id51c5333c10e910f54d9f2fb5666ed5701efbfc0
+Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32621
+Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
+Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
+Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
+Reviewed-by: Stewart Smith <stewart@linux.vnet.ibm.com>
+Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
+Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
+---
+ src/usr/testcore/lib/makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/usr/testcore/lib/makefile b/src/usr/testcore/lib/makefile
+index 9866637..a688b2a 100644
+--- a/src/usr/testcore/lib/makefile
++++ b/src/usr/testcore/lib/makefile
+@@ -25,8 +25,8 @@
+ ROOTPATH = ../../../..
+
+ MODULE = testsyslib
+-// @TODO-RTC:151185-Turn enable all test cases
+-// TESTS = *.H
++#@TODO-RTC:151185-Turn enable all test cases
++#TESTS = *.H
+ TESTS = stltest.H
+
+
+--
+1.8.2.2
+
diff --git a/openpower/package/witherspoon-xml/witherspoon.mk b/openpower/package/witherspoon-xml/witherspoon.mk
index 1d53545..79955ea 100644
--- a/openpower/package/witherspoon-xml/witherspoon.mk
+++ b/openpower/package/witherspoon-xml/witherspoon.mk
@@ -4,7 +4,7 @@
#
################################################################################
-WITHERSPOON_XML_VERSION ?= 166b3135edbc7299aaa991a42f6eb0fc40d784e6
+WITHERSPOON_XML_VERSION ?= 3a89d5efc33377302418c06d654cc3356561c797
WITHERSPOON_XML_SITE ?= $(call github,open-power,witherspoon-xml,$(WITHERSPOON_XML_VERSION))
WITHERSPOON_XML_LICENSE = Apache-2.0
@@ -32,12 +32,8 @@
bash -c 'mkdir -p $(MRW_SCRATCH) && cp -r $(@D)/* $(MRW_SCRATCH)'
# generate the system mrw xml
- #perl -I $(MRW_HB_TOOLS) \
+ perl -I $(MRW_HB_TOOLS) \
$(MRW_HB_TOOLS)/processMrw.pl -x $(MRW_SCRATCH)/witherspoon.xml
-
- # copy local simics_NIMBUS xml until processMrw changes are in
- # RTC: 143114
- cp $(MRW_HB_TOOLS)/simics_NIMBUS.system.xml $(MRW_SCRATCH)/$(BR2_WITHERSPOON_SYSTEM_XML_FILENAME)
# merge in any system specific attributes, hostboot attributes
$(MRW_HB_TOOLS)/mergexml.sh $(MRW_SCRATCH)/$(BR2_WITHERSPOON_SYSTEM_XML_FILENAME) \