diff options
| author | Evan Lojewski <github@meklort.com> | 2020-11-01 14:40:12 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-01 14:40:12 -0700 |
| commit | 729709bc91c48c4f1d833e4f58aa9f5fb76f5d8d (patch) | |
| tree | e9f3aa1487c32fdde3d9a4a563d998acd71cde8b /utils/bcmflash | |
| parent | b56f59b9aa41fe6644232d0a44cb34d5fdc21753 (diff) | |
| download | bcm5719-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-x | utils/bcmflash/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | utils/bcmflash/create_header.c | 94 | ||||
| -rw-r--r-- | utils/bcmflash/create_header.h | 63 | ||||
| -rw-r--r-- | utils/bcmflash/main.cpp | 22 | ||||
| -rw-r--r-- | utils/bcmflash/nvm_blackbird.c | 172 | ||||
| -rw-r--r-- | utils/bcmflash/nvm_kh08p.c | 172 | ||||
| -rw-r--r-- | utils/bcmflash/nvm_talos2.c | 172 |
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); |

