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