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) \