diff --git a/openpower/package/hostboot/hostboot-0004-Serverwiz2-scripts.patch b/openpower/package/hostboot/hostboot-0004-Serverwiz2-scripts.patch
index 6eecc7b..9d7a6c0 100644
--- a/openpower/package/hostboot/hostboot-0004-Serverwiz2-scripts.patch
+++ b/openpower/package/hostboot/hostboot-0004-Serverwiz2-scripts.patch
@@ -1,17 +1,16 @@
-From 065fd1bc3d9fcc8b06be7564f8df162580f8775e Mon Sep 17 00:00:00 2001
+From 8f139eab659dc681e24a8c414dac00607a090fa0 Mon Sep 17 00:00:00 2001
 From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 13 Feb 2015 10:41:12 -0600
-Subject: [PATCH] New severwiz2 scripts up to support up to commit
- 44fde6512e834ea8f5071299ca99b35973c0f979
+Date: Mon, 16 Feb 2015 13:15:43 -0600
+Subject: [PATCH] New Serverwiz2 patches
 
-Change-Id: I3df49506aad9490f5f6e1840fa5e6afe3150492d
+Change-Id: I4ba05d89e9ca0ef3298c0f9d503f349782632d89
 ---
- src/build/mkrules/dist.targets.mk      |    3 +-
- src/usr/targeting/common/Targets.pm    | 1446 ++++++++++++++++++++++++++++++++
- src/usr/targeting/common/processMrw.pl | 1144 +++++++++++++++++++++++++
- 3 files changed, 2592 insertions(+), 1 deletion(-)
- create mode 100755 src/usr/targeting/common/Targets.pm
- create mode 100755 src/usr/targeting/common/processMrw.pl
+ src/build/mkrules/dist.targets.mk      |   3 +-
+ src/usr/targeting/common/Targets.pm    |  24 ++---
+ src/usr/targeting/common/processMrw.pl | 171 ++++++++++++++-------------------
+ 3 files changed, 88 insertions(+), 110 deletions(-)
+ mode change 100644 => 100755 src/usr/targeting/common/Targets.pm
+ mode change 100644 => 100755 src/usr/targeting/common/processMrw.pl
 
 diff --git a/src/build/mkrules/dist.targets.mk b/src/build/mkrules/dist.targets.mk
 index ca28150..4b541ce 100644
@@ -28,2336 +27,337 @@
      src/usr/targeting/common/xmltohb/attribute_types.xml:openpower \
      src/usr/targeting/common/xmltohb/attribute_types_hb.xml:openpower \
 diff --git a/src/usr/targeting/common/Targets.pm b/src/usr/targeting/common/Targets.pm
-new file mode 100755
-index 0000000..53568cf
---- /dev/null
+old mode 100644
+new mode 100755
+index d4c2bfa..53568cf
+--- a/src/usr/targeting/common/Targets.pm
 +++ b/src/usr/targeting/common/Targets.pm
-@@ -0,0 +1,1446 @@
-+# IBM_PROLOG_BEGIN_TAG
-+# This is an automatically generated prolog.
-+#
-+# $Source: src/usr/targeting/common/Targets.pm $
-+#
-+# OpenPOWER HostBoot Project
-+#
-+# Contributors Listed Below - COPYRIGHT 2015
-+# [+] International Business Machines Corp.
-+#
-+#
-+# Licensed under the Apache License, Version 2.0 (the "License");
-+# you may not use this file except in compliance with the License.
-+# You may obtain a copy of the License at
-+#
-+#     http://www.apache.org/licenses/LICENSE-2.0
-+#
-+# Unless required by applicable law or agreed to in writing, software
-+# distributed under the License is distributed on an "AS IS" BASIS,
-+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-+# implied. See the License for the specific language governing
-+# permissions and limitations under the License.
-+#
-+# IBM_PROLOG_END_TAG
-+package Targets;
-+
-+use strict;
-+use XML::Simple;
-+use Data::Dumper;
-+
-+sub new
-+{
-+    my $class = shift;
-+    my $self  = {
-+        xml          => undef,
-+        data         => undef,
-+        targeting    => undef,
-+        enumerations => undef,
-+        MAX_MCS      => 0,
-+        master_proc  => undef,
-+        huid_idx     => undef,
-+        mru_idx      => undef,
-+        force        => 0,
-+        debug        => 0,
-+        version      => "",
-+        errorsExist  => 0,
-+        NUM_PROCS    => 0,
-+        TOP_LEVEL    => "sys-0",
-+        TOPOLOGY     => undef,
-+        DMI_FSI_MAP  => {
-+            '0' => '3',
-+            '1' => '2',
-+            '4' => '7',
-+            '5' => '6'
-+        }
-+        # TODO RTC: TBD
-+        # DMI_FSI_MAP is a lookup table for DMI channel to FSI and ref clock.
-+        # It is processor specific and needs to be pulled from a
-+        # processor attribute instead of being hardcoded
-+
-+    };
-+    return bless $self, $class;
-+}
-+
-+sub setVersion
-+{
-+    my $self    = shift;
-+    my $version = shift;
-+
-+    $self->{version} = $version;
-+}
-+
-+sub getData
-+{
-+    my $self = shift;
-+    return $self->{data};
-+}
-+
-+## loads ServerWiz XML format
-+sub loadXML
-+{
-+    my $self = shift;
-+    my $filename = shift;
-+    $XML::Simple::PREFERRED_PARSER = 'XML::Parser';
-+    print "Loading MRW XML: $filename\n";
-+    $self->{xml} =
-+      XMLin($filename,forcearray => [ 'child_id', 'hidden_child_id', 'bus',
-+                                      'property' ]);
-+    $self->storeEnumerations();
-+    $self->buildHierarchy($self->{TOP_LEVEL});
-+    $self->buildAffinity();
-+}
-+
-+################################################
-+## prints out final XML for HOSTBOOT consumption
-+
-+sub printXML
-+{
-+    my $self = shift;
-+    my $fh   = shift;
-+    my $t    = shift;
-+
-+    my $atTop = 0;
-+    if ($t eq "top")
-+    {
-+        $atTop = 1;
-+        $t     = $self->{targeting}->{SYS};
-+        print $fh "<attributes>\n";
-+        print $fh "<version>" . $self->{version} . "</version>\n";
-+    }
-+    if (ref($t) ne "ARRAY")
-+    {
-+        return;
-+    }
-+    for (my $p = 0; $p < scalar(@{$t}); $p++)
-+    {
-+        if (ref($t->[$p]) ne "HASH") { next; }
-+        my $target = $t->[$p]->{KEY};
-+        $self->printTarget($fh, $target);
-+        my $children = $t->[$p];
-+        foreach my $u (sort(keys %{$children}))
-+        {
-+            if ($u ne "KEY")
-+            {
-+                $self->printXML($fh, $t->[$p]->{$u});
-+            }
-+        }
-+    }
-+    if ($atTop)
-+    {
-+        print $fh "</attributes>\n";
-+    }
-+}
-+
-+sub printTarget
-+{
-+    my $self   = shift;
-+    my $fh     = shift;
-+    my $target = shift;
-+
-+    my $target_ptr = $self->getTarget($target);
-+    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";
-+
-+    ## get attributes
-+    foreach my $attr (sort (keys %{ $target_ptr->{ATTRIBUTES} }))
-+    {
-+        $self->printAttribute($fh, $target_ptr->{ATTRIBUTES}, $attr);
-+    }
-+    print $fh "</targetInstance>\n";
-+}
-+
-+sub printAttribute
-+{
-+    my $self       = shift;
-+    my $fh         = shift;
-+    my $target_ptr = shift;
-+    my $attribute  = shift;
-+    my $r          = "";
-+
-+    # 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{ALL_MCS_IN_INTERLEAVING_GROUP}  = 1;
-+    $filter{MSS_INTERLEAVE_ENABLE}          = 1;
-+    $filter{CDM_POLICIES_BITMASK}           = 1;
-+    $filter{ENTITY_ID_LOOKUP}               = 1;
-+    $filter{ENTITY_INSTANCE}                = 1;
-+    $filter{MBA_NUM}                        = 1;
-+    $filter{IPMI_INSTANCE}                  = 1;
-+    $filter{INSTANCE_ID}                    = 1;
+@@ -194,6 +194,7 @@ sub printAttribute
+     $filter{MBA_NUM}                        = 1;
+     $filter{IPMI_INSTANCE}                  = 1;
+     $filter{INSTANCE_ID}                    = 1;
 +    $filter{ADC_CHANNEL_SENSOR_NUMBERS}     = 1;
-+
-+    if ($filter{$attribute} == 1)
-+    {
-+        return;
-+    }
-+    print $fh "\t<attribute>\n";
-+    print $fh "\t\t<id>$attribute</id>\n";
-+    my $value = $target_ptr->{$attribute}->{default};
-+
-+    if (ref($value) eq "HASH")
-+    {
-+        if (defined($value->{field}))
-+        {
-+            print $fh "\t\t<default>\n";
-+            foreach my $f (sort keys %{ $value->{field} })
-+            {
-+                my $v = $value->{field}->{$f}->{value};
-+                print $fh "\t\t\t<field><id>$f</id><value>$v</value></field>\n";
-+            }
-+            print $fh "\t\t</default>\n";
-+        }
-+    }
-+    else
-+    {
-+        print $fh "\t\t<default>$value</default>\n";
-+    }
-+    print $fh "\t</attribute>\n";
-+}
-+
-+## stores TYPE enumeration values which is used to generate HUIDs
-+sub storeEnumerations
-+{
-+    my $self = shift;
-+
-+    foreach my $enumType (keys(%{ $self->{xml}->{enumerationType} }))
-+    {
-+        foreach my $enum (
-+            keys(%{$self->{xml}->{enumerationType}->{$enumType}->{enumerator}}))
-+        {
-+            $self->{enumeration}->{$enumType}->{$enum} =
-+              $self->{xml}->{enumerationType}->{$enumType}->{enumerator}
-+              ->{$enum}->{value};
-+        }
-+    }
-+}
-+
-+####################################################
-+## build target hierarchy recursively
-+##
-+## creates convenient data structure
-+## for accessing targets and busses
-+## Structure:
-+##
-+##{TARGETS}                                         # location of all targets
-+##{NSTANCE_PATH}                                    # keeps track of hierarchy
-+##                                                   path while iterating
-+##{TARGETS} -> target_name                          # specific target
-+##{TARGETS} -> target_name -> {TARGET}              # pointer to target data
-+##                                                   from XML data struture
-+##{TARGETS} -> target_name -> {TYPE}# special attribute
-+##{TARGETS} -> target_name -> {PARENT}              # parent target name
-+##{TARGETS} -> target_name -> {CHILDREN}            # array of children targets
-+##{TARGETS} -> target_name -> {CONNECTION} -> {DEST} # array of connection
-+##                                                     destination targets
-+##{TARGETS} -> target_name -> {CONNECTION} -> {BUS} # array of busses
-+##{TARGETS} -> target_name -> {CHILDREN}            # array of children targets
-+##{TARGETS} -> target_name -> {ATTRIBUTES}          # attributes
-+## {ENUMERATION} -> enumeration_type -> enum        # value of enumeration
-+## {BUSSES} -> bus_type[]                           # array of busses by
-+##                                                   bus_type (I2C, FSI, etc)
-+## {BUSSES} -> bus_type[] -> {BUS}                  # pointer to bus target
-+##                                                   from xml structure
-+## {BUSSES} -> bus_type[] -> {SOURCE_TARGET}        # source target name
-+## {BUSSES} -> bus_type[] -> {DEST_TARGET}          # dest target name
-+
-+sub buildHierarchy
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+
-+    my $old_path        = $self->{data}->{INSTANCE_PATH};
-+    my $target_xml      = $self->{xml}->{'targetInstance'}{$target};
-+    my $affinity_target = $target;
-+    my $key             = $self->{data}->{INSTANCE_PATH} . "/" . $target;
-+
-+    my $instance_path = $self->{data}->{INSTANCE_PATH};
-+    $instance_path = "instance:" . substr($instance_path, 1);
-+    $self->setAttribute($key, "INSTANCE_PATH", $instance_path);
-+    $self->{data}->{TARGETS}->{$key}->{TARGET} = $target_xml;
-+    $self->{data}->{INSTANCE_PATH} = $old_path . "/" . $target;
-+
-+    ## copy attributes
+ 
+     if ($filter{$attribute} == 1)
+     {
+@@ -286,7 +287,7 @@ sub buildHierarchy
+     $self->{data}->{INSTANCE_PATH} = $old_path . "/" . $target;
+ 
+     ## copy attributes
+-
 +    
-+    foreach my $attribute (keys %{ $target_xml->{attribute} })
-+    {
-+        my $value = $target_xml->{attribute}->{$attribute}->{default};
-+        if (ref($value) eq "HASH")
-+        {
-+            if (defined($value->{field}))
-+            {
-+                foreach my $f (keys %{ $value->{field} })
-+                {
-+                    my $field_val=$value->{field}{$f}{value};
-+                    if (ref($field_val)) {
-+                        $self->setAttributeField($key, $attribute, $f,"");
-+                    }
-+                    else
-+                    {
-+                        $self->setAttributeField($key, $attribute, $f,
-+                            $value->{field}{$f}{value});
-+                    }
-+                }
-+            }
-+            else
-+            {
-+                $self->setAttribute($key, $attribute, "");
-+            }
-+        }
-+        else
-+        {
-+            $self->setAttribute($key, $attribute, $value);
-+        }
-+    }
+     foreach my $attribute (keys %{ $target_xml->{attribute} })
+     {
+         my $value = $target_xml->{attribute}->{$attribute}->{default};
+@@ -317,7 +318,7 @@ sub buildHierarchy
+             $self->setAttribute($key, $attribute, $value);
+         }
+     }
+-    ## global attributes overwrite local
 +    ## global attributes overwrite local   
-+    foreach my $prop (keys %{$self->{xml}->{globalSetting}->{$key}->{property}})
-+    {
-+        my $val=$self->{xml}->{globalSetting}->{$key}->{property}->
-+                       {$prop}->{value};
-+        $self->setAttribute($key, $prop, $val);
-+    }
-+
-+    ## Save busses
-+    if (defined($target_xml->{bus}))
-+    {
-+        foreach my $b (@{ $target_xml->{bus} })
-+        {
-+            my $source_target =
-+              $key . "/" . $b->{source_path} . $b->{source_target};
-+            my $dest_target = $key . "/" . $b->{dest_path} . $b->{dest_target};
-+            my $bus_type    = $b->{bus_type};
-+            push(
-+                @{
-+                    $self->{data}->{TARGETS}->{$source_target}->{CONNECTION}
-+                      ->{DEST}
-+                  },
-+                $dest_target
-+            );
-+            push(
-+                @{
-+                    $self->{data}->{TARGETS}->{$source_target}->{CONNECTION}
-+                      ->{BUS}
-+                  },
-+                $b
-+            );
-+            my %bus_entry;
-+            $bus_entry{SOURCE_TARGET} = $source_target;
-+            $bus_entry{DEST_TARGET}   = $dest_target;
-+            $bus_entry{BUS_TARGET}    = $b;
-+            push(@{ $self->{data}->{BUSSES}->{$bus_type} }, \%bus_entry);
-+        }
-+    }
-+
-+    foreach my $child (@{ $target_xml->{child_id} })
-+    {
-+        my $child_key = $self->{data}->{INSTANCE_PATH} . "/" . $child;
-+        $self->{data}->{TARGETS}->{$child_key}->{PARENT} = $key;
-+        push(@{ $self->{data}->{TARGETS}->{$key}->{CHILDREN} }, $child_key);
-+        $self->buildHierarchy($child);
-+    }
-+    foreach my $child (@{ $target_xml->{hidden_child_id} })
-+    {
-+        my $child_key = $self->{data}->{INSTANCE_PATH} . "/" . $child;
-+        $self->{data}->{TARGETS}->{$child_key}->{PARENT} = $key;
-+        push(@{ $self->{data}->{TARGETS}->{$key}->{CHILDREN} }, $child_key);
-+        $self->buildHierarchy($child);
-+    }
-+    $self->{data}->{INSTANCE_PATH} = $old_path;
-+
-+}
-+
-+##########################################################
-+## traces busses and builds affinity hierarchy
-+## HOSTBOOT expected hierarchy: sys/node/proc/<unit>
-+##                              sys/node/proc/mcs/membuf/<unit>
-+##                              sys/node/proc/mcs/membuf/mba/dimm
-+
-+sub buildAffinity
-+{
-+    my $self = shift;
-+    my $node      = -1;
-+    my $proc      = -1;
-+    my $node_phys = "";
-+    my $node_aff  = "";
-+    my $core_num = 0;
-+    $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);
-+        if ($type_id eq "") { $type_id = 0; }
-+
-+        if ($type eq "SYS")
-+        {
-+            $proc = -1;
-+            $node = -1;
+     foreach my $prop (keys %{$self->{xml}->{globalSetting}->{$key}->{property}})
+     {
+         my $val=$self->{xml}->{globalSetting}->{$key}->{property}->
+@@ -400,7 +401,7 @@ sub buildAffinity
+         {
+             $proc = -1;
+             $node = -1;
+-
 +            
-+            $self->{targeting}{SYS}[0]{KEY} = $target;
-+            $self->setAttribute($target, "AFFINITY_PATH", "affinity:sys-0");
-+            $self->setAttribute($target, "PHYS_PATH",     "physical:sys-0");
-+            $self->setAttribute($target, "ENTITY_INSTANCE","0");
-+        }
-+        elsif ($type eq "NODE")
-+        {
-+            $core_num = 0;
-+            $proc = -1;
-+            $self->{dimm_tpos} = 0;
-+            $self->{membuf_inst_num}=0;
-+            $node++;
-+            $node_phys = "physical:sys-0/node-$node";
-+            $node_aff  = "affinity:sys-0/node-$node";
-+            $self->{targeting}{SYS}[0]{NODES}[$node]{KEY} = $target;
-+            $self->setAttribute($target, "AFFINITY_PATH",
-+                "affinity:sys-0/node-$node");
-+            $self->setAttribute($target, "PHYS_PATH",
-+                "physical:sys-0/node-$node");
-+            $self->setHuid($target, 0, $node);
-+            $self->setAttribute($target, "ENTITY_INSTANCE",$node);
-+        }
-+        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->{targeting}{SYS}[0]{KEY} = $target;
+             $self->setAttribute($target, "AFFINITY_PATH", "affinity:sys-0");
+             $self->setAttribute($target, "PHYS_PATH",     "physical:sys-0");
+@@ -443,7 +444,7 @@ sub buildAffinity
+             $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:sys-0/node-$node/proc-$proc";
-+            my $parent_physical = "physical:sys-0/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);
-+            $self->setAttribute($target, "FABRIC_NODE_ID",
-+                  $self->getAttribute($socket,"FABRIC_NODE_ID"));
-+             $self->setAttribute($target, "FABRIC_CHIP_ID",
-+                  $self->getAttribute($socket,"FABRIC_CHIP_ID"));
-+
-+            $self->setAttribute($target, "VPD_REC_NUM",    $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)
-+                {
+             $self->setHuid($target, 0, $node);
+             my $socket = $self->getTargetParent(
+                          $self->getTargetParent($target));
+@@ -475,7 +476,7 @@ sub buildAffinity
+                 ## don't want non-hostboot targets
+                 if ($unit_type_id > 0)
+                 {
+-
 +                    
-+                    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")
-+                    {
+                     push(@{$self->{targeting}
+                             ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{$unit_type}},
+                             { 'KEY' => $unit });
+@@ -490,7 +491,7 @@ sub buildAffinity
+                     $self->setHuid($unit, 0, $node);
+                     if ($unit_type eq "OCC")
+                     {
+-                        $self->setAttribute($unit, "ENTITY_INSTANCE",$proc);
 +                        $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);
-+                }
-+            }
-+        }
-+    }
-+}
-+
-+sub processMcs
-+{
-+    my $self            = shift;
-+    my $unit            = shift;
-+    my $node            = shift;
-+    my $proc            = shift;
-+    my $parent_affinity = shift;
-+    my $parent_physical = shift;
-+    my $node_phys       = shift;
-+
-+    my $mcs = $self->getAttribute($unit, "CHIP_UNIT");
-+    my $membufnum = $proc * $self->{MAX_MCS} + $mcs;
-+    $self->setAttribute($unit, "AFFINITY_PATH",$parent_affinity . "/mcs-$mcs");
-+    $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->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];
-+    if (defined($membuf_dmi))
-+    {
-+        ## found membuf connected
-+        my $membuf =
-+          $self->{data}->{TARGETS}{$membuf_dmi}
-+          {PARENT};    ## get parent of dmi unit which is membuf
-+        my $dmi_bus = $self->{data}->{TARGETS}{$unit}{CONNECTION}{BUS}[0];
-+        $self->setAttribute($membuf, "POSITION",$membufnum);
-+        $self->setAttribute($membuf, "AFFINITY_PATH",
-+            $parent_affinity . "/mcs-$mcs/membuf-$membufnum");
-+        $self->setAttribute($membuf, "PHYS_PATH",
-+            $node_phys . "/membuf-$membufnum");
-+        $self->setAttribute($membuf, "VPD_REC_NUM",
-+            $self->getAttribute($membuf, "POSITION"));
-+
-+        ## copy DMI bus attributes to membuf
-+        $self->setAttribute($unit, "EI_BUS_TX_LANE_INVERT",
-+            $dmi_bus->{bus_attribute}->{PROC_TX_LANE_INVERT}->{default});
-+        $self->setAttribute($unit, "EI_BUS_TX_MSBSWAP",
-+            $dmi_bus->{bus_attribute}->{PROC_TX_MSBSWAP}->{default});
-+        $self->setAttribute($membuf, "EI_BUS_TX_LANE_INVERT",
-+            $dmi_bus->{bus_attribute}->{MEMBUF_TX_LANE_INVERT}->{default});
-+        $self->setAttribute($membuf, "EI_BUS_TX_MSBSWAP",
-+            $dmi_bus->{bus_attribute}->{MEMBUF_TX_MSBSWAP}->{default});
-+
-+        ## auto setup FSI assuming schematic symbol.  If FSI busses are
-+        ## defined in serverwiz2, this will be overridden
-+        ## in the schematic symbol, the fsi port num matches dmi ref clk num
-+
-+        my $fsi_port = $self->{DMI_FSI_MAP}->{$mcs};
-+        my $proc_key =
-+            $self->{targeting}->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{KEY};
-+        my $proc_path = $self->getAttribute($proc_key,"PHYS_PATH");
-+        $self->setFsiAttributes($membuf,"FSICM",0,$proc_path,$fsi_port,0);
-+        $self->setAttribute($unit, "DMI_REFCLOCK_SWIZZLE",$fsi_port);
-+        my $dmi_swizzle =
-+             $dmi_bus->{bus_attribute}->{DMI_REFCLOCK_SWIZZLE}->{default};
-+        my $dmi_swizzle =
-+             $self->getBusAttribute($unit,0,"DMI_REFCLOCK_SWIZZLE");
-+        if ($dmi_swizzle ne "")
-+        {
-+            $self->setAttribute($unit, "DMI_REFCLOCK_SWIZZLE",$dmi_swizzle);
-+        }
-+
-+        $self->setHuid($membuf, 0, $node);
-+        $self->{targeting}
-+          ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{MCSS}[$mcs] {MEMBUFS}[0]{KEY} =
-+          $membuf;
+                     }
+                     ## export core
+                     if ($unit_type eq "EX")
+@@ -610,9 +611,9 @@ sub processMcs
+         $self->{targeting}
+           ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{MCSS}[$mcs] {MEMBUFS}[0]{KEY} =
+           $membuf;
+-
 +          
-+        $self->setAttribute($membuf, "ENTITY_INSTANCE",
+         $self->setAttribute($membuf, "ENTITY_INSTANCE",
+-               $self->{membuf_inst_num});
 +               $self->{membuf_inst_num});   
-+        $self->{membuf_inst_num}++;
-+        ## get the mbas
-+        foreach my $child (@{ $self->{data}->{TARGETS}{$membuf}{CHILDREN} })
-+        {
-+            ## need to not hardcard the subunits
-+            if ($self->getType($child) eq "L4")
-+            {
-+                $self->{targeting}
-+                  ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{MCSS}[$mcs]{MEMBUFS}[0]
-+                  {L4S}[0] {KEY} = $child;
-+                $self->setAttribute($child, "AFFINITY_PATH",
-+                    $parent_affinity . "/mcs-$mcs/membuf-$membufnum/l4-0");
-+                $self->setAttribute($child, "PHYS_PATH",
-+                    $node_phys . "/membuf-$membufnum/l4-0");
-+                $self->setHuid($child, 0, $node);
-+            }
+         $self->{membuf_inst_num}++;
+         ## get the mbas
+         foreach my $child (@{ $self->{data}->{TARGETS}{$membuf}{CHILDREN} })
+@@ -629,7 +630,7 @@ sub processMcs
+                     $node_phys . "/membuf-$membufnum/l4-0");
+                 $self->setHuid($child, 0, $node);
+             }
+-
 +            
-+            if ($self->getType($child) eq "MBA")
-+            {
-+                my $mba = $self->getAttribute($child,"MBA_NUM");
-+                $self->setAttribute($child, "AFFINITY_PATH",
-+                    $parent_affinity . "/mcs-$mcs/membuf-$membufnum/mba-$mba");
-+                $self->setAttribute($child, "PHYS_PATH",
-+                    $node_phys . "/membuf-$membufnum/mba-$mba");
-+                $self->setHuid($child, 0, $node);
-+                $self->{targeting}
-+                  ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{MCSS}[$mcs]{MEMBUFS}[0]
-+                  {MBAS}[$mba]{KEY} = $child;
-+
-+                ## Trace the DDR busses to find connected DIMM
-+                my $ddrs = $self->findConnections($child,"DDR3","");
-+                if ($ddrs ne "")
-+                {
-+                    my $affinitypos=0;
-+                    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};
-+                        $self->setAttribute($dimm,"MBA_PORT",$port_num);
-+                        $self->setAttribute($dimm,"MBA_DIMM",$dimm_num);
-+
-+                        my $aff_pos=16*$proc+$mcs*$self->{MAX_MCS}+4*$mba+
-+                                    2*$port_num+$dimm_num;
-+                        $self->setAttribute($dimm, "AFFINITY_PATH",
-+                            $parent_affinity
-+                      . "/mcs-$mcs/membuf-$membufnum/mba-$mba/dimm-$affinitypos"
-+                        );
-+                        $self->setAttribute($dimm, "PHYS_PATH",
-+                            $node_phys . "/dimm-" . $self->{dimm_tpos});
-+                        $self->setAttribute($dimm, "POSITION",
-+                            $aff_pos);
-+                        $self->setAttribute($dimm, "VPD_REC_NUM",
-+                            $aff_pos);
-+                        $self->setHuid($dimm, 0, $node);
-+                        $self->{targeting}
-+                          ->{SYS}[0]{NODES}[$node]{PROCS}[$proc] {MCSS}[$mcs]
+             if ($self->getType($child) eq "MBA")
+             {
+                 my $mba = $self->getAttribute($child,"MBA_NUM");
+@@ -671,10 +672,9 @@ sub processMcs
+                         $self->setHuid($dimm, 0, $node);
+                         $self->{targeting}
+                           ->{SYS}[0]{NODES}[$node]{PROCS}[$proc] {MCSS}[$mcs]
+-                          {MEMBUFS}[0]{MBAS}[$mba]{DIMMS}[$affinitypos]{KEY}
+-                                = $dimm;
 +                          {MEMBUFS}[0]{MBAS}[$mba] {DIMMS}[$affinitypos]{KEY} = $dimm;
-+                        $self->setAttribute($dimm, "ENTITY_INSTANCE",
+                         $self->setAttribute($dimm, "ENTITY_INSTANCE",
+-                             $self->{dimm_tpos});
 +                             $self->{dimm_tpos});  
-+                        $self->{dimm_tpos}++;
-+                        $affinitypos++;
-+                    }
-+                }
-+            }
-+        }
-+    }
-+}
-+
-+sub setFsiAttributes
-+{
-+    my $self = shift;
-+    my $target = shift;
-+    my $type = shift;
-+    my $cmfsi = shift;
-+    my $phys_path = shift;
-+    my $fsi_port = shift;
-+    my $flip_port = shift;
-+
-+    $self->setAttribute($target, "FSI_MASTER_TYPE","NO_MASTER");
-+    if ($type eq "FSIM")
-+    {
-+        $self->setAttribute($target, "FSI_MASTER_TYPE","MFSI");
-+    }
-+    if ($type eq "FSICM")
-+    {
-+        $self->setAttribute($target, "FSI_MASTER_TYPE","CMFSI");
-+    }
-+    $self->setAttribute($target, "FSI_MASTER_CHIP","physical:sys");
-+    $self->setAttribute($target, "FSI_MASTER_PORT","0xFF");
-+    $self->setAttribute($target, "ALTFSI_MASTER_CHIP","physical:sys");
-+    $self->setAttribute($target, "ALTFSI_MASTER_PORT","0xFF");
-+    $self->setAttribute($target, "FSI_SLAVE_CASCADE", "0");
-+    if ($cmfsi == 0)
-+    {
-+        $self->setAttribute($target, "FSI_MASTER_CHIP",$phys_path);
-+        $self->setAttribute($target, "FSI_MASTER_PORT", $fsi_port);
-+    }
-+    else
-+    {
-+        $self->setAttribute($target, "ALTFSI_MASTER_CHIP",$phys_path);
-+        $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");
-+
-+}
-+
-+
-+## returns pointer to target from target name
-+sub getTarget
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    return $self->{data}->{TARGETS}->{$target};
-+}
-+
-+## returns pointer to array of all targets
-+sub getAllTargets
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    return $self->{data}->{TARGETS};
-+}
-+
-+## returns the target name of the parent of passed in target
-+sub getTargetParent
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    return $target_ptr->{PARENT};
-+}
-+
-+## returns the number of connections associated with target
-+sub getNumConnections
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    if (!defined($target_ptr->{CONNECTION}->{DEST}))
-+    {
-+        return 0;
-+    }
-+    return scalar(@{ $target_ptr->{CONNECTION}->{DEST} });
-+}
-+
-+## returns destination target name of first connection
-+## useful for point to point busses with only 1 endpoint
-+sub getFirstConnectionDestination
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    return $target_ptr->{CONNECTION}->{DEST}->[0];
-+}
-+
-+## returns pointer to bus of first connection
-+sub getFirstConnectionBus
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    return $target_ptr->{CONNECTION}->{BUS}->[0];
-+}
-+## returns target name of $i connection
-+sub getConnectionDestination
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $i          = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    return $target_ptr->{CONNECTION}->{DEST}->[$i];
-+}
-+
-+sub getConnectionBus
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $i          = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    return $target_ptr->{CONNECTION}->{BUS}->[$i];
-+}
-+
-+sub findFirstEndpoint
-+{
-+    my $self     = shift;
-+    my $target   = shift;
-+    my $bus_type = shift;
-+    my $end_type = shift;
-+
-+    my $target_children = $self->getTargetChildren($target);
-+    if ($target_children eq "") { return ""; }
-+
-+    foreach my $child (@{ $self->getTargetChildren($target) })
-+    {
-+        my $child_bus_type = $self->getBusType($child);
-+        if ($child_bus_type eq $bus_type)
-+        {
-+            for (my $i = 0; $i < $self->getNumConnections($child); $i++)
-+            {
-+                my $dest_target = $self->getConnectionDestination($child, $i);
-+                my $dest_parent = $self->getTargetParent($dest_target);
-+                my $type        = $self->getMrwType($dest_parent);
-+                my $dest_type   = $self->getType($dest_parent);
-+                if ($type eq "NA") { $type = $dest_type; }
-+                if ($type eq $end_type)
-+                {
-+                    return $dest_parent;
-+                }
-+            }
-+        }
-+    }
-+    return "";
-+}
-+sub findConnections
-+{
-+    my $self     = shift;
-+    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 "";
-+    }
-+
-+    foreach my $child (@{ $self->getTargetChildren($target) })
-+    {
-+        my $child_bus_type = $self->getBusType($child);
-+        if ($child_bus_type eq $bus_type)
-+        {
-+            for (my $i = 0; $i < $self->getNumConnections($child); $i++)
-+            {
-+                my $dest_target = $self->getConnectionDestination($child, $i);
-+                my $dest_parent = $self->getTargetParent($dest_target);
-+                my $type        = $self->getMrwType($dest_parent);
-+                my $dest_type   = $self->getType($dest_parent);
-+                if ($type eq "NA")
-+                {
-+                    $type = $dest_type;
-+                }
-+
-+                if ($type eq $end_type || $end_type eq "")
-+                {
-+                    $connections{CONN}[$num]{SOURCE}=$child;
-+                    $connections{CONN}[$num]{SOURCE_PARENT}=$target;
-+                    $connections{CONN}[$num]{DEST}=$dest_target;
-+                    $connections{CONN}[$num]{DEST_PARENT}=$dest_parent;
-+                    $connections{CONN}[$num]{BUS_NUM}=$i;
-+                    $num++;
-+                }
-+            }
-+        }
-+    }
-+    if ($num==0) { return ""; }
-+    return \%connections;
-+}
-+
-+
-+## returns BUS_TYPE attribute of target
-+sub getBusType
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    my $type   = $self->getAttribute($target, "BUS_TYPE");
-+    if ($type eq "") { $type = "NA"; }
-+    return $type;
-+}
-+
-+## return target type
-+sub getType
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    my $type   = $self->getAttribute($target, "TYPE");
-+    if ($type eq "") { $type = "NA"; }
-+    return $type;
-+}
-+
-+## return target type
-+sub getMrwType
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    my $type   = $self->getAttribute($target, "MRW_TYPE");
-+    if ($type eq "") { $type = "NA"; }
-+    return $type;
-+}
-+
-+## returns target instance name
-+sub getInstanceName
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    return $target_ptr->{TARGET}->{instance_name};
-+}
-+
-+## returns the parent target type
-+sub getTargetType
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    return $target_ptr->{TARGET}->{type};
-+}
-+
-+## checks if attribute is value
-+## must be defined and have a non-empty value
-+sub isBadAttribute
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $attribute  = shift;
-+    my $badvalue   = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}))
-+    {
-+        return 1;
-+    }
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}->{default}))
-+    {
-+        return 1;
-+    }
-+    if ($target_ptr->{ATTRIBUTES}->{$attribute}->{default} eq "")
-+    {
-+        return 1;
-+    }
-+    if ($target_ptr->{ATTRIBUTES}->{$attribute}->{default} eq $badvalue)
-+    {
-+        return 1;
-+    }
-+    return 0;
-+}
-+
-+## checks if complex attribute field is
-+## defined and non-empty
-+sub isBadComplexAttribute
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $attribute  = shift;
-+    my $field      = shift;
-+    my $badvalue   = shift;
-+    my $target_ptr = $self->getTarget($target);
-+
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}))
-+    {
-+        return 1;
-+    }
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}->{default}))
-+    {
-+        return 1;
-+    }
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}->{default}->{field}))
-+    {
-+        return 1;
-+    }
-+    if ($target_ptr->{ATTRIBUTES}->{$attribute}->{default}->{field}->{$field}
-+        ->{value} eq "")
-+    {
-+        return 1;
-+    }
-+    if ($target_ptr->{ATTRIBUTES}->{$attribute}->{default}->{field}->{$field}
-+        ->{value} eq $badvalue)
-+    {
-+        return 1;
-+    }
-+    return 0;
-+}
-+
-+## returns attribute value
-+sub getAttribute
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $attribute  = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}->{default}))
-+    {
-+        printf("ERROR: getAttribute(%s,%s) | Attribute not defined\n",
-+            $target, $attribute);
-+
-+        #print Dumper($target_ptr);
-+        $self->myExit(4);
-+    }
-+    return $target_ptr->{ATTRIBUTES}->{$attribute}->{default};
-+}
-+## renames a target attribute
-+sub renameAttribute
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $oldName    = shift;
-+    my $newName    = shift;
-+    my $target_ptr = $self->{data}->{TARGETS}->{$target};
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$oldName}))
-+    {
-+        return 1;
-+    }
-+    $target_ptr->{ATTRIBUTES}->{$newName}->{default} =
-+      $target_ptr->{ATTRIBUTES}->{$oldName}->{default};
-+    delete($target_ptr->{ATTRIBUTES}->{$oldName});
-+    $self->log($target, "Renaming attribute: $oldName => $newName");
-+    return 0;
-+}
-+
-+## copy an attribute between targets
-+sub copyAttribute
-+{
-+    my $self = shift;
-+    my $source_target = shift;
-+    my $dest_target = shift;
-+    my $attribute = shift;
-+
-+    my $value=$self->getAttribute($source_target,$attribute);
-+    $self->setAttribute($dest_target,$attribute,$value);
-+
-+    $self->log($dest_target, "Copy Attribute: $attribute=$value");
-+}
-+
-+## sets an attribute
-+sub setAttribute
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $attribute  = shift;
-+    my $value      = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    $target_ptr->{ATTRIBUTES}->{$attribute}->{default} = $value;
-+    $self->log($target, "Setting Attribute: $attribute=$value");
-+}
-+## sets the field of a complex attribute
-+sub setAttributeField
-+{
-+    my $self      = shift;
-+    my $target    = shift;
-+    my $attribute = shift;
-+    my $field     = shift;
-+    my $value     = shift;
-+    $self->{data}->{TARGETS}->{$target}->{ATTRIBUTES}->{$attribute}->{default}
-+      ->{field}->{$field}->{value} = $value;
-+}
-+## returns complex attribute value
-+sub getAttributeField
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $attribute  = shift;
-+    my $field      = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}->
-+       {default}->{field}->{$field}->{value}))
-+    {
-+        printf("ERROR: getAttributeField(%s,%s,%s) | Attribute not defined\n",
-+            $target, $attribute,$field);
-+
-+        $self->myExit(4);
-+    }
-+
-+    return $target_ptr->{ATTRIBUTES}->{$attribute}->
-+           {default}->{field}->{$field}->{value};
-+}
-+
-+## returns an attribute from a bus
-+sub getBusAttribute
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $busnum     = shift;
-+    my $attr       = shift;
-+    my $target_ptr = $self->getTarget($target);
-+
-+    if (
-+        !defined(
-+            $target_ptr->{CONNECTION}->{BUS}->[$busnum]->{bus_attribute}
-+              ->{$attr}->{default}
-+        )
-+      )
-+    {
-+        printf("ERROR: getBusAttribute(%s,%d,%s) | Attribute not defined\n",
-+            $target, $busnum, $attr);
-+        $self->myExit(4);
-+    }
-+   if (ref($target_ptr->{CONNECTION}->{BUS}->[$busnum]->{bus_attribute}->{$attr}
-+      ->{default}) eq  "HASH") {
-+        return  "";
-+    }
-+    return $target_ptr->{CONNECTION}->{BUS}->[$busnum]->{bus_attribute}->{$attr}
-+      ->{default};
-+}
-+## returns a pointer to an array of children target names
-+sub getTargetChildren
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $target_ptr = $self->getTarget($target);
-+    ## this is an array
-+    return $target_ptr->{CHILDREN};
-+}
-+
-+sub getEnumValue
-+{
-+    my $self     = shift;
-+    my $enumType = shift;
-+    my $enumName = shift;
-+    if (!defined($self->{enumeration}->{$enumType}->{$enumName}))
-+    {
-+        printf("ERROR: getEnumValue(%s,%s) | enumType not defined\n",
-+            $enumType, $enumName);
-+        $self->myExit(4);
-+    }
-+    return $self->{enumeration}->{$enumType}->{$enumName};
-+}
-+
-+sub getEnumHash
-+{
-+    my $self     = shift;
-+    my $enumType = shift;
-+    my $enumName = shift;
-+    if (!defined($self->{enumeration}->{$enumType}))
-+    {
-+        printf("ERROR: getEnumValue(%s) | enumType not defined\n",
-+            $enumType);
-+            print Dumper($self->{enumeration});
-+        $self->myExit(4);
-+    }
-+    return $self->{enumeration}->{$enumType};
-+}
-+
-+sub setHuid
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    my $sys    = shift;
-+    my $node   = shift;
-+
-+    my $type    = $self->getType($target);
-+    my $type_id = $self->{enumeration}->{TYPE}->{$type};
-+    if ($type_id eq "") { $type_id = 0; }
-+    if ($type_id == 0) { return; }
-+    my $index = 0;
-+    if (defined($self->{huid_idx}->{$type}))
-+    {
-+        $index = $self->{huid_idx}->{$type};
-+    }
-+    else { $self->{huid_idx}->{$type} = 0; }
-+
-+    # Format: SSSS NNNN TTTTTTTT iiiiiiiiiiiiiiii
-+    my $huid = sprintf("%01x%01x%02x%04x", $sys, $node, $type_id, $index);
-+    $huid = "0x" . uc($huid);
-+
-+    $self->setAttribute($target, "HUID", $huid);
-+    $self->{huid_idx}->{$type}++;
-+    $self->log($target, "Setting HUID: $huid");
-+    $self->setMruid($target, $node);
-+}
-+
-+sub setMruid
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    my $node   = shift;
-+
-+    my $type          = $self->getType($target);
-+    my $mru_prefix_id = $self->{enumeration}->{MRU_PREFIX}->{$type};
-+    if ($mru_prefix_id eq "") { $mru_prefix_id = "0xFFFF"; }
-+    if ($mru_prefix_id eq "0xFFFF") { return; }
-+    my $index = 0;
-+    if (defined($self->{mru_idx}->{$node}->{$type}))
-+    {
-+        $index = $self->{mru_idx}->{$node}->{$type};
-+    }
-+    else { $self->{mru_idx}->{$node}->{$type} = 0; }
-+
-+    my $mruid = sprintf("%s%04x", $mru_prefix_id, $index);
-+    $self->setAttribute($target, "MRU_ID", $mruid);
-+    $self->{mru_idx}->{$node}->{$type}++;
-+}
-+
-+sub getMasterProc
-+{
-+    my $self = shift;
-+    return $self->{master_proc};
-+}
-+
-+sub setMasterProc
-+{
-+    my $self = shift;
-+    my $target = shift;
-+    $self->{master_proc}=$target;
-+}
-+
-+sub getSystemName
-+{
-+    my $self = shift;
-+    return $self->getAttribute("/".$self->{TOP_LEVEL}, "SYSTEM_NAME");
-+}
-+
-+sub myExit
-+{
-+    my $self      = shift;
-+    my $exit_code = shift;
-+    if ($exit_code eq "") { $exit_code = 0; }
-+    $self->{errorsExist} = 1;
-+    if ($self->{force} == 0)
-+    {
-+        exit($exit_code);
-+    }
-+}
-+
-+sub log
-+{
-+    my $self   = shift;
-+    my $target = shift;
-+    my $msg    = shift;
-+    if ($self->{debug})
-+    {
-+        print "DEBUG: ($target) $msg\n";
-+    }
-+}
-+1;
-+
-+=head1 NAME
-+
-+Targets
-+
-+=head1 SYNOPSIS
-+
-+    use Targets;
-+
-+    my $targets = Targets->new;
-+    $targets->loadXML("myfile.xml");
-+    foreach my $target ( sort keys %{ $targets->getAllTargets() } ) {
-+        ## do stuff with targets
-+    }
-+
-+    $targets->printXML( $file_handle, "top" );
-+
-+=head1 DESCRIPTION
-+
-+C<Targets> is a class that consumes XML generated by ServerWiz2.  The XML
-+describes a POWER system topology including nodes, cards, chips, and busses.
-+
-+=head1 OVERVIEW
-+
-+A simple example of a ServerWiz2 topology would be:
-+
-+=over 4
-+
-+=item Topology Example:
-+
-+   -system
-+      -node
-+         -motherboard
-+           -processor
-+           -pcie card
-+               - daughtercard
-+                  - memory buffer
-+                  - dimms
-+
-+=back
-+
-+Targets->loadXML("myfile.xml") reads this topology and creates 2 data
-+structures.  One data structure simply represents the hierarchical system
-+topology.  The other data structure represents the hierarchical structure
-+that hostboot expects (affinity path).
-+
-+Unlike hostboot, everything in ServerWiz2 is represented as a target.
-+For example, FSI and I2C units are targets under the processor that have a
-+bus type and therefore allow connections to be made.
-+
-+=head1 CONSTRUCTOR
-+
-+=over 4
-+
-+=item new ()
-+
-+There are no arguments for the constructor.
-+
-+=back
-+
-+=head1 METHODS
-+
-+C<TARGET> is a pointer to data structure containing all target information.
-+C<TARGET_STRING> is the hierarchical target string used as key for data
-+structure.  An example for C<TARGET_STRING> would be:
-+C</sys-0/node-0/motherboard-0/dimm-0>
-+
-+=over 4
-+
-+=item loadXml (C<FILENAME>)
-+
-+Reads ServerWiz2 XML C<FILENAME> and stores into a data structure for
-+manipulation and printing.
-+
-+=item getTarget(C<TARGET_STRING>)
-+
-+Returns pointer to data structure (C<TARGET>)
-+
-+=item getAllTargets(C<TARGET_STRING>)
-+
-+Returns array with all existing target data structures
-+
-+=item getTargetParent(C<TARGET_STRING>)
-+
-+Returns C<TARGET_STRING> of parent target
-+
-+=item getNumConnections(C<TARGET_STRING>)
-+
-+Returns the number of bus connections to this target
-+
-+=item getFirstConnectionDestination(C<TARGET_STRING>)
-+
-+Returns the target string of the first target found connected to
-+C<TARGET_STRING>.  This is useful because many busses are guaranteed
-+to only have one connection because they are point to point.
-+
-+=item getFirstConnectionBus(C<TARGET_STRING>)
-+
-+Returns the data structure of the bus of the first target found connected to
-+C<TARGET_STRING>.  The bus data structure is also a target with attributes.
-+
-+=item getConnectionDestination(C<TARGET_STRING>,C<INDEX>)
-+
-+Returns the target string of the C<INDEX> target found connected to
-+C<TARGET_STRING>.
-+
-+=item getConnectionBus(C<TARGET_STRING>)
-+
-+Returns the data structure of the C<INDEX> bus target found connected to
-+C<TARGET_STRING>.
-+
-+=item findEndpoint(C<TARGET_STRING>,C<BUS_TYPE>,C<ENDPOINT_MRW_TYPE>)
-+
-+Searches through all connections to C<TARGET_STRING>
-+for a endpoint C<MRW_TYPE> and C<BUS_TYPE>
-+
-+=item getBusType(C<TARGET_STRING>)
-+
-+Returns the BUS_TYPE attribute of (C<TARGET_STRING>).  Examples are I2C and DMI.
-+
-+=item getType(C<TARGET_STRING>)
-+
-+Returns the TYPE attribute of (C<TARGET_STRING>).
-+Examples are PROC and MEMBUF.
-+
-+=item getMrwType(C<TARGET_STRING>)
-+
-+Returns the MRW_TYPE attribute of (C<TARGET_STRING>).
-+Examples are CARD and PCI_CONFIG.  This
-+is an extension to the TYPE attribute and are types that hostboot does
-+not care about.
-+
-+=item getTargetType(C<TARGET_STRING>)
-+
-+Returns the target type id of (C<TARGET_STRING>).
-+This is not the TYPE attribute.  This is the
-+<id> from target_types.xml.  Examples are unit-pci-power8 and enc-node-power8.
-+
-+=item isBadAttribute(C<TARGET_STRING>,C<ATTRIBUTE_NAME>)
-+
-+Tests where attribute (C<ATTRIBUTE_NAME>) has been set in
-+target (C<TARGET_STRING>).  Returns true if attribute is undefined or empty
-+and false if attribute is defined and not empty.
-+
-+=item getAttribute(C<TARGET_STRING>,C<ATTRIBUTE_NAME>)
-+
-+Returns the value of attribute C<ATTRIBUTE_NAME> in target C<TARGET_STRING>.
-+
-+=item renameAttribute(C<TARGET_STRING>,C<ATTRIBUTE_OLDNAME>,
-+C<ATTRIBUTE_OLDNAME>)
-+
-+Renames attribute C<ATTRIBUTE_OLDNAME> to C<ATTRIBUTE_NEWNAME> in target
-+C<TARGET_STRING>.
-+
-+=item setAttribute(C<TARGET_STRING>,C<ATTRIBUTE_NAME>,C<VALUE>)
-+
-+Sets attribute C<ATTRIBUTE_NAME> of target C<TARGET_STRING> to value C<VALUE>.
-+
-+=item setAttributeField(C<TARGET_STRING>,C<ATTRIBUTE_NAME>,C<FIELD>,C<VALUE>)
-+
-+Sets attribute C<ATTRIBUTE_NAME> and field C<FIELD> of target C<TARGET_STRING>
-+to value C<VALUE>.  This is for complex attributes.
-+
-+=item getBusAttribute(C<TARGET_STRING>,C<INDEX>,C<ATTRIBUTE_NAME>)
-+
-+Gets the attribute C<ATTRIBUTE_NAME> from bus C<TARGET_STRING> bus number
-+C<INDEX>.
-+
-+=item getTargetChildren(C<TARGET_STRING>)
-+
-+Returns an array of target strings representing all the children of target
-+C<TARGET_STRING>.
-+
-+=item getEnumValue(C<ENUM_TYPE>,C<ENUM_NAME>)
-+
-+Returns the enum value of type C<ENUM_TYPE> and name C<ENUM_NAME>.  The
-+enumerations are also defined in ServerWiz2 XML output and are directly
-+copied from attribute_types.xml.
-+
-+=item getMasterProc()
-+
-+Returns the target string of the master processor.
-+
-+=item myExit(C<EXIT_NUM>)
-+
-+Calls exit(C<EXIT_NUM>) when force flag is not set.
-+
-+=item log(C<TARGET_STRING>,C<MESSAGE>)
-+
-+Prints to stdout log message is debug mode is turned on.
-+
-+
-+=back
-+
-+=head1 CREDITS
-+
-+Norman James <njames@us.ibm.com>
-+
-+=cut
-+
+                         $self->{dimm_tpos}++;
+                         $affinitypos++;
+                     }
 diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
-new file mode 100755
-index 0000000..1fb292f
---- /dev/null
+old mode 100644
+new mode 100755
+index 18107df..1fb292f
+--- a/src/usr/targeting/common/processMrw.pl
 +++ b/src/usr/targeting/common/processMrw.pl
-@@ -0,0 +1,1144 @@
-+#! /usr/bin/perl
-+# IBM_PROLOG_BEGIN_TAG
-+# This is an automatically generated prolog.
-+#
-+# $Source: src/usr/targeting/common/processMrw.pl $
-+#
-+# OpenPOWER HostBoot Project
-+#
-+# Contributors Listed Below - COPYRIGHT 2015
-+# [+] International Business Machines Corp.
-+#
-+#
-+# Licensed under the Apache License, Version 2.0 (the "License");
-+# you may not use this file except in compliance with the License.
-+# You may obtain a copy of the License at
-+#
-+#     http://www.apache.org/licenses/LICENSE-2.0
-+#
-+# Unless required by applicable law or agreed to in writing, software
-+# distributed under the License is distributed on an "AS IS" BASIS,
-+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-+# implied. See the License for the specific language governing
-+# permissions and limitations under the License.
-+#
-+# IBM_PROLOG_END_TAG
-+
-+use strict;
-+use XML::Simple;
-+use Data::Dumper;
-+use Targets;
-+use Math::BigInt;
-+use Getopt::Long;
-+use File::Basename;
-+
-+my $VERSION = "1.0.0";
-+
-+my $force          = 0;
-+my $serverwiz_file = "";
-+my $version        = 0;
-+my $debug          = 0;
-+my $report         = 0;
-+my $sdr_file       = "";
-+
-+GetOptions(
-+    "f"   => \$force,             # numeric
-+    "x=s" => \$serverwiz_file,    # string
-+    "d"   => \$debug,
-+    "v"   => \$version,
-+    "r"   => \$report,
-+  )                               # flag
-+  or printUsage();
-+
-+if ($version == 1)
-+{
-+    die "\nprocessMrw.pl\tversion $VERSION\n";
-+}
-+
-+if ($serverwiz_file eq "")
-+{
-+    printUsage();
-+}
-+
-+$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
-+
-+my $targetObj = Targets->new;
-+if ($force == 1)
-+{
-+    $targetObj->{force} = 1;
-+}
-+if ($debug == 1)
-+{
-+    $targetObj->{debug} = 1;
-+}
-+
-+$targetObj->setVersion($VERSION);
-+my $xmldir = dirname($serverwiz_file);
-+$targetObj->loadXML($serverwiz_file);
-+
-+#--------------------------------------------------
-+## loop through all targets and do stuff
-+foreach my $target (sort keys %{ $targetObj->getAllTargets() })
-+{
-+    my $type = $targetObj->getType($target);
-+    if ($type eq "SYS")
-+    {
-+        processSystem($targetObj, $target);
+@@ -84,7 +84,7 @@ foreach my $target (sort keys %{ $targetObj->getAllTargets() })
+     if ($type eq "SYS")
+     {
+         processSystem($targetObj, $target);
+-    }
 +    } 
-+    elsif ($type eq "PROC")
-+    {
-+        processProcessor($targetObj, $target);
-+    }
-+    elsif ($type eq "MEMBUF")
-+    {
-+        processMembuf($targetObj, $target);
-+    }
-+    elsif ($type eq "FSP")
-+    {
-+        processBmc($targetObj, $target);
-+    }
-+}
-+
-+
-+## check topology
-+foreach my $n (keys %{$targetObj->{TOPOLOGY}}) {
-+    foreach my $p (keys %{$targetObj->{TOPOLOGY}->{$n}}) {
-+        if ($targetObj->{TOPOLOGY}->{$n}->{$p} > 1) {
-+            print "ERROR: Fabric topology invalid.  2 targets have same ".
-+                  "FABRIC_NODE_ID,FABRIC_CHIP_ID ($n,$p)\n";
-+            $targetObj->myExit(3);
-+        }
-+    }
-+}
-+## check for errors
-+if ($targetObj->getMasterProc() eq "")
-+{
-+    print "ERROR: Master Processor not defined.  Please instaitant a BMC
-+ and connect LPC bus\n";
-+    $targetObj->myExit(3);
-+}
-+foreach my $target (keys %{ $targetObj->getAllTargets() })
-+{
-+    errorCheck($targetObj, $target);
-+}
-+
-+#--------------------------------------------------
-+## write out final XML
-+my $xml_fh;
-+my $filename = $xmldir . "/" . $targetObj->getSystemName() . "_hb.mrw.xml";
-+print "Creating XML: $filename\n";
-+open($xml_fh, ">$filename") || die "Unable to create: $filename";
-+$targetObj->printXML($xml_fh, "top");
-+close $xml_fh;
-+if (!$targetObj->{errorsExist})
-+{
-+    print "MRW created successfully!\n";
-+}
-+
-+
-+## optionally print out report
-+if ($report)
-+{
-+    my $report_file = $xmldir . "/" . $targetObj->getSystemName() . ".rpt";
-+    open(SUM,">$report_file") || die "Unable to create: $report_file\n";
+     elsif ($type eq "PROC")
+     {
+         processProcessor($targetObj, $target);
+@@ -141,7 +141,7 @@ if ($report)
+ {
+     my $report_file = $xmldir . "/" . $targetObj->getSystemName() . ".rpt";
+     open(SUM,">$report_file") || die "Unable to create: $report_file\n";
+-    my $ref = $targetObj->{targeting}->{SYS}[0]{NODES}[0]{PROCS};
 +    my $ref = $targetObj->{targeting}->{SYS}[0]{NODES}[0]{PROCS};       
-+    foreach my $proc (@{$ref})
-+    {
-+        foreach my $mcs (@{$proc->{MCSS}})
-+        {
-+            my $mcs_target = $mcs->{KEY};
-+            my $membuf=$mcs->{MEMBUFS}[0];
-+            my $membuf_target = $membuf->{KEY};
+     foreach my $proc (@{$ref})
+     {
+         foreach my $mcs (@{$proc->{MCSS}})
+@@ -149,7 +149,7 @@ if ($report)
+             my $mcs_target = $mcs->{KEY};
+             my $membuf=$mcs->{MEMBUFS}[0];
+             my $membuf_target = $membuf->{KEY};
+-
 +          
-+            my $sch = $targetObj->getAttribute($mcs_target,
-+                      "SCHEMATIC_INTERFACE");
-+            my $aff = $targetObj->getAttribute($mcs_target,"AFFINITY_PATH");
-+            my $huid = $targetObj->getAttribute($mcs_target,"HUID");
-+            print SUM "$sch | $huid | $mcs_target | $aff\n";
-+            if ($membuf_target ne "") {
-+                foreach my $mba (@{$membuf->{MBAS}}) {
-+                    my $mba_target = $mba->{KEY};
+             my $sch = $targetObj->getAttribute($mcs_target,
+                       "SCHEMATIC_INTERFACE");
+             my $aff = $targetObj->getAttribute($mcs_target,"AFFINITY_PATH");
+@@ -158,7 +158,7 @@ if ($report)
+             if ($membuf_target ne "") {
+                 foreach my $mba (@{$membuf->{MBAS}}) {
+                     my $mba_target = $mba->{KEY};
+-
 +               
-+                    $huid = $targetObj->getAttribute($mba_target,"HUID");
-+                    $aff = $targetObj->getAttribute($mcs_target,
-+                                   "AFFINITY_PATH");
-+                    print SUM "\t | $huid | $mba_target | $aff\n";
-+                    foreach my $dimm (@{$mba->{DIMMS}}) {
-+                        my $dimm_target = $dimm->{KEY};
-+                        $aff = $targetObj->getAttribute($dimm_target,
-+                                   "AFFINITY_PATH");
-+                        $huid = $targetObj->getAttribute($dimm_target,"HUID");
-+                        my $p = $targetObj->getAttribute($dimm_target,
-+                                  "MBA_PORT");
-+                        my $d = $targetObj->getAttribute($dimm_target,
-+                                   "MBA_DIMM");
-+                        my $i2c = $targetObj->getAttributeField($dimm_target,
-+                                  "EEPROM_VPD_PRIMARY_INFO","devAddr");
-+                        my $sens = $targetObj->getAttribute($dimm_target,
-+                                  "IPMI_SENSORS");
-+                        my @s = split(/\,/,$sens);
+                     $huid = $targetObj->getAttribute($mba_target,"HUID");
+                     $aff = $targetObj->getAttribute($mcs_target,
+                                    "AFFINITY_PATH");
+@@ -177,7 +177,7 @@ if ($report)
+                         my $sens = $targetObj->getAttribute($dimm_target,
+                                   "IPMI_SENSORS");
+                         my @s = split(/\,/,$sens);
+-
 +                        
-+                        print SUM "\t\t$huid | $dimm_target".
-+                                  " | $aff | $p | $d | $i2c | ".
-+                                  "$s[0],$s[1] | $s[2],$s[3]\n";
-+                    }
-+                }
-+            }
-+        }
-+    }
-+    close SUM;
-+}
-+
-+#--------------------------------------------------
-+#--------------------------------------------------
-+## Processing subroutines
-+
-+#--------------------------------------------------
-+
-+#--------------------------------------------------
-+## System
-+##
-+
-+sub processSystem
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
-+
-+    $targetObj->setAttribute($target, "MAX_MCS_PER_SYSTEM",
-+        $targetObj->{NUM_PROCS_PER_NODE} * $targetObj->{MAX_MCS});
-+    $targetObj->setAttribute($target, "MAX_PROC_CHIPS_PER_NODE",
-+        $targetObj->{NUM_PROCS_PER_NODE});
-+    parseBitwise($targetObj,$target,"CDM_POLICIES");
-+}
-+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")
-+        {
-+            $mask=$mask | $val;
-+        }
-+    }
-+    $targetObj->setAttribute($target,$attribute,$mask);
-+ }
-+#--------------------------------------------------
-+## Processor
-+##
-+
-+sub processProcessor
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
-+
-+    #########################
-+    ## Copy PCIE attributes from socket
-+    ## In serverwiz, processor instances are not unique
-+    ## because plugged into socket
-+    ## so processor instance unique attributes are socket level.
-+    ## The grandparent is guaranteed to be socket.
-+    my $socket_target =
-+       $targetObj->getTargetParent($targetObj->getTargetParent($target));
-+    $targetObj->copyAttribute($socket_target,$target,"LOCATION_CODE");
-+    $targetObj->copyAttribute($socket_target,$target,"FRU_ID");
+                         print SUM "\t\t$huid | $dimm_target".
+                                   " | $aff | $p | $d | $i2c | ".
+                                   "$s[0],$s[1] | $s[2],$s[3]\n";
+@@ -194,82 +194,6 @@ if ($report)
+ ## Processing subroutines
+ 
+ #--------------------------------------------------
+-## SDRs
+-##
+-
+-sub processSdr
+-{
+-    my $targetObj = shift;
+-    my $target = shift;
+-    my $sdrObj = shift;
+-
+-    my @ipmi_sensors;
+-    my %id_lu;
+-
+-    if ($targetObj->isBadAttribute($target,"ENTITY_ID_LOOKUP")==1)
+-    {
+-        return;
+-    }
+-    my $entity_id_lookup = $targetObj->getAttribute($target,"ENTITY_ID_LOOKUP");
+-    if ($entity_id_lookup ne "") {
+-        my $pos=0;
+-        if ($targetObj->isBadAttribute($target,"IPMI_INSTANCE")==1)
+-        {
+-            $pos = $targetObj->getAttribute($target,"ENTITY_INSTANCE");
+-        }
+-        else
+-        {
+-            $pos = $targetObj->getAttribute($target,"IPMI_INSTANCE");
+-        }
+-        print  "$entity_id_lookup,$pos\n";
+-        my @ids = split(/,/,$entity_id_lookup);
+-        foreach my $i (@ids)
+-        {
+-            my $i_int = oct($i);
+-            if ($i_int>0)
+-            {
+-                $id_lu{$i_int}=1;
+-            }
+-        }
+-        foreach my $s (@{$sdrObj->{data}})
+-        {
+-            my $sdr_entity_id = oct($s->{entity_id});
+-            if ($s->{name}=~/Core/) {
+-                $sdr_entity_id=208;
+-            }
+-            if ($id_lu{$sdr_entity_id}>0)
+-            {
+-                my $sensor_id=$s->{sensor_id};
+-                my $instance_id=oct($s->{entity_instance});
+-                my $sensor_type=oct($s->{sensor_type});
+-                if ($instance_id==$pos)
+-                {
+-                    print "IMPORTING: $target; pos=$pos; entity_id=".
+-                           "$sdr_entity_id; ".
+-                           "sensor_id=$sensor_id; sensor_type=$sensor_type\n";
+-                    my $eid=sprintf("0x%02x%02x",$sensor_type,$sdr_entity_id);
+-                    my $sid=sprintf("0x%02x",$s->{sensor_id});
+-                    push(@ipmi_sensors,$eid.",".$sid);
+-                    $id_lu{$sdr_entity_id}++;
+-                }
+-            }
+-        }
+-        foreach my $k (keys(%id_lu)) {
+-            if ($id_lu{$k}==1)
+-            {
+-                print "WARNING: $target; pos=$pos; entity_id=$k; ".
+-                      "not imported\n";
+-                #$targetObj->myExit(3);
+-            }
+-        }
+-        for (my $i=@ipmi_sensors;$i<16;$i++)
+-        {
+-            push(@ipmi_sensors,"0xFFFF,0xFF");
+-        }
+-        my $ipmi = join(',',@ipmi_sensors);
+-        $targetObj->setAttribute($target,"IPMI_SENSORS",$ipmi);
+-    }
+-}
+ 
+ #--------------------------------------------------
+ ## System
+@@ -347,7 +271,7 @@ sub processProcessor
+        $targetObj->getTargetParent($targetObj->getTargetParent($target));
+     $targetObj->copyAttribute($socket_target,$target,"LOCATION_CODE");
+     $targetObj->copyAttribute($socket_target,$target,"FRU_ID");
+-
 +    
-+
-+    foreach my $attr (sort (keys
-+           %{ $targetObj->getTarget($socket_target)->{TARGET}->{attribute} }))
-+    {
-+        if ($attr =~ /PROC\_PCIE/)
-+        {
-+            $targetObj->copyAttribute($socket_target,$target,$attr);
-+        }
-+    }
-+    $targetObj->log($target, "Processing PROC");
-+    foreach my $child (@{ $targetObj->getTargetChildren($target) })
-+    {
-+        $targetObj->log($target, "Processing PROC child: $child");
-+        my $child_type = $targetObj->getType($child);
-+        if ($child_type eq "NA" || $child_type eq "FSI")
-+        {
-+            $child_type = $targetObj->getMrwType($child);
-+        }
-+        if ($child_type eq "ABUS")
-+        {
-+            processAbus($targetObj, $child);
-+        }
-+        elsif ($child_type eq "XBUS")
-+        {
-+            processXbus($targetObj, $child);
-+        }
-+        elsif ($child_type eq "FSIM" || $child_type eq "FSICM")
-+        {
-+            processFsi($targetObj, $child, $target);
-+        }
-+        elsif ($child_type eq "PCI_CONFIGS")
-+        {
-+            foreach my $pci_child (@{ $targetObj->getTargetChildren($child) })
-+            {
-+               processPcie($targetObj, $pci_child, $target);
-+            }
-+        }
-+        elsif ($child_type eq "MCS")
-+        {
-+            processMcs($targetObj, $child, $target);
-+        }
-+        elsif ($child_type eq "OCC")
-+        {
-+            processOcc($targetObj, $child, $target);
-+        }
-+    }
-+
-+    ## update path for mvpd's and sbe's
-+    my $path  = $targetObj->getAttribute($target, "PHYS_PATH");
-+    my $model = $targetObj->getAttribute($target, "MODEL");
-+
-+    $targetObj->setAttributeField($target,
-+        "EEPROM_VPD_PRIMARY_INFO","i2cMasterPath",$path);
-+    $targetObj->setAttributeField($target,
-+        "EEPROM_VPD_BACKUP_INFO","i2cMasterPath",$path);
-+    $targetObj->setAttributeField($target,
-+        "EEPROM_SBE_PRIMARY_INFO","i2cMasterPath",$path);
-+    $targetObj->setAttributeField($target,
-+        "EEPROM_SBE_BACKUP_INFO","i2cMasterPath",$path);
-+    $targetObj->setAttributeField($target,
-+        "EEPROM_VPD_FRU_INFO","i2cMasterPath",$path);
-+
-+    ## initialize master processor FSI's
-+    $targetObj->setAttributeField($target, "FSI_OPTION_FLAGS", "flipPort", "0");
-+
-+    if ($target eq $targetObj->getMasterProc())
-+    {
-+        $targetObj->setAttributeField($target, "FSI_OPTION_FLAGS", "reserved",
-+            "0");
-+        $targetObj->setAttribute($target, "FSI_MASTER_CHIP",    "physical:sys");
-+        $targetObj->setAttribute($target, "FSI_MASTER_PORT",    "0xFF");
-+        $targetObj->setAttribute($target, "ALTFSI_MASTER_CHIP", "physical:sys");
-+        $targetObj->setAttribute($target, "ALTFSI_MASTER_PORT", "0xFF");
-+        $targetObj->setAttribute($target, "FSI_MASTER_TYPE",    "NO_MASTER");
-+        $targetObj->setAttribute($target, "FSI_SLAVE_CASCADE",  "0");
-+        $targetObj->setAttribute($target, "PROC_MASTER_TYPE", "ACTING_MASTER");
-+    }
-+    else
-+    {
-+        $targetObj->setAttribute($target, "PROC_MASTER_TYPE",
-+            "MASTER_CANDIDATE");
-+    }
-+    ## Update bus speeds
-+    processI2cSpeeds($targetObj,$target);
-+
-+    ## these are hardcoded because code sets them properly
-+    $targetObj->setAttributeField($target, "SCOM_SWITCHES", "reserved",   "0");
-+    $targetObj->setAttributeField($target, "SCOM_SWITCHES", "useFsiScom", "1");
-+    $targetObj->setAttributeField($target, "SCOM_SWITCHES", "useInbandScom",
-+        "0");
-+    $targetObj->setAttributeField($target, "SCOM_SWITCHES", "useXscom", "0");
-+
-+    processMembufVpdAssociation($targetObj,$target);
-+    setupBars($targetObj,$target);
-+}
-+
-+
-+sub processI2cSpeeds
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
-+
-+    my @bus_speeds;
-+    my $bus_speed_attr=$targetObj->getAttribute($target,"I2C_BUS_SPEED_ARRAY");
-+    my @bus_speeds2 = split(/,/,$bus_speed_attr);
-+    $bus_speeds[0][0] = $bus_speeds2[0];
-+    $bus_speeds[0][1] = $bus_speeds2[1];
-+    $bus_speeds[0][2] = $bus_speeds2[2];
-+    $bus_speeds[1][0] = $bus_speeds2[3];
-+    $bus_speeds[1][1] = $bus_speeds2[4];
-+    $bus_speeds[1][2] = $bus_speeds2[5];
-+
-+    my $i2cs=$targetObj->findConnections($target,"I2C","");
-+    if ($i2cs ne "") {
-+        foreach my $i2c (@{$i2cs->{CONN}}) {
-+            my $port=oct($targetObj->getAttribute($i2c->{SOURCE},"I2C_PORT"));
-+            my $engine=oct($targetObj->getAttribute(
-+                           $i2c->{SOURCE},"I2C_ENGINE"));
-+            my $bus_speed=$targetObj->getBusAttribute(
-+                  $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_SPEED");
-+            if ($bus_speed eq "" || $bus_speed==0) {
-+                print "ERROR: I2C bus speed not defined for $i2c->{SOURCE}\n";
-+                $targetObj->myExit(3);
-+            }
-+            ## choose lowest bus speed
-+            if ($bus_speeds[$engine][$port] eq "" ||
-+                  $bus_speeds[$engine][$port]==0  ||
-+                  $bus_speed < $bus_speeds[$engine][$port]) {
-+                $bus_speeds[$engine][$port] = $bus_speed;
-+            }
-+        }
-+    }
-+    $bus_speed_attr = $bus_speeds[0][0].",".
-+                      $bus_speeds[0][1].",".
-+                      $bus_speeds[0][2].",".
-+                      $bus_speeds[1][0].",".
-+                      $bus_speeds[1][1].",".
-+                      $bus_speeds[1][2];
-+
-+    $targetObj->setAttribute($target,"I2C_BUS_SPEED_ARRAY",$bus_speed_attr);
-+}
-+
-+################################
-+## Setup address map
-+
-+sub setupBars
-+{
-+    my $targetObj = shift;
-+    my $target = shift;
-+    #--------------------------------------------------
-+    ## Setup BARs
-+
-+    my $node = $targetObj->getAttribute($target, "FABRIC_NODE_ID");
-+    my $proc   = $targetObj->getAttribute($target, "FABRIC_CHIP_ID");
-+    $targetObj->{TOPOLOGY}->{$node}->{$proc}++;
-+
-+    my @bars=("FSP_BASE_ADDR","PSI_BRIDGE_BASE_ADDR",
-+              "INTP_BASE_ADDR","PHB_BASE_ADDRS","PCI_BASE_ADDRS_32",
-+              "PCI_BASE_ADDRS_64","RNG_BASE_ADDR","IBSCOM_PROC_BASE_ADDR");
-+
-+    foreach my $bar (@bars)
-+    {
-+        my ($num,$base,$node_offset,$proc_offset,$offset) = split(/,/,
-+               $targetObj->getAttribute($target,$bar));
-+        my $i_base = Math::BigInt->new($base);
-+        my $i_node_offset = Math::BigInt->new($node_offset);
-+        my $i_proc_offset = Math::BigInt->new($proc_offset);
-+        my $i_offset = Math::BigInt->new($offset);
-+
-+        my $value="";
-+        if ($num==0)
-+        {
-+            $value=$base;
-+        }
-+        else
-+        {
-+            for (my $i=0;$i<$num;$i++)
-+            {
-+                my $b=sprintf("0x%016X",
-+         $i_base+$i_node_offset*$node+$i_proc_offset*$proc+$i_offset*$i);
-+                my $sep=",";
+ 
+     foreach my $attr (sort (keys
+            %{ $targetObj->getTarget($socket_target)->{TARGET}->{attribute} }))
+@@ -529,7 +453,7 @@ sub setupBars
+                 my $b=sprintf("0x%016X",
+          $i_base+$i_node_offset*$node+$i_proc_offset*$proc+$i_offset*$i);
+                 my $sep=",";
+-                if ($i==$num-1)
 +                if ($i==$num-1) 
-+                {
-+                    $sep="";
-+                }
-+                $value=$value.$b.$sep;
-+            }
-+        }
-+        $targetObj->setAttribute($target,$bar,$value);
-+    }
-+}
-+
-+#--------------------------------------------------
-+## MCS
-+##
-+sub processMcs
-+{
-+    my $targetObj    = shift;
-+    my $target       = shift;
-+    my $parentTarget = shift;
-+
-+    my $node = $targetObj->getAttribute($parentTarget, "FABRIC_NODE_ID");
-+    my $proc   = $targetObj->getAttribute($parentTarget, "FABRIC_CHIP_ID");
-+
-+    my ($base,$node_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($node_offset);
-+    my $i_proc_offset = Math::BigInt->new($proc_offset);
-+    my $i_offset = Math::BigInt->new($offset);
-+
-+    my $mcs = $targetObj->getAttribute($target, "MCS_NUM");
+                 {
+                     $sep="";
+                 }
+@@ -560,7 +484,7 @@ sub processMcs
+     my $i_offset = Math::BigInt->new($offset);
+ 
+     my $mcs = $targetObj->getAttribute($target, "MCS_NUM");
+-    my $mcsStr=sprintf("0x%016X",
 +    my $mcsStr=sprintf("0x%016X",   
-+         $i_base+$i_node_offset*$node+$i_proc_offset*$proc+$i_offset*$mcs);
-+    $targetObj->setAttribute($target, "IBSCOM_MCS_BASE_ADDR", $mcsStr);
-+}
-+
-+
-+#--------------------------------------------------
-+## XBUS
-+##
-+## Finds XBUS connections and creates PEER TARGET attributes
-+
-+sub processXbus
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
-+
-+    # $targetObj->setAttribute($target, "PEER_TARGET","");
+          $i_base+$i_node_offset*$node+$i_proc_offset*$proc+$i_offset*$mcs);
+     $targetObj->setAttribute($target, "IBSCOM_MCS_BASE_ADDR", $mcsStr);
+ }
+@@ -577,7 +501,7 @@ sub processXbus
+     my $target    = shift;
+ 
+     # $targetObj->setAttribute($target, "PEER_TARGET","");
+-
 +  
-+}
-+
-+#--------------------------------------------------
-+## ABUS
-+##
-+## Finds ABUS connections and creates PEER TARGET attributes
-+
-+sub processAbus
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
-+
-+    my $found_abus = 0;
-+   $targetObj->setAttribute($target, "PEER_PATH","physical:na");
-+   $targetObj->setAttribute($target, "EI_BUS_TX_LANE_INVERT","0");
-+   $targetObj->setAttribute($target, "EI_BUS_TX_MSBSWAP","0");
-+   # $targetObj->setAttribute($target, "PEER_TARGET","");
+ }
+ 
+ #--------------------------------------------------
+@@ -595,7 +519,7 @@ sub processAbus
+    $targetObj->setAttribute($target, "EI_BUS_TX_LANE_INVERT","0");
+    $targetObj->setAttribute($target, "EI_BUS_TX_MSBSWAP","0");
+    # $targetObj->setAttribute($target, "PEER_TARGET","");
+-
 +            
-+    my $abus_child_conn = $targetObj->getFirstConnectionDestination($target);
-+    if ($abus_child_conn ne "")
-+    {
-+        ## set attributes for both directions
-+        my $aff1 = $targetObj->getAttribute($target, "AFFINITY_PATH");
-+        my $aff2 = $targetObj->getAttribute($abus_child_conn, "AFFINITY_PATH");
-+
-+        $targetObj->setAttribute($abus_child_conn, "PEER_TARGET",
-+            $targetObj->getAttribute($target, "PHYS_PATH"));
-+        $targetObj->setAttribute($target, "PEER_TARGET",
-+            $targetObj->getAttribute($abus_child_conn, "PHYS_PATH"));
-+
-+        $targetObj->setAttribute($abus_child_conn, "PEER_PATH",
-+            $targetObj->getAttribute($target, "PHYS_PATH"));
-+        $targetObj->setAttribute($target, "PEER_PATH",
-+            $targetObj->getAttribute($abus_child_conn, "PHYS_PATH"));
-+
-+        # copy Abus attributes to proc
-+        my $abus = $targetObj->getFirstConnectionBus($target);
-+        $targetObj->setAttribute($target, "EI_BUS_TX_LANE_INVERT",
-+            $abus->{bus_attribute}->{SOURCE_TX_LANE_INVERT}->{default});
-+        $targetObj->setAttribute($target, "EI_BUS_TX_MSBSWAP",
-+            $abus->{bus_attribute}->{SOURCE_TX_MSBSWAP}->{default});
-+        $targetObj->setAttribute($abus_child_conn, "EI_BUS_TX_LANE_INVERT",
-+            $abus->{bus_attribute}->{DEST_TX_LANE_INVERT}->{default});
-+        $targetObj->setAttribute($abus_child_conn, "EI_BUS_TX_MSBSWAP",
-+            $abus->{bus_attribute}->{DEST_TX_MSBSWAP}->{default});
-+        $found_abus = 1;
-+    }
-+}
-+
-+#--------------------------------------------------
-+## FSI
-+##
-+## Finds FSI connections and creates FSI MASTER attributes at endpoint target
-+
-+sub processFsi
-+{
-+    my $targetObj    = shift;
-+    my $target       = shift;
-+    my $parentTarget = shift;
-+    my $type         = $targetObj->getBusType($target);
-+
-+    ## fsi can only have 1 connection
-+    my $fsi_child_conn = $targetObj->getFirstConnectionDestination($target);
-+
-+    ## found something on other end
-+    if ($fsi_child_conn ne "")
-+    {
-+        my $fsi_link = $targetObj->getAttribute($target, "FSI_LINK");
-+        my $fsi_port = $targetObj->getAttribute($target, "FSI_PORT");
-+        my $cmfsi = $targetObj->getAttribute($target, "CMFSI");
-+        my $flip_port         = 0;
-+        my $proc_path = $targetObj->getAttribute($parentTarget,"PHYS_PATH");
-+        my $fsi_child_target = $targetObj->getTargetParent($fsi_child_conn);
-+        $targetObj->setFsiAttributes($fsi_child_target,
-+                    $type,$cmfsi,$proc_path,$fsi_port,$flip_port);
-+    }
-+}
-+
-+#--------------------------------------------------
-+## PCIE
-+##
-+## Creates attributes from abstract PCI attributes on bus
-+
-+sub processPcie
-+{
-+    my $targetObj    = shift;
-+    my $target       = shift;
-+    my $parentTarget = shift;
-+
-+
-+    ## process pcie config target
-+    ## this is a special target whose children are the different ways
-+    ## to configure iop/phb's
-+
-+    # TODO RTC: TBD
-+    # add a 3rd IOP for Naples
-+
-+    ## Get config children
-+    my @lane_swap;
-+    $lane_swap[0][0] = 0;
-+    $lane_swap[0][1] = 0;
-+    $lane_swap[1][0] = 0;
-+    $lane_swap[1][1] = 0;
-+
-+    my @lane_mask;
-+    $lane_mask[0][0] = "0x0000";
-+    $lane_mask[0][1] = "0x0000";
-+    $lane_mask[1][0] = "0x0000";
-+    $lane_mask[1][1] = "0x0000";
-+
-+    my @lane_rev;
-+    $lane_rev[0][0] = "";
-+    $lane_rev[0][1] = "";
-+    $lane_rev[1][0] = "";
-+    $lane_rev[1][1] = "";
-+
-+    my @is_slot;
-+    $is_slot[0][0] = 0;
-+    $is_slot[0][1] = 0;
-+    $is_slot[1][0] = 0;
-+    $is_slot[1][1] = 0;
-+
-+    my $phb_config = "00000000";
-+
-+    my %cfg_check;
-+    my @equalization;
-+
-+    my $wiring_table = $targetObj->getAttribute($target,"PCIE_LANE_SWAP_TABLE");
-+    $wiring_table=~s/\s+//g;
-+    $wiring_table=~s/\t+//g;
-+    $wiring_table=~s/\n+//g;
-+
-+    my @t = split(/,/,$wiring_table);
-+    my %iop_swap;
-+
-+    #iop_swap{iop}{clk swap}{clk group reversal}
-+    $iop_swap{0}{0}{'00'}=$t[0];
-+    $iop_swap{0}{0}{'01'}=$t[1];
-+    $iop_swap{0}{0}{'10'}=$t[2];
-+    $iop_swap{0}{0}{'11'}=$t[3];
-+    $iop_swap{0}{1}{'00'}=$t[4];
-+    $iop_swap{0}{1}{'01'}=$t[5];
-+    $iop_swap{0}{1}{'10'}=$t[6];
-+    $iop_swap{0}{1}{'11'}=$t[7];
-+
-+    $iop_swap{1}{0}{'00'}=$t[8];
-+    $iop_swap{1}{0}{'01'}=$t[9];
-+    $iop_swap{1}{0}{'10'}=$t[10];
-+    $iop_swap{1}{0}{'11'}=$t[11];
-+    $iop_swap{1}{1}{'00'}=$t[12];
-+    $iop_swap{1}{1}{'01'}=$t[13];
-+    $iop_swap{1}{1}{'10'}=$t[14];
-+    $iop_swap{1}{1}{'11'}=$t[15];
-+
-+    my @lane_eq;
-+    my $NUM_PHBS=4;
-+    for (my $p=0;$p<$NUM_PHBS;$p++)
-+    {
-+        for (my $lane=0;$lane<16;$lane++)
-+        {
-+           $equalization[$p][$lane] = "0x00,0x00";
-+        }
-+    }
-+    my $found=0;
-+    foreach my $child (@{ $targetObj->getTargetChildren($target) })
-+    {
-+        my $num_connections = $targetObj->getNumConnections($child);
-+        if ($num_connections > 0)
-+        {
-+            $found=1;
-+            my $pci_endpoint=$targetObj->getFirstConnectionDestination($child);
-+
-+            my $bus = $targetObj->getConnectionBus($target, 0);
-+            my $iop_num = $targetObj->getAttribute($child, "IOP_NUM");
-+            my $swap_clks=$targetObj->getBusAttribute($child, 0,
-+                         "PCIE_SWAP_CLKS");
-+
-+            my $lane_rev=$targetObj->getBusAttribute($child, 0,
-+                         "LANE_REVERSAL");
-+
-+            my $phb_num = $targetObj->getAttribute($child, "PHB_NUM");
-+            my $lane_set = $targetObj->getAttribute($child, "PCIE_LANE_SET");
-+            my $capi = $targetObj->getAttribute($child, "ENABLE_CAPI");
-+
-+            my $pci_endpoint_type =
-+              $targetObj->getAttribute(
-+                $targetObj->getTargetParent($pci_endpoint), "CLASS");
-+
-+            if ($pci_endpoint_type eq "CARD")
-+            {
-+                $is_slot[$iop_num][$lane_set] = 1;
-+            }
-+            $lane_swap[$iop_num][$lane_set] =
-+              $targetObj->getBusAttribute($child, 0, "PCIE_SWAP_CLKS");
-+            $lane_mask[$iop_num][$lane_set] =
-+              $targetObj->getAttribute($child, "PCIE_LANE_MASK");
-+            $lane_rev[$iop_num][$lane_set] =
-+              $targetObj->getBusAttribute($child, 0, "LANE_REVERSAL");
-+            my $eq = $targetObj->getBusAttribute($child, 0,
-+              "PCIE_LANE_EQUALIZATION");
-+            my @eqs = split(/\,/,$eq);
-+            for (my $e=0;$e<@eqs;$e=$e+3)
-+            {
-+                if ($eqs[$e] eq "all")
-+                {
-+                    for (my $lane=0;$lane<16;$lane++)
-+                    {
+     my $abus_child_conn = $targetObj->getFirstConnectionDestination($target);
+     if ($abus_child_conn ne "")
+     {
+@@ -785,14 +709,12 @@ sub processPcie
+                 {
+                     for (my $lane=0;$lane<16;$lane++)
+                     {
+-                        $equalization[$phb_num][$lane]=$eqs[$e+1].",".
+-                              $eqs[$e+2];
+-                    }
 +                        $equalization[$phb_num][$lane]=$eqs[$e+1].",".$eqs[$e+2];
 +                    }                    
-+                }
-+                else
-+                {
+                 }
+                 else
+                 {
+-                    $equalization[$phb_num][$eqs[$e]] = $eqs[$e+1].",".
+-                              $eqs[$e+2];
 +                    $equalization[$phb_num][$eqs[$e]] = $eqs[$e+1].",".$eqs[$e+2];
-+                }
-+            }
-+            substr($phb_config, $phb_num, 1, "1");
-+        }
-+    }
-+    if ($found)
-+    {
-+    my $hex = sprintf('%X', oct("0b$phb_config"));
-+
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_PHB_ACTIVE","0x" . $hex);
-+    my $lane_mask_attr = sprintf("%s,%s,%s,%s",
-+        $lane_mask[0][0], $lane_mask[0][1],
-+        $lane_mask[1][0], $lane_mask[1][1]);
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_LANE_MASK",
-+        $lane_mask_attr);
-+    $targetObj->setAttribute($parentTarget,"PROC_PCIE_LANE_MASK_NON_BIFURCATED",
-+        $lane_mask_attr);
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_LANE_MASK_BIFURCATED",
-+        "0,0,0,0");
-+
-+    my @iop_swap_lu;
-+    my @iop_lane_swap;
-+    for (my $iop=0;$iop<2;$iop++)
-+    {
-+        $iop_lane_swap[$iop] = $lane_swap[$iop][0] | $lane_swap[$iop][1];
-+        my $lane_rev = $lane_rev[$iop][0].$lane_rev[$iop][1];
-+        $iop_swap_lu[$iop]=
-+                 "0b".$iop_swap{$iop}{$iop_lane_swap[$iop]}{$lane_rev};
-+        if ($iop_swap_lu[$iop] eq "") {
-+          die "PCIE config for $iop,$iop_lane_swap[$iop],$lane_rev not found\n";
-+        }
-+    }
-+    my $lane_swap_attr0 = sprintf("%s,%s",$iop_lane_swap[0],
-+                          $iop_lane_swap[1]);
-+    my $lane_swap_attr1 = sprintf("%s,0,%s,0",$iop_lane_swap[0],
-+                          $iop_lane_swap[1]);
-+
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP",
-+        $lane_swap_attr0);
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_NON_BIFURCATED",
-+        $lane_swap_attr1);
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_BIFURCATED",
-+        "0,0,0,0");
-+
-+    my $lane_rev_attr = sprintf("%s,0,%s,0",
-+                         oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
-+
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL",
-+        $lane_rev_attr);
-+    $targetObj->setAttribute($parentTarget,
-+        "PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED",$lane_rev_attr);
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL_BIFURCATED",
-+        "0,0,0,0");
-+
-+    my $is_slot_attr = sprintf("%s,%s,%s,%s",
-+        $is_slot[0][0], $is_slot[0][1], $is_slot[1][0], $is_slot[1][1]);
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_IS_SLOT", $is_slot_attr);
-+
-+    ## don't support DSMP
-+    $targetObj->setAttribute($parentTarget, "PROC_PCIE_DSMP_CAPABLE","0,0,0,0");
-+    my $eq_str="";
-+    for (my $p=0;$p<$NUM_PHBS;$p++)
-+    {
-+        for (my $lane=0;$lane<16;$lane++)
-+        {
-+            $eq_str=$eq_str.$equalization[$p][$lane].",";
-+        }
-+    }
-+    $eq_str = substr($eq_str,0,length($eq_str)-1);
-+    $targetObj->setAttribute($parentTarget,"PROC_PCIE_LANE_EQUALIZATION",
-+         $eq_str);
-+    }
-+}
-+#--------------------------------------------------
-+## OCC
-+##
-+sub processOcc
-+{
-+    my $targetObj    = shift;
-+    my $target       = shift;
-+    my $parentTarget = shift;
-+    my $master_capable=0;
-+    if ($parentTarget eq $targetObj->getMasterProc())
-+    {
-+        $master_capable=1;
-+    }
-+    $targetObj->setAttribute($target,"OCC_MASTER_CAPABLE",$master_capable);
-+}
-+
-+sub processMembufVpdAssociation
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
+                 }
+             }
+             substr($phb_config, $phb_num, 1, "1");
+@@ -886,7 +808,7 @@ sub processMembufVpdAssociation
+ {
+     my $targetObj = shift;
+     my $target    = shift;
+-
 +    
-+    my $vpds=$targetObj->findConnections($target,"I2C","VPD");
-+    if ($vpds ne "" ) {
-+        my $vpd = $vpds->{CONN}->[0];
-+
-+        my $membuf_assocs=$targetObj->findConnections($vpd->{DEST_PARENT},
-+                          "LOGICAL_ASSOCIATION","MEMBUF");
-+        if ($membuf_assocs ne "") {
-+            foreach my $membuf_assoc (@{$membuf_assocs->{CONN}}) {
-+                my $membuf_target = $membuf_assoc->{DEST_PARENT};
-+                setEepromAttributes($targetObj,
-+                       "EEPROM_VPD_PRIMARY_INFO",$membuf_target,$vpd);
-+                setEepromAttributes($targetObj,
+     my $vpds=$targetObj->findConnections($target,"I2C","VPD");
+     if ($vpds ne "" ) {
+         my $vpd = $vpds->{CONN}->[0];
+@@ -899,7 +821,7 @@ sub processMembufVpdAssociation
+                 setEepromAttributes($targetObj,
+                        "EEPROM_VPD_PRIMARY_INFO",$membuf_target,$vpd);
+                 setEepromAttributes($targetObj,
+-                       "EEPROM_VPD_FRU_INFO",$membuf_target,$vpd,"0++");
 +                       "EEPROM_VPD_FRU_INFO",$membuf_target,$vpd,"0++");       
-+                my $index = $targetObj->getBusAttribute($membuf_assoc->{SOURCE},
-+                                $membuf_assoc->{BUS_NUM}, "ISDIMM_MBVPD_INDEX");
-+                $targetObj->setAttribute(
-+                            $membuf_target,"ISDIMM_MBVPD_INDEX",$index);
-+            }
-+        }
-+    }
-+}
-+
-+#--------------------------------------------------
-+## MEMBUF
-+##
-+## Finds I2C connections to DIMM and creates EEPROM attributes
-+## FYI:  I had to handle DMI busses in framework because they
-+## define affinity path
-+
-+sub processMembuf
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
+                 my $index = $targetObj->getBusAttribute($membuf_assoc->{SOURCE},
+                                 $membuf_assoc->{BUS_NUM}, "ISDIMM_MBVPD_INDEX");
+                 $targetObj->setAttribute(
+@@ -920,8 +842,8 @@ sub processMembuf
+ {
+     my $targetObj = shift;
+     my $target    = shift;
+-    if ($targetObj->isBadAttribute($target, "PHYS_PATH", ""))
+-    {
 +    if ($targetObj->isBadAttribute($target, "PHYS_PATH", "")) 
 +    { 
-+        ##dmi is probably not connected.  will get caught in error checking
-+        return;
-+    }
-+
-+    processMembufVpdAssociation($targetObj,$target);
-+
-+    ## finds which gpio expander that controls vddr regs for membufs
-+    my $gpioexp=$targetObj->findConnections($target,"I2C","GPIO_EXPANDER");
-+    if ($gpioexp ne "" ) {
-+        my $vreg=$targetObj->findConnections(
-+            $gpioexp->{CONN}->[0]->{DEST_PARENT},"GPIO","VOLTAGE_REGULATOR");
-+        if ($vreg ne "") {
-+            my $vddPin = $targetObj->getAttribute(
-+                 $vreg->{CONN}->[0]->{SOURCE},"CHIP_UNIT");
-+            my $membufs=$targetObj->findConnections(
-+               $vreg->{CONN}->[0]->{DEST_PARENT},"POWER","MEMBUF");
-+            if ($membufs ne "") {
-+                foreach my $membuf (@{$membufs->{CONN}}) {
-+                    my $aff = $targetObj->getAttribute($membuf->{DEST_PARENT},
-+                        "PHYS_PATH");
-+                    setGpioAttributes($targetObj,$membuf->{DEST_PARENT},
-+                        $gpioexp->{CONN}->[0],$vddPin);
-+
-+                }
-+            }
-+        }
-+    }
+         ##dmi is probably not connected.  will get caught in error checking
+         return;
+     }
+@@ -949,7 +871,33 @@ sub processMembuf
+             }
+         }
+     }
 +    ## find port mapping
 +    my %dimm_portmap;
 +    foreach my $child (@{$targetObj->getTargetChildren($target)})
@@ -2383,18 +383,15 @@
 +    }
 +    
 +    
-+    ## Process MEMBUF to DIMM I2C connections
+     ## Process MEMBUF to DIMM I2C connections
 +    my @addr_map=('0','0','0','0','0','0','0','0');
-+    my $dimms=$targetObj->findConnections($target,"I2C","SPD");
-+    if ($dimms ne "") {
-+        foreach my $dimm (@{$dimms->{CONN}}) {
-+            my $dimm_target = $targetObj->getTargetParent($dimm->{DEST_PARENT});
-+            setEepromAttributes($targetObj,
-+                       "EEPROM_VPD_PRIMARY_INFO",$dimm_target,
-+                       $dimm);
-+            setEepromAttributes($targetObj,
-+                       "EEPROM_VPD_FRU_INFO",$dimm_target,
-+                       $dimm,"0++");
+     my $dimms=$targetObj->findConnections($target,"I2C","SPD");
+     if ($dimms ne "") {
+         foreach my $dimm (@{$dimms->{CONN}}) {
+@@ -960,8 +908,19 @@ sub processMembuf
+             setEepromAttributes($targetObj,
+                        "EEPROM_VPD_FRU_INFO",$dimm_target,
+                        $dimm,"0++");
 +
 +            my $field=getI2cMapField($targetObj,$dimm_target,$dimm);
 +            my $map = $dimm_portmap{$dimm_target};
@@ -2403,33 +400,27 @@
 +                $targetObj->myExit(3);
 +            }
 +            $addr_map[$map] = $field;
-+        }
-+    }
+         }
+     }
 +    $targetObj->setAttribute($targetObj->{targeting}->{SYS}[0]->{KEY},
 +            "MRW_MEM_SENSOR_CACHE_ADDR_MAP","0x".join("",@addr_map));
 +
-+    ## Update bus speeds
-+    processI2cSpeeds($targetObj,$target);
-+
-+    ## Do MBA port mapping
-+    my %mba_port_map;
-+    my $ddrs=$targetObj->findConnections($target,"DDR3","DIMM");
-+    if ($ddrs ne "") {
-+        my %portmap;
-+        foreach my $ddr (@{$ddrs->{CONN}}) {
-+            my $mba=$ddr->{SOURCE};
-+            my $dimm=$ddr->{DEST_PARENT};
+     ## Update bus speeds
+     processI2cSpeeds($targetObj,$target);
+ 
+@@ -973,7 +932,7 @@ sub processMembuf
+         foreach my $ddr (@{$ddrs->{CONN}}) {
+             my $mba=$ddr->{SOURCE};
+             my $dimm=$ddr->{DEST_PARENT};
+-            my ($dimmnum,$port)=split(//,sprintf("%02b\n",$portmap{$mba}));
 +            my ($dimmnum,$port)=split(//,sprintf("%02b\n",$portmap{$mba}));        
-+            $targetObj->setAttribute($dimm, "MBA_DIMM",$dimmnum);
-+            $targetObj->setAttribute($dimm, "MBA_PORT",$port);
-+            $portmap{$mba}++;
-+
-+            ## Copy connector attributes
-+            my $dimmconn=$targetObj->getTargetParent($dimm);
-+        }
-+    }
-+}
-+
+             $targetObj->setAttribute($dimm, "MBA_DIMM",$dimmnum);
+             $targetObj->setAttribute($dimm, "MBA_PORT",$port);
+             $portmap{$mba}++;
+@@ -984,6 +943,24 @@ sub processMembuf
+     }
+ }
+ 
 +sub getI2cMapField
 +{
 +    my $targetObj = shift;
@@ -2448,187 +439,18 @@
 +    return $hexfield;
 +}
 +
-+
-+sub setEepromAttributes
-+{
-+    my $targetObj = shift;
-+    my $name = shift;
-+    my $target = shift;
-+    my $conn_target = shift;
-+    my $fru = shift;
-+
-+    my $port = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_PORT");
-+    my $engine = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_ENGINE");
-+    my $addr = $targetObj->getBusAttribute($conn_target->{SOURCE},
-+            $conn_target->{BUS_NUM}, "I2C_ADDRESS");
-+
-+    my $path = $targetObj->getAttribute($conn_target->{SOURCE_PARENT},
-+               "PHYS_PATH");
-+    my $mem  = $targetObj->getAttribute($conn_target->{DEST_PARENT},
-+               "MEMORY_SIZE_IN_KB");
-+    my $cycle  = $targetObj->getAttribute($conn_target->{DEST_PARENT},
-+               "WRITE_CYCLE_TIME");
-+    my $page  = $targetObj->getAttribute($conn_target->{DEST_PARENT},
-+               "WRITE_PAGE_SIZE");
-+    my $offset  = $targetObj->getAttribute($conn_target->{DEST_PARENT},
-+               "BYTE_ADDRESS_OFFSET");
-+
-+    $targetObj->setAttributeField($target, $name, "i2cMasterPath", $path);
-+    $targetObj->setAttributeField($target, $name, "port", $port);
-+    $targetObj->setAttributeField($target, $name, "devAddr", $addr);
-+    $targetObj->setAttributeField($target, $name, "engine", $engine);
-+    $targetObj->setAttributeField($target, $name, "byteAddrOffset", $offset);
-+    $targetObj->setAttributeField($target, $name, "maxMemorySizeKB", $mem);
-+    $targetObj->setAttributeField($target, $name, "writePageSize", $page);
-+    $targetObj->setAttributeField($target, $name, "writeCycleTime", $cycle);
-+
-+    if ($fru ne "")
-+    {
-+        $targetObj->setAttributeField($target, $name, "fruId", $fru);
-+    }
-+}
-+
-+
-+sub setGpioAttributes
-+{
-+    my $targetObj = shift;
-+    my $target = shift;
-+    my $conn_target = shift;
-+    my $vddrPin = shift;
-+
-+    my $port = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_PORT");
-+    my $engine = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_ENGINE");
-+    my $addr = $targetObj->getBusAttribute($conn_target->{SOURCE},
-+            $conn_target->{BUS_NUM}, "I2C_ADDRESS");
+ 
+ sub setEepromAttributes
+ {
+@@ -1036,7 +1013,7 @@ sub setGpioAttributes
+     my $engine = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_ENGINE");
+     my $addr = $targetObj->getBusAttribute($conn_target->{SOURCE},
+             $conn_target->{BUS_NUM}, "I2C_ADDRESS");
+-    my $path = $targetObj->getAttribute($conn_target->{SOURCE_PARENT},
 +    my $path = $targetObj->getAttribute($conn_target->{SOURCE_PARENT}, 
-+               "PHYS_PATH");
-+
-+
-+    my $name="GPIO_INFO";
-+    $targetObj->setAttributeField($target, $name, "i2cMasterPath", $path);
-+    $targetObj->setAttributeField($target, $name, "port", $port);
-+    $targetObj->setAttributeField($target, $name, "devAddr", $addr);
-+    $targetObj->setAttributeField($target, $name, "engine", $engine);
-+    $targetObj->setAttributeField($target, $name, "vddrPin", $vddrPin);
-+}
-+
-+#--------------------------------------------------
-+## ERROR checking
-+sub errorCheck
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
-+    my $type      = $targetObj->getType($target);
-+
-+    ## error checking even for connections are done with attribute checks
-+    ##  since connections simply create attributes at source and/or destination
-+    ##
-+    ## 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'],
-+    );
-+    my %error_msg = (
-+        'EEPROM_VPD_PRIMARY_INFO/devAddr' =>
-+          'I2C connection to target is not defined',
-+        'FSI_MASTER_PORT' => 'This target is missing a required FSI connection',
-+        'FSI_MASTER_CHIP' => 'This target is missing a required FSI connection',
-+        '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);
-+        my ($a_complex, $field) = split(/\//, $a);
-+        if ($field ne "")
-+        {
-+            if ($targetObj->isBadComplexAttribute(
-+                    $target, $a_complex, $field, $v) )
-+            {
-+                push(@errors,sprintf(
-+                        "$a attribute is invalid (Target=%s)\n\t%s\n",
-+                        $target, $error_msg{$a}));
-+            }
-+        }
-+        else
-+        {
-+            if ($targetObj->isBadAttribute($target, $a, $v))
-+            {
-+                push(@errors,sprintf(
-+                        "$a attribute is invalid (Target=%s)\n\t%s\n",
-+                        $target, $error_msg{$a}));
-+            }
-+        }
-+    }
-+    if ($type eq "PROC")
-+    {
-+        ## note: DMI is checked on membuf side so don't need to check that here
-+        ## this checks if at least 1 abus is connected
-+        my $found_abus = 0;
-+        my $abus_error = "";
-+        foreach my $child (@{ $targetObj->getTargetChildren($target) })
-+        {
-+            my $child_type = $targetObj->getBusType($child);
-+            if ($child_type eq "ABUS" || $child_type eq "XBUS")
-+            {
-+                if ($targetObj->getMasterProc() ne $target)
-+                {
-+                    if (!$targetObj->isBadAttribute($child, "PEER_TARGET"))
-+                    {
-+                        $found_abus = 1;
-+                    }
-+                    else
-+                    {
-+                        $abus_error = sprintf(
-+"proc not connected to proc via Abus or Xbus (Target=%s)",$child);
-+                    }
-+                }
-+            }
-+        }
-+        if ($found_abus)
-+        {
-+            $abus_error = "";
-+        }
-+        else
-+        {
-+            push(@errors, $abus_error);
-+        }
-+    }
-+    if ($errors[0])
-+    {
-+        foreach my $err (@errors)
-+        {
-+            print "ERROR: $err\n";
-+        }
-+        $targetObj->myExit(3);
-+    }
-+}
-+
-+sub printUsage
-+{
-+    print "
-+processMrwl.pl -x [XML filename] [OPTIONS]
-+Options:
-+        -f = force output file creation even when errors
-+        -d = debug mode
-+        -s [SDR XML file] = import SDRs
-+        -r = create report and save to [system_name].rpt
-+        -v = version
-+";
-+    exit(1);
-+}
+                "PHYS_PATH");
+ 
+ 
 -- 
 1.8.2.2
 
