summaryrefslogtreecommitdiffstats
path: root/utils/bcmflash
diff options
context:
space:
mode:
authorEvan Lojewski <github@meklort.com>2020-11-01 14:40:12 -0700
committerGitHub <noreply@github.com>2020-11-01 14:40:12 -0700
commit729709bc91c48c4f1d833e4f58aa9f5fb76f5d8d (patch)
treee9f3aa1487c32fdde3d9a4a563d998acd71cde8b /utils/bcmflash
parentb56f59b9aa41fe6644232d0a44cb34d5fdc21753 (diff)
downloadbcm5719-ortega-729709bc91c48c4f1d833e4f58aa9f5fb76f5d8d.tar.gz
bcm5719-ortega-729709bc91c48c4f1d833e4f58aa9f5fb76f5d8d.zip
bcmflash: Create fully valid firmware images for supported targets. (#158)
- Use captured Info and Info2 sections for real firmware images. - Include valid VPD information when creating full fw images.
Diffstat (limited to 'utils/bcmflash')
-rwxr-xr-xutils/bcmflash/CMakeLists.txt6
-rw-r--r--utils/bcmflash/create_header.c94
-rw-r--r--utils/bcmflash/create_header.h63
-rw-r--r--utils/bcmflash/main.cpp22
-rw-r--r--utils/bcmflash/nvm_blackbird.c172
-rw-r--r--utils/bcmflash/nvm_kh08p.c172
-rw-r--r--utils/bcmflash/nvm_talos2.c172
7 files changed, 685 insertions, 16 deletions
diff --git a/utils/bcmflash/CMakeLists.txt b/utils/bcmflash/CMakeLists.txt
index d12c0e0..1839968 100755
--- a/utils/bcmflash/CMakeLists.txt
+++ b/utils/bcmflash/CMakeLists.txt
@@ -8,6 +8,12 @@ set(SOURCES
bcmflash.h
ethtool.c ethtool.h
+
+ # Support files for initializing the firmware header
+ create_header.c create_header.h
+ nvm_talos2.c
+ nvm_blackbird.c
+ nvm_kh08p.c
)
simulator_add_executable(${PROJECT_NAME} ${SOURCES})
diff --git a/utils/bcmflash/create_header.c b/utils/bcmflash/create_header.c
new file mode 100644
index 0000000..5983370
--- /dev/null
+++ b/utils/bcmflash/create_header.c
@@ -0,0 +1,94 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @file main.cpp
+///
+/// @project bcm5719-fw
+///
+/// @brief Main bcmflash tool for parsing BCM5179 flash images.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @copyright Copyright (c) 2018-2020, Evan Lojewski
+/// @cond
+///
+/// All rights reserved.
+///
+/// Redistribution and use in source and binary forms, with or without
+/// modification, are permitted provided that the following conditions are met:
+/// 1. Redistributions of source code must retain the above copyright notice,
+/// this list of conditions and the following disclaimer.
+/// 2. Redistributions in binary form must reproduce the above copyright notice,
+/// this list of conditions and the following disclaimer in the documentation
+/// and/or other materials provided with the distribution.
+/// 3. Neither the name of the copyright holder nor the
+/// names of its contributors may be used to endorse or promote products
+/// derived from this software without specific prior written permission.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+/// SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/// POSSIBILITY OF SUCH DAMAGE.
+/// @endcond
+////////////////////////////////////////////////////////////////////////////////
+
+#include "create_header.h"
+
+#include <NVRam.h>
+#include <bcm5719_eeprom.h>
+#include <endian.h>
+#include <string.h>
+
+static struct
+{
+ const char *name;
+ NVRAMInfo_t *info;
+ NVRAMInfo2_t *info2;
+ unsigned char *vpd;
+ size_t vpd_length;
+} devices[] = {
+ { .name = "blackbird", .info = &gBlackbirdNVRAMInfo, .info2 = &gBlackbirdNVRAMInfo2, .vpd = gBlackbirdVPD, .vpd_length = gBlackbirdVPDLength },
+ { .name = "talos2", .info = &gTalosIINVRAMInfo, .info2 = &gTalosIINVRAMInfo2, .vpd = gTalosIIVPD, .vpd_length = gTalosIIVPDLength },
+ { .name = "kh08p", .info = &gKH08PNVRAMInfo, .info2 = &gKH08PNVRAMInfo2, .vpd = gKH08PVPD, .vpd_length = gKH08PVPDLength },
+};
+
+void init_firmware_header(NVRAMContents_t *nvram, const char *type)
+{
+ for (size_t i = 0; i < ARRAY_ELEMENTS(devices); i++)
+ {
+ if (0 == strncmp(type, devices[i].name, strlen(devices[i].name) + 1))
+ {
+ // Found the right device to use.
+ memcpy(&nvram->info, devices[i].info, sizeof(NVRAMInfo_t));
+ memcpy(&nvram->info2, devices[i].info2, sizeof(NVRAMInfo2_t));
+ if (devices[i].vpd_length <= sizeof(vpd_t))
+ {
+ memcpy(&nvram->vpd, devices[i].vpd, devices[i].vpd_length);
+ }
+ break;
+ }
+ }
+
+ nvram->header.magic = htobe32(BCM_NVRAM_MAGIC);
+ nvram->header.bootstrapPhysAddr = htobe32(0x08003800);
+ nvram->header.bootstrapOffset = htobe32(sizeof(NVRAMContents_t));
+ nvram->header.bootstrapWords = 0;
+ nvram->header.crc = 0;
+}
+
+void fixup_firmware_header(NVRAMContents_t *nvram)
+{
+ // CRC fixup
+ nvram->info.mfrCRC = ~NVRam_crc((uint8_t *)&nvram->info, sizeof(NVRAMInfo_t) - 4, 0xffffffff);
+ nvram->header.crc = ~NVRam_crc((uint8_t *)&nvram->header, sizeof(nvram->header) - 4, 0xffffffff);
+}
diff --git a/utils/bcmflash/create_header.h b/utils/bcmflash/create_header.h
new file mode 100644
index 0000000..7114365
--- /dev/null
+++ b/utils/bcmflash/create_header.h
@@ -0,0 +1,63 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @file main.cpp
+///
+/// @project bcm5719-fw
+///
+/// @brief Main bcmflash tool for parsing BCM5179 flash images.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @copyright Copyright (c) 2018-2020, Evan Lojewski
+/// @cond
+///
+/// All rights reserved.
+///
+/// Redistribution and use in source and binary forms, with or without
+/// modification, are permitted provided that the following conditions are met:
+/// 1. Redistributions of source code must retain the above copyright notice,
+/// this list of conditions and the following disclaimer.
+/// 2. Redistributions in binary form must reproduce the above copyright notice,
+/// this list of conditions and the following disclaimer in the documentation
+/// and/or other materials provided with the distribution.
+/// 3. Neither the name of the copyright holder nor the
+/// names of its contributors may be used to endorse or promote products
+/// derived from this software without specific prior written permission.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+/// SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/// POSSIBILITY OF SUCH DAMAGE.
+/// @endcond
+////////////////////////////////////////////////////////////////////////////////
+
+#include <bcm5719_eeprom.h>
+
+extern NVRAMInfo_t gTalosIINVRAMInfo;
+extern NVRAMInfo2_t gTalosIINVRAMInfo2;
+extern unsigned char gTalosIIVPD[];
+extern size_t gTalosIIVPDLength;
+
+extern NVRAMInfo_t gBlackbirdNVRAMInfo;
+extern NVRAMInfo2_t gBlackbirdNVRAMInfo2;
+extern unsigned char gBlackbirdVPD[];
+extern size_t gBlackbirdVPDLength;
+
+extern NVRAMInfo_t gKH08PNVRAMInfo;
+extern NVRAMInfo2_t gKH08PNVRAMInfo2;
+extern unsigned char gKH08PVPD[];
+extern size_t gKH08PVPDLength;
+
+void init_firmware_header(NVRAMContents_t *nvram, const char *type);
+void fixup_firmware_header(NVRAMContents_t *nvram);
diff --git a/utils/bcmflash/main.cpp b/utils/bcmflash/main.cpp
index eb01383..c6e04bc 100644
--- a/utils/bcmflash/main.cpp
+++ b/utils/bcmflash/main.cpp
@@ -43,6 +43,7 @@
////////////////////////////////////////////////////////////////////////////////
#include "bcmflash.h"
+#include "create_header.h"
#include "ethtool.h"
#include <../bcm5719_NVM.h>
@@ -295,7 +296,6 @@ void dump_info(NVRAMInfo_t *info, NVRAMInfo2_t *info2)
printf("Device ID: 0x%04X\n", be16toh(info->deviceID));
printf("Subsystem Vendor ID: 0x%04X\n", be16toh(info->subsystemVendorID));
printf("Subsystem Device ID: 0x%04X\n", be16toh(info->subsystemDeviceID));
- printf("Subsystem ID: 0x%04X\n", be16toh(info->subsystemDeviceID));
printf("Function 0S Subsystem ID 0x%04X\n", be16toh(info2->pciSubsystemF0SERDES));
printf("Function 1S Subsystem ID 0x%04X\n", be16toh(info2->pciSubsystemF1SERDES));
@@ -480,7 +480,7 @@ int main(int argc, char const *argv[])
parser.add_option("-r", "restore").dest("restore").help("Update the target device to match the specified file.").metavar("FILE");
- parser.add_option("-c", "--create").dest("create").action("store_true").set_default("0").help("Create a full firmware image for use with fwupd.");
+ parser.add_option("-c", "--create").choices({ "talos2", "blackbird", "kh08p" }).dest("create").help("Create a full firmware image for use with fwupd.");
for (size_t i = 0; i < ARRAY_ELEMENTS(mac_table); i++)
{
@@ -548,21 +548,13 @@ int main(int argc, char const *argv[])
}
}
- if (options.get("create"))
+ if (options.is_set("create"))
{
// Default to erased flash contents.
memset(nvram.words, -1, sizeof(nvram.words));
+ memset(&nvram.contents.vpd, 0, sizeof(nvram.contents.vpd));
- memcpy(nvram.contents.info.partNumber, "BCM95719", sizeof("BCM95719"));
- memcpy(nvram.contents.info.partRevision, "A0", sizeof("A0"));
- nvram.contents.info.vendorID = htobe16(0x14E4);
- nvram.contents.info.deviceID = htobe16(0x1657);
-
- nvram.contents.header.magic = htobe32(BCM_NVRAM_MAGIC);
- nvram.contents.header.bootstrapPhysAddr = htobe32(0x08003800);
- nvram.contents.header.bootstrapOffset = htobe32(sizeof(NVRAMContents_t));
- nvram.contents.header.bootstrapWords = 0;
- nvram.contents.header.crc = 0;
+ init_firmware_header(&nvram.contents, options["create"].c_str());
if (options.is_set("stage1"))
{
@@ -620,8 +612,6 @@ int main(int argc, char const *argv[])
nvram_size = sizeof(uint32_t) * ((&stage2->words[1] - nvram.words) + ape_length);
}
-
- memset(&nvram.contents.vpd, 0, sizeof(nvram.contents.vpd));
}
else
{
@@ -828,7 +818,7 @@ int main(int argc, char const *argv[])
if (should_write)
{
// Fixup the firmware header now that all information is up to date.
- nvram.contents.header.crc = ~NVRam_crc((uint8_t *)&nvram.contents.header, sizeof(nvram.contents.header) - 4, 0xffffffff);
+ fixup_firmware_header(&nvram.contents);
printf("Header CRC: %x\n", nvram.contents.header.crc);
// write updated nvram.
diff --git a/utils/bcmflash/nvm_blackbird.c b/utils/bcmflash/nvm_blackbird.c
new file mode 100644
index 0000000..b71d39b
--- /dev/null
+++ b/utils/bcmflash/nvm_blackbird.c
@@ -0,0 +1,172 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @file blackbird.c
+///
+/// @project bcm5719-fw
+///
+/// @brief NVRAM configuration for use with the blackbird.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @copyright Copyright (c) 2020, Evan Lojewski
+/// @cond
+///
+/// All rights reserved.
+///
+/// Redistribution and use in source and binary forms, with or without
+/// modification, are permitted provided that the following conditions are met:
+/// 1. Redistributions of source code must retain the above copyright notice,
+/// this list of conditions and the following disclaimer.
+/// 2. Redistributions in binary form must reproduce the above copyright notice,
+/// this list of conditions and the following disclaimer in the documentation
+/// and/or other materials provided with the distribution.
+/// 3. Neither the name of the copyright holder nor the
+/// names of its contributors may be used to endorse or promote products
+/// derived from this software without specific prior written permission.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+/// SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/// POSSIBILITY OF SUCH DAMAGE.
+/// @endcond
+////////////////////////////////////////////////////////////////////////////////
+
+#include "create_header.h"
+
+#include <bcm5719_eeprom.h>
+
+#ifdef __LITTLE_ENDIAN__
+#define htobe32(__x__) ((((__x__)&0x000000FF) << 24) | (((__x__)&0x0000FF00) << 8) | (((__x__)&0x00FF0000) >> 8) | (((__x__)&0xFF000000) >> 24))
+#define htobe16(__x__) ((((__x__)&0x00FF) << 8) | (((__x__)&0xFF00) >> 8))
+#elif __BIG_ENDIAN__
+#define htobe32(__x__) (__x__)
+#define htobe16(__x__) (__x__)
+#else
+#error Unknown endianness
+#endif
+
+NVRAMInfo2_t gBlackbirdNVRAMInfo2 = {
+ .mfr2Unk = 0, // [200] 00 00 -- Unknown, probably unused.
+ .mfr2Len = htobe16(sizeof(NVRAMInfo2_t)), // [202] 00 8C -- Length of manufacturing section 2.
+ .UNKNOWN0 = 0, // [204] 00 00 00 00 -- Could be reserved.
+
+ .macAddr2 = { 0 }, // 1 [208] Upper 16 bits are zero/unused.
+
+ .UNKNOWN1 = 0, // [210] 0
+ .UNKNOWN2 = 0, // [214] 0
+ .UNKNOWN3 = 0, // [218] 0
+ .cfg5 = 0, // 1 [21C] 0 - GEN_CFG_5. g_unknownInitWord3
+ .UNKNOWN4 = 0, // [220] 0
+ .UNKNOWN5 = 0, // [224] 0
+
+ .func3PXEVLAN = htobe16(0),
+ .func2PXEVLAN = htobe16(0),
+
+ .pciSubsystemF0GPHY = htobe16(0x1981),
+ .pciSubsystemF1GPHY = htobe16(0x1981),
+ .pciSubsystemF2GPHY = htobe16(0x1981),
+ .pciSubsystemF3GPHY = htobe16(0x1981),
+ .pciSubsystemF0SERDES = htobe16(0x1657),
+ .pciSubsystemF1SERDES = htobe16(0x1657),
+ .pciSubsystemF2SERDES = htobe16(0x1657),
+ .pciSubsystemF3SERDES = htobe16(0x1657),
+
+ .UNKNOWN7 = 0, // [23C] 0
+ .UNKNOWN8 = 0, // [240] 0
+ .UNKNOWN9 = 0, // [244] 0
+ .UNKNOWN10 = 0, // [248] 0
+ .UNKNOWN11 = 0, // [24C] 0
+ .func2CfgFeature = htobe32(0xC5C00000), // 1 [250] C5 C0 00 00 - Function 2 GEN_CFG_1E4.
+ .func2CfgHW = htobe32(0x00004014), // 1 [254] 00 00 40 14 - Function 2 GEN_CFG_2.
+
+ .macAddr3 = { 0 }, // 1 [258] Upper 16 bits are zero/unused.
+
+ .func3CfgFeature = htobe32(0xC5C00000), // 1 [260] C5 C0 00 00 - Function 3 GEN_CFG_1E4.
+ .func3CfgHW = htobe32(0x00004014), // 1 [264] 00 00 40 14 - Function 3 GEN_CFG_2.
+ .UNKNOWN12 = 0, // [268] 0a
+ .UNKNOWN13 = 0, // [26C] 0a
+ .UNKNOWN14 = 0, // [270] 0a
+ .UNKNOWN15 = 0, // [274] 0a
+ .func0CfgHW2 = htobe32(0x00000040), // 1 [278] 00 00 00 40 - Function 0 GEN_CFG_2A8.a
+ .func1CfgHW2 = htobe32(0x00000040), // 1 [27C] 00 00 00 40 - Function 1 GEN_CFG_2A8.a
+ .func2CfgHW2 = htobe32(0x00000040), // 1 [280] 00 00 00 40 - Function 2 GEN_CFG_2A8.a
+ .func3CfgHW2 = htobe32(0x00000040), // 1 [284] 00 00 00 40 - Function 3 GEN_CFG_2A8.a
+ .mfr2CRC = 0, // [288] 1A AC 41 A6 // could be CRC
+};
+
+NVRAMInfo_t gBlackbirdNVRAMInfo = {
+ .macAddr0 = { 0 }, /* Placeholder*/
+ .partNumber = "BCM95719",
+ .partRevision = { 'A', '0' },
+ .firmwareRevision = 0, /* Placeholder*/
+ .mfrData = { 0 },
+ .func1PXEVLAN = 0,
+ .func0PXEVLAN = 0,
+ .vendorID = htobe16(0x1657), /*< PCI Vendor ID. */
+ .deviceID = htobe16(0x14E4), /*< PCI Device ID. */
+ .subsystemVendorID = htobe16(0x1657), /*< PCI Subsystem Vendor ID. */
+ .subsystemDeviceID = htobe16(0x14E4), /*< PCI Subsystem Device ID. */
+
+ .cpuClock = htobe16(66), /*< 66MHz, Legacy */
+
+ .SMBusAddr = 0,
+ .SMBusAddrBMC = 0,
+
+ .macAddr0Backup = { 0 },
+ .macAddr1Backup = { 0 },
+
+ .powerDissipatedD0 = 0x64,
+ .powerDissipatedD1 = 0x00,
+ .powerDissipatedD2 = 0x00,
+ .powerDissipatedD3 = 0x0A,
+
+ .powerConsumedD0 = 0x64, /*< Power consumed in the D0 state. Note: The data scale is hard coded at 0.1. */
+ .powerConsumedD1 = 0x00, /*< Power consumed in the D1 state. The NetXtreme II family does not support the D1 state. */
+ .powerConsumedD2 = 0x00, /*< Power consumed in the D2 state. The NetXtreme II family does not support the D2 state. */
+ .powerConsumedD3 = 0x0A, /*< Power consumed in the D3 state. Note: The data scale is hard coded at 0.1. */
+
+ .func0CfgFeature = htobe32(0xC5C00080),
+ .func0CfgHW = htobe32(0x00004014),
+
+ .macAddr1 = { 0 },
+ .func1CfgFeature = htobe32(0xC5C00000),
+ .func1CfgHW = htobe32(0x00004014),
+
+ .cfgShared = htobe32(0x00C2AA38),
+ .powerBudget0 = htobe32(0x2C163C2C),
+ .powerBudget1 = htobe32(0x0000230A),
+ .serworksUse = 0,
+ .func1SERDESOverride = 0,
+ .func0SERDESOverride = 0,
+ .tpmNVMSize = 0,
+ .macNVMSize = htobe16(4),
+ .powerBudget2 = htobe32(0x00000000),
+ .powerBudget3 = htobe32(0x00000000),
+ .mfrCRC = 0,
+};
+
+unsigned char gBlackbirdVPD[] = {
+ 0x82, 0x2f, 0x00, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x6f, 0x6d, 0x20, 0x4e, 0x65, 0x74, 0x58, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x20, 0x47, 0x69, 0x67, 0x61,
+ 0x62, 0x69, 0x74, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x00, 0x90, 0x4b,
+ 0x00, 0x50, 0x4e, 0x08, 0x42, 0x43, 0x4d, 0x39, 0x35, 0x37, 0x31, 0x39, 0x45, 0x43, 0x09, 0x31, 0x30, 0x36, 0x36, 0x37, 0x39, 0x2d, 0x31, 0x35, 0x53, 0x4e,
+ 0x0a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x4d, 0x4e, 0x04, 0x31, 0x34, 0x65, 0x34, 0x52, 0x56, 0x1d, 0x15, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x7c,
+ 0x00, 0x59, 0x41, 0x0b, 0x58, 0x59, 0x5a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x52, 0x57, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78
+};
+
+size_t gBlackbirdVPDLength = sizeof(gBlackbirdVPD);
diff --git a/utils/bcmflash/nvm_kh08p.c b/utils/bcmflash/nvm_kh08p.c
new file mode 100644
index 0000000..890e548
--- /dev/null
+++ b/utils/bcmflash/nvm_kh08p.c
@@ -0,0 +1,172 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @file kh08p.c
+///
+/// @project bcm5719-fw
+///
+/// @brief NVRAM configuration for use with the KH08P.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @copyright Copyright (c) 2020, Evan Lojewski
+/// @cond
+///
+/// All rights reserved.
+///
+/// Redistribution and use in source and binary forms, with or without
+/// modification, are permitted provided that the following conditions are met:
+/// 1. Redistributions of source code must retain the above copyright notice,
+/// this list of conditions and the following disclaimer.
+/// 2. Redistributions in binary form must reproduce the above copyright notice,
+/// this list of conditions and the following disclaimer in the documentation
+/// and/or other materials provided with the distribution.
+/// 3. Neither the name of the copyright holder nor the
+/// names of its contributors may be used to endorse or promote products
+/// derived from this software without specific prior written permission.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+/// SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/// POSSIBILITY OF SUCH DAMAGE.
+/// @endcond
+////////////////////////////////////////////////////////////////////////////////
+
+#include "create_header.h"
+
+#include <bcm5719_eeprom.h>
+
+#ifdef __LITTLE_ENDIAN__
+#define htobe32(__x__) ((((__x__)&0x000000FF) << 24) | (((__x__)&0x0000FF00) << 8) | (((__x__)&0x00FF0000) >> 8) | (((__x__)&0xFF000000) >> 24))
+#define htobe16(__x__) ((((__x__)&0x00FF) << 8) | (((__x__)&0xFF00) >> 8))
+#elif __BIG_ENDIAN__
+#define htobe32(__x__) (__x__)
+#define htobe16(__x__) (__x__)
+#else
+#error Unknown endianness
+#endif
+
+NVRAMInfo2_t gKH08PNVRAMInfo2 = {
+ .mfr2Unk = 0, // [200] 00 00 -- Unknown, probably unused.
+ .mfr2Len = htobe16(sizeof(NVRAMInfo2_t)), // [202] 00 8C -- Length of manufacturing section 2.
+ .UNKNOWN0 = 0, // [204] 00 00 00 00 -- Could be reserved.
+
+ .macAddr2 = { 0 }, // 1 [208] Upper 16 bits are zero/unused.
+
+ .UNKNOWN1 = 0, // [210] 0
+ .UNKNOWN2 = 0, // [214] 0
+ .UNKNOWN3 = 0, // [218] 0
+ .cfg5 = 0, // 1 [21C] 0 - GEN_CFG_5. g_unknownInitWord3
+ .UNKNOWN4 = 0, // [220] 0
+ .UNKNOWN5 = 0, // [224] 0
+
+ .func3PXEVLAN = htobe16(1),
+ .func2PXEVLAN = htobe16(1),
+
+ .pciSubsystemF0GPHY = htobe16(0x1904),
+ .pciSubsystemF1GPHY = htobe16(0x1904),
+ .pciSubsystemF2GPHY = htobe16(0x1904),
+ .pciSubsystemF3GPHY = htobe16(0x1904),
+ .pciSubsystemF0SERDES = htobe16(0x1657),
+ .pciSubsystemF1SERDES = htobe16(0x1657),
+ .pciSubsystemF2SERDES = htobe16(0x1657),
+ .pciSubsystemF3SERDES = htobe16(0x1657),
+
+ .UNKNOWN7 = 0, // [23C] 0
+ .UNKNOWN8 = 0, // [240] 0
+ .UNKNOWN9 = 0, // [244] 0
+ .UNKNOWN10 = 0, // [248] 0
+ .UNKNOWN11 = 0, // [24C] 0
+ .func2CfgFeature = htobe32(0xCDB50202), // 1 [250] C5 C0 00 00 - Function 2 GEN_CFG_1E4.
+ .func2CfgHW = htobe32(0x00006014), // 1 [254] 00 00 40 14 - Function 2 GEN_CFG_2.
+
+ .macAddr3 = { 0 }, // 1 [258] Upper 16 bits are zero/unused.
+
+ .func3CfgFeature = htobe32(0xCDB50202), // 1 [260] C5 C0 00 00 - Function 3 GEN_CFG_1E4.
+ .func3CfgHW = htobe32(0x00006014), // 1 [264] 00 00 40 14 - Function 3 GEN_CFG_2.
+ .UNKNOWN12 = 0, // [268] 0a
+ .UNKNOWN13 = 0, // [26C] 0a
+ .UNKNOWN14 = 0, // [270] 0a
+ .UNKNOWN15 = 0, // [274] 0a
+ .func0CfgHW2 = htobe32(0x00000042),
+ .func1CfgHW2 = htobe32(0x00000042),
+ .func2CfgHW2 = htobe32(0x00000042),
+ .func3CfgHW2 = htobe32(0x00000042),
+ .mfr2CRC = 0, // [288] 1A AC 41 A6 // could be CRC
+};
+
+NVRAMInfo_t gKH08PNVRAMInfo = {
+ .macAddr0 = { 0 }, /* Placeholder*/
+ .partNumber = "BCM95719",
+ .partRevision = { 'A', '0' },
+ .firmwareRevision = 0, /* Placeholder*/
+ .mfrData = { 0 },
+ .func1PXEVLAN = htobe16(1),
+ .func0PXEVLAN = htobe16(1),
+ .vendorID = htobe16(0x1657), /*< PCI Vendor ID. */
+ .deviceID = htobe16(0x14E4), /*< PCI Device ID. */
+ .subsystemVendorID = htobe16(0x1657), /*< PCI Subsystem Vendor ID. */
+ .subsystemDeviceID = htobe16(0x14E4), /*< PCI Subsystem Device ID. */
+
+ .cpuClock = htobe16(66), /*< 66MHz, Legacy */
+
+ .SMBusAddr = 0x64,
+ .SMBusAddrBMC = 0,
+
+ .macAddr0Backup = { 0 },
+ .macAddr1Backup = { 0 },
+
+ .powerDissipatedD0 = 0x64,
+ .powerDissipatedD1 = 0x00,
+ .powerDissipatedD2 = 0x00,
+ .powerDissipatedD3 = 0x0A,
+
+ .powerConsumedD0 = 0x64, /*< Power consumed in the D0 state. Note: The data scale is hard coded at 0.1. */
+ .powerConsumedD1 = 0x00, /*< Power consumed in the D1 state. The NetXtreme II family does not support the D1 state. */
+ .powerConsumedD2 = 0x00, /*< Power consumed in the D2 state. The NetXtreme II family does not support the D2 state. */
+ .powerConsumedD3 = 0x0A, /*< Power consumed in the D3 state. Note: The data scale is hard coded at 0.1. */
+
+ .func0CfgFeature = htobe32(0xCDB50282),
+ .func0CfgHW = htobe32(0x00006014),
+
+ .macAddr1 = { 0 },
+ .func1CfgFeature = htobe32(0xCDB50202),
+ .func1CfgHW = htobe32(0x00006014),
+
+ .cfgShared = htobe32(0x0012AA38),
+ .powerBudget0 = htobe32(0x2C163C2C),
+ .powerBudget1 = htobe32(0x0000230A),
+ .serworksUse = 0,
+ .func1SERDESOverride = 0,
+ .func0SERDESOverride = 0,
+ .tpmNVMSize = 0,
+ .macNVMSize = htobe16(2),
+ .powerBudget2 = htobe32(0x00000000),
+ .powerBudget3 = htobe32(0x00000000),
+ .mfrCRC = 0,
+};
+
+unsigned char gKH08PVPD[] = {
+ 0x82, 0x2f, 0x00, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x6f, 0x6d, 0x20, 0x4e, 0x65, 0x74, 0x58, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x20, 0x47, 0x69, 0x67, 0x61,
+ 0x62, 0x69, 0x74, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x00, 0x90, 0x4b,
+ 0x00, 0x50, 0x4e, 0x08, 0x42, 0x43, 0x4d, 0x39, 0x35, 0x37, 0x31, 0x39, 0x45, 0x43, 0x09, 0x31, 0x30, 0x36, 0x36, 0x37, 0x39, 0x2d, 0x31, 0x35, 0x53, 0x4e,
+ 0x0a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x4d, 0x4e, 0x04, 0x31, 0x34, 0x65, 0x34, 0x52, 0x56, 0x1d, 0x15, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x7c,
+ 0x00, 0x59, 0x41, 0x0b, 0x58, 0x59, 0x5a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x52, 0x57, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78
+};
+
+size_t gKH08PVPDLength = sizeof(gKH08PVPD);
diff --git a/utils/bcmflash/nvm_talos2.c b/utils/bcmflash/nvm_talos2.c
new file mode 100644
index 0000000..07a4b6f
--- /dev/null
+++ b/utils/bcmflash/nvm_talos2.c
@@ -0,0 +1,172 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @file talos2.c
+///
+/// @project bcm5719-fw
+///
+/// @brief NVRAM configuration for use with the Talos II.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @copyright Copyright (c) 2020, Evan Lojewski
+/// @cond
+///
+/// All rights reserved.
+///
+/// Redistribution and use in source and binary forms, with or without
+/// modification, are permitted provided that the following conditions are met:
+/// 1. Redistributions of source code must retain the above copyright notice,
+/// this list of conditions and the following disclaimer.
+/// 2. Redistributions in binary form must reproduce the above copyright notice,
+/// this list of conditions and the following disclaimer in the documentation
+/// and/or other materials provided with the distribution.
+/// 3. Neither the name of the copyright holder nor the
+/// names of its contributors may be used to endorse or promote products
+/// derived from this software without specific prior written permission.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+/// SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/// POSSIBILITY OF SUCH DAMAGE.
+/// @endcond
+////////////////////////////////////////////////////////////////////////////////
+
+#include "create_header.h"
+
+#include <bcm5719_eeprom.h>
+
+#ifdef __LITTLE_ENDIAN__
+#define htobe32(__x__) ((((__x__)&0x000000FF) << 24) | (((__x__)&0x0000FF00) << 8) | (((__x__)&0x00FF0000) >> 8) | (((__x__)&0xFF000000) >> 24))
+#define htobe16(__x__) ((((__x__)&0x00FF) << 8) | (((__x__)&0xFF00) >> 8))
+#elif __BIG_ENDIAN__
+#define htobe32(__x__) (__x__)
+#define htobe16(__x__) (__x__)
+#else
+#error Unknown endianness
+#endif
+
+NVRAMInfo2_t gTalosIINVRAMInfo2 = {
+ .mfr2Unk = 0, // [200] 00 00 -- Unknown, probably unused.
+ .mfr2Len = htobe16(sizeof(NVRAMInfo2_t)), // [202] 00 8C -- Length of manufacturing section 2.
+ .UNKNOWN0 = 0, // [204] 00 00 00 00 -- Could be reserved.
+
+ .macAddr2 = { 0 }, // 1 [208] Upper 16 bits are zero/unused.
+
+ .UNKNOWN1 = 0, // [210] 0
+ .UNKNOWN2 = 0, // [214] 0
+ .UNKNOWN3 = 0, // [218] 0
+ .cfg5 = 0, // 1 [21C] 0 - GEN_CFG_5. g_unknownInitWord3
+ .UNKNOWN4 = 0, // [220] 0
+ .UNKNOWN5 = 0, // [224] 0
+
+ .func3PXEVLAN = htobe16(0),
+ .func2PXEVLAN = htobe16(0),
+
+ .pciSubsystemF0GPHY = htobe16(0x1981),
+ .pciSubsystemF1GPHY = htobe16(0x1981),
+ .pciSubsystemF2GPHY = htobe16(0x1981),
+ .pciSubsystemF3GPHY = htobe16(0x1981),
+ .pciSubsystemF0SERDES = htobe16(0x1657),
+ .pciSubsystemF1SERDES = htobe16(0x1657),
+ .pciSubsystemF2SERDES = htobe16(0x1657),
+ .pciSubsystemF3SERDES = htobe16(0x1657),
+
+ .UNKNOWN7 = 0, // [23C] 0
+ .UNKNOWN8 = 0, // [240] 0
+ .UNKNOWN9 = 0, // [244] 0
+ .UNKNOWN10 = 0, // [248] 0
+ .UNKNOWN11 = 0, // [24C] 0
+ .func2CfgFeature = htobe32(0xC5C00000), // 1 [250] C5 C0 00 00 - Function 2 GEN_CFG_1E4.
+ .func2CfgHW = htobe32(0x00004014), // 1 [254] 00 00 40 14 - Function 2 GEN_CFG_2.
+
+ .macAddr3 = { 0 }, // 1 [258] Upper 16 bits are zero/unused.
+
+ .func3CfgFeature = htobe32(0xC5C00000), // 1 [260] C5 C0 00 00 - Function 3 GEN_CFG_1E4.
+ .func3CfgHW = htobe32(0x00004014), // 1 [264] 00 00 40 14 - Function 3 GEN_CFG_2.
+ .UNKNOWN12 = 0, // [268] 0a
+ .UNKNOWN13 = 0, // [26C] 0a
+ .UNKNOWN14 = 0, // [270] 0a
+ .UNKNOWN15 = 0, // [274] 0a
+ .func0CfgHW2 = htobe32(0x00000040), // 1 [278] 00 00 00 40 - Function 0 GEN_CFG_2A8.a
+ .func1CfgHW2 = htobe32(0x00000040), // 1 [27C] 00 00 00 40 - Function 1 GEN_CFG_2A8.a
+ .func2CfgHW2 = htobe32(0x00000040), // 1 [280] 00 00 00 40 - Function 2 GEN_CFG_2A8.a
+ .func3CfgHW2 = htobe32(0x00000040), // 1 [284] 00 00 00 40 - Function 3 GEN_CFG_2A8.a
+ .mfr2CRC = 0, // [288] 1A AC 41 A6 // could be CRC
+};
+
+NVRAMInfo_t gTalosIINVRAMInfo = {
+ .macAddr0 = { 0 }, /* Placeholder*/
+ .partNumber = "BCM95719",
+ .partRevision = { 'A', '0' },
+ .firmwareRevision = 0, /* Placeholder*/
+ .mfrData = { 0 },
+ .func1PXEVLAN = 0,
+ .func0PXEVLAN = 0,
+ .vendorID = htobe16(0x1657), /*< PCI Vendor ID. */
+ .deviceID = htobe16(0x14E4), /*< PCI Device ID. */
+ .subsystemVendorID = htobe16(0x1657), /*< PCI Subsystem Vendor ID. */
+ .subsystemDeviceID = htobe16(0x14E4), /*< PCI Subsystem Device ID. */
+
+ .cpuClock = htobe16(66), /*< 66MHz, Legacy */
+
+ .SMBusAddr = 0,
+ .SMBusAddrBMC = 0,
+
+ .macAddr0Backup = { 0 },
+ .macAddr1Backup = { 0 },
+
+ .powerDissipatedD0 = 0x64,
+ .powerDissipatedD1 = 0x00,
+ .powerDissipatedD2 = 0x00,
+ .powerDissipatedD3 = 0x0A,
+
+ .powerConsumedD0 = 0x64, /*< Power consumed in the D0 state. Note: The data scale is hard coded at 0.1. */
+ .powerConsumedD1 = 0x00, /*< Power consumed in the D1 state. The NetXtreme II family does not support the D1 state. */
+ .powerConsumedD2 = 0x00, /*< Power consumed in the D2 state. The NetXtreme II family does not support the D2 state. */
+ .powerConsumedD3 = 0x0A, /*< Power consumed in the D3 state. Note: The data scale is hard coded at 0.1. */
+
+ .func0CfgFeature = htobe32(0xC5C00080),
+ .func0CfgHW = htobe32(0x00004014),
+
+ .macAddr1 = { 0 },
+ .func1CfgFeature = htobe32(0xC5C00000),
+ .func1CfgHW = htobe32(0x00004014),
+
+ .cfgShared = htobe32(0x00C2AA38),
+ .powerBudget0 = htobe32(0x2C163C2C),
+ .powerBudget1 = htobe32(0x0000230A),
+ .serworksUse = 0,
+ .func1SERDESOverride = 0,
+ .func0SERDESOverride = 0,
+ .tpmNVMSize = 0,
+ .macNVMSize = htobe16(4),
+ .powerBudget2 = htobe32(0x00000000),
+ .powerBudget3 = htobe32(0x00000000),
+ .mfrCRC = 0,
+};
+
+unsigned char gTalosIIVPD[] = {
+ 0x82, 0x2f, 0x00, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x6f, 0x6d, 0x20, 0x4e, 0x65, 0x74, 0x58, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x20, 0x47, 0x69, 0x67, 0x61,
+ 0x62, 0x69, 0x74, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x00, 0x90, 0x4b,
+ 0x00, 0x50, 0x4e, 0x08, 0x42, 0x43, 0x4d, 0x39, 0x35, 0x37, 0x31, 0x39, 0x45, 0x43, 0x09, 0x31, 0x30, 0x36, 0x36, 0x37, 0x39, 0x2d, 0x31, 0x35, 0x53, 0x4e,
+ 0x0a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x4d, 0x4e, 0x04, 0x31, 0x34, 0x65, 0x34, 0x52, 0x56, 0x1d, 0x15, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x7c,
+ 0x00, 0x59, 0x41, 0x0b, 0x58, 0x59, 0x5a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x52, 0x57, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78
+};
+
+size_t gTalosIIVPDLength = sizeof(gTalosIIVPD);
OpenPOWER on IntegriCloud