Op-Build Update 06/14/2017
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index ed4e725..83c9b80 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
#
################################################################################
HOSTBOOT_VERSION_BRANCH_MASTER_P8 ?= 695bd891343faf1f0ef85fe53148590e58239efd
-HOSTBOOT_VERSION_BRANCH_MASTER ?= 0f8d0c0955cc2a3769961257f4d39495ef6eba56
+HOSTBOOT_VERSION_BRANCH_MASTER ?= 3608c1ff8cc3df658c095280e0dab8705a6be036
HOSTBOOT_VERSION ?= $(if $(BR2_OPENPOWER_POWER9),$(HOSTBOOT_VERSION_BRANCH_MASTER),$(HOSTBOOT_VERSION_BRANCH_MASTER_P8))
HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
diff --git a/openpower/package/hostboot/p9Patches/hostboot-0010-Updates-to-HBRT-runtime-interfaces.patch b/openpower/package/hostboot/p9Patches/hostboot-0010-Updates-to-HBRT-runtime-interfaces.patch
deleted file mode 100644
index e2d052f..0000000
--- a/openpower/package/hostboot/p9Patches/hostboot-0010-Updates-to-HBRT-runtime-interfaces.patch
+++ /dev/null
@@ -1,419 +0,0 @@
-From 826657215c64a6fba1f8141769af5a93994b4a5d Mon Sep 17 00:00:00 2001
-From: Dan Crowell <dcrowell@us.ibm.com>
-Date: Fri, 12 May 2017 15:40:46 -0500
-Subject: [PATCH] Updates to HBRT runtime interfaces
-
-Reconciling P9 function table with P8 table to make opal-prd
-work.
-
-Added new entries for:
-- firmware_request
-- get_ipoll_events
-- firmware_notify
-
-Added in entries for P8 functions:
-- get_interface_capabilities
-
-Added deprecated placeholders for P8 functions:
-- occ_load
-- occ_start
-- occ_stop
-
-Moved entries for:
-- load_pm_complex
-- start_pm_complex
-- reset_pm_complex
-
-Change-Id: I1892b4465a6e5901aa9eaa6a49e139a4bc4c5b56
----
- src/include/runtime/interface.h | 230 +++++++++++++++++++++++++++-------------
- src/runtime/rt_main.C | 26 ++++-
- 2 files changed, 182 insertions(+), 74 deletions(-)
-
-diff --git a/src/include/runtime/interface.h b/src/include/runtime/interface.h
-index aafbbf9..363e50c 100644
---- a/src/include/runtime/interface.h
-+++ b/src/include/runtime/interface.h
-@@ -37,9 +37,9 @@
- */
-
- /** Current interface version.
-- * 0x9001: 9=P9, 001=Version 1
-+ * 0x9001: 9=P9, 002=Version 2
- */
--#define HOSTBOOT_RUNTIME_INTERFACE_VERSION 0x9001
-+#define HOSTBOOT_RUNTIME_INTERFACE_VERSION 0x9002
-
- #ifndef __HOSTBOOT_RUNTIME_INTERFACE_VERSION_ONLY
-
-@@ -53,7 +53,7 @@ enum MemoryError_t
- * continues to report errors on subsequent reads. A second CE on that
- * cache line will result in memory UE. Therefore, it is advised to
- * migrate off of the address range as soon as possible. */
-- MEMORY_ERROR_CE,
-+ MEMORY_ERROR_CE = 0,
-
- /** Hardware has reported an uncorrectable error in memory (memory UE,
- * channel failure, etc). The hypervisor should migrate any partitions
-@@ -63,13 +63,13 @@ enum MemoryError_t
- * partition failures to handle the hardware attentions so that the
- * hypervisor will know all areas of memory that are impacted by the
- * failure. */
-- MEMORY_ERROR_UE,
-+ MEMORY_ERROR_UE = 1,
-
- /** Firmware has predictively requested service on a part in the memory
- * subsystem. The partitions may not have been affected, but it is
- * advised to migrate off of the address range as soon as possible to
- * avoid potential partition outages. */
-- MEMORY_ERROR_PREDICTIVE,
-+ MEMORY_ERROR_PREDICTIVE = 2,
- };
-
- /**
-@@ -130,6 +130,21 @@ enum MemoryError_t
- #define HBRT_RSVD_MEM__SBE_FFDC "ibm,sbe-ffdc"
-
-
-+/**
-+ * Specifiers for get_interface_capabilities
-+ */
-+
-+/* Common Features */
-+#define HBRT_CAPS_SET0_COMMON 0
-+
-+/* OPAL fixes */
-+#define HBRT_CAPS_SET1_OPAL 1
-+#define HBRT_CAPS_OPAL_HAS_XSCOM_RC (1ul << 0)
-+
-+/* PHYP fixes */
-+#define HBRT_CAPS_SET2_PHYP 2
-+
-+
- /** @typedef hostInterfaces_t
- * @brief Interfaces provided by the underlying environment (ex. Sapphire).
- *
-@@ -412,6 +427,40 @@ typedef struct hostInterfaces
- enum MemoryError_t i_errorType );
-
- /**
-+ * @brief Query the HBRT host for a list of fixes/features
-+ *
-+ * There are times when workarounds need to be put into place to handle
-+ * issues with the hosting layer (e.g. opal-prd) while fixes are not yet
-+ * released. This is especially true because of the disconnected release
-+ * streams for the firmware and the hosting environment.
-+ *
-+ * @param i_set Indicates which set of fixes/features we're checking
-+ * see HBRT_CAPS_SET...
-+ *
-+ * @return a bitmask containing the relevant flags for the current
-+ * implementation, see HBRT_CAPS_FLAGS_...
-+ */
-+ uint64_t (*get_interface_capabilities)( uint64_t i_set );
-+
-+ /**
-+ * @brief Map a physical address space into usable memory
-+ * @note Repeated calls to map the same memory should not return an error
-+ * @param[in] i_physMem Physical address
-+ * @param[in] i_bytes Number of bytes to map in
-+ * @return NULL on error, else pointer to usable memory
-+ * @platform FSP, OpenPOWER
-+ */
-+ void* (*map_phys_mem)(uint64_t i_physMem, size_t i_bytes);
-+
-+ /**
-+ * @brief Unmap a physical address space from usable memory
-+ * @param[in] i_ptr Previously mapped pointer
-+ * @return 0 on success, else RC
-+ * @platform FSP, OpenPOWER
-+ */
-+ int (*unmap_phys_mem)(void* i_ptr);
-+
-+ /**
- * @brief Modify the SCOM restore section of the HCODE image with the
- * given register data
- *
-@@ -441,22 +490,27 @@ typedef struct hostInterfaces
- uint64_t i_scomData );
-
- /**
-- * @brief Map a physical address space into usable memory
-- * @note Repeated calls to map the same memory should not return an error
-- * @param[in] i_physMem Physical address
-- * @param[in] i_bytes Number of bytes to map in
-- * @return NULL on error, else pointer to usable memory
-- * @platform FSP, OpenPOWER
-- */
-- void* (*map_phys_mem)(uint64_t i_physMem, size_t i_bytes);
--
-- /**
-- * @brief Unmap a physical address space from usable memory
-- * @param[in] i_ptr Previously mapped pointer
-- * @return 0 on success, else RC
-- * @platform FSP, OpenPOWER
-+ * @brief Send a request to firmware, and receive a response
-+ * @details
-+ * req_len bytes are sent to runtime firmware, and resp_len
-+ * bytes received in response.
-+ *
-+ * Both req and resp are allocated by the caller. If resp_len
-+ * is not large enough to contain the full response, an error
-+ * is returned.
-+ *
-+ * @param[in] i_reqLen length of request data
-+ * @param[in] i_req request data
-+ * @param[inout] o_respLen in: size of request data buffer
-+ * out: length of request data
-+ * @param[in] o_resp response data
-+ * @return 0 on success, else RC
-+ * @platform FSP, OpenPOWER
- */
-- int (*unmap_phys_mem)(void* i_ptr);
-+ int (*firmware_request)( uint64_t i_reqLen,
-+ void *i_req,
-+ uint64_t* o_respLen,
-+ void *o_resp );
-
- // Reserve some space for future growth.
- // do NOT ever change this number, even if you add functions.
-@@ -475,7 +529,7 @@ typedef struct hostInterfaces
- // allocated with sufficient space and populated with NULL function
- // pointers. 32 is big enough that we should not likely add that many
- // functions from either direction in between any two levels of support.
-- void (*reserved[32])(void);
-+ void (*reserved[27])(void);
-
- } hostInterfaces_t;
-
-@@ -502,44 +556,11 @@ typedef struct runtimeInterfaces
- const uint32_t * (*get_lid_list)(size_t * o_num);
-
- /**
-- * @brief Load OCC/HCODE images into mainstore
-- *
-- * @param[in] i_chip the HW chip id (XSCOM chip ID)
-- * @param[in] i_homer_addr the physical mainstore address of the
-- * start of the HOMER image,
-- * @param[in] i_occ_common_addr the physical mainstore address of the
-- * OCC common area, 8MB, used for
-- * OCC-OCC communication (1 per node)
-- * @param[in] i_mode selects initial load vs concurrent reloads
-- * HBRT_PM_LOAD:
-- * load all lids/sections from scratch,
-- * preserve nothing
-- * HBRT_PM_RELOAD:
-- * reload all lids/sections,
-- * but preserve runtime updates
-- * @return 0 on success else return code
-- * @platform FSP, OpenPOWER
-- */
-- int (*load_pm_complex)( uint64_t i_chip,
-- uint64_t i_homer_addr,
-- uint64_t i_occ_common_addr,
-- uint32_t i_mode );
--
-- /**
-- * @brief Start OCC/HCODE on the specified chip
-- * @param[in] i_chip the HW chip id
-- * @return 0 on success else return code
-- * @platform FSP, OpenPOWER
-- */
-- int (*start_pm_complex)( uint64_t i_chip );
--
-- /**
-- * @brief Reset OCC/HCODE on the specified chip
-- * @param[in] i_chip the HW chip id
-- * @return 0 on success else return code
-- * @platform FSP, OpenPOWER
-+ * Space allocated for deprecated P8 interfaces
- */
-- int (*reset_pm_complex)( uint64_t i_chip );
-+ const uint32_t * (*occ_load__deprecated)(size_t * o_num);
-+ const uint32_t * (*occ_start__deprecated)(size_t * o_num);
-+ const uint32_t * (*occ_stop__deprecated)(size_t * o_num);
-
- /**
- * @brief Notify HTMGT that an OCC has an error to report
-@@ -629,20 +650,20 @@ typedef struct runtimeInterfaces
- /**
- * @brief Send a pass-through command to HTMGT
- *
-- * @details This is a blocking call that will send a command
-- * to HTMGT.
-- * @note If o_rspLength is returned with a non-zero value,
-- * the data at the o_rspData should be dumped to
-- * stdout in a hex dump format.
-- * @note The maximum response data returned will be 4096 bytes
-+ * @details This is a blocking call that will send a command
-+ * to HTMGT.
-+ * @note If o_rspLength is returned with a non-zero value,
-+ * the data at the o_rspData should be dumped to
-+ * stdout in a hex dump format.
-+ * @note The maximum response data returned will be 4096 bytes
- *
- * @param[in] i_cmdLength number of bytes in pass-thru command data
-- * @param[in] *i_cmdData pointer to pass-thru command data
-+ * @param[in] *i_cmdData pointer to pass-thru command data
- * @param[out] *o_rspLength pointer to number of bytes returned
- * in o_rspData
-- * @param[out] *o_rspData pointer to a 4096 byte buffer that will
-+ * @param[out] *o_rspData pointer to a 4096 byte buffer that will
- * contain the response data from the command
-- * @returns 0 on success, or return code if the command failed
-+ * @returns 0 on success, or return code if the command failed
- * @platform OpenPOWER
- */
- int (*mfg_htmgt_pass_thru)( uint16_t i_cmdLength,
-@@ -691,20 +712,83 @@ typedef struct runtimeInterfaces
- size_t i_hwKeyHashSize);
-
- /**
-- * @brief SBE message passing
-+ * @brief SBE message passing notification
- *
-- * @details This is a blocking call that will pass an SBE message
-- * with a pass-through command through HBRT to code that
-- * will process the command and provide a response.
-+ * @details
-+ * This is a blocking call that is used to notify HBRT there is
-+ * a SBE message available. This should be called when the Host
-+ * detects the appropriate PSU interrupt from the SBE.
- *
- * @param[in] i_procChipId Chip ID of the processor whose SBE is passing
- * the message and sent the interrupt
- *
-- * @returns 0 on success, or return code if the command failed
-+ * @return 0 on success, or return code if the command failed
- * @platform FSP, OpenPOWER
- */
- int (*sbe_message_passing)(uint32_t i_procChipId);
-
-+ /**
-+ * @brief Load OCC/HCODE images into mainstore
-+ *
-+ * @param[in] i_chip the HW chip id (XSCOM chip ID)
-+ * @param[in] i_homer_addr the physical mainstore address of the
-+ * start of the HOMER image,
-+ * @param[in] i_occ_common_addr the physical mainstore address of the
-+ * OCC common area, 8MB, used for
-+ * OCC-OCC communication (1 per node)
-+ * @param[in] i_mode selects initial load vs concurrent reloads
-+ * HBRT_PM_LOAD:
-+ * load all lids/sections from scratch,
-+ * preserve nothing
-+ * HBRT_PM_RELOAD:
-+ * reload all lids/sections,
-+ * but preserve runtime updates
-+ * @return 0 on success else return code
-+ * @platform FSP, OpenPOWER
-+ */
-+ int (*load_pm_complex)( uint64_t i_chip,
-+ uint64_t i_homer_addr,
-+ uint64_t i_occ_common_addr,
-+ uint32_t i_mode );
-+
-+ /**
-+ * @brief Start OCC/HCODE on the specified chip
-+ * @param[in] i_chip the HW chip id
-+ * @return 0 on success else return code
-+ * @platform FSP, OpenPOWER
-+ */
-+ int (*start_pm_complex)( uint64_t i_chip );
-+
-+ /**
-+ * @brief Reset OCC/HCODE on the specified chip
-+ * @param[in] i_chip the HW chip id
-+ * @return 0 on success else return code
-+ * @platform FSP, OpenPOWER
-+ */
-+ int (*reset_pm_complex)( uint64_t i_chip );
-+
-+ /**
-+ * @brief Query the IPOLL event mask supported by HBRT
-+ *
-+ * @details This call allows the wrapper application to query
-+ * the ipoll event mask to set when the HBRT instance is running. Bits
-+ * that are *set* in this bitmask represent events that will be
-+ * forwarded to the handle_attn() callback.
-+ *
-+ * @return The IPOLL event bits to enable during HBRT execution
-+ * @platform FSP, OpenPOWER
-+ */
-+ uint64_t (*get_ipoll_events)( void );
-+
-+ /**
-+ * @brief Receive an async notification from firmware
-+ * @param[in] i_len length of notification data
-+ * @param[in] i_data notification data
-+ * @platform FSP, OpenPOWER
-+ */
-+ void (*firmware_notify)( uint64_t len,
-+ void *data );
-+
- // Reserve some space for future growth.
- // do NOT ever change this number, even if you add functions.
- //
-@@ -722,7 +806,7 @@ typedef struct runtimeInterfaces
- // allocated with sufficient space and populated with NULL function
- // pointers. 32 is big enough that we should not likely add that many
- // functions from either direction in between any two levels of support.
-- void (*reserved[32])(void);
-+ void (*reserved[22])(void);
-
- } runtimeInterfaces_t;
-
-diff --git a/src/runtime/rt_main.C b/src/runtime/rt_main.C
-index d9a21c9..d539018 100644
---- a/src/runtime/rt_main.C
-+++ b/src/runtime/rt_main.C
-@@ -5,7 +5,7 @@
- /* */
- /* OpenPOWER HostBoot Project */
- /* */
--/* Contributors Listed Below - COPYRIGHT 2013,2016 */
-+/* Contributors Listed Below - COPYRIGHT 2013,2017 */
- /* [+] International Business Machines Corp. */
- /* */
- /* */
-@@ -70,6 +70,27 @@ extern "C"
- */
- runtimeInterfaces_t* rt_start(hostInterfaces_t*) NEVER_INLINE;
-
-+
-+/** @fn rt_version_fixup
-+ *
-+ * @brief Make any adjustments needed to handle old versions
-+ */
-+void rt_version_fixup( void )
-+{
-+ uint64_t hostver = g_hostInterfaces->interfaceVersion;
-+ if( HOSTBOOT_RUNTIME_INTERFACE_VERSION == hostver )
-+ {
-+ return; //nothing to do, we match
-+ }
-+
-+ char verstring[100];
-+ sprintf( verstring,
-+ "HRBT Ver=%X, HostVer=%X\n",
-+ HOSTBOOT_RUNTIME_INTERFACE_VERSION,
-+ hostver );
-+ (g_hostInterfaces->puts)(verstring);
-+}
-+
- /** Call C++ constructors present in this image. */
- void rt_cppBootstrap();
-
-@@ -111,6 +132,9 @@ runtimeInterfaces_t* rt_start(hostInterfaces_t* intf)
- postInitCalls_t* rtPost = getPostInitCalls();
- rtPost->callApplyTempOverrides();
-
-+ // do any version mismatch fixups
-+ rt_version_fixup();
-+
- // Return our interface pointer structure.
- return rtInterfaces;
- }
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/p9Patches/hostboot-0012-Revert-increase-I2C_BUS_SPEED_ARRAY-to-be-4x13-array.patch b/openpower/package/hostboot/p9Patches/hostboot-0012-Revert-increase-I2C_BUS_SPEED_ARRAY-to-be-4x13-array.patch
new file mode 100644
index 0000000..709b022
--- /dev/null
+++ b/openpower/package/hostboot/p9Patches/hostboot-0012-Revert-increase-I2C_BUS_SPEED_ARRAY-to-be-4x13-array.patch
@@ -0,0 +1,234 @@
+From 7abdc8fec08c12bff5d52f4ee0f4a30c8e4c7137 Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Mon, 12 Jun 2017 08:22:27 -0500
+Subject: [PATCH] Revert "increase I2C_BUS_SPEED_ARRAY to be 4x13 array"
+
+This reverts commit cfc04f8b5bb5453603d2e683502fd5c47fa7fc58.
+---
+ src/usr/targeting/common/genHwsvMrwXml.pl | 38 ++++++++-------
+ src/usr/targeting/common/processMrw.pl | 55 +++++++++++++---------
+ .../targeting/common/xmltohb/attribute_types.xml | 10 ++--
+ .../common/xmltohb/simics_NIMBUS.system.xml | 16 +++----
+ .../targeting/common/xmltohb/vbu_NIMBUS.system.xml | 8 ++--
+ 5 files changed, 67 insertions(+), 60 deletions(-)
+
+diff --git a/src/usr/targeting/common/genHwsvMrwXml.pl b/src/usr/targeting/common/genHwsvMrwXml.pl
+index 18b8399..5cf4ad9 100755
+--- a/src/usr/targeting/common/genHwsvMrwXml.pl
++++ b/src/usr/targeting/common/genHwsvMrwXml.pl
+@@ -7043,11 +7043,9 @@ sub addI2cBusSpeedArray
+ my $tmp_offset = 0x0;
+ my $tmp_ct eq "";
+
+- # bus_speed_array[engine][port] is 4x13 array
+- my @speed_array = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
++ # bus_speed_array[engine][port] is 4x4 array
++ my @speed_array = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
++
+ # Loop through all i2c devices
+ for my $i ( 0 .. $#I2Cdevices )
+ {
+@@ -7135,7 +7133,7 @@ sub addI2cBusSpeedArray
+ $tmp_speed = $I2Cdevices[$i]{i2c_speed};
+ $tmp_engine = $I2Cdevices[$i]{i2c_engine};
+ $tmp_port = $I2Cdevices[$i]{i2c_port};
+- $tmp_offset = ($tmp_engine * 13) + $tmp_port;
++ $tmp_offset = ($tmp_engine * 4) + $tmp_port;
+
+ # use the slower speed if there is a previous entry
+ if ( ($speed_array[$tmp_offset] == 0) ||
+@@ -7149,18 +7147,22 @@ sub addI2cBusSpeedArray
+ print " <attribute>\n";
+ print " <id>I2C_BUS_SPEED_ARRAY</id>\n";
+ print " <default>\n";
+-
+- my $speed_array_len = scalar(@speed_array);
+- my $speed_array_str = "";
+- for my $i (0 .. $speed_array_len)
+- {
+- $speed_array_str .= " $speed_array[$i],\n";
+- }
+-
+- #remove last ","
+- $speed_array_str =~ s/,\n$/\n/;
+- print $speed_array_str;
+-
++ print " $speed_array[0],\n";
++ print " $speed_array[1],\n";
++ print " $speed_array[2],\n";
++ print " $speed_array[3],\n";
++ print " $speed_array[4],\n";
++ print " $speed_array[5],\n";
++ print " $speed_array[6],\n";
++ print " $speed_array[7],\n";
++ print " $speed_array[8],\n";
++ print " $speed_array[9],\n";
++ print " $speed_array[10],\n";
++ print " $speed_array[11],\n";
++ print " $speed_array[12],\n";
++ print " $speed_array[13],\n";
++ print " $speed_array[14],\n";
++ print " $speed_array[15],\n";
+ print " </default>\n";
+ print " </attribute>\n";
+
+diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
+index e907bcf..7b558de 100644
+--- a/src/usr/targeting/common/processMrw.pl
++++ b/src/usr/targeting/common/processMrw.pl
+@@ -666,17 +666,22 @@ sub processI2cSpeeds
+ my @bus_speeds;
+ my $bus_speed_attr=$targetObj->getAttribute($target,"I2C_BUS_SPEED_ARRAY");
+ my @bus_speeds2 = split(/,/,$bus_speed_attr);
+-
+- #need to create a 4X13 array
+- my $i = 0;
+- for my $engineIdx (0 .. 3)
+- {
+- for my $portIdx (0 .. 12)
+- {
+- $bus_speeds[$engineIdx][$portIdx] = $bus_speeds2[$i];
+- $i++;
+- }
+- }
++ $bus_speeds[0][0] = $bus_speeds2[0];
++ $bus_speeds[0][1] = $bus_speeds2[1];
++ $bus_speeds[0][2] = $bus_speeds2[2];
++ $bus_speeds[0][3] = $bus_speeds2[3];
++ $bus_speeds[1][0] = $bus_speeds2[4];
++ $bus_speeds[1][1] = $bus_speeds2[5];
++ $bus_speeds[1][2] = $bus_speeds2[6];
++ $bus_speeds[1][3] = $bus_speeds2[7];
++ $bus_speeds[2][0] = $bus_speeds2[8];
++ $bus_speeds[2][1] = $bus_speeds2[9];
++ $bus_speeds[2][2] = $bus_speeds2[10];
++ $bus_speeds[2][3] = $bus_speeds2[11];
++ $bus_speeds[3][0] = $bus_speeds2[12];
++ $bus_speeds[3][1] = $bus_speeds2[13];
++ $bus_speeds[3][2] = $bus_speeds2[14];
++ $bus_speeds[3][3] = $bus_speeds2[15];
+
+ my $i2cs=$targetObj->findConnections($target,"I2C","");
+ if ($i2cs ne "") {
+@@ -710,18 +715,22 @@ sub processI2cSpeeds
+ }
+ }
+ }
+-
+- #need to flatten 4x13 array
+- $bus_speed_attr = "";
+- for my $engineIdx (0 .. 3)
+- {
+- for my $portIdx (0 .. 12)
+- {
+- $bus_speed_attr .= $bus_speeds[$engineIdx][$portIdx] . ",";
+- }
+- }
+- #remove last ,
+- $bus_speed_attr =~ s/,$//;
++ $bus_speed_attr = $bus_speeds[0][0].",".
++ $bus_speeds[0][1].",".
++ $bus_speeds[0][2].",".
++ $bus_speeds[0][3].",".
++ $bus_speeds[1][0].",".
++ $bus_speeds[1][1].",".
++ $bus_speeds[1][2].",".
++ $bus_speeds[1][3].",".
++ $bus_speeds[2][0].",".
++ $bus_speeds[2][1].",".
++ $bus_speeds[2][2].",".
++ $bus_speeds[2][3].",".
++ $bus_speeds[3][0].",".
++ $bus_speeds[3][1].",".
++ $bus_speeds[3][2].",".
++ $bus_speeds[3][3];
+
+ $targetObj->setAttribute($target,"I2C_BUS_SPEED_ARRAY",$bus_speed_attr);
+ }
+diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml
+index 1bbf23f..77465d2 100644
+--- a/src/usr/targeting/common/xmltohb/attribute_types.xml
++++ b/src/usr/targeting/common/xmltohb/attribute_types.xml
+@@ -17209,20 +17209,16 @@ Measured in GB</description>
+ Creator: MRW
+ Purpose: Used by FW to know the fastest possible bus speed that all of
+ the devices on a given bus are able to use.
+- Data Format: 4x13 array of uint16_t values. The first index indicates
++ Data Format: 4x4 array of uint16_t values. The first index indicates
+ the engine number of the bus. The second index indicates the port
+ number of the bus. The value in the array is the I2C bus speed
+ used for that engine/port combination in KHz.
+ </description>
+ <simpleType>
+ <uint16_t>
+- <default>
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0</default>
++ <default>0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0</default>
+ </uint16_t>
+- <array>4,13</array>
++ <array>4,4</array>
+ </simpleType>
+ <persistency>non-volatile</persistency>
+ <readable/>
+diff --git a/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml b/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml
+index fd630d5..485881f 100644
+--- a/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml
++++ b/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml
+@@ -458,10 +458,10 @@
+ <attribute>
+ <id>I2C_BUS_SPEED_ARRAY</id>
+ <default>
+- 400,400,0,0,0,0,0,0,0,0,0,0,0,
+- 400,400,400,400,0,0,0,0,0,0,0,0,0,
+- 400,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0
++ 0, 0, 0, 0,
++ 400, 400, 400, 400,
++ 400, 0, 0, 0,
++ 0, 0, 0, 0
+ </default>
+ </attribute>
+ <attribute>
+@@ -5440,10 +5440,10 @@
+ <attribute>
+ <id>I2C_BUS_SPEED_ARRAY</id>
+ <default>
+- 400,400,0,0,0,0,0,0,0,0,0,0,0,
+- 400,400,400,400,0,0,0,0,0,0,0,0,0,
+- 400,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0
++ 0, 0, 0, 0,
++ 400, 400, 400, 400,
++ 0, 0, 0, 0,
++ 0, 0, 0, 0
+ </default>
+ </attribute>
+ <!-- FSI connections -->
+diff --git a/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml b/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml
+index ffe2503..ac19f28 100644
+--- a/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml
++++ b/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml
+@@ -428,10 +428,10 @@
+ <attribute>
+ <id>I2C_BUS_SPEED_ARRAY</id>
+ <default>
+- 400,400,0,0,0,0,0,0,0,0,0,0,0,
+- 400,400,400,400,0,0,0,0,0,0,0,0,0,
+- 400,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0
++ 400, 0, 0, 0,
++ 0, 400, 0, 400,
++ 400, 0, 0, 0,
++ 0, 0, 0, 0
+ </default>
+ </attribute>
+ <attribute>
+--
+1.8.2.2
+