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