op-build update 11-21-2019

Changes Included for package hostboot, branch master-p10:
1ef4c00 - Roland Veloz - 2019-11-21 - P10 MRW parsing MEM Targets:  script updates: processMrw & Targets.pm
b5edc2c - Roland Veloz - 2019-11-21 - P10 MRW parsing PROC Targets: script updates: processMrw & Targets.pm
f31da9d - Olsen - 2019-11-21 - Minor updates to customize codes

Signed-off-by: hostboot <hostboot@us.ibm.com>
diff --git a/openpower/package/hostboot-p10/0001-mrw-parser-initial-fixes.patch b/openpower/package/hostboot-p10/0001-mrw-parser-initial-fixes.patch
deleted file mode 100644
index e014d7d..0000000
--- a/openpower/package/hostboot-p10/0001-mrw-parser-initial-fixes.patch
+++ /dev/null
@@ -1,2216 +0,0 @@
-From c69095d5359b800068c258819014f0bb684046f6 Mon Sep 17 00:00:00 2001
-From: Roland Veloz <rveloz@us.ibm.com>
-Date: Fri, 6 Sep 2019 13:52:32 -0500
-Subject: [PATCH] P10 MRW parsing: Changes to the parser scripts
-
-This commit deals with refactoring and modularizing the processMrw.pl
-and Targets.pm scripts.  This commit is not about the artifact that
-gets produced by these files but the act of parsing an MRW file.
-
-Change-Id: I359afeebd9aa00ec6db2857a03ba0d9684c0858e
-RTC: 215164
----
- src/usr/targeting/common/Targets.pm    |  637 +++++++++++------
- src/usr/targeting/common/processMrw.pl | 1183 +++++++++++++++++++++-----------
- 2 files changed, 1218 insertions(+), 602 deletions(-)
-
-diff --git a/src/usr/targeting/common/Targets.pm b/src/usr/targeting/common/Targets.pm
-index dfd65d6..fb0bcbb 100644
---- a/src/usr/targeting/common/Targets.pm
-+++ b/src/usr/targeting/common/Targets.pm
-@@ -91,10 +91,29 @@ my %maxInstance = (
-     "SMPGROUP"      => 8,
-     "OMIC"          => 6,
- );
-+
-+#--------------------------------------------------
-+# @brief The constructor for the object Target
-+#--------------------------------------------------
- sub new
- {
-     my $class = shift;
-     my $self  = {
-+        # The following data are associated with the
-+        # user command line options
-+        build           => "hb",  # default to HB
-+        force           => 0,
-+        serverwiz_file  => "",    # input xml file
-+        serverwiz_dir   => "",    # directory of input xml file
-+        debug           => 0,
-+        system_config   => "",
-+        output_file     => "",
-+        version         => 0,
-+        report          => 0,
-+        run_self_test   => 0,     # run internal test
-+
-+        # The following data are associated with the
-+        # xml itself
-         xml          => undef,
-         data         => undef,
-         targeting    => undef,
-@@ -103,13 +122,11 @@ sub new
-         UNIT_COUNTS  => undef,
-         huid_idx     => undef,
-         mru_idx      => undef,
--        force        => 0,
--        debug        => 0,
--        version      => "",
-         xml_version  => 0,
-         errorsExist  => 0,
-         NUM_PROCS    => 0,
-         TOP_LEVEL    => "",
-+        TOP_LEVEL_HANDLE    => undef,
-         TOPOLOGY     => undef,
-         report_log   => "",
-         vpd_num      => 0,
-@@ -388,6 +405,162 @@ sub storeGroups
-     }
- }
- 
-+#--------------------------------------------------
-+# @brief Initialize a handle to the target instance.
-+#
-+# @details This method locates where the target instance
-+#          resides and caches it for fast retrieval.
-+#
-+# @post A handle to the target instance is cached or exit
-+#       stating that the target instance cannot be found.
-+#
-+# @param [in] $self - The global target object.
-+#--------------------------------------------------
-+sub initializeTargetInstanceHandle
-+{
-+    my $self = shift;
-+
-+    if ( (!defined $self->{TARGET_INST_HANDLE}) ||
-+         ($self->{TARGET_INST_HANDLE} eq "") )
-+    {
-+        # Find the location of where target instances reside
-+        my $targetInstances = $self->{xml}->{'targetInstance'};
-+        if (!defined $targetInstances)
-+        {
-+            # Check one more level for the target instances
-+            $targetInstances = $self->{xml}->{'targetInstances'}
-+                                           ->{'targetInstance'};
-+        }
-+
-+        # If can't find the target instances, then state so and exit
-+        if (!defined $targetInstances)
-+        {
-+            die "No target instances defined\n";
-+        }
-+
-+        $self->setTargetInstanceHandle($targetInstances);
-+    } # end if ( (!defined $self->{TARGET_INST_HANDLE}) ||  ...
-+}
-+
-+#--------------------------------------------------
-+# @brief Return a handle to the target instances.
-+#
-+# @details This method will initialize the target instances
-+#          if has not been already initialized.
-+#
-+# @param [in] $self - The global target object.
-+#
-+# @return - A handle to the target instance.
-+#--------------------------------------------------
-+sub getTargetInstanceHandle
-+{
-+    my $self = shift;
-+
-+    # If handle to target instances is not already cached, then initialize it
-+    if ( (!defined $self->{TARGET_INST_HANDLE}) ||
-+         ($self->{TARGET_INST_HANDLE} eq "") )
-+    {
-+        $self->initializeTargetInstanceHandle();
-+    }
-+
-+    return ($self->{TARGET_INST_HANDLE});
-+}
-+
-+#--------------------------------------------------
-+# @brief Set the target instance handle to the given target handle
-+#
-+# @param [in] $self - The global target object.
-+# @param [in] $targetHndl - The value the target instance handle is set to.
-+#--------------------------------------------------
-+sub setTargetInstanceHandle
-+{
-+    my $self = shift;
-+    my $targetHndl = shift;
-+
-+    # Dynamically create and cache a handle to the target instance
-+    $self->{TARGET_INST_HANDLE} = $targetHndl;
-+}
-+
-+#--------------------------------------------------
-+# @brief Initialize the top level target.
-+#
-+# @details This method locate the top level target
-+#          and cache it for fast retrieval.
-+#
-+# @post The top level target is cached or exit stating that
-+#       top level target not found.
-+#
-+# @param [in] $self - The global target object.
-+#--------------------------------------------------
-+sub initalizeTopLevel
-+{
-+    my $self = shift;
-+
-+    # If the top level target instance has not been found and set,
-+    # then find that target and set top level to it
-+    if ((!defined $self->{TOP_LEVEL}) || ($self->{TOP_LEVEL} eq ""))
-+    {
-+        # Get a handle to the target instances
-+        my $targetInstancesHandle = $self->getTargetInstanceHandle();
-+
-+        # Find the system target which is the top level target
-+        foreach my $target (keys(%{$targetInstancesHandle}))
-+        {
-+            # If target is of type 'SYS' then we found the top level target
-+            if ($targetInstancesHandle->{$target}->{attribute}
-+                                      ->{TYPE}->{default} eq "SYS")
-+            {
-+                # Set the top level target and search no more
-+                $self->setTopLevel($target);
-+                # YOU SHALL NOT PASS!!!
-+                last;
-+            }
-+        }
-+
-+        # If unable to find top level target, then state so and exit
-+        if ((!defined $self->{TOP_LEVEL}) || ($self->{TOP_LEVEL} eq ""))
-+        {
-+            die "Unable to find system top level target\n";
-+        }
-+    } # end if ((!defined $self->{TOP_LEVEL}) || ($self->{TOP_LEVEL} eq ""))
-+}
-+
-+#--------------------------------------------------
-+# @brief Return the top level target.
-+#
-+# @details This method will initialize the top level
-+#          target if has not been already initialized.
-+#
-+# @param [in] $self - The global target object.
-+#
-+# @return - The top level target.
-+#--------------------------------------------------
-+sub getTopLevel
-+{
-+    my $self = shift;
-+
-+    # If the top level target is not already cached, then initialize it
-+    if ((!defined $self->{TOP_LEVEL}) || ($self->{TOP_LEVEL} eq ""))
-+    {
-+        $self->initalizeTopLevel();
-+    }
-+    return ($self->{TOP_LEVEL});
-+}
-+
-+#--------------------------------------------------
-+# @brief Set the top level target to the given target.
-+#
-+# @param [in] $self - The global target object.
-+# @param [in] $target - The value the top level target is set to.
-+#--------------------------------------------------
-+sub setTopLevel
-+{
-+    my $self = shift;
-+    my $target = shift;
-+
-+    $self->{TOP_LEVEL} = $target;
-+}
-+
- ####################################################
- ## build target hierarchy recursively
- ##
-@@ -422,34 +595,23 @@ sub buildHierarchy
-     my $self   = shift;
-     my $target = shift;
- 
--    my $instance_path = $self->{data}->{INSTANCE_PATH};
--    if (!defined $instance_path)
--    {
--        $instance_path = "";
--    }
--    my $baseptr = $self->{xml}->{'targetInstance'};
--    if ($self->{xml_version} == 1)
--    {
--        $baseptr = $self->{xml}->{'targetInstances'}->{'targetInstance'};
--    }
-+    # Get a handle to the target instances
-+    my $targetInstanceRef = $self->getTargetInstanceHandle();
-+
-+    # If caller did not provide a target, then use the top level target
-     if ($target eq "")
-     {
--        ## find system target
--        foreach my $t (keys(%{$baseptr}))
--        {
--            if ($baseptr->{$t}->{attribute}->{TYPE}->{default} eq "SYS")
--            {
--                $self->{TOP_LEVEL} = $t;
--                $target = $t;
--            }
--        }
-+        $target = $self->getTopLevel();
-     }
--    if ($target eq "")
-+
-+    my $instance_path = $self->{data}->{INSTANCE_PATH};
-+    if (!defined $instance_path)
-     {
--        die "Unable to find system top level target\n";
-+        $instance_path = "";
-     }
-+
-     my $old_path        = $instance_path;
--    my $target_xml      = $baseptr->{$target};
-+    my $target_xml      = $targetInstanceRef->{$target};
-     my $affinity_target = $target;
-     my $key             = $instance_path . "/" . $target;
- 
-@@ -466,7 +628,6 @@ 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};
-@@ -2448,192 +2609,6 @@ sub findDestConnections
- 
- }
- 
--sub setEepromAttributesForAxone
--{
--    my $self      = shift;
--    my $targetObj = shift;
--    # Expects ocmb target
--    my $target    = shift;
--
--    my %connections;
--    my $num=0;
--
--    my $eeprom_name = "EEPROM_VPD_PRIMARY_INFO";
--    my $fapi_name = "FAPI_I2C_CONTROL_INFO";
--    # SPD contains data for EEPROM_VPD_PRIMARY_INFO and FAPI_I2C_CONTROL_INFO
--    # SPD is the child of ocmb's parent, so get ocmb's parent
--    # then look for the SPD child
--    # With the resulting info, we populate pmic0, pmic1, ocmb, and dimm
--    my $target_parent = $self->getTargetParent($target);
--
--    # Need to store pmic targets because they get parsed before we
--    # do calculations for engine, port, and muxBusSelector
--    # pmics need these values, so we store them until we need them later
--    my $address = 0;
--    my @pmic_array;
--    foreach my $child (@{ $self->getTargetChildren($target_parent) })
--    {
--        my $type = $self->getTargetType($child);
--        if ($type eq "chip-spd-device")
--        {
--            my $offset = $self->getAttribute($child, "BYTE_ADDRESS_OFFSET");
--            my $memory_size = $self->getAttribute($child, "MEMORY_SIZE_IN_KB");
--            my $cycle_time = $self->getAttribute($child, "WRITE_CYCLE_TIME");
--            my $page_size = $self->getAttribute($child, "WRITE_PAGE_SIZE");
--
--            # Populate EEPROM for ocmb
--            $targetObj->setAttributeField($target, $eeprom_name, "byteAddrOffset",
--                $offset);
--            $targetObj->setAttributeField($target, $eeprom_name, "maxMemorySizeKB",
--                $memory_size);
--            $targetObj->setAttributeField($target, $eeprom_name, "writeCycleTime",
--                $cycle_time);
--            $targetObj->setAttributeField($target, $eeprom_name, "writePageSize",
--                $page_size);
--
--            # Populate EEPROM for dimm
--            $targetObj->setAttributeField($target_parent, $eeprom_name, "byteAddrOffset",
--                $offset);
--            $targetObj->setAttributeField($target_parent, $eeprom_name, "maxMemorySizeKB",
--                $memory_size);
--            $targetObj->setAttributeField($target_parent, $eeprom_name, "writeCycleTime",
--                $cycle_time);
--            $targetObj->setAttributeField($target_parent, $eeprom_name, "writePageSize",
--                $page_size);
--
--            # spd only child is i2c-slave, which contains devAddr info
--            foreach my $i2c_slave (@{ $self->getTargetChildren($child) })
--            {
--                $address = $self->getAttribute($i2c_slave, "I2C_ADDRESS");
--                # Populate EEPROM for dimm
--                $targetObj->setAttributeField($target_parent, $eeprom_name, "devAddr",
--                    $address);
--
--                # Populate EEPROM for ocmb
--                $targetObj->setAttributeField($target, $eeprom_name, "devAddr",
--                    $address);
--            }
--        }
--        elsif ($type eq "chip-vreg-generic")
--        {
--            push(@pmic_array, $child);
--            foreach my $i2c_slave (@{ $self->getTargetChildren($child) })
--            {
--                $type = $self->getTargetType($i2c_slave);
--                # pmic has child i2c_slave which contains the device address
--                if ($type eq "unit-i2c-slave")
--                {
--                    $address = $self->getAttribute($i2c_slave, "I2C_ADDRESS");
--
--                    # Populate FAPI for pmic
--                    $targetObj->setAttributeField($child, $fapi_name, "devAddr",
--                        $address);
--                    last;
--                }
--            }
--        }
--        elsif ($type eq "chip-ocmb")
--        {
--            foreach my $i2c_slave (@{ $self->getTargetChildren($child) })
--            {
--                # ocmb has multiple i2c-slaves, so we query with instance_name
--                my $instance_name = $self->getInstanceName($i2c_slave);
--                if ($instance_name eq "i2c-ocmb")
--                {
--                    $address = $self->getAttribute($i2c_slave, "I2C_ADDRESS");
--
--                    # Populate FAPI for ocmb
--                    $targetObj->setAttributeField($target, $fapi_name, "devAddr",
--                        $address);
--                    last;
--                }
--            }
--        }
--    }
--
--    # Get data from i2c-master-omi, which connects to the i2c_mux PCA9847
--    my $conn = $self->findConnectionsByDirection($target, "I2C", "", 1);
--    if ($conn ne "")
--    {
--        # There exists multiple i2c bus connections with chip-ocmb
--        # They are all the same connections so we just take the first one
--        # The mux channel has the i2cMuxBusSelector
--        my $conn_source = @{$conn->{CONN}}[0]->{SOURCE};
--        my $mux = $self->getAttribute($conn_source, "MUX_CHANNEL");
--
--        # Parent PCA9848 determines the mux path
--        my $parent = $self->getTargetParent($conn_source);
--        my $parent_pos = $self->getAttribute($parent, "POSITION");
--        my $i2c_mux_path = "physical:sys-0/node-0/i2c_mux-$parent_pos";
--
--        # pmics and ocmb all grab FRU_ID from parent dimm
--        my $fru = $self->getAttribute($target_parent, "FRU_ID");
--
--        my $master_i2c = $self->findConnectionsByDirection($self->getTargetParent($conn_source), "I2C", "", 1);
--        if ($master_i2c ne "")
--        {
--            # There exists multiple i2c bus connections with the PCA9847 i2c_mux
--            # They are all the same connections so we just take the first one
--            $master_i2c = @{$master_i2c->{CONN}}[0];
--            # i2c-master-omi source which has data we need
--            my $source = $master_i2c->{SOURCE};
--            my $dest = $master_i2c->{DEST};
--            my $engine = $self->getAttribute($source, "I2C_ENGINE");
--            my $port = $self->getAttribute($source, "I2C_PORT");
--
--            # Populate FAPI for ocmb
--            $self->setAttributeField($target, $fapi_name, "engine",
--                $engine);
--            $self->setAttributeField($target, $fapi_name, "port",
--                $port);
--            $self->setAttributeField($target, $fapi_name, "i2cMuxBusSelector",
--                $mux);
--            $self->setAttributeField($target, $fapi_name, "i2cMuxPath",
--                $i2c_mux_path);
--            $self->setAttribute($target, "FRU_ID",
--                $fru);
--
--            # Populate EEPROM for ocmb
--            $self->setAttributeField($target, $eeprom_name, "i2cMuxPath",
--                $i2c_mux_path);
--            $self->setAttributeField($target, $eeprom_name, "engine",
--                $engine);
--            $self->setAttributeField($target, $eeprom_name, "port",
--                $port);
--            $self->setAttributeField($target, $eeprom_name, "i2cMuxBusSelector",
--                $mux);
--
--
--            # Populate FAPI for pmics
--            foreach my $pmic (@pmic_array)
--            {
--                $self->setAttributeField($pmic, $fapi_name, "engine",
--                    $engine);
--                $self->setAttributeField($pmic, $fapi_name, "port",
--                    $port);
--                $self->setAttributeField($pmic, $fapi_name, "i2cMuxBusSelector",
--                    $mux);
--                $self->setAttributeField($pmic, $fapi_name, "i2cMuxPath",
--                    $i2c_mux_path);
--                $self->setAttribute($pmic, "FRU_ID",
--                    $fru);
--            }
--
--            # Populate EEPROM for dimm
--            $self->setAttributeField($target_parent, $eeprom_name, "engine",
--                $engine);
--            $self->setAttributeField($target_parent, $eeprom_name, "port",
--                $port);
--            $self->setAttributeField($target_parent, $eeprom_name, "i2cMuxBusSelector",
--                $mux);
--            $self->setAttributeField($target_parent, $eeprom_name, "i2cMuxPath",
--                $i2c_mux_path);
--            $self->setAttribute($target_parent, "FRU_ID",
--                $fru);
--        }
--    }
--}
--
- # Find connections from/to $target (and it's children)
- # $to_this_target indicates the direction to find.
- sub findConnectionsByDirection
-@@ -2792,6 +2767,41 @@ sub getTargetType
-     return $target_ptr->{TARGET}->{type};
- }
- 
-+
-+#--------------------------------------------------
-+# @brief Checks the given target for given attribute
-+#
-+# @details Will check the target for the given attribute.
-+#          If attribute does not exist for target then
-+#          return 0 (false), else if attribute does exist
-+#          for target then return 1 (true).  This methods
-+#          does not check the validity of the attribute
-+#          or it's value.
-+#
-+# @param [in] $self - The global target object.
-+# @param [in] $target - target to locate attribute on
-+# @param [in] $attribut - attribute to locate
-+#
-+# @return true if attribute found, else false
-+#--------------------------------------------------
-+sub doesAttributeExistForTarget
-+{
-+    my $self       = shift;
-+    my $target     = shift;
-+    my $attribute  = shift;
-+
-+    my $target_ptr = $self->getTarget($target);
-+
-+    # If can't locate attribute for target then return back 0 (false)
-+    if (!defined($target_ptr->{ATTRIBUTES}->{$attribute}))
-+    {
-+        return 0;
-+    }
-+
-+    # Attribute for target was found, return back 1 (true)
-+    return 1;
-+}
-+
- ## checks if attribute is value
- ## must be defined and have a non-empty value
- sub isBadAttribute
-@@ -2818,6 +2828,7 @@ sub isBadAttribute
-     {
-         return 1;
-     }
-+
-     return 0;
- }
- 
-@@ -2864,6 +2875,7 @@ sub getAttribute
-     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",
-@@ -3296,6 +3308,207 @@ sub writeReportFile
-     close R;
- }
- 
-+#--------------------------------------------------
-+# @brief Populates the EEPROM attributes for DDIMS
-+#
-+# @param [in] $self - The global target object.
-+# @param [in] $target - An OCMB target
-+#--------------------------------------------------
-+sub setEepromAttributesForDDIMs
-+{
-+    my $self      = shift;
-+    my $target    = shift;  # Expects ocmb target
-+
-+    my %connections;
-+    my $num=0;
-+
-+    my $eeprom_name = "EEPROM_VPD_PRIMARY_INFO";
-+    my $fapi_name = "FAPI_I2C_CONTROL_INFO";
-+    # SPD contains data for EEPROM_VPD_PRIMARY_INFO and FAPI_I2C_CONTROL_INFO
-+    # SPD is the child of ocmb's parent, so get ocmb's parent
-+    # then look for the SPD child
-+    # With the resulting info, we populate pmic0, pmic1, ocmb, and dimm
-+    my $target_parent = $self->getTargetParent($target);
-+
-+    # Need to store pmic targets because they get parsed before we
-+    # do calculations for engine, port, etc
-+    # pmics need these values, so we store them until we need them later
-+    my $address = 0;
-+    my @pmic_array;
-+    foreach my $child (@{ $self->getTargetChildren($target_parent) })
-+    {
-+        my $type = $self->getTargetType($child);
-+        if ($type eq "chip-spd-device")
-+        {
-+            my $offset = $self->getAttribute($child, "BYTE_ADDRESS_OFFSET");
-+            my $memory_size = $self->getAttribute($child, "MEMORY_SIZE_IN_KB");
-+            my $cycle_time = $self->getAttribute($child, "WRITE_CYCLE_TIME");
-+            my $page_size = $self->getAttribute($child, "WRITE_PAGE_SIZE");
-+
-+            # Populate EEPROM for ocmb
-+            $self->setAttributeField($target, $eeprom_name, "byteAddrOffset",
-+                $offset);
-+            $self->setAttributeField($target, $eeprom_name, "maxMemorySizeKB",
-+                $memory_size);
-+            $self->setAttributeField($target, $eeprom_name, "writeCycleTime",
-+                $cycle_time);
-+            $self->setAttributeField($target, $eeprom_name, "writePageSize",
-+                $page_size);
-+
-+            # Populate EEPROM for dimm
-+            $self->setAttributeField($target_parent, $eeprom_name, "byteAddrOffset",
-+                $offset);
-+            $self->setAttributeField($target_parent, $eeprom_name, "maxMemorySizeKB",
-+                $memory_size);
-+            $self->setAttributeField($target_parent, $eeprom_name, "writeCycleTime",
-+                $cycle_time);
-+            $self->setAttributeField($target_parent, $eeprom_name, "writePageSize",
-+                $page_size);
-+
-+            # spd only child is i2c-slave, which contains devAddr info
-+            foreach my $i2c_slave (@{ $self->getTargetChildren($child) })
-+            {
-+                $address = $self->getAttribute($i2c_slave, "I2C_ADDRESS");
-+                # Populate EEPROM for dimm
-+                $self->setAttributeField($target_parent, $eeprom_name, "devAddr",
-+                    $address);
-+
-+                # Populate EEPROM for ocmb
-+                $self->setAttributeField($target, $eeprom_name, "devAddr",
-+                    $address);
-+            }
-+        } # end if ($type eq "chip-spd-device") ...
-+        elsif ($type eq "chip-vreg-generic")
-+        {
-+            push(@pmic_array, $child);
-+            foreach my $i2c_slave (@{ $self->getTargetChildren($child) })
-+            {
-+                $type = $self->getTargetType($i2c_slave);
-+                # pmic has child i2c_slave which contains the device address
-+                if ($type eq "unit-i2c-slave")
-+                {
-+                    $address = $self->getAttribute($i2c_slave, "I2C_ADDRESS");
-+
-+                    # Populate FAPI for pmic
-+                    $self->setAttributeField($child, $fapi_name, "devAddr",
-+                        $address);
-+                    last;
-+                }
-+            }
-+        } # end elsif ($type eq "chip-vreg-generic")
-+        elsif ($type eq "chip-ocmb")
-+        {
-+            foreach my $i2c_slave (@{ $self->getTargetChildren($child) })
-+            {
-+                # ocmb has multiple i2c-slaves, so we query with instance_name
-+                my $instance_name = $self->getInstanceName($i2c_slave);
-+                if ($instance_name eq "i2c-ocmb")
-+                {
-+                    $address = $self->getAttribute($i2c_slave, "I2C_ADDRESS");
-+
-+                    # Populate FAPI for ocmb
-+                    $self->setAttributeField($target, $fapi_name, "devAddr",
-+                        $address);
-+                    last;
-+                }
-+            }
-+        } # end elsif ($type eq "chip-ocmb")
-+    } # end foreach my $child ...
-+
-+        # Get data from i2c-master-omi, which connects to the i2c_mux PCA9847
-+    my $conn = $self->findConnectionsByDirection($target, "I2C", "", 1);
-+    if ($conn ne "")
-+    {
-+        # There exists multiple i2c bus connections with chip-ocmb
-+        # They are all the same connections so we just take the first one
-+        # The mux channel has the i2cMuxBusSelector
-+        my $conn_source = @{$conn->{CONN}}[0]->{SOURCE};
-+# TODO FIX ROLAND
-+# Will fix later in the process
-+# ROLAND causing errors:
-+# ERROR: getAttribute(/sys-0/node-0/nisqually-0/proc_socket-0/godel-0/power10-0/i2c-master-op3b,MUX_CHANNEL) | Attribute not defined
-+# I only found MUX_CHANNEL on attributes /sys-0/node-0/nisqually-0/PCA9849-[0-7]/PCA9849.i2cm-[0..3]
-+#
-+#        my $mux = $self->getAttribute($conn_source, "MUX_CHANNEL");
-+        my $mux = 0;
-+
-+        # Parent PCA9848 determines the mux path
-+        my $parent = $self->getTargetParent($conn_source);
-+        my $parent_pos = $self->getAttribute($parent, "POSITION");
-+        my $i2c_mux_path = "physical:sys-0/node-0/i2c_mux-$parent_pos";
-+
-+        # pmics and ocmb all grab FRU_ID from parent dimm
-+        my $fru = $self->getAttribute($target_parent, "FRU_ID");
-+
-+        my $master_i2c = $self->findConnectionsByDirection($self->getTargetParent($conn_source), "I2C", "", 1);
-+        if ($master_i2c ne "")
-+        {
-+            # There exists multiple i2c bus connections with the PCA9847 i2c_mux
-+            # They are all the same connections so we just take the first one
-+            $master_i2c = @{$master_i2c->{CONN}}[0];
-+            # i2c-master-omi source which has data we need
-+            my $source = $master_i2c->{SOURCE};
-+            my $dest = $master_i2c->{DEST};
-+            my $engine = $self->getAttribute($source, "I2C_ENGINE");
-+            my $port = $self->getAttribute($source, "I2C_PORT");
-+
-+            # Populate FAPI for ocmb
-+            $self->setAttributeField($target, $fapi_name, "engine",
-+                $engine);
-+            $self->setAttributeField($target, $fapi_name, "port",
-+                $port);
-+            $self->setAttributeField($target, $fapi_name, "i2cMuxBusSelector",
-+                $mux);
-+            $self->setAttributeField($target, $fapi_name, "i2cMuxPath",
-+                $i2c_mux_path);
-+            $self->setAttribute($target, "FRU_ID",
-+                $fru);
-+
-+            # Populate EEPROM for ocmb
-+            $self->setAttributeField($target, $eeprom_name, "i2cMuxPath",
-+                $i2c_mux_path);
-+            $self->setAttributeField($target, $eeprom_name, "engine",
-+                $engine);
-+            $self->setAttributeField($target, $eeprom_name, "port",
-+                $port);
-+            $self->setAttributeField($target, $eeprom_name, "i2cMuxBusSelector",
-+                $mux);
-+
-+            # Populate FAPI for pmics
-+            foreach my $pmic (@pmic_array)
-+            {
-+                $self->setAttributeField($pmic, $fapi_name, "engine",
-+                    $engine);
-+                $self->setAttributeField($pmic, $fapi_name, "port",
-+                    $port);
-+                $self->setAttributeField($pmic, $fapi_name, "i2cMuxBusSelector",
-+                    $mux);
-+                $self->setAttributeField($pmic, $fapi_name, "i2cMuxPath",
-+                    $i2c_mux_path);
-+                $self->setAttribute($pmic, "FRU_ID",
-+                    $fru);
-+            }
-+
-+            # Populate EEPROM for dimm
-+            $self->setAttributeField($target_parent, $eeprom_name, "engine",
-+                $engine);
-+            $self->setAttributeField($target_parent, $eeprom_name, "port",
-+                $port);
-+            $self->setAttributeField($target_parent, $eeprom_name, "i2cMuxBusSelector",
-+                $mux);
-+            $self->setAttributeField($target_parent, $eeprom_name, "i2cMuxPath",
-+                $i2c_mux_path);
-+            $self->setAttribute($target_parent, "FRU_ID",
-+                $fru);
-+        } # end if ($master_i2c  ne "")
-+    } # end if ($conn ne "")
-+}
-+
-+#--------------------------------------------------
-+# @brief The end of the executable elements of this PERL module
-+#
-+# @details Don't forget to return the true value from this file
-+#--------------------------------------------------
- 1;
- 
- =head1 NAME
-diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
-index 7a63791..cd84b14 100755
---- a/src/usr/targeting/common/processMrw.pl
-+++ b/src/usr/targeting/common/processMrw.pl
-@@ -24,6 +24,9 @@
- #
- # IBM_PROLOG_END_TAG
- 
-+###############################################################################
-+# Include these libraries
-+###############################################################################
- use strict;
- use XML::Simple;
- use Data::Dumper;
-@@ -32,112 +35,168 @@ use Math::BigInt;
- use Getopt::Long;
- use File::Basename;
- 
--use constant HZ_PER_KHZ=>1000;
--use constant MAX_MCS_PER_PROC => 4; # 4 MCS per Nimbus
- 
-+###############################################################################
-+# Define some global constants
-+###############################################################################
- my $VERSION = "1.0.0";
-+my $targetObj = Targets->new;
- 
--my $force           = 0;
--my $serverwiz_file  = "";
--my $version         = 0;
--my $debug           = 0;
--my $report          = 0;
--my $sdr_file        = "";
--my $build           = "hb";
--my $system_config   = "";
--my $output_filename = "";
--
--# Map the OMI instance to its corresponding OMIC parent
--my %omi_map         = (4  => "omic-0",
--                       5  => "omic-0",
--                       6  => "omic-0",
--                       7  => "omic-1",
--                       2  => "omic-1",
--                       3  => "omic-1",
--                       0  => "omic-2",
--                       1  => "omic-2",
--                       12 => "omic-0",
--                       13 => "omic-0",
--                       14 => "omic-0",
--                       15 => "omic-1",
--                       10 => "omic-1",
--                       11 => "omic-1",
--                       8  => "omic-2",
--                       9  => "omic-2");
-+# Define a true an false keyword
-+use constant { true => 1, false => 0 };
-+
-+use constant HZ_PER_KHZ=>1000;
-+use constant MAX_MCS_PER_PROC => 4; # 4 MCS per Nimbus
- 
- # TODO RTC:170860 - Remove this after dimm connector defines VDDR_ID
--my $num_voltage_rails_per_proc = 1;
--
--GetOptions(
--    "build=s" => \$build,
--    "f"   => \$force,             # numeric
--    "x=s" => \$serverwiz_file,    # string
--    "d"   => \$debug,
--    "c=s" => \$system_config,      #string
--    "o=s" => \$output_filename,   #string
--    "v"   => \$version,
--    "r"   => \$report,
--  )                               # flag
--  or printUsage();
--
--if ($version == 1)
--{
--    die "\nprocessMrw.pl\tversion $VERSION\n";
--}
-+my $NUM_VOLTAGE_RAILS_PER_PROC = 1;
- 
--if ($serverwiz_file eq "")
--{
--    printUsage();
--}
-+## Used to setup GPU sensors on processors
-+# key: OBUS slot target,
-+# value: (GPU#, Function, Temp, MemTemp IPMI name/ids,
-+my %GPU_SENSORS;
- 
--$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
-+# key: OBUS slot string
-+# value: processor target string
-+my %SLOT_TO_PROC;
- 
--my $targetObj = Targets->new;
--if ($force == 1)
-+our %hwsvmrw_plugins;
-+
-+###############################################################################
-+# The starting point for this script
-+###############################################################################
-+main($targetObj);
-+
-+sub main
- {
--    $targetObj->{force} = 1;
-+    my $targetObj = shift;
-+
-+    # Extract the caller's options off the command and validate.
-+    # Will exit if options are not valid.
-+    getAndValidateCallerInputOptions();
-+
-+
-+    # Run tests if asked to do so
-+    if ($targetObj->{run_self_test} == 1)
-+    {
-+        runTests($targetObj);
-+        return 0;
-+    }
-+
-+    # Load the XML and process the file, extracting targets and associating
-+    # attributes, with their data, to the targets
-+    loadXmlFile();
-+
-+    if ($targetObj->{build} eq "fsp")
-+    {
-+        doFspBuild();
-+    }
-+
-+    # Process the targets - set some needed attribute values
-+    processTargets();
-+
-+    # Check for errors in the targets
-+    errorCheckTheTargets($targetObj);
-+
-+    # Write the results of processing the targets to an XML file
-+    writeResultsToXml($targetObj);
- }
--if ($debug == 1)
-+
-+###############################################################################
-+# Supporting subroutines
-+###############################################################################
-+#--------------------------------------------------
-+# @brief Extract caller's command line options
-+#
-+# @details Extract caller's command line options and
-+#          validate them.  If valid then store in the
-+#          global Target object for easy retrieval.
-+#          If options are not valid, then print
-+#          usage statement and exit script.
-+#--------------------------------------------------
-+sub getAndValidateCallerInputOptions
- {
--    $targetObj->{debug} = 1;
--}
-+    # Local variables, and their defaults, to cache the command line options to
-+    my $build           = "hb";
-+    my $force           = 0;
-+    my $serverwiz_file  = "";
-+    my $debug           = 0;
-+    my $system_config   = "";
-+    my $output_file     = "";
-+    my $version         = 0;
-+    my $report          = 0;
-+    my $run_self_test   = 0;
-+
-+    # Grab the user's command line options.  If options not recognized
-+    # print usage statement and exit script.
-+    GetOptions(
-+        "build=s" => \$build,      # string
-+        "f"   => \$force,          # numeric
-+        "x=s" => \$serverwiz_file, # string
-+        "d"   => \$debug,          # flag
-+        "c=s" => \$system_config,  # string
-+        "o=s" => \$output_file,    # string
-+        "v"   => \$version,        # flag
-+        "r"   => \$report,         # flag
-+        "t"   => \$run_self_test,  # flag
-+      )
-+      or printUsage();
-+
-+    # Display current version of file
-+    if ($version == 1)
-+    {
-+        die "\nprocessMrw.pl\tversion $VERSION\n";
-+    }
-+
-+    # If caller did not specify an input file, then print usage and die
-+    if ($serverwiz_file eq "")
-+    {
-+        printUsage();
-+    }
-+
-+    # Save the caller's input options to global storage for easy retrieval
-+    $targetObj->{build} = $build;
-+    $targetObj->{force} = $force;
-+    $targetObj->{serverwiz_file} = $serverwiz_file;
-+    $targetObj->{serverwiz_dir} = dirname($serverwiz_file);
-+    $targetObj->{debug} = $debug;
-+    $targetObj->{system_config} = $system_config;
-+    $targetObj->{output_file} = $output_file;
-+    $targetObj->setVersion($VERSION);
-+    $targetObj->{report} = $report;
-+    $targetObj->{run_self_test} = $run_self_test;
-+
-+} # end getAndValidateCallerInputOptions
-+
-+# loadXmlFile
-+sub loadXmlFile
-+{
-+    $XML::Simple::PREFERRED_PARSER = 'XML::Parser';
-+    $targetObj->loadXML($targetObj->{serverwiz_file});
- 
--$targetObj->setVersion($VERSION);
--my $xmldir = dirname($serverwiz_file);
--$targetObj->loadXML($serverwiz_file);
-+    my $str=sprintf(
-+        " %30s | %10s | %6s | %4s | %9s | %4s | %4s | %4s | %10s | %s\n",
-+        "Sensor Name","FRU Name","Ent ID","Type","Evt Type","ID","Inst","FRU",
-+        "HUID","Target");
-+
-+    $targetObj->writeReport($str);
-+    my $str=sprintf(
-+        " %30s | %10s | %6s | %4s | %9s | %4s | %4s | %4s | %10s | %s\n",
-+        "------------------------------","----------",
-+        "------","----","---------","----","----","----","----------",
-+        "----------");
-+
-+    $targetObj->writeReport($str);
-+} # end loadXmlFile
- 
--our %hwsvmrw_plugins;
- # FSP-specific functions
--if ($build eq "fsp")
-+sub doFspBuild
- {
-     eval ("use processMrw_fsp; return 1;");
-     processMrw_fsp::return_plugins();
--}
--
--my $str=sprintf(
--    " %30s | %10s | %6s | %4s | %9s | %4s | %4s | %4s | %10s | %s\n",
--    "Sensor Name","FRU Name","Ent ID","Type","Evt Type","ID","Inst","FRU",
--    "HUID","Target");
-+} # end doFspBuild
- 
--$targetObj->writeReport($str);
--my $str=sprintf(
--    " %30s | %10s | %6s | %4s | %9s | %4s | %4s | %4s | %10s | %s\n",
--    "------------------------------","----------",
--    "------","----","---------","----","----","----","----------",
--    "----------");
--
--$targetObj->writeReport($str);
--
--########################
--## Used to setup GPU sensors on processors
--my %G_gpu_sensors;
--# key: obusslot target,
--# value: (GPU#, Function, Temp, MemTemp IPMI name/ids,
- 
--my %G_slot_to_proc;
--# key: obusslot string
--# value: processor target string
--#########################
- 
- # convert a number string into a bit-position number
- # example:  "0x02" -->  0b0100 = 4
-@@ -151,7 +210,7 @@ sub numToBitPositionNum
-     return $newNum;
- }
- 
--# Used to populate G_gpu_sensors hash of array references
-+# Used to populate GPU_SENSORS hash of array references
- #
- # Each array reference will be composed of 3 sensors +
- # board cfg ID which together makes up a GPU.
-@@ -167,7 +226,7 @@ sub addSensorToGpuSensors
-     my $GPU_SENSORS_TEMP_OFFSET = 2;
-     my $GPU_SENSORS_MEM_TEMP_OFFSET = 4;
- 
--    my $rSensorArray = $G_gpu_sensors{$obusslot_str};
-+    my $rSensorArray = $GPU_SENSORS{$obusslot_str};
-     unless ($rSensorArray) {
-         $rSensorArray = [ "0xFFFF","0xFF","0xFFFF","0xFF",
-                           "0xFFFF","0xFF","0x00" ];
-@@ -192,11 +251,11 @@ sub addSensorToGpuSensors
-         $rSensorArray->[$GPU_SENSORS_TEMP_OFFSET+1] = $sensorID;
-     }
- 
--    $G_gpu_sensors{$obusslot_str} = $rSensorArray;
-+    $GPU_SENSORS{$obusslot_str} = $rSensorArray;
- }
- 
- 
--# Populates the G_slot_to_proc hash and updates the cfgID in G_gpu_sensors
-+# Populates the SLOT_TO_PROC hash and updates the cfgID in GPU_SENSORS
- # This is how we map the obusslot to the GPU sensors
- sub addObusCfgToGpuSensors
- {
-@@ -205,14 +264,14 @@ sub addObusCfgToGpuSensors
- 
-     my $foundSlot = 0;
- 
--    $G_slot_to_proc{$obusslot_str} = $proc_target;
-+    $SLOT_TO_PROC{$obusslot_str} = $proc_target;
- 
--    foreach my $obusslot (keys %G_gpu_sensors)
-+    foreach my $obusslot (keys %GPU_SENSORS)
-     {
-         if ($obusslot =~ m/$obusslot_str/)
-         {
-             # Add in the cfg number
--            my $rSensorArray = $G_gpu_sensors{$obusslot_str};
-+            my $rSensorArray = $GPU_SENSORS{$obusslot_str};
-             $rSensorArray->[$GPU_SENSORS_OBUS_CFG_OFFSET] =
-                  sprintf("0x%02X",
-                         (oct($rSensorArray->[$GPU_SENSORS_OBUS_CFG_OFFSET]) |
-@@ -225,10 +284,10 @@ sub addObusCfgToGpuSensors
-     {
-         print STDOUT sprintf("%s:%d ", __FILE__,__LINE__);
-         print STDOUT "Found obus slot ($obusslot_str - processor $proc_target)".
--                     " not in G_gpu_sensors hash\n";
-+                     " not in GPU_SENSORS hash\n";
- 
-         my $cfg_bit_num = numToBitPositionNum($cfg);
--        $G_gpu_sensors{$obusslot_str} =
-+        $GPU_SENSORS{$obusslot_str} =
-             ["0xFFFF","0xFF","0xFFFF","0xFF","0xFFFF",
-              "0xFF", sprintf("0x02X",oct($cfg_bit_num))];
-     }
-@@ -273,17 +332,207 @@ sub isMultiTpmSystem
- }
- 
- #--------------------------------------------------
--## loop through all targets and do stuff
--my @targets = sort keys %{ $targetObj->getAllTargets() };
--my $isMultiTpmSys = isMultiTpmSystem(\@targets);
--foreach my $target (@targets)
-+# @brief Loop through all targets and set attributes as needed
-+#
-+# @param [in] $targetObj - The global target object.
-+#--------------------------------------------------
-+sub processTargets
-+{
-+    my @targets = sort keys %{ $targetObj->getAllTargets() };
-+    my $isMultiTpmSys = isMultiTpmSystem(\@targets);
-+    foreach my $target (@targets)
-+{
-+        my $type = $targetObj->getType($target);
-+        if ($type eq "SYS")
-+        {
-+            processSystem($targetObj, $target);
-+
-+            my $maxComputeNodes  = get_max_compute_nodes($targetObj , $target);
-+            $targetObj->setAttribute($target, "MAX_COMPUTE_NODES_PER_SYSTEM", $maxComputeNodes);
-+
-+            #handle enumeration changes
-+            my $enum_val = $targetObj->getAttribute($target,"PROC_FABRIC_PUMP_MODE");
-+            if ( $enum_val =~ /MODE1/i)
-+            {
-+                $targetObj->setAttribute($target,"PROC_FABRIC_PUMP_MODE","CHIP_IS_NODE");
-+            }
-+            elsif ( $enum_val =~ /MODE2/i)
-+            {
-+                $targetObj->setAttribute($target,"PROC_FABRIC_PUMP_MODE","CHIP_IS_GROUP");
-+            }
-+        }
-+        elsif ($type eq "PROC")
-+        {
-+            processProcessor($targetObj, $target);
-+            if ($targetObj->{build} eq "fsp")
-+            {
-+                do_plugin("fsp_proc", $targetObj, $target);
-+            }
-+        }
-+        elsif ($type eq "APSS")
-+        {
-+            processApss($targetObj, $target);
-+        }
-+
-+        # @TODO RTC: 189374 Remove multiple TPMs filter when all platforms' MRW
-+        # supports dynamically determining the processor driving it.
-+        elsif (($type eq "TPM") && $isMultiTpmSys)
-+        {
-+            processTpm($targetObj, $target);
-+        }
-+        elsif ($type eq "POWER_SEQUENCER")
-+        {
-+            my $target_type = $targetObj->getTargetType($target);
-+
-+            # Strip off the chip- part of the target type name
-+            $target_type =~ s/chip\-//g;
-+
-+            # Currently only UCD9090 and UCD90120A on FSP systems are supported.
-+            # All other UCD types are skipped.
-+            if (($target_type eq "UCD9090")
-+                || ($target_type eq "UCD90120A"))
-+            {
-+                processUcd($targetObj, $target);
-+            }
-+        }
-+        elsif ($type eq "OCMB_CHIP")
-+        {
-+            processOcmbChip($targetObj, $target);
-+        }
-+
-+        # Once processing of the target type is complete, remove
-+        # deprecated and un-needed attributes for this type
-+        pruneTargetAttributes($targetObj, $target, $type);
-+
-+        processIpmiSensors($targetObj,$target);
-+    }  # end foreach my $target (@targets)
-+
-+
-+    if ($targetObj->{build} eq "fsp")
-+    {
-+        processMrw_fsp::loadFSP($targetObj);
-+    }
-+} # end processTargets
-+
-+#--------------------------------------------------
-+# @brief Check the processed targets for errors
-+#
-+# @param [in] $targetObj - The global target object.
-+#--------------------------------------------------
-+sub errorCheckTheTargets
- {
--    my $type = $targetObj->getType($target);
-+    my $targetObj = shift;
-+
-+# TODO FIX ROLAND
-+# Will fix later in the process
-+# check topology
-+# ROLAND Having issues with the topology:
-+# ERROR: Fabric topology invalid.  2 targets have same FABRIC_TOPOLOGY_ID (0x0)
-+# Once resolved, add this check back in
-+# The MRW XML has 2 procs: power10-0 of type chip-processor-power10 and
-+#                          power10-1 of type chip-processor-power10 and
-+# In the loadXmlFile method, it produces 4 procs, 2 on a socket:
-+#  '/sys-0/node-0/nisqually-0/proc_socket-0/godel-0/power10-0';
-+#  '/sys-0/node-0/nisqually-0/proc_socket-1/godel-0/power10-0';
-+#  '/sys-0/node-0/nisqually-0/proc_socket-0/godel-0/power10-1';
-+#  '/sys-0/node-0/nisqually-0/proc_socket-1/godel-0/power10-1';
-+#     For both power10-0 procs it uses topologoy ID 0
-+#     For both power10-1 procs it uses topologoy ID 1
-+#       So this end up in duplicates being used
-+
-+#    foreach my $n (keys %{$targetObj->{TOPOLOGY}})
-+#    {
-+#        if ($targetObj->{TOPOLOGY}->{$n} > 1)
-+#        {
-+#            print "ERROR: Fabric topology invalid.  2 targets have same ".
-+#                  "FABRIC_TOPOLOGY_ID ($n)\n";
-+#            $targetObj->myExit(3);
-+#        }
-+#    }
-+
-+    foreach my $target (keys %{ $targetObj->getAllTargets() })
-+    {
-+    # TODO FIX ROLAND
-+    # Will fix later in the process
-+    # ROLAND Having issues with power10-0 so wrapped errorCheck with if statement:
-+    # ERROR: EEPROM_VPD_PRIMARY_INFO/devAddr attribute is invalid (Target=/sys-0/node-0/nisqually-0/proc_socket-0/godel-0/power10-0)
-+    #	I2C connection to target is not defined
-+    ## Once resolved, will remove if statement
-+        if ($target != "/sys-0/node-0/nisqually-0/proc_socket-0/godel-0/power10-0")
-+        {
-+            errorCheck($targetObj, $target);
-+        }
-+    }
-+} # end sub errorCheckTheTargets
-+
-+#--------------------------------------------------
-+# @brief Write out the results to an XML file
-+#
-+# @param [in] $targetObj - The global target object.
-+#--------------------------------------------------
-+sub writeResultsToXml
-+{
-+    my $targetObj = shift;
-+
-+    my $xml_fh;
-+    my $filename;
-+    my $config_str = $targetObj->{system_config};
-+
-+    #If user did not specify the output filename, then build one up by using
-+    #config and build parameters
-+    if ($targetObj->{output_file} eq "")
-+    {
-+        if ($config_str ne "")
-+        {
-+            $config_str = "_" . $config_str;
-+        }
-+
-+        $filename = $targetObj->{serverwiz_dir} . "/" . $targetObj->getSystemName() . $config_str . "_" . $targetObj->{build} . ".mrw.xml";
-+    }
-+    else
-+    {
-+        $filename = $targetObj->{output_file};
-+    }
-+
-+    print "Creating XML: $filename\n";
-+    open($xml_fh, ">$filename") || die "Unable to create: $filename";
-+
-+    $targetObj->printXML($xml_fh, "top", $targetObj->{build});
-+    close $xml_fh;
-+    if (!$targetObj->{errorsExist})
-+    {
-+        ## optionally print out report
-+        if ($targetObj->{report})
-+        {
-+            print "Writing report to: ".$targetObj->{report_filename}."\n";
-+            $targetObj->writeReportFile();
-+        }
-+        print "MRW created successfully!\n";
-+    }
-+} # end sub writeResultsToXml
-+
-+#--------------------------------------------------
-+# @brief Remove attributes associated with target.
-+#        Either because they have been deprecated
-+#        or simply not used/needed.
-+# @param[in] $targetObj - The global target object
-+#                         blob
-+# @param[in] $target - The target to remove attributes
-+#                      from
-+# @param[in] $type -   The type of the target
-+#
-+# TODO RTC: 178351 Remove depricated Attribute from HB XML
-+# these are obsolete
-+#
-+#--------------------------------------------------
-+sub pruneTargetAttributes
-+{
-+    my $targetObj = shift;
-+    my $target    = shift;
-+    my $type      = shift;
-+
-     if ($type eq "SYS")
-     {
--        processSystem($targetObj, $target);
--        #TODO RTC: 178351 Remove depricated Attribute from HB XML
--        #these are obsolete
-         $targetObj->deleteAttribute($target,"FUSED_CORE_MODE");
-         $targetObj->deleteAttribute($target,"MRW_CDIMM_MASTER_I2C_TEMP_SENSOR_ENABLE");
-         $targetObj->deleteAttribute($target,"MRW_CDIMM_SPARE_I2C_TEMP_SENSOR_ENABLE");
-@@ -302,31 +551,9 @@ foreach my $target (@targets)
-         $targetObj->deleteAttribute($target,"SYSTEM_WOF_ENABLED");
-         $targetObj->deleteAttribute($target,"VDM_ENABLE");
-         $targetObj->deleteAttribute($target,"CHIP_HAS_SBE");
--
--        my $maxComputeNodes  = get_max_compute_nodes($targetObj , $target);
--        $targetObj->setAttribute($target, "MAX_COMPUTE_NODES_PER_SYSTEM", $maxComputeNodes);
--
--        #handle enumeration changes
--        my $enum_val = $targetObj->getAttribute($target,"PROC_FABRIC_PUMP_MODE");
--        if ( $enum_val =~ /MODE1/i)
--        {
--            $targetObj->setAttribute($target,"PROC_FABRIC_PUMP_MODE","CHIP_IS_NODE");
--        }
--        elsif ( $enum_val =~ /MODE2/i)
--        {
--            $targetObj->setAttribute($target,"PROC_FABRIC_PUMP_MODE","CHIP_IS_GROUP");
--        }
--
-     }
-     elsif ($type eq "PROC")
-     {
--        processProcessor($targetObj, $target);
--        if ($build eq "fsp")
--        {
--            do_plugin("fsp_proc", $targetObj, $target);
--        }
--        #TODO RTC: 178351 Remove depricated Attribute from HB XML
--        #these are obsolete
-         $targetObj->deleteAttribute($target,"CHIP_HAS_SBE");
-         $targetObj->deleteAttribute($target,"FSI_GP_REG_SCOM_ACCESS");
-         $targetObj->deleteAttribute($target,"I2C_SLAVE_ADDRESS");
-@@ -349,18 +576,8 @@ foreach my $target (@targets)
-         $targetObj->deleteAttribute($target,"PROC_SECURITY_SETUP_VECTOR");
-         $targetObj->deleteAttribute($target,"SBE_SEEPROM_I2C_ADDRESS_BYTES");
-     }
--    elsif ($type eq "APSS")
--    {
--        processApss($targetObj, $target);
--    }
--    elsif ($type eq "MEMBUF")
--    {
--        processMembuf($targetObj, $target);
--        $targetObj->deleteAttribute($target,"CEN_MSS_VREF_CAL_CNTL");
--    }
-     elsif ($type eq "PHB")
-     {
--        #TODO RTC: 178351 Remove depricated Attribute from HB XML
-         $targetObj->deleteAttribute($target,"DEVICE_ID");
-         $targetObj->deleteAttribute($target,"HDDW_ORDER");
-         $targetObj->deleteAttribute($target,"MAX_POWER");
-@@ -376,91 +593,7 @@ foreach my $target (@targets)
-         $targetObj->deleteAttribute($target,"SLOT_NAME");
-         $targetObj->deleteAttribute($target,"VENDOR_ID");
-     }
--    # @TODO RTC: 189374 Remove multiple TPMs filter when all platforms' MRW
--    # supports dynamically determining the processor driving it.
--    elsif (($type eq "TPM") && $isMultiTpmSys)
--    {
--        processTpm($targetObj, $target);
--    }
--    elsif ($type eq "POWER_SEQUENCER")
--    {
--        my $target_type = $targetObj->getTargetType($target);
--
--        # Strip off the chip- part of the target type name
--        $target_type =~ s/chip\-//g;
--
--        # Currently only UCD9090 and UCD90120A on FSP systems are supported.
--        # All other UCD types are skipped.
--        if (($target_type eq "UCD9090")
--            || ($target_type eq "UCD90120A"))
--        {
--            processUcd($targetObj, $target);
--        }
--    }
--    elsif ($type eq "OCMB_CHIP")
--    {
--        processOcmbChip($targetObj, $target);
--    }
--
--    processIpmiSensors($targetObj,$target);
--}
--
--if ($build eq "fsp")
--{
--    processMrw_fsp::loadFSP($targetObj);
--}
--## check topology
--foreach my $n (keys %{$targetObj->{TOPOLOGY}}) {
--    if ($targetObj->{TOPOLOGY}->{$n} > 1) {
--        print "ERROR: Fabric topology invalid.  2 targets have same ".
--              "FABRIC_TOPOLOGY_ID ($n)\n";
--        $targetObj->myExit(3);
--    }
--}
--## check for errors
--foreach my $target (keys %{ $targetObj->getAllTargets() })
--{
--    errorCheck($targetObj, $target);
--}
--
--#--------------------------------------------------
--## write out final XML
--my $xml_fh;
--my $filename;
--my $config_str = $system_config;
--
--#If user did not specify the output filename, then build one up by using
--#config and build parameters
--if ($output_filename eq "")
--{
--    if ($config_str ne "")
--    {
--        $config_str = "_" . $config_str;
--    }
--
--    $filename = $xmldir . "/" . $targetObj->getSystemName() . $config_str . "_" . $build . ".mrw.xml";
--}
--else
--{
--    $filename = $output_filename;
--}
--
--print "Creating XML: $filename\n";
--open($xml_fh, ">$filename") || die "Unable to create: $filename";
--
--$targetObj->printXML($xml_fh, "top", $build);
--close $xml_fh;
--if (!$targetObj->{errorsExist})
--{
--    ## optionally print out report
--    if ($report)
--    {
--        print "Writing report to: ".$targetObj->{report_filename}."\n";
--        $targetObj->writeReportFile();
--    }
--    print "MRW created successfully!\n";
--}
--
-+}  # end pruneTargetAttributes
- 
- #--------------------------------------------------
- #--------------------------------------------------
-@@ -493,7 +626,7 @@ sub processSystem
-     my $system_name = $targetObj->getAttribute($target,"SYSTEM_NAME");
-     if ($system_name =~ /ZAIUS/i)
-     {
--        $num_voltage_rails_per_proc = 2;
-+        $NUM_VOLTAGE_RAILS_PER_PROC = 2;
-     }
- 
-     # TODO RTC:182764 -- right now there is no support for CDIMMs. So,
-@@ -940,9 +1073,9 @@ sub processUcd
- }
- 
- #--------------------------------------------------
--## Processor
--##
--
-+# @brief Process processors
-+#
-+#--------------------------------------------------
- sub processProcessor
- {
-     my $targetObj = shift;
-@@ -998,7 +1131,6 @@ sub processProcessor
-         }
-     }
- 
--
-     # I2C arrays
-     my @engine = ();
-     my @port = ();
-@@ -1051,11 +1183,11 @@ sub processProcessor
-             #   contain this information and this can be removed
-             my $socket_pos =  $targetObj->getAttribute($socket_target,
-                                   "POSITION");
--            if ($num_voltage_rails_per_proc > 1)
-+            if ($NUM_VOLTAGE_RAILS_PER_PROC > 1)
-             {
-                 my $mcbist_pos = $targetObj->getAttribute($child, "CHIP_UNIT");
-                 $targetObj->setAttribute($child, "VDDR_ID",
--                         $socket_pos*$num_voltage_rails_per_proc + $mcbist_pos);
-+                         $socket_pos*$NUM_VOLTAGE_RAILS_PER_PROC + $mcbist_pos);
-             }
-             else
-             {
-@@ -1097,16 +1229,16 @@ sub processProcessor
- 
-     # Add GPU sensors to processor
-     my @aGpuSensors = ();
--    foreach my $obusslot (sort keys %G_gpu_sensors)
-+    foreach my $obusslot (sort keys %GPU_SENSORS)
-     {
-         # find matching obusslot to processor
--        my $proc_target = $G_slot_to_proc{$obusslot};
-+        my $proc_target = $SLOT_TO_PROC{$obusslot};
- 
-         # if a processor target is found and it is the same as this target
-         if ($proc_target && ($target =~ m/$proc_target/))
-         {
-             # Add this GPU's sensors to the processor's array of GPU sensors
--            push (@aGpuSensors, @{ $G_gpu_sensors{$obusslot} });
-+            push (@aGpuSensors, @{ $GPU_SENSORS{$obusslot} });
-         }
-     }
-     if (@aGpuSensors)
-@@ -1216,10 +1348,11 @@ sub processProcessor
-                              $targetObj->getAttribute($target,
-                                                       "FABRIC_CHIP_ID"));
- 
--    processMembufVpdAssociation($targetObj,$target);
-+
-     #TODO RTC: 191762 -- Need a generic way to source FABRIC_GROUP_ID and
-     #FABRIC_CHIP_ID from the MRW and select the right value in processMRW
-     #based on the system configuration we are compiling for.
-+    my $system_config = $targetObj->{system_config};
-     if ($system_config eq "w")
-     {
-         my $huid_str = $targetObj->getAttribute($target, "HUID");
-@@ -1412,36 +1545,21 @@ sub processI2cSpeeds
-     $targetObj->setAttribute($target,"I2C_BUS_SPEED_ARRAY",$bus_speed_attr);
- }
- 
--################################
--## Setup address map
--
-+#--------------------------------------------------
-+# @brief Setup address map
-+#--------------------------------------------------
- sub setupBars
- {
-     my $targetObj = shift;
-     my $target = shift;
--    #--------------------------------------------------
--    ## Setup BARs
--
--    #The topology ID is a 4 bit value that must be converted to
--    #a 5-bit topology index before we can use it to calculate the
--    #address offset.
--    #The conversion method depends on the topology mode.
--    my $topoId = $targetObj->getAttribute($target, "PROC_FABRIC_TOPOLOGY_ID");
--    my $topoMode = $targetObj->getAttribute($target, "PROC_FABRIC_TOPOLOGY_MODE");
--
--    #Assume topo mode 1 (GGCC -> 0GGCC)
--    my $topoIndex = $topoId;
--
--    #Check for topo mode 0
--    if ($topoMode == 0)
--    {
--        # GGGC -> GGG0C
--        $topoIndex = (($topoIndex & 0xE) << 1) | ($topoIndex & 0x1);
--    }
- 
--    #keep track of which topology ID's have been used
-+    # Keep track of which topology ID's have been used
-+    my $topoId = getTopologyId($targetObj, $target);
-     $targetObj->{TOPOLOGY}->{$topoId}++;
- 
-+    # Get the topology index
-+    my $topologyIndex = getTopologyIndex($targetObj, $target);
-+
-     #P10 has a defined memory map for all configurations,
-     #these are the base addresses for topology ID 0 (group0-chip0).
-     my %bars=(  "FSP_BASE_ADDR"             => 0x0006030100000000,
-@@ -1466,9 +1584,147 @@ sub setupBars
-     {
-         my $i_base = Math::BigInt->new($bars{$bar});
-         my $value=sprintf("0x%016s",substr((
--                        $i_base+$topoIndexOffset*$topoIndex)->as_hex(),2));
-+                        $i_base+$topoIndexOffset*$topologyIndex)->as_hex(),2));
-         $targetObj->setAttribute($target,$bar,$value);
-     }
-+}  # end setupBars
-+
-+#--------------------------------------------------
-+# @brief Retrieve the fabric topolgy mode
-+#
-+# @details The fabric topology mode, attribute PROC_FABRIC_TOPOLOGY_MODE,
-+#          is an attribute of the top level target (sys-0), but retrieving
-+#          the value from the attribute returns a string (MODE0 or MODE1).
-+#          This string is used to get the actual value, tied that mode,
-+#          within the enumeration types.
-+#
-+# @param[in] $targetObj - The global target object, needed to get topology mode
-+#
-+# @return the numerical value of the topology mode in base 10
-+#--------------------------------------------------
-+sub getTopologyMode
-+{
-+    my $targetObj = shift;
-+
-+    use constant TOPOLOGY_MODE_ATTRIBUTE => "PROC_FABRIC_TOPOLOGY_MODE";
-+
-+    # Get topology mode from top level target
-+    # Need to prepend "/" to the returned top level target because targets
-+    # are mapped slightly different in the TARGETS hash vs the xml hash.
-+    my $topologoyMode = $targetObj->getAttribute("/".$targetObj->{TOP_LEVEL},
-+                                                 TOPOLOGY_MODE_ATTRIBUTE);
-+
-+    # Return the value of the mode as defined in
-+    # enumeration type PROC_FABRIC_TOPOLOGY_MODE
-+    # Convert the value from hex to base 10
-+    return hex($targetObj->{xml}->{enumerationTypes}->{enumerationType}
-+                      ->{PROC_FABRIC_TOPOLOGY_MODE}
-+                      ->{enumerator}->{$topologoyMode}->{value});
-+}
-+
-+#--------------------------------------------------
-+# @brief Convert the topology ID to a topology index.
-+#
-+# @details  The topology ID is a 4 bit value that will be converted to a 5 bit
-+#           topology index. The topology index is an index into the topology
-+#           table.
-+#           The conversion method depends on the topology mode.
-+#                Mode      ID      index
-+#               MODE 0 => GGGC --> GGG0C
-+#               MODE 1 => GGCC --> GG0CC
-+#
-+# @param[in] $topologyId - The topology ID to convert to an index
-+# @param[in] $topologyMode - The topology mode that determines the conversion
-+#                            method. Needs to be a base 10 numeral value.
-+#
-+# @return a toplogy index, that is a base 10 numeral value.
-+#--------------------------------------------------
-+sub convertTopologyIdToIndex
-+{
-+    my $topologyId = shift;
-+    my $topologyMode = shift;
-+
-+    use constant TOPOLOGY_MODE_1 => 1;
-+
-+    # Assume topology mode 0 (GGGC -> GGG0C)
-+    my $groupMask = 0xE; # Use 0xE, 1110b, to extract 'GGG' from 'GGGC'
-+    my $chipMask = 0x1;  # Use 0x1, 0001b, to extract 'C' from 'GGGC'
-+
-+    # If topology mode 1 (GGCC -> GG0CC)
-+    if (TOPOLOGY_MODE_1 == $topologyMode)
-+    {
-+        $groupMask = 0xC; # Use 0xC, 1100b, to extract 'GG' from 'GGCC'
-+        $chipMask = 0x3;  # Use 0x3, 0011b, to extract 'CC' from 'GGCC'
-+    }
-+
-+    # Set topology index to topology ID before doing conversion
-+    my $topologyIndex = $topologyId;
-+
-+    ## Turn the 4 bit topology ID into a 5 bit index
-+    ## convert GGGC to GGG0C
-+    ##      OR GGCC to GG0CC
-+    # If group mask equal to 0xE (mode 0) then extract 'GGG' from 'GGGC':
-+    #  1) GGGC & 0xE (1110b) returns GGG0 then shift to left (<< 1) to get GGG00
-+    #  2) extract C from GGGC: GGGC & 0x1 (0001b) returns C
-+    # If group mask equal to 0xC (mode 1) then extract 'GG' from 'GGCC':
-+    #  1) GGCC & 0xC (1100b) returns GG00 then shift to left (<< 1) to get GG000
-+    #  2) extract CC from GGCC: GGCC & 0x3 (0011b) returns CC
-+    # Bitwise 'OR' 1 and 2 together to produce a 5 bit index value: GGG0C OR GG0CC
-+    #    Index     =                  1                  'OR'               2
-+    $topologyIndex = (($topologyIndex & $groupMask) << 1) | ($topologyIndex & $chipMask);
-+
-+    return ($topologyIndex);
-+}
-+
-+#--------------------------------------------------
-+# @brief Get the topology ID from processor
-+#
-+#
-+# @param[in] $targetObj - The global target object, needed to get topology mode
-+# @param[in] $processorTarget - The processor target, has the attribute topology ID
-+#
-+# @return topology ID, that is a base 10 numeral value.
-+#--------------------------------------------------
-+sub getTopologyId
-+{
-+    my $targetObj = shift;
-+    my $processorTarget = shift;
-+
-+    use constant TOPOLOGY_ID_ATTRIBUTE => "PROC_FABRIC_TOPOLOGY_ID";
-+
-+    # Get the topology ID from the processor.
-+    # Convert hex value to base 10 numerical value
-+    return hex($targetObj->getAttribute($processorTarget,
-+                                        TOPOLOGY_ID_ATTRIBUTE));
-+
-+}
-+
-+#--------------------------------------------------
-+# @brief Get the topology index, an index into the topology table.
-+#
-+# @details The topology index needs to be calculated using the topology mode
-+#          and the topology ID.  @see convertTopologyIdToIndex for
-+#          more details
-+#
-+# @param[in] $targetObj - The global target object, needed to get topology mode
-+# @param[in] $processorTarget - The processor target has the attribute topology ID
-+#
-+# @return a topology index, that is base 10 numeral value.
-+#--------------------------------------------------
-+sub getTopologyIndex
-+{
-+    my $targetObj = shift;
-+    my $processorTarget = shift;
-+
-+    # Get the topology mode: MODE 0 (0) or MODE 1 (1)
-+    my $topologyMode = getTopologyMode($targetObj);
-+
-+    # Get the topology ID from the processor.
-+    my $topologyId = getTopologyId($targetObj, $processorTarget);
-+
-+    # Convert the topology ID to a topology index. The conversion method is
-+    # based on the topology mode.
-+    return (convertTopologyIdToIndex($topologyId, $topologyMode));
- }
- 
- #--------------------------------------------------
-@@ -1572,10 +1828,14 @@ sub processEq
-         $targetObj->log($target,
-             "Processing EQ child: $child Type: $child_type");
- 
--        if ($child_type eq "EX")
-+        if ($child_type eq "EQ")
-         {
-             processEx($targetObj, $child, $chip_unit);
-         }
-+        elsif ($child_type eq "FC")
-+        {
-+            processFc($targetObj, $child, $chip_unit);
-+        }
-     }
- 
-     my $value = sprintf("0x%x",
-@@ -1584,6 +1844,35 @@ sub processEq
-     $targetObj->setAttribute( $target, "CHIPLET_ID", $value);
- }
- 
-+## FC
-+sub processFc
-+{
-+    my $targetObj        = shift;
-+    my $target           = shift;
-+    my $parent_chip_unit = shift;
-+
-+    foreach my $child (@{ $targetObj->getTargetChildren($target) })
-+    {
-+        my $child_type = $targetObj->getType($child);
-+
-+        $targetObj->log($target,
-+            "Processing EX child: $child Type: $child_type");
-+
-+        if ($child_type eq "CORE")
-+        {
-+            processCore($targetObj, $child);
-+        }
-+    }
-+
-+    my $value = sprintf("0x%x",
-+                        Targets::PERVASIVE_PARENT_EQ_OFFSET
-+                        + $parent_chip_unit);
-+
-+    $targetObj->setAttribute( $target, "CHIPLET_ID", $value);
-+}
-+
-+
-+
- ## EX
- sub processEx
- {
-@@ -1672,9 +1961,9 @@ sub processMcbist
- ##
- sub processMc
- {
--    # NOTE: OMI_INBAND_BAR_BASE_ADDR_OFFSET will be set for the MC                         
--    # targets via a specific child OMI Target. View the                                    
--    # processOmi function for further details.                                             
-+    # NOTE: OMI_INBAND_BAR_BASE_ADDR_OFFSET will be set for the MC
-+    # targets via a specific child OMI Target. View the
-+    # processOmi function for further details.
-     my $targetObj    = shift;
-     my $target       = shift;
- 
-@@ -1751,8 +2040,28 @@ sub processMcc
- ##
- sub processOmi
- {
--    my $mrwObj   = shift;
--    my $omitarg      = shift;
-+    my $mrwObj  = shift;
-+    my $omitarg = shift;
-+
-+# TODO This may need to be updated if layout is different
-+# ROLAND investigate this
-+    # Map the OMI instance to its corresponding OMIC parent
-+    my %omi_map = (4  => "omic-0",
-+                   5  => "omic-0",
-+                   6  => "omic-0",
-+                   7  => "omic-1",
-+                   2  => "omic-1",
-+                   3  => "omic-1",
-+                   0  => "omic-2",
-+                   1  => "omic-2",
-+                   12 => "omic-0",
-+                   13 => "omic-0",
-+                   14 => "omic-0",
-+                   15 => "omic-1",
-+                   10 => "omic-1",
-+                   11 => "omic-1",
-+                   8  => "omic-2",
-+                   9  => "omic-2");
- 
-     use integer;
-     # There are a total of eight OMI units on an MC unit. So, to
-@@ -1834,15 +2143,15 @@ sub processOmic
- }
- 
- #--------------------------------------------------
--## OCMB_CHIP
--##
--##
-+# @brief OCMB_CHIP
-+#
-+#--------------------------------------------------
- sub processOcmbChip
- {
-     my $targetObj    = shift;
-     my $target       = shift;
- 
--    $targetObj->setEepromAttributesForAxone($targetObj, $target);
-+    $targetObj->setEepromAttributesForDDIMs($target);
- }
- 
- #-------------------------------------------------g
-@@ -2032,6 +2341,7 @@ sub processXbus
-         #For example, in wrap config, CONFIG_APPLY is expected to have "w"
-         #If "w" is not there, then we skip the connection and mark peers
-         #as NULL
-+        my $system_config = $targetObj->{system_config};
-         if (($system_config eq $wrap_config && $config =~ /$wrap_config/) ||
-            ($system_config ne $wrap_config && $config =~ /$default_config/))
-         {
-@@ -2098,7 +2408,7 @@ sub processAbus
-     # A-bus connection has to be conisdered or not
-     # If user has passed 2N as argument, then we consider only those
-     # A-bus connections where token "2" is present
--
-+    my $system_config = $targetObj->{system_config};
-     if($system_config eq "2N" && $config =~ /$twonode/)
-     {
-         #Looking for Abus connections pertaining to 2 node system only
-@@ -2634,123 +2944,6 @@ sub processOcc
-     $targetObj->setAttribute($target,"OCC_MASTER_CAPABLE",$master_capable);
- }
- 
--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);
--                my $index = $targetObj->getBusAttribute($membuf_assoc->{SOURCE},
--                                $membuf_assoc->{BUS_NUM}, "ISDIMM_MBVPD_INDEX");
--                $targetObj->setAttribute(
--                            $membuf_target,"ISDIMM_MBVPD_INDEX",$index);
--                $targetObj->setAttribute($membuf_target,
--                            "VPD_REC_NUM",$targetObj->{vpd_num});
--            }
--        }
--        my $group_assocs=$targetObj->findConnections($vpd->{DEST_PARENT},
--                          "LOGICAL_ASSOCIATION","CARD");
--
--        if ($group_assocs ne "") {
--            foreach my $group_assoc (@{$group_assocs->{CONN}}) {
--                my $mb_target = $group_assoc->{DEST_PARENT};
--                my $group_target = $targetObj->getTargetParent($mb_target);
--                $targetObj->setAttribute($group_target,
--                            "VPD_REC_NUM",$targetObj->{vpd_num});
--            }
--        }
--        $targetObj->{vpd_num}++;
--    }
--}
--
--#--------------------------------------------------
--## 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 $membufTarg    = shift;
--    if ($targetObj->isBadAttribute($membufTarg, "PHYS_PATH", ""))
--    {
--        ##dmi is probably not connected.  will get caught in error checking
--        return;
--    }
--
--    processMembufVpdAssociation($targetObj,$membufTarg);
--
--    ## find port mapping
--    my %dimm_portmap;
--    foreach my $child (@{$targetObj->getTargetChildren($membufTarg)})
--    {
--         if ($targetObj->getType($child) eq "MBA")
--         {
--             # find this MBA's position relative to the membuf
--             my $mba_num = $targetObj->getAttribute($child,"MBA_NUM");
--             # follow the DDR4 bus connection to find the 'ddr' targets
--             my $ddrs = $targetObj->findConnections($child,"DDR4","");
--
--             if($ddrs eq "")
--             {
--                # on multi node system there is a possibility that either
--                # DDR4 or DDR3 dimms are connected under a node
--                my $ddrs = $targetObj->findConnections($child,"DDR3","");
--             }
--
--             if ($ddrs ne "")
--             {
--                 foreach my $ddr (@{$ddrs->{CONN}})
--                 {
--                       my $port_num = $targetObj->getDimmPort($ddr->{SOURCE});
--                       my $dimm_num = $targetObj->getDimmPos($ddr->{SOURCE});
--                       my $map = oct("0b".$mba_num.$port_num.$dimm_num);
--                       $dimm_portmap{$ddr->{DEST_PARENT}} = $map;
--                 }
--             }
--         }
--    }
--
--
--    ## Process MEMBUF to DIMM I2C connections
--    my @addr_map=('0','0','0','0','0','0','0','0');
--    my $dimms=$targetObj->findConnections($membufTarg,"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);
--
--            my $field=getI2cMapField($targetObj,$dimm_target,$dimm);
--            my $map = $dimm_portmap{$dimm_target};
--
--            if ($map eq "") {
--                print "ERROR: $dimm_target doesn't map to a dimm/port\n";
--                $targetObj->myExit(3);
--            }
--            $addr_map[$map] = $field;
--        }
--    }
--    $targetObj->setAttribute($membufTarg,
--            "MRW_MEM_SENSOR_CACHE_ADDR_MAP","0x".join("",@addr_map));
--
--    ## Update bus speeds
--    processI2cSpeeds($targetObj,$membufTarg);
--
--    processPowerRails($targetObj, $membufTarg);
--}
- 
- sub getI2cMapField
- {
-@@ -2794,7 +2987,7 @@ sub getI2cMapField
-     return $hexfield;
- }
- 
--#------------------------------------------------------------------------------
-+#--------------------------------------------------
- # I2C
- #
- sub processI2C
-@@ -3253,7 +3446,9 @@ sub get_max_compute_nodes
- }
- 
- #--------------------------------------------------
--## ERROR checking
-+# @brief Error checking
-+#
-+#--------------------------------------------------
- sub errorCheck
- {
-     my $targetObj = shift;
-@@ -3363,9 +3558,9 @@ Options:
-              2N = special 2 node config with extra ABUS links
-              w = Special MST wrap config
-         -o = output filename
--        -s [SDR XML file] = import SDRs
-         -r = create report and save to [system_name].rpt
--        -v = version
-+        -v = display current version
-+        -t = run self test
- ";
-     exit(1);
- }
-@@ -3380,8 +3575,216 @@ sub do_plugin
-     {
-         $hwsvmrw_plugins{$step}(@_);
-     }
--    elsif ($debug && ($build eq "fsp"))
-+    elsif ($targetObj->{debug} && ($targetObj->{build} eq "fsp"))
-+    {
-+        print STDERR "build is $targetObj->{build} but no plugin for $step\n";
-+    }
-+}
-+
-+###############################################################################
-+# Self tests
-+###############################################################################
-+#--------------------------------------------------
-+# @brief The main procedure to run the tests
-+#
-+# @param[in] $targetObj - The global target object
-+#--------------------------------------------------
-+sub runTests
-+{
-+    print "\nRunning tests: \n\n";
-+    my $targetObj = shift;
-+
-+    # Load the XML and process the file, extracting targets and associating
-+    # attributes, with their data, to the targets
-+    loadXmlFile();
-+
-+    # Process the targets, setting the targets attributes.
-+    processTargets();
-+
-+    # Each one of the test build on each other, if one fails then no point in
-+    # running the other
-+    testGetTopologyMode($targetObj)   &&
-+    testTopologyIdToTopologyIndex()   &&
-+    testGetTopologyIndex($targetObj);
-+}
-+
-+#--------------------------------------------------
-+# @brief Test the method that gets the topology mode.
-+#
-+# @param[in] $targetObj - The global target object
-+#
-+# @return true if test passed, false other wise
-+#--------------------------------------------------
-+sub testGetTopologyMode
-+{
-+    print ">> Running testgetTopologyMode \n";
-+    my $targetObj = shift;
-+
-+    my $testPassed = true;
-+
-+    use constant TOPOLOGY_MODE_ATTRIBUTE => "PROC_FABRIC_TOPOLOGY_MODE";
-+    use constant TOPOLOGY_MODES => qw/ MODE0 MODE1 /;
-+    my @topologyModes = (TOPOLOGY_MODES);
-+
-+    # Cache the current mode to restore later
-+    my $persistMode = $targetObj->getAttribute("/".$targetObj->{TOP_LEVEL},
-+                                               TOPOLOGY_MODE_ATTRIBUTE);
-+
-+    # Test getting the topology mode
-+    foreach my $topologyMode (@topologyModes)
-     {
--        print STDERR "build is $build but no plugin for $step\n";
-+        $targetObj->setAttribute("/".$targetObj->{TOP_LEVEL},
-+                                 TOPOLOGY_MODE_ATTRIBUTE,
-+                                 $topologyMode);
-+        my $topologyModeNumber = chop($topologyMode);
-+        if (getTopologyMode($targetObj) != $topologyModeNumber)
-+        {
-+
-+            $testPassed = false;
-+            print "ERROR: Expected topology mode '$topologyModeNumber' but got " .
-+                   getTopologyMode($targetObj) . "\n";
-+        }
-     }
-+
-+    # Restore mode
-+    $targetObj->setAttribute("/".$targetObj->{TOP_LEVEL},
-+                             TOPOLOGY_MODE_ATTRIBUTE,
-+                             $persistMode);
-+
-+    print "<< Running testgetTopologyMode: test " .
-+          getPassFailString($testPassed) . "\n";
-+
-+    return $testPassed;
- }
-+
-+#--------------------------------------------------
-+# @brief Tests the conversion method that converts the topology ID,
-+#        with given topology mode, to the topology index.
-+#
-+# @return true if test passed, false other wise
-+#--------------------------------------------------
-+sub testTopologyIdToTopologyIndex
-+{
-+    print ">> Running testTopologyIdToTopologyIndex \n";
-+
-+    my $testPassed = true;
-+
-+    # The different values expected when mode is 0 or 1
-+    use constant TOPOLOGY_MODE_0_ARRAY => qw/ 0 1 4 5 8 9 12 13 16 17 20 21 24 25 28 29 /;
-+    use constant TOPOLOGY_MODE_1_ARRAY => qw/ 0 1 2 3 8 9 10 11 16 17 18 19 24 25 26 27 /;
-+
-+    # The different topology modes
-+    use constant TOPOLOGY_MODES => qw/ MODE0 MODE1 /;
-+    my @topologyModes = (TOPOLOGY_MODES);
-+
-+    # Default with mode 0
-+    my @toplogyModeArray = (TOPOLOGY_MODE_0_ARRAY);
-+
-+    # Test the conversion on the different IDs and modes
-+    for my $topologyMode (@topologyModes)
-+    {
-+        my $topologyModeNumber = chop($topologyMode);
-+        if (1 == $topologyModeNumber)
-+        {
-+            @toplogyModeArray = (TOPOLOGY_MODE_1_ARRAY);
-+        }
-+
-+        # Needed variable
-+        my $topologyIndex = 0;
-+
-+        # Iterate thru each permutation of the topology ID and
-+        # test conversion to index
-+        for (my $topologyId = 0; $topologyId < 16; ++$topologyId)
-+        {
-+            $topologyIndex = convertTopologyIdToIndex($topologyId,
-+                                                      $topologyModeNumber);
-+            if ($topologyIndex != $toplogyModeArray[$topologyId])
-+            {
-+                $testPassed = false;
-+                print "ERROR: conversion on topology Id($topologyId) with ";
-+                print "topology mode($topologyMode) returned ";
-+                print "topology index($topologyIndex), but expected ";
-+                print "topology index($toplogyModeArray[$topologyId]) \n";
-+            }
-+        }  # end for (my $topologyId = 0 ...
-+    } # end foreach my $topologyMode (@topologyModes)
-+
-+    print "<< Running testTopologyIdToTopologyIndex: test " .
-+          getPassFailString($testPassed) . "\n";
-+
-+    return $testPassed;
-+}
-+
-+#--------------------------------------------------
-+# @brief Test the method that gets the topology index based
-+#        based on the current processors within the MRW XML
-+#
-+# @param[in] $targetObj - The global target object
-+#
-+# @return true if test passed, false other wise
-+#--------------------------------------------------
-+sub testGetTopologyIndex
-+{
-+    my $targetObj = shift;
-+
-+    my $testPassed = true;
-+
-+    my $system_name = $targetObj->getAttribute('/sys-0',"SYSTEM_NAME");
-+    if ($system_name =~ /RAINIER/i)
-+    {
-+        print ">> Running testGetTopologyIndex \n";
-+
-+        # The different procs available
-+        use constant PROC_0 => "/sys-0/node-0/nisqually-0/proc_socket-0/godel-0/power10-0";
-+        use constant PROC_1 => "/sys-0/node-0/nisqually-0/proc_socket-0/godel-0/power10-1";
-+
-+        # Get processor 1's index
-+        my $processorTarget = PROC_0;
-+        my $topologyIndex = getTopologyIndex($targetObj, $processorTarget);
-+
-+        # For the current MRW, proc 0 has index 0 with mode 0
-+        my $expectedTopologyIndex = 0;
-+        if ($topologyIndex != $expectedTopologyIndex)
-+        {
-+            $testPassed = false;
-+            my @fullProc = split(/\//, $processorTarget);
-+            print "ERROR: retrieved topology index $topologyIndex for processor " .
-+                   "@fullProc[-1] but expected $expectedTopologyIndex \n";
-+        }
-+
-+        # Get processor 2's index
-+        $processorTarget = PROC_1;
-+        $topologyIndex = getTopologyIndex($targetObj, $processorTarget);
-+
-+        # For the current MRW, proc 1 has index 4 with mode 0
-+        $expectedTopologyIndex = 4;
-+        if ($topologyIndex != $expectedTopologyIndex)
-+        {
-+            $testPassed = false;
-+            my @fullProc = split(/\//, $processorTarget);
-+            print "ERROR: retrieved topology index $topologyIndex for processor " .
-+                   "@fullProc[-1] but expected $expectedTopologyIndex \n";
-+        }
-+
-+        print "<< Running testGetTopologyIndex: test " .
-+              getPassFailString($testPassed) . "\n";
-+
-+    } # end if ($system_name =~ /RAINIER/i)
-+
-+    return $testPassed;
-+}
-+
-+sub getPassFailString
-+{
-+    my $passFailBoolean = shift;
-+    my $failPassString = "passed";
-+
-+    if ($passFailBoolean == false)
-+    {
-+        $failPassString = "failed";
-+    }
-+
-+    return $failPassString;
-+}
-+
-+
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot-p10/Config.in b/openpower/package/hostboot-p10/Config.in
index 0ca0539..7649fbd 100644
--- a/openpower/package/hostboot-p10/Config.in
+++ b/openpower/package/hostboot-p10/Config.in
@@ -25,7 +25,7 @@
 
 config BR2_HOSTBOOT_P10_VERSION
 	string
-	default "475bfbebbaaf01d0b4a092a9175cb251333b9c28" if BR2_HOSTBOOT_P10_LATEST_VERSION
+	default "1ef4c008d43a0c83f5a30822b2bbb6e26dfc2af7" if BR2_HOSTBOOT_P10_LATEST_VERSION
 	default BR2_HOSTBOOT_P10_CUSTOM_VERSION_VALUE \
 		if BR2_HOSTBOOT_P10_CUSTOM_VERSION