1*eee9853fSAlexander FilippovFrom 9b91e2ace1c127344e5e7d32ebb866ca636387fd Mon Sep 17 00:00:00 2001 2eeef3b96SAlexander AmelkinFrom: Alexander Amelkin <alexander@amelkin.msk.ru> 3eeef3b96SAlexander AmelkinDate: Wed, 11 Jul 2018 13:16:01 +0300 4eeef3b96SAlexander AmelkinSubject: [PATCH] Fix version parsing, update AUX revision info 5eeef3b96SAlexander Amelkin 6eeef3b96SAlexander AmelkinAUX Revision info was always taken from the dev_id.json 7eeef3b96SAlexander Amelkinfile if it exists, overriding the value calculated from the 8eeef3b96SAlexander Amelkinactive firmware version string. Also, when AUX info was 9eeef3b96SAlexander Amelkincalculated, it only properly parsed the dirtyness of the 10eeef3b96SAlexander Amelkinbuild. 11eeef3b96SAlexander Amelkin 12eeef3b96SAlexander AmelkinWith this commit the AUX info calculation will properly parse 13eeef3b96SAlexander Amelkinthe git hash part and will include it as higher 3 bytes of 14eeef3b96SAlexander Amelkinthe AUX info. For officially released versions the lower byte 15eeef3b96SAlexander Amelkinwill be zero. 16eeef3b96SAlexander Amelkin 17eeef3b96SAlexander AmelkinFor development versions, bits [7:1] of the fourth byte will 18eeef3b96SAlexander Amelkinall be 1 as an indicator of non-release branch. For unofficial 19eeef3b96SAlexander Amelkinbuilds from release branches those bits will contain a number 20eeef3b96SAlexander Amelkinfrom 1 to 126 indicating a patch level since the release tag. 21eeef3b96SAlexander Amelkin 22eeef3b96SAlexander AmelkinIn any case the bit 0 of byte 4 is a dirtyness indicator. 23eeef3b96SAlexander AmelkinIf the sources used to build the firmware were modified compared 24eeef3b96SAlexander Amelkinto the git hash, this bit will be 1. 25eeef3b96SAlexander Amelkin 26eeef3b96SAlexander AmelkinWARNING: For the AUX decoding from version string to work 27eeef3b96SAlexander Amelkin properly, the dev_id.json file must NOT contain 28eeef3b96SAlexander Amelkin the `aux` property. 29eeef3b96SAlexander Amelkin 30eeef3b96SAlexander AmelkinResolves SRV-775 31eeef3b96SAlexander AmelkinEnd-user-impact: Version info is properly represented in the 32eeef3b96SAlexander Amelkin AUX Revision Info fields in response to the 33eeef3b96SAlexander Amelkin IPMI Get Device ID command (ipmitool mc info) 34*eee9853fSAlexander FilippovSigned-off-by: Alexander Amelkin <a.amelkin@yadro.com> 35*eee9853fSAlexander FilippovSigned-off-by: Alexander Filippov <a.filippov@yadro.com> 36eeef3b96SAlexander Amelkin 37eeef3b96SAlexander Amelkin--- 38*eee9853fSAlexander Filippov apphandler.cpp | 226 +++++++++++++++++++++++++++++++++++-------------- 39*eee9853fSAlexander Filippov 1 file changed, 163 insertions(+), 63 deletions(-) 40eeef3b96SAlexander Amelkin 41eeef3b96SAlexander Amelkindiff --git a/apphandler.cpp b/apphandler.cpp 42*eee9853fSAlexander Filippovindex 6cdd78f..c62cd35 100644 43eeef3b96SAlexander Amelkin--- a/apphandler.cpp 44eeef3b96SAlexander Amelkin+++ b/apphandler.cpp 45eeef3b96SAlexander Amelkin@@ -1,4 +1,5 @@ 46eeef3b96SAlexander Amelkin #include <arpa/inet.h> 47eeef3b96SAlexander Amelkin+#include <endian.h> 48eeef3b96SAlexander Amelkin #include <fcntl.h> 49eeef3b96SAlexander Amelkin #include <limits.h> 50eeef3b96SAlexander Amelkin #include <linux/i2c-dev.h> 51eeef3b96SAlexander Amelkin@@ -459,33 +460,112 @@ ipmi::RspType<uint8_t, // acpiSystemPowerState 52eeef3b96SAlexander Amelkin return ipmi::responseSuccess(sysAcpiState, devAcpiState); 53eeef3b96SAlexander Amelkin } 54eeef3b96SAlexander Amelkin 55eeef3b96SAlexander Amelkin+static 56eeef3b96SAlexander Amelkin+std::vector<std::string> 57eeef3b96SAlexander Amelkin+tokenize(std::string const& str, 58eeef3b96SAlexander Amelkin+ char const token[]) 59eeef3b96SAlexander Amelkin+{ 60eeef3b96SAlexander Amelkin+ std::vector<std::string> results; 61eeef3b96SAlexander Amelkin+ std::string::size_type j = 0; 62eeef3b96SAlexander Amelkin+ while (j < str.length()) 63eeef3b96SAlexander Amelkin+ { 64eeef3b96SAlexander Amelkin+ std::string::size_type k = str.find_first_of(token, j); 65eeef3b96SAlexander Amelkin+ if (k == std::string::npos) 66eeef3b96SAlexander Amelkin+ k = str.length(); 67eeef3b96SAlexander Amelkin+ results.push_back(str.substr(j, k-j)); 68eeef3b96SAlexander Amelkin+ j = k + 1; 69eeef3b96SAlexander Amelkin+ } 70eeef3b96SAlexander Amelkin+ return results; 71eeef3b96SAlexander Amelkin+} 72eeef3b96SAlexander Amelkin+ 73eeef3b96SAlexander Amelkin typedef struct 74eeef3b96SAlexander Amelkin { 75eeef3b96SAlexander Amelkin- char major; 76eeef3b96SAlexander Amelkin- char minor; 77eeef3b96SAlexander Amelkin- uint16_t d[2]; 78eeef3b96SAlexander Amelkin+ uint8_t major; 79eeef3b96SAlexander Amelkin+ uint8_t minor; 80eeef3b96SAlexander Amelkin+ union { 81eeef3b96SAlexander Amelkin+ uint8_t aux[4]; // Individual bytes in IPMI big-endian order 82eeef3b96SAlexander Amelkin+ uint32_t aux32; // use htobe32() on writes to aux32 83eeef3b96SAlexander Amelkin+ }; 84eeef3b96SAlexander Amelkin } Revision; 85eeef3b96SAlexander Amelkin 86eeef3b96SAlexander Amelkin-/* Currently supports the vx.x-x-[-x] and v1.x.x-x-[-x] format. It will */ 87eeef3b96SAlexander Amelkin-/* return -1 if not in those formats, this routine knows how to parse */ 88eeef3b96SAlexander Amelkin+/* Currently supports the following formats. It will return -1 if not in */ 89eeef3b96SAlexander Amelkin+/* those formats: */ 90eeef3b96SAlexander Amelkin+/* */ 91eeef3b96SAlexander Amelkin+/* Format 1: */ 92eeef3b96SAlexander Amelkin /* version = v0.6-19-gf363f61-dirty */ 93eeef3b96SAlexander Amelkin-/* ^ ^ ^^ ^ */ 94eeef3b96SAlexander Amelkin-/* | | |----------|-- additional details */ 95eeef3b96SAlexander Amelkin-/* | |---------------- Minor */ 96eeef3b96SAlexander Amelkin-/* |------------------ Major */ 97eeef3b96SAlexander Amelkin-/* and version = v1.99.10-113-g65edf7d-r3-0-g9e4f715 */ 98eeef3b96SAlexander Amelkin-/* ^ ^ ^^ ^ */ 99eeef3b96SAlexander Amelkin-/* | | |--|---------- additional details */ 100eeef3b96SAlexander Amelkin-/* | |---------------- Minor */ 101eeef3b96SAlexander Amelkin-/* |------------------ Major */ 102eeef3b96SAlexander Amelkin-/* Additional details : If the option group exists it will force Auxiliary */ 103eeef3b96SAlexander Amelkin-/* Firmware Revision Information 4th byte to 1 indicating the build was */ 104eeef3b96SAlexander Amelkin-/* derived with additional edits */ 105eeef3b96SAlexander Amelkin+/* ^ ^ ^^^^^^ ^^^^^ */ 106eeef3b96SAlexander Amelkin+/* | | | | */ 107eeef3b96SAlexander Amelkin+/* | | | `-- AUX dirty flag */ 108eeef3b96SAlexander Amelkin+/* | | `---------- AUX commit hash */ 109eeef3b96SAlexander Amelkin+/* | `---------------- Minor */ 110eeef3b96SAlexander Amelkin+/* `------------------ Major */ 111eeef3b96SAlexander Amelkin+/* */ 112eeef3b96SAlexander Amelkin+/* Format 2: */ 113eeef3b96SAlexander Amelkin+/* version = v1.99.10-113-g65edf7d-r3-0-g9e4f715-dirty */ 114eeef3b96SAlexander Amelkin+/* ^ ^^ ^^^^^^ ^^^^^ */ 115eeef3b96SAlexander Amelkin+/* | | | .-----------------' */ 116eeef3b96SAlexander Amelkin+/* | | | `- AUX dirty flag */ 117eeef3b96SAlexander Amelkin+/* | | `----- AUX commit hash */ 118eeef3b96SAlexander Amelkin+/* | `---------------- Minor */ 119eeef3b96SAlexander Amelkin+/* `------------------ Major */ 120eeef3b96SAlexander Amelkin+/* */ 121eeef3b96SAlexander Amelkin+/* version = v2.09-dev-794-g196400c89-some-branch-name-dirty */ 122eeef3b96SAlexander Amelkin+/* ^ ^^ ^^^^^^ ^^^^^ */ 123eeef3b96SAlexander Amelkin+/* | | | .-----------------------' */ 124eeef3b96SAlexander Amelkin+/* | | | `- AUX dirty flag */ 125eeef3b96SAlexander Amelkin+/* | | `---- AUX commit hash */ 126eeef3b96SAlexander Amelkin+/* | `---------------- Minor */ 127eeef3b96SAlexander Amelkin+/* `------------------ Major */ 128eeef3b96SAlexander Amelkin+/* */ 129eeef3b96SAlexander Amelkin+/* Format 3 (YADRO Releases): */ 130eeef3b96SAlexander Amelkin+/* version = v1.0rcf2817p7-rc2-unofficial-dirty */ 131eeef3b96SAlexander Amelkin+/* ^ ^ ^^^^^^ ^^ .----------^^^^^ */ 132eeef3b96SAlexander Amelkin+/* | | | | `- AUX dirty flag */ 133eeef3b96SAlexander Amelkin+/* | | | `------- AUX patch level (1-126), optional */ 134eeef3b96SAlexander Amelkin+/* | | `-------------- AUX release number */ 135eeef3b96SAlexander Amelkin+/* | `---------------- Minor */ 136eeef3b96SAlexander Amelkin+/* `------------------ Major */ 137eeef3b96SAlexander Amelkin+/* */ 138eeef3b96SAlexander Amelkin+static 139eeef3b96SAlexander Amelkin int convertVersion(std::string s, Revision& rev) 140eeef3b96SAlexander Amelkin { 141eeef3b96SAlexander Amelkin- std::string token; 142eeef3b96SAlexander Amelkin- uint16_t commits; 143eeef3b96SAlexander Amelkin+ std::vector<std::string> tokens; 144eeef3b96SAlexander Amelkin+ bool has_release = false; // version string is of "release" format 3 145eeef3b96SAlexander Amelkin+ bool dirty = false; 146eeef3b96SAlexander Amelkin 147eeef3b96SAlexander Amelkin+ constexpr int TOKEN_MAJOR = 0; 148eeef3b96SAlexander Amelkin+ constexpr int TOKEN_MINOR = 1; 149eeef3b96SAlexander Amelkin+ // These are for "release" format 3 150eeef3b96SAlexander Amelkin+ constexpr int TOKEN_MINOR_HASH = 1; 151eeef3b96SAlexander Amelkin+ constexpr int TOKEN_MINOR_PATCH = 2; 152eeef3b96SAlexander Amelkin+ // For non-release formats 1 and 2 153eeef3b96SAlexander Amelkin+ constexpr int TOKEN_HASH = 3; // Search for git hash starting from this 154eeef3b96SAlexander Amelkin+ 155eeef3b96SAlexander Amelkin+ // Hash info is in the higher 24 bits of AUX F/W Revision Info 156eeef3b96SAlexander Amelkin+ constexpr int AUX_HASH_SHIFT = 8; 157eeef3b96SAlexander Amelkin+ constexpr int AUX_HASH_LEN = 6; 158eeef3b96SAlexander Amelkin+ 159eeef3b96SAlexander Amelkin+ // Non-release indicator is byte 3 (bits 7..1 of AUX F/W Revision Info) 160eeef3b96SAlexander Amelkin+ constexpr int AUX_NON_REL_BYTE = 3; 161eeef3b96SAlexander Amelkin+ constexpr int AUX_NON_REL_SHIFT = 1; 162eeef3b96SAlexander Amelkin+ constexpr uint8_t AUX_NON_REL_VALUE = UINT8_MAX >> AUX_NON_REL_SHIFT; 163eeef3b96SAlexander Amelkin+ 164eeef3b96SAlexander Amelkin+ // Release patch level occupies the same bits as the non-release indicator 165eeef3b96SAlexander Amelkin+ constexpr int AUX_PATCH_BYTE = AUX_NON_REL_BYTE; 166eeef3b96SAlexander Amelkin+ constexpr int AUX_PATCH_SHIFT = AUX_NON_REL_SHIFT; 167eeef3b96SAlexander Amelkin+ constexpr int AUX_MAX_PATCH = AUX_NON_REL_VALUE - 1; 168eeef3b96SAlexander Amelkin+ 169eeef3b96SAlexander Amelkin+ // The least significant bit of byte 3 is the dirty flag 170eeef3b96SAlexander Amelkin+ constexpr int AUX_DIRTY_BYTE = 3; 171eeef3b96SAlexander Amelkin+ constexpr int AUX_DIRTY_SHIFT = 0; 172eeef3b96SAlexander Amelkin+ 173eeef3b96SAlexander Amelkin+ // Use base-16 to convert decimals to BCD 174eeef3b96SAlexander Amelkin+ constexpr int BCD_BASE = 16; 175eeef3b96SAlexander Amelkin+ 176eeef3b96SAlexander Amelkin+ // First of all clear the revision 177eeef3b96SAlexander Amelkin+ rev = {0}; 178eeef3b96SAlexander Amelkin+ 179eeef3b96SAlexander Amelkin+ // Cut off the optional 'v' at the beginning 180eeef3b96SAlexander Amelkin auto location = s.find_first_of('v'); 181eeef3b96SAlexander Amelkin if (location != std::string::npos) 182eeef3b96SAlexander Amelkin { 183*eee9853fSAlexander Filippov@@ -494,64 +574,77 @@ int convertVersion(std::string s, Revision& rev) 184eeef3b96SAlexander Amelkin 185eeef3b96SAlexander Amelkin if (!s.empty()) 186eeef3b96SAlexander Amelkin { 187eeef3b96SAlexander Amelkin- location = s.find_first_of("."); 188eeef3b96SAlexander Amelkin- if (location != std::string::npos) 189eeef3b96SAlexander Amelkin+ int hash = 0; 190eeef3b96SAlexander Amelkin+ 191eeef3b96SAlexander Amelkin+ if (s.find("dirty") != std::string::npos) 192eeef3b96SAlexander Amelkin { 193eeef3b96SAlexander Amelkin- rev.major = 194*eee9853fSAlexander Filippov- static_cast<char>(std::stoi(s.substr(0, location), 0, 10)); 195eeef3b96SAlexander Amelkin- token = s.substr(location + 1); 196eeef3b96SAlexander Amelkin+ dirty = true; 197eeef3b96SAlexander Amelkin } 198eeef3b96SAlexander Amelkin 199eeef3b96SAlexander Amelkin- if (!token.empty()) 200eeef3b96SAlexander Amelkin+ tokens = tokenize(s, ".-"); 201eeef3b96SAlexander Amelkin+ 202eeef3b96SAlexander Amelkin+ if (!tokens.empty()) 203eeef3b96SAlexander Amelkin { 204eeef3b96SAlexander Amelkin- location = token.find_first_of(".-"); 205eeef3b96SAlexander Amelkin- if (location != std::string::npos) 206eeef3b96SAlexander Amelkin+ rev.major = std::stoi(tokens[TOKEN_MAJOR], 0, BCD_BASE); 207eeef3b96SAlexander Amelkin+ } 208eeef3b96SAlexander Amelkin+ 209eeef3b96SAlexander Amelkin+ if (tokens.size() > TOKEN_MINOR) 210eeef3b96SAlexander Amelkin+ { 211eeef3b96SAlexander Amelkin+ rev.minor = std::stoi(tokens[TOKEN_MINOR], 0, BCD_BASE); 212eeef3b96SAlexander Amelkin+ 213eeef3b96SAlexander Amelkin+ // Minor version token may also contain release/patchlevel info 214eeef3b96SAlexander Amelkin+ std::vector<std::string> minortok; 215eeef3b96SAlexander Amelkin+ 216eeef3b96SAlexander Amelkin+ minortok = tokenize(tokens[TOKEN_MINOR], "rp"); 217eeef3b96SAlexander Amelkin+ 218eeef3b96SAlexander Amelkin+ if (minortok.size() > TOKEN_MINOR_HASH) 219eeef3b96SAlexander Amelkin { 220eeef3b96SAlexander Amelkin- rev.minor = static_cast<char>( 221*eee9853fSAlexander Filippov- std::stoi(token.substr(0, location), 0, 10)); 222eeef3b96SAlexander Amelkin- token = token.substr(location + 1); 223eeef3b96SAlexander Amelkin+ // hash is plain hex 224eeef3b96SAlexander Amelkin+ hash= std::stoi(minortok[TOKEN_MINOR_HASH], 0, 16); 225eeef3b96SAlexander Amelkin+ has_release = true; 226eeef3b96SAlexander Amelkin+ } 227eeef3b96SAlexander Amelkin+ 228eeef3b96SAlexander Amelkin+ if (minortok.size() > TOKEN_MINOR_PATCH) 229eeef3b96SAlexander Amelkin+ { 230eeef3b96SAlexander Amelkin+ // Patch level is encoded as binary, not BCD. 231eeef3b96SAlexander Amelkin+ // That is to allow for a wider range. 232eeef3b96SAlexander Amelkin+ int pl = std::stoi(minortok[TOKEN_MINOR_PATCH], 0, 10); 233eeef3b96SAlexander Amelkin+ uint8_t patchlevel = (pl > AUX_MAX_PATCH) 234eeef3b96SAlexander Amelkin+ ? AUX_MAX_PATCH 235eeef3b96SAlexander Amelkin+ : pl; 236eeef3b96SAlexander Amelkin+ rev.aux[AUX_PATCH_BYTE] = patchlevel << AUX_PATCH_SHIFT; 237eeef3b96SAlexander Amelkin } 238eeef3b96SAlexander Amelkin } 239eeef3b96SAlexander Amelkin 240eeef3b96SAlexander Amelkin- // Capture the number of commits on top of the minor tag. 241eeef3b96SAlexander Amelkin- // I'm using BE format like the ipmi spec asked for 242eeef3b96SAlexander Amelkin- location = token.find_first_of(".-"); 243eeef3b96SAlexander Amelkin- if (!token.empty()) 244eeef3b96SAlexander Amelkin+ // If it's not a "release" format 3, then search for 245eeef3b96SAlexander Amelkin+ // letter 'g' indicating the position of a git hash 246eeef3b96SAlexander Amelkin+ // in the version string 247eeef3b96SAlexander Amelkin+ if (!has_release && tokens.size() > TOKEN_HASH) 248eeef3b96SAlexander Amelkin { 249eeef3b96SAlexander Amelkin- commits = std::stoi(token.substr(0, location), 0, 16); 250eeef3b96SAlexander Amelkin- rev.d[0] = (commits >> 8) | (commits << 8); 251eeef3b96SAlexander Amelkin- 252eeef3b96SAlexander Amelkin- // commit number we skip 253eeef3b96SAlexander Amelkin- location = token.find_first_of(".-"); 254eeef3b96SAlexander Amelkin- if (location != std::string::npos) 255eeef3b96SAlexander Amelkin+ std::string hashstr; 256eeef3b96SAlexander Amelkin+ for (size_t i = TOKEN_HASH; i < tokens.size(); ++i) 257eeef3b96SAlexander Amelkin { 258eeef3b96SAlexander Amelkin- token = token.substr(location + 1); 259eeef3b96SAlexander Amelkin+ // Find the first token that looks like a git hash. 260eeef3b96SAlexander Amelkin+ // We think here that anything starting with a 'g' is a match. 261eeef3b96SAlexander Amelkin+ if ('g' == tokens[i][0]) 262eeef3b96SAlexander Amelkin+ { 263eeef3b96SAlexander Amelkin+ // Cut off the 'g', take only the first AUX_HASH_LEN digits 264eeef3b96SAlexander Amelkin+ hashstr = tokens[i].substr(1, AUX_HASH_LEN); 265eeef3b96SAlexander Amelkin+ break; 266eeef3b96SAlexander Amelkin+ } 267eeef3b96SAlexander Amelkin } 268eeef3b96SAlexander Amelkin- } 269eeef3b96SAlexander Amelkin- else 270eeef3b96SAlexander Amelkin- { 271eeef3b96SAlexander Amelkin- rev.d[0] = 0; 272eeef3b96SAlexander Amelkin- } 273eeef3b96SAlexander Amelkin 274eeef3b96SAlexander Amelkin- if (location != std::string::npos) 275eeef3b96SAlexander Amelkin- { 276eeef3b96SAlexander Amelkin- token = token.substr(location + 1); 277eeef3b96SAlexander Amelkin+ // Hash is plain hex 278eeef3b96SAlexander Amelkin+ hash = std::stoi(hashstr, 0, 16); 279eeef3b96SAlexander Amelkin+ rev.aux[AUX_NON_REL_BYTE] |= AUX_NON_REL_VALUE << AUX_NON_REL_SHIFT; 280eeef3b96SAlexander Amelkin } 281eeef3b96SAlexander Amelkin+ rev.aux32 |= htobe32(hash << AUX_HASH_SHIFT); 282eeef3b96SAlexander Amelkin+ rev.aux[AUX_DIRTY_BYTE] |= dirty << AUX_DIRTY_SHIFT; 283eeef3b96SAlexander Amelkin 284eeef3b96SAlexander Amelkin- // Any value of the optional parameter forces it to 1 285eeef3b96SAlexander Amelkin- location = token.find_first_of(".-"); 286eeef3b96SAlexander Amelkin- if (location != std::string::npos) 287eeef3b96SAlexander Amelkin- { 288eeef3b96SAlexander Amelkin- token = token.substr(location + 1); 289eeef3b96SAlexander Amelkin- } 290eeef3b96SAlexander Amelkin- commits = (!token.empty()) ? 1 : 0; 291eeef3b96SAlexander Amelkin- 292eeef3b96SAlexander Amelkin- // We do this operation to get this displayed in least significant bytes 293eeef3b96SAlexander Amelkin- // of ipmitool device id command. 294eeef3b96SAlexander Amelkin- rev.d[1] = (commits >> 8) | (commits << 8); 295eeef3b96SAlexander Amelkin+ return 0; 296eeef3b96SAlexander Amelkin } 297eeef3b96SAlexander Amelkin 298eeef3b96SAlexander Amelkin- return 0; 299eeef3b96SAlexander Amelkin+ return -1; 300eeef3b96SAlexander Amelkin } 301eeef3b96SAlexander Amelkin 302eeef3b96SAlexander Amelkin /* @brief: Implement the Get Device ID IPMI command per the IPMI spec 303*eee9853fSAlexander Filippov@@ -623,7 +716,7 @@ ipmi::RspType<uint8_t, // Device ID 304eeef3b96SAlexander Amelkin 305eeef3b96SAlexander Amelkin rev.minor = (rev.minor > 99 ? 99 : rev.minor); 306eeef3b96SAlexander Amelkin devId.fw[1] = rev.minor % 10 + (rev.minor / 10) * 16; 307eeef3b96SAlexander Amelkin- std::memcpy(&devId.aux, rev.d, 4); 308eeef3b96SAlexander Amelkin+ std::memcpy(&devId.aux, rev.aux, 4); 309*eee9853fSAlexander Filippov haveBMCVersion = true; 310eeef3b96SAlexander Amelkin } 311*eee9853fSAlexander Filippov } 312*eee9853fSAlexander Filippov@@ -643,7 +736,14 @@ ipmi::RspType<uint8_t, // Device ID 313eeef3b96SAlexander Amelkin devId.addnDevSupport = data.value("addn_dev_support", 0); 314eeef3b96SAlexander Amelkin devId.manufId = data.value("manuf_id", 0); 315eeef3b96SAlexander Amelkin devId.prodId = data.value("prod_id", 0); 316eeef3b96SAlexander Amelkin- devId.aux = data.value("aux", 0); 317eeef3b96SAlexander Amelkin+ 318eeef3b96SAlexander Amelkin+ // Use the AUX data from the file only for overriding 319eeef3b96SAlexander Amelkin+ // the data obtained from version string. 320eeef3b96SAlexander Amelkin+ if (data.contains("aux")) 321eeef3b96SAlexander Amelkin+ { 322eeef3b96SAlexander Amelkin+ // AUX F/W Revision Info is MSB first (big-endian) 323eeef3b96SAlexander Amelkin+ devId.aux = htobe32(data.value("aux", 0)); 324eeef3b96SAlexander Amelkin+ } 325eeef3b96SAlexander Amelkin 326eeef3b96SAlexander Amelkin // Set the availablitity of the BMC. 327eeef3b96SAlexander Amelkin defaultActivationSetting = data.value("availability", true); 328