199b78ec8SJason M. Bills /*
299b78ec8SJason M. Bills // Copyright (c) 2019 Intel Corporation
399b78ec8SJason M. Bills //
499b78ec8SJason M. Bills // Licensed under the Apache License, Version 2.0 (the "License");
599b78ec8SJason M. Bills // you may not use this file except in compliance with the License.
699b78ec8SJason M. Bills // You may obtain a copy of the License at
799b78ec8SJason M. Bills //
899b78ec8SJason M. Bills //      http://www.apache.org/licenses/LICENSE-2.0
999b78ec8SJason M. Bills //
1099b78ec8SJason M. Bills // Unless required by applicable law or agreed to in writing, software
1199b78ec8SJason M. Bills // distributed under the License is distributed on an "AS IS" BASIS,
1299b78ec8SJason M. Bills // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399b78ec8SJason M. Bills // See the License for the specific language governing permissions and
1499b78ec8SJason M. Bills // limitations under the License.
1599b78ec8SJason M. Bills */
1699b78ec8SJason M. Bills 
1799b78ec8SJason M. Bills #include <boost/beast/core/span.hpp>
1899b78ec8SJason M. Bills #include <ipmi_to_redfish_hooks.hpp>
19d2220ccdSAgnieszka Szlendak #include <me_to_redfish_hooks.hpp>
2099b78ec8SJason M. Bills #include <storagecommands.hpp>
21fcd2d3a9SJames Feist 
22fcd2d3a9SJames Feist #include <iomanip>
23fcd2d3a9SJames Feist #include <sstream>
2499b78ec8SJason M. Bills #include <string_view>
2599b78ec8SJason M. Bills 
2699b78ec8SJason M. Bills namespace intel_oem::ipmi::sel
2799b78ec8SJason M. Bills {
2899b78ec8SJason M. Bills 
2999b78ec8SJason M. Bills namespace redfish_hooks
3099b78ec8SJason M. Bills {
toHexStr(const boost::beast::span<uint8_t> bytes,std::string & hexStr)3199b78ec8SJason M. Bills static void toHexStr(const boost::beast::span<uint8_t> bytes,
3299b78ec8SJason M. Bills                      std::string& hexStr)
3399b78ec8SJason M. Bills {
3499b78ec8SJason M. Bills     std::stringstream stream;
3599b78ec8SJason M. Bills     stream << std::hex << std::uppercase << std::setfill('0');
3699b78ec8SJason M. Bills     for (const uint8_t& byte : bytes)
3799b78ec8SJason M. Bills     {
3899b78ec8SJason M. Bills         stream << std::setw(2) << static_cast<int>(byte);
3999b78ec8SJason M. Bills     }
4099b78ec8SJason M. Bills     hexStr = stream.str();
4199b78ec8SJason M. Bills }
4299b78ec8SJason M. Bills 
4399b78ec8SJason M. Bills // Record a BIOS message as a Redfish message instead of a SEL record
biosMessageHook(const SELData & selData,const std::string & ipmiRaw)4499b78ec8SJason M. Bills static bool biosMessageHook(const SELData& selData, const std::string& ipmiRaw)
4599b78ec8SJason M. Bills {
4699b78ec8SJason M. Bills     // This is a BIOS message, so record it as a Redfish message instead
4799b78ec8SJason M. Bills     // of a SEL record
4899b78ec8SJason M. Bills 
4999b78ec8SJason M. Bills     // Walk through the SEL request record to build the appropriate Redfish
5099b78ec8SJason M. Bills     // message
5199b78ec8SJason M. Bills     static constexpr std::string_view openBMCMessageRegistryVersion = "0.1";
52*b37abfb2SPatrick Williams     std::string messageID = "OpenBMC." +
53*b37abfb2SPatrick Williams                             std::string(openBMCMessageRegistryVersion);
5499b78ec8SJason M. Bills     std::vector<std::string> messageArgs;
5599b78ec8SJason M. Bills     BIOSSensors sensor = static_cast<BIOSSensors>(selData.sensorNum);
5699b78ec8SJason M. Bills     BIOSEventTypes eventType = static_cast<BIOSEventTypes>(selData.eventType);
5799b78ec8SJason M. Bills     switch (sensor)
5899b78ec8SJason M. Bills     {
5999b78ec8SJason M. Bills         case BIOSSensors::memoryRASConfigStatus:
6099b78ec8SJason M. Bills             switch (eventType)
6199b78ec8SJason M. Bills             {
6299b78ec8SJason M. Bills                 case BIOSEventTypes::digitalDiscrete:
6399b78ec8SJason M. Bills                 {
6499b78ec8SJason M. Bills                     switch (selData.offset)
6599b78ec8SJason M. Bills                     {
6699b78ec8SJason M. Bills                         case 0x00:
6799b78ec8SJason M. Bills                             messageID += ".MemoryRASConfigurationDisabled";
6899b78ec8SJason M. Bills                             break;
6999b78ec8SJason M. Bills                         case 0x01:
7099b78ec8SJason M. Bills                             messageID += ".MemoryRASConfigurationEnabled";
7199b78ec8SJason M. Bills                             break;
7299b78ec8SJason M. Bills                         default:
736dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
7499b78ec8SJason M. Bills                             break;
7599b78ec8SJason M. Bills                     }
7699b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
7799b78ec8SJason M. Bills 
7899b78ec8SJason M. Bills                     // error = eventData2 bits [3:0]
7999b78ec8SJason M. Bills                     int error = selData.eventData2 & 0x0F;
8099b78ec8SJason M. Bills 
8199b78ec8SJason M. Bills                     // mode = eventData3 bits [3:0]
8299b78ec8SJason M. Bills                     int mode = selData.eventData3 & 0x0F;
8399b78ec8SJason M. Bills 
8499b78ec8SJason M. Bills                     // Save the messageArgs
8599b78ec8SJason M. Bills                     switch (error)
8699b78ec8SJason M. Bills                     {
8799b78ec8SJason M. Bills                         case 0x00:
8899b78ec8SJason M. Bills                             messageArgs.push_back("None");
8999b78ec8SJason M. Bills                             break;
9099b78ec8SJason M. Bills                         case 0x03:
9199b78ec8SJason M. Bills                             messageArgs.push_back("Invalid DIMM Config");
9299b78ec8SJason M. Bills                             break;
9399b78ec8SJason M. Bills                         default:
9499b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(error));
9599b78ec8SJason M. Bills                             break;
9699b78ec8SJason M. Bills                     }
9799b78ec8SJason M. Bills                     switch (mode)
9899b78ec8SJason M. Bills                     {
9999b78ec8SJason M. Bills                         case 0x00:
10099b78ec8SJason M. Bills                             messageArgs.push_back("None");
10199b78ec8SJason M. Bills                             break;
10299b78ec8SJason M. Bills                         case 0x01:
10399b78ec8SJason M. Bills                             messageArgs.push_back("Mirroring");
10499b78ec8SJason M. Bills                             break;
10599b78ec8SJason M. Bills                         case 0x02:
10699b78ec8SJason M. Bills                             messageArgs.push_back("Lockstep");
10799b78ec8SJason M. Bills                             break;
10899b78ec8SJason M. Bills                         case 0x04:
10999b78ec8SJason M. Bills                             messageArgs.push_back("Rank Sparing");
11099b78ec8SJason M. Bills                             break;
11199b78ec8SJason M. Bills                         default:
11299b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(mode));
11399b78ec8SJason M. Bills                             break;
11499b78ec8SJason M. Bills                     }
11599b78ec8SJason M. Bills 
11699b78ec8SJason M. Bills                     break;
11799b78ec8SJason M. Bills                 }
11899b78ec8SJason M. Bills                 default:
1196dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
12099b78ec8SJason M. Bills                     break;
12199b78ec8SJason M. Bills             }
12299b78ec8SJason M. Bills             break;
12399b78ec8SJason M. Bills         case BIOSSensors::biosPOSTError:
12499b78ec8SJason M. Bills             switch (eventType)
12599b78ec8SJason M. Bills             {
12699b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
12799b78ec8SJason M. Bills                 {
12899b78ec8SJason M. Bills                     switch (selData.offset)
12999b78ec8SJason M. Bills                     {
13099b78ec8SJason M. Bills                         case 0x00:
13199b78ec8SJason M. Bills                             messageID += ".BIOSPOSTError";
13299b78ec8SJason M. Bills                             break;
13399b78ec8SJason M. Bills                         default:
1346dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
13599b78ec8SJason M. Bills                             break;
13699b78ec8SJason M. Bills                     }
13799b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
13899b78ec8SJason M. Bills 
13999b78ec8SJason M. Bills                     std::array<uint8_t, 2> post;
14099b78ec8SJason M. Bills                     // post LSB = eventData2 bits [7:0]
14199b78ec8SJason M. Bills                     post[1] = selData.eventData2;
14299b78ec8SJason M. Bills                     // post MSB = eventData3 bits [7:0]
14399b78ec8SJason M. Bills                     post[0] = selData.eventData3;
14499b78ec8SJason M. Bills 
14599b78ec8SJason M. Bills                     // Save the messageArgs
14699b78ec8SJason M. Bills                     messageArgs.emplace_back();
14799b78ec8SJason M. Bills                     std::string& postStr = messageArgs.back();
14899b78ec8SJason M. Bills                     toHexStr(boost::beast::span<uint8_t>(post), postStr);
14999b78ec8SJason M. Bills 
15099b78ec8SJason M. Bills                     break;
15199b78ec8SJason M. Bills                 }
15299b78ec8SJason M. Bills                 default:
1536dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
15499b78ec8SJason M. Bills                     break;
15599b78ec8SJason M. Bills             }
15699b78ec8SJason M. Bills             break;
15799b78ec8SJason M. Bills         case BIOSSensors::intelUPILinkWidthReduced:
15899b78ec8SJason M. Bills             switch (eventType)
15999b78ec8SJason M. Bills             {
16099b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete7:
16199b78ec8SJason M. Bills                 {
16299b78ec8SJason M. Bills                     switch (selData.offset)
16399b78ec8SJason M. Bills                     {
16499b78ec8SJason M. Bills                         case 0x01:
16599b78ec8SJason M. Bills                             messageID += ".IntelUPILinkWidthReducedToHalf";
16699b78ec8SJason M. Bills                             break;
16799b78ec8SJason M. Bills                         case 0x02:
16899b78ec8SJason M. Bills                             messageID += ".IntelUPILinkWidthReducedToQuarter";
16999b78ec8SJason M. Bills                             break;
17099b78ec8SJason M. Bills                         default:
1716dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
17299b78ec8SJason M. Bills                             break;
17399b78ec8SJason M. Bills                     }
17499b78ec8SJason M. Bills                     // Get the message data from eventData2
17599b78ec8SJason M. Bills 
17699b78ec8SJason M. Bills                     // Node ID = eventData2 bits [7:0]
17799b78ec8SJason M. Bills                     int node = selData.eventData2;
17899b78ec8SJason M. Bills 
17999b78ec8SJason M. Bills                     // Save the messageArgs
18099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(node + 1));
18199b78ec8SJason M. Bills 
18299b78ec8SJason M. Bills                     break;
18399b78ec8SJason M. Bills                 }
18499b78ec8SJason M. Bills                 default:
1856dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
18699b78ec8SJason M. Bills                     break;
18799b78ec8SJason M. Bills             }
18899b78ec8SJason M. Bills             break;
18999b78ec8SJason M. Bills         case BIOSSensors::memoryRASModeSelect:
19099b78ec8SJason M. Bills             switch (eventType)
19199b78ec8SJason M. Bills             {
19299b78ec8SJason M. Bills                 case BIOSEventTypes::digitalDiscrete:
19399b78ec8SJason M. Bills                 {
19499b78ec8SJason M. Bills                     switch (selData.offset)
19599b78ec8SJason M. Bills                     {
19699b78ec8SJason M. Bills                         case 0x00:
19799b78ec8SJason M. Bills                             messageID += ".MemoryRASModeDisabled";
19899b78ec8SJason M. Bills                             break;
19999b78ec8SJason M. Bills                         case 0x01:
20099b78ec8SJason M. Bills                             messageID += ".MemoryRASModeEnabled";
20199b78ec8SJason M. Bills                             break;
20299b78ec8SJason M. Bills                         default:
2036dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
20499b78ec8SJason M. Bills                             break;
20599b78ec8SJason M. Bills                     }
20699b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
20799b78ec8SJason M. Bills 
20899b78ec8SJason M. Bills                     // prior mode = eventData2 bits [3:0]
20999b78ec8SJason M. Bills                     int priorMode = selData.eventData2 & 0x0F;
21099b78ec8SJason M. Bills 
21199b78ec8SJason M. Bills                     // selected mode = eventData3 bits [3:0]
21299b78ec8SJason M. Bills                     int selectedMode = selData.eventData3 & 0x0F;
21399b78ec8SJason M. Bills 
21499b78ec8SJason M. Bills                     // Save the messageArgs
21599b78ec8SJason M. Bills                     switch (priorMode)
21699b78ec8SJason M. Bills                     {
21799b78ec8SJason M. Bills                         case 0x00:
21899b78ec8SJason M. Bills                             messageArgs.push_back("None");
21999b78ec8SJason M. Bills                             break;
22099b78ec8SJason M. Bills                         case 0x01:
22199b78ec8SJason M. Bills                             messageArgs.push_back("Mirroring");
22299b78ec8SJason M. Bills                             break;
22399b78ec8SJason M. Bills                         case 0x02:
22499b78ec8SJason M. Bills                             messageArgs.push_back("Lockstep");
22599b78ec8SJason M. Bills                             break;
22699b78ec8SJason M. Bills                         case 0x04:
22799b78ec8SJason M. Bills                             messageArgs.push_back("Rank Sparing");
22899b78ec8SJason M. Bills                             break;
22999b78ec8SJason M. Bills                         default:
23099b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(priorMode));
23199b78ec8SJason M. Bills                             break;
23299b78ec8SJason M. Bills                     }
23399b78ec8SJason M. Bills                     switch (selectedMode)
23499b78ec8SJason M. Bills                     {
23599b78ec8SJason M. Bills                         case 0x00:
23699b78ec8SJason M. Bills                             messageArgs.push_back("None");
23799b78ec8SJason M. Bills                             break;
23899b78ec8SJason M. Bills                         case 0x01:
23999b78ec8SJason M. Bills                             messageArgs.push_back("Mirroring");
24099b78ec8SJason M. Bills                             break;
24199b78ec8SJason M. Bills                         case 0x02:
24299b78ec8SJason M. Bills                             messageArgs.push_back("Lockstep");
24399b78ec8SJason M. Bills                             break;
24499b78ec8SJason M. Bills                         case 0x04:
24599b78ec8SJason M. Bills                             messageArgs.push_back("Rank Sparing");
24699b78ec8SJason M. Bills                             break;
24799b78ec8SJason M. Bills                         default:
24899b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(selectedMode));
24999b78ec8SJason M. Bills                             break;
25099b78ec8SJason M. Bills                     }
25199b78ec8SJason M. Bills 
25299b78ec8SJason M. Bills                     break;
25399b78ec8SJason M. Bills                 }
25499b78ec8SJason M. Bills                 default:
2556dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
25699b78ec8SJason M. Bills                     break;
25799b78ec8SJason M. Bills             }
25899b78ec8SJason M. Bills             break;
25999b78ec8SJason M. Bills         case BIOSSensors::bootEvent:
26099b78ec8SJason M. Bills             switch (eventType)
26199b78ec8SJason M. Bills             {
26299b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
26399b78ec8SJason M. Bills                 {
26499b78ec8SJason M. Bills                     switch (selData.offset)
26599b78ec8SJason M. Bills                     {
26699b78ec8SJason M. Bills                         case 0x01:
26799b78ec8SJason M. Bills                             messageID += ".BIOSBoot";
26899b78ec8SJason M. Bills                             break;
269a04e7481SSnehalatha Venkatesh                         case 0x09:
270a04e7481SSnehalatha Venkatesh                             messageID += ".BIOSAttributesChanged";
271a04e7481SSnehalatha Venkatesh                             break;
27299b78ec8SJason M. Bills                         default:
2736dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
27499b78ec8SJason M. Bills                             break;
27599b78ec8SJason M. Bills                     }
27699b78ec8SJason M. Bills                     break;
27799b78ec8SJason M. Bills                 }
27899b78ec8SJason M. Bills                 default:
2796dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
28099b78ec8SJason M. Bills                     break;
28199b78ec8SJason M. Bills             }
28299b78ec8SJason M. Bills             break;
28399b78ec8SJason M. Bills         default:
2846dd8f047SJason M. Bills             return defaultMessageHook(ipmiRaw);
28599b78ec8SJason M. Bills             break;
28699b78ec8SJason M. Bills     }
28799b78ec8SJason M. Bills 
28899b78ec8SJason M. Bills     // Log the Redfish message to the journal with the appropriate metadata
28999b78ec8SJason M. Bills     std::string journalMsg = "BIOS POST IPMI event: " + ipmiRaw;
29099b78ec8SJason M. Bills     if (messageArgs.empty())
29199b78ec8SJason M. Bills     {
29299b78ec8SJason M. Bills         phosphor::logging::log<phosphor::logging::level::INFO>(
29399b78ec8SJason M. Bills             journalMsg.c_str(),
29499b78ec8SJason M. Bills             phosphor::logging::entry("REDFISH_MESSAGE_ID=%s",
29599b78ec8SJason M. Bills                                      messageID.c_str()));
29699b78ec8SJason M. Bills     }
29799b78ec8SJason M. Bills     else
29899b78ec8SJason M. Bills     {
299*b37abfb2SPatrick Williams         std::string messageArgsString = boost::algorithm::join(messageArgs,
300*b37abfb2SPatrick Williams                                                                ",");
30199b78ec8SJason M. Bills         phosphor::logging::log<phosphor::logging::level::INFO>(
30299b78ec8SJason M. Bills             journalMsg.c_str(),
30399b78ec8SJason M. Bills             phosphor::logging::entry("REDFISH_MESSAGE_ID=%s",
30499b78ec8SJason M. Bills                                      messageID.c_str()),
30599b78ec8SJason M. Bills             phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s",
30699b78ec8SJason M. Bills                                      messageArgsString.c_str()));
30799b78ec8SJason M. Bills     }
30899b78ec8SJason M. Bills 
30999b78ec8SJason M. Bills     return true;
31099b78ec8SJason M. Bills }
31199b78ec8SJason M. Bills 
31299b78ec8SJason M. Bills // Record a BIOS SMI message as a Redfish message instead of a SEL record
biosSMIMessageHook(const SELData & selData,const std::string & ipmiRaw)31399b78ec8SJason M. Bills static bool biosSMIMessageHook(const SELData& selData,
31499b78ec8SJason M. Bills                                const std::string& ipmiRaw)
31599b78ec8SJason M. Bills {
31699b78ec8SJason M. Bills     // This is a BIOS SMI message, so record it as a Redfish message instead
31799b78ec8SJason M. Bills     // of a SEL record
31899b78ec8SJason M. Bills 
31999b78ec8SJason M. Bills     // Walk through the SEL request record to build the appropriate Redfish
32099b78ec8SJason M. Bills     // message
32199b78ec8SJason M. Bills     static constexpr std::string_view openBMCMessageRegistryVersion = "0.1";
322*b37abfb2SPatrick Williams     std::string messageID = "OpenBMC." +
323*b37abfb2SPatrick Williams                             std::string(openBMCMessageRegistryVersion);
32499b78ec8SJason M. Bills     std::vector<std::string> messageArgs;
32599b78ec8SJason M. Bills     BIOSSMISensors sensor = static_cast<BIOSSMISensors>(selData.sensorNum);
32699b78ec8SJason M. Bills     BIOSEventTypes eventType = static_cast<BIOSEventTypes>(selData.eventType);
32799b78ec8SJason M. Bills     switch (sensor)
32899b78ec8SJason M. Bills     {
32999b78ec8SJason M. Bills         case BIOSSMISensors::mirroringRedundancyState:
33099b78ec8SJason M. Bills             switch (eventType)
33199b78ec8SJason M. Bills             {
33299b78ec8SJason M. Bills                 case BIOSEventTypes::discreteRedundancyStates:
33399b78ec8SJason M. Bills                 {
33499b78ec8SJason M. Bills                     switch (selData.offset)
33599b78ec8SJason M. Bills                     {
33699b78ec8SJason M. Bills                         case 0x00:
33799b78ec8SJason M. Bills                             messageID += ".MirroringRedundancyFull";
33899b78ec8SJason M. Bills                             break;
33999b78ec8SJason M. Bills                         case 0x02:
34099b78ec8SJason M. Bills                             messageID += ".MirroringRedundancyDegraded";
34199b78ec8SJason M. Bills                             break;
34299b78ec8SJason M. Bills                         default:
3436dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
34499b78ec8SJason M. Bills                             break;
34599b78ec8SJason M. Bills                     }
34699b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
34799b78ec8SJason M. Bills 
34899b78ec8SJason M. Bills                     // pair = eventData2 bits [7:4]
34999b78ec8SJason M. Bills                     int pair = selData.eventData2 >> 4 & 0x0F;
35099b78ec8SJason M. Bills                     // rank = eventData2 bits [1:0]
35199b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x03;
35299b78ec8SJason M. Bills 
35399b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:5]
35499b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 5 & 0x07;
35599b78ec8SJason M. Bills                     // Channel = eventData3 bits [4:2]
35699b78ec8SJason M. Bills                     int channel = selData.eventData3 >> 2 & 0x07;
35799b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
35899b78ec8SJason M. Bills                     channelLetter[0] += channel;
35999b78ec8SJason M. Bills                     // DIMM = eventData3 bits [1:0]
36099b78ec8SJason M. Bills                     int dimm = selData.eventData3 & 0x03;
36199b78ec8SJason M. Bills 
36299b78ec8SJason M. Bills                     // Save the messageArgs
36399b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
36499b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
36599b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm + 1));
36699b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(pair));
36799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
36899b78ec8SJason M. Bills 
36999b78ec8SJason M. Bills                     break;
37099b78ec8SJason M. Bills                 }
37199b78ec8SJason M. Bills                 default:
3726dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
37399b78ec8SJason M. Bills                     break;
37499b78ec8SJason M. Bills             }
37599b78ec8SJason M. Bills             break;
37699b78ec8SJason M. Bills         case BIOSSMISensors::memoryECCError:
37799b78ec8SJason M. Bills             switch (eventType)
37899b78ec8SJason M. Bills             {
37999b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
38099b78ec8SJason M. Bills                 {
38199b78ec8SJason M. Bills                     switch (selData.offset)
38299b78ec8SJason M. Bills                     {
38399b78ec8SJason M. Bills                         case 0x00:
38499b78ec8SJason M. Bills                             messageID += ".MemoryECCCorrectable";
38599b78ec8SJason M. Bills                             break;
38699b78ec8SJason M. Bills                         case 0x01:
38799b78ec8SJason M. Bills                             messageID += ".MemoryECCUncorrectable";
38899b78ec8SJason M. Bills                             break;
38999b78ec8SJason M. Bills                         default:
3906dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
39199b78ec8SJason M. Bills                             break;
39299b78ec8SJason M. Bills                     }
39399b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
39499b78ec8SJason M. Bills 
39599b78ec8SJason M. Bills                     // dimm = eventData2 bits [7:4]
39699b78ec8SJason M. Bills                     int dimm = selData.eventData2 >> 4 & 0x0F;
39799b78ec8SJason M. Bills                     // rank = eventData2 bits [3:0]
39899b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x0F;
39999b78ec8SJason M. Bills 
40099b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:4]
40199b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 4 & 0x0F;
40299b78ec8SJason M. Bills                     // Channel = eventData3 bits [3:0]
40399b78ec8SJason M. Bills                     int channel = selData.eventData3 & 0x0F;
40499b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
40599b78ec8SJason M. Bills                     channelLetter[0] += channel;
40699b78ec8SJason M. Bills 
40799b78ec8SJason M. Bills                     // Save the messageArgs
40899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
40999b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
41099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm));
41199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
41299b78ec8SJason M. Bills 
41399b78ec8SJason M. Bills                     break;
41499b78ec8SJason M. Bills                 }
41599b78ec8SJason M. Bills                 default:
4166dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
41799b78ec8SJason M. Bills                     break;
41899b78ec8SJason M. Bills             }
41999b78ec8SJason M. Bills             break;
42099b78ec8SJason M. Bills         case BIOSSMISensors::legacyPCIError:
42199b78ec8SJason M. Bills             switch (eventType)
42299b78ec8SJason M. Bills             {
42399b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
42499b78ec8SJason M. Bills                 {
42599b78ec8SJason M. Bills                     switch (selData.offset)
42699b78ec8SJason M. Bills                     {
42799b78ec8SJason M. Bills                         case 0x04:
42899b78ec8SJason M. Bills                             messageID += ".LegacyPCIPERR";
42999b78ec8SJason M. Bills                             break;
43099b78ec8SJason M. Bills                         case 0x05:
43199b78ec8SJason M. Bills                             messageID += ".LegacyPCISERR";
43299b78ec8SJason M. Bills                             break;
43399b78ec8SJason M. Bills                         default:
4346dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
43599b78ec8SJason M. Bills                             break;
43699b78ec8SJason M. Bills                     }
43799b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
43899b78ec8SJason M. Bills 
43999b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
44099b78ec8SJason M. Bills                     int bus = selData.eventData2;
44199b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
44299b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
44399b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
44499b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
44599b78ec8SJason M. Bills 
44699b78ec8SJason M. Bills                     // Save the messageArgs
44799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
44899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
44999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
45099b78ec8SJason M. Bills 
45199b78ec8SJason M. Bills                     break;
45299b78ec8SJason M. Bills                 }
45399b78ec8SJason M. Bills                 default:
4546dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
45599b78ec8SJason M. Bills                     break;
45699b78ec8SJason M. Bills             }
45799b78ec8SJason M. Bills             break;
45899b78ec8SJason M. Bills         case BIOSSMISensors::pcieFatalError:
45999b78ec8SJason M. Bills             switch (eventType)
46099b78ec8SJason M. Bills             {
46199b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete0:
46299b78ec8SJason M. Bills                 {
46399b78ec8SJason M. Bills                     switch (selData.offset)
46499b78ec8SJason M. Bills                     {
46599b78ec8SJason M. Bills                         case 0x00:
46699b78ec8SJason M. Bills                             messageID += ".PCIeFatalDataLinkLayerProtocol";
46799b78ec8SJason M. Bills                             break;
46899b78ec8SJason M. Bills                         case 0x01:
46999b78ec8SJason M. Bills                             messageID += ".PCIeFatalSurpriseLinkDown";
47099b78ec8SJason M. Bills                             break;
47199b78ec8SJason M. Bills                         case 0x02:
47299b78ec8SJason M. Bills                             messageID += ".PCIeFatalCompleterAbort";
47399b78ec8SJason M. Bills                             break;
47499b78ec8SJason M. Bills                         case 0x03:
47599b78ec8SJason M. Bills                             messageID += ".PCIeFatalUnsupportedRequest";
47699b78ec8SJason M. Bills                             break;
47799b78ec8SJason M. Bills                         case 0x04:
47899b78ec8SJason M. Bills                             messageID += ".PCIeFatalPoisonedTLP";
47999b78ec8SJason M. Bills                             break;
48099b78ec8SJason M. Bills                         case 0x05:
48199b78ec8SJason M. Bills                             messageID += ".PCIeFatalFlowControlProtocol";
48299b78ec8SJason M. Bills                             break;
48399b78ec8SJason M. Bills                         case 0x06:
48499b78ec8SJason M. Bills                             messageID += ".PCIeFatalCompletionTimeout";
48599b78ec8SJason M. Bills                             break;
48699b78ec8SJason M. Bills                         case 0x07:
48799b78ec8SJason M. Bills                             messageID += ".PCIeFatalReceiverBufferOverflow";
48899b78ec8SJason M. Bills                             break;
48999b78ec8SJason M. Bills                         case 0x08:
49099b78ec8SJason M. Bills                             messageID += ".PCIeFatalACSViolation";
49199b78ec8SJason M. Bills                             break;
49299b78ec8SJason M. Bills                         case 0x09:
49399b78ec8SJason M. Bills                             messageID += ".PCIeFatalMalformedTLP";
49499b78ec8SJason M. Bills                             break;
49599b78ec8SJason M. Bills                         case 0x0a:
49699b78ec8SJason M. Bills                             messageID += ".PCIeFatalECRCError";
49799b78ec8SJason M. Bills                             break;
49899b78ec8SJason M. Bills                         case 0x0b:
49999b78ec8SJason M. Bills                             messageID +=
50099b78ec8SJason M. Bills                                 ".PCIeFatalReceivedFatalMessageFromDownstream";
50199b78ec8SJason M. Bills                             break;
50299b78ec8SJason M. Bills                         case 0x0c:
50399b78ec8SJason M. Bills                             messageID += ".PCIeFatalUnexpectedCompletion";
50499b78ec8SJason M. Bills                             break;
50599b78ec8SJason M. Bills                         case 0x0d:
5066757fb4eSJason M. Bills                             messageID += ".PCIeFatalReceivedErrNonFatalMessage";
50799b78ec8SJason M. Bills                             break;
50899b78ec8SJason M. Bills                         case 0x0e:
50999b78ec8SJason M. Bills                             messageID += ".PCIeFatalUncorrectableInternal";
51099b78ec8SJason M. Bills                             break;
51199b78ec8SJason M. Bills                         case 0x0f:
51299b78ec8SJason M. Bills                             messageID += ".PCIeFatalMCBlockedTLP";
51399b78ec8SJason M. Bills                             break;
51499b78ec8SJason M. Bills                         default:
5156dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
51699b78ec8SJason M. Bills                             break;
51799b78ec8SJason M. Bills                     }
51899b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
51999b78ec8SJason M. Bills 
52099b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
52199b78ec8SJason M. Bills                     int bus = selData.eventData2;
52299b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
52399b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
52499b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
52599b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
52699b78ec8SJason M. Bills 
52799b78ec8SJason M. Bills                     // Save the messageArgs
52899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
52999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
53099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
53199b78ec8SJason M. Bills 
53299b78ec8SJason M. Bills                     break;
53399b78ec8SJason M. Bills                 }
53499b78ec8SJason M. Bills                 default:
5356dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
53699b78ec8SJason M. Bills                     break;
53799b78ec8SJason M. Bills             }
53899b78ec8SJason M. Bills             break;
53999b78ec8SJason M. Bills         case BIOSSMISensors::pcieCorrectableError:
54099b78ec8SJason M. Bills             switch (eventType)
54199b78ec8SJason M. Bills             {
54299b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete1:
54399b78ec8SJason M. Bills                 {
54499b78ec8SJason M. Bills                     switch (selData.offset)
54599b78ec8SJason M. Bills                     {
54699b78ec8SJason M. Bills                         case 0x00:
54799b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableReceiverError";
54899b78ec8SJason M. Bills                             break;
54999b78ec8SJason M. Bills                         case 0x01:
55099b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableBadDLLP";
55199b78ec8SJason M. Bills                             break;
55299b78ec8SJason M. Bills                         case 0x02:
55399b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableBadTLP";
55499b78ec8SJason M. Bills                             break;
55599b78ec8SJason M. Bills                         case 0x03:
55699b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableReplayNumRollover";
55799b78ec8SJason M. Bills                             break;
55899b78ec8SJason M. Bills                         case 0x04:
55999b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableReplayTimerTimeout";
56099b78ec8SJason M. Bills                             break;
56199b78ec8SJason M. Bills                         case 0x05:
56299b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableAdvisoryNonFatal";
56399b78ec8SJason M. Bills                             break;
56499b78ec8SJason M. Bills                         case 0x06:
56599b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableLinkBWChanged";
56699b78ec8SJason M. Bills                             break;
56799b78ec8SJason M. Bills                         case 0x07:
56899b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableInternal";
56999b78ec8SJason M. Bills                             break;
57099b78ec8SJason M. Bills                         case 0x08:
57199b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableHeaderLogOverflow";
57299b78ec8SJason M. Bills                             break;
57399b78ec8SJason M. Bills                         case 0x0f:
57499b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableUnspecifiedAERError";
57599b78ec8SJason M. Bills                             break;
57699b78ec8SJason M. Bills                         default:
5776dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
57899b78ec8SJason M. Bills                             break;
57999b78ec8SJason M. Bills                     }
58099b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
58199b78ec8SJason M. Bills 
58299b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
58399b78ec8SJason M. Bills                     int bus = selData.eventData2;
58499b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
58599b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
58699b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
58799b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
58899b78ec8SJason M. Bills 
58999b78ec8SJason M. Bills                     // Save the messageArgs
59099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
59199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
59299b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
59399b78ec8SJason M. Bills 
59499b78ec8SJason M. Bills                     break;
59599b78ec8SJason M. Bills                 }
59699b78ec8SJason M. Bills                 default:
5976dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
59899b78ec8SJason M. Bills                     break;
59999b78ec8SJason M. Bills             }
60099b78ec8SJason M. Bills             break;
60199b78ec8SJason M. Bills         case BIOSSMISensors::sparingRedundancyState:
60299b78ec8SJason M. Bills             switch (eventType)
60399b78ec8SJason M. Bills             {
60499b78ec8SJason M. Bills                 case BIOSEventTypes::discreteRedundancyStates:
60599b78ec8SJason M. Bills                 {
60699b78ec8SJason M. Bills                     switch (selData.offset)
60799b78ec8SJason M. Bills                     {
60899b78ec8SJason M. Bills                         case 0x00:
60999b78ec8SJason M. Bills                             messageID += ".SparingRedundancyFull";
61099b78ec8SJason M. Bills                             break;
61199b78ec8SJason M. Bills                         case 0x02:
61299b78ec8SJason M. Bills                             messageID += ".SparingRedundancyDegraded";
61399b78ec8SJason M. Bills                             break;
61499b78ec8SJason M. Bills                         default:
6156dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
61699b78ec8SJason M. Bills                             break;
61799b78ec8SJason M. Bills                     }
61899b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
61999b78ec8SJason M. Bills 
62099b78ec8SJason M. Bills                     // domain = eventData2 bits [7:4]
62199b78ec8SJason M. Bills                     int domain = selData.eventData2 >> 4 & 0x0F;
62299b78ec8SJason M. Bills                     char domainLetter[4] = {'A'};
62399b78ec8SJason M. Bills                     domainLetter[0] += domain;
62499b78ec8SJason M. Bills                     // rank = eventData2 bits [1:0]
62599b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x03;
62699b78ec8SJason M. Bills 
62799b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:5]
62899b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 5 & 0x07;
62999b78ec8SJason M. Bills                     // Channel = eventData3 bits [4:2]
63099b78ec8SJason M. Bills                     int channel = selData.eventData3 >> 2 & 0x07;
63199b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
63299b78ec8SJason M. Bills                     channelLetter[0] += channel;
63399b78ec8SJason M. Bills                     // DIMM = eventData3 bits [1:0]
63499b78ec8SJason M. Bills                     int dimm = selData.eventData3 & 0x03;
63599b78ec8SJason M. Bills 
63699b78ec8SJason M. Bills                     // Save the messageArgs
63799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
63899b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
63999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm + 1));
64099b78ec8SJason M. Bills                     messageArgs.push_back(std::string(domainLetter));
64199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
64299b78ec8SJason M. Bills 
64399b78ec8SJason M. Bills                     break;
64499b78ec8SJason M. Bills                 }
64599b78ec8SJason M. Bills                 default:
6466dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
64799b78ec8SJason M. Bills                     break;
64899b78ec8SJason M. Bills             }
64999b78ec8SJason M. Bills             break;
65099b78ec8SJason M. Bills         case BIOSSMISensors::memoryParityError:
65199b78ec8SJason M. Bills             switch (eventType)
65299b78ec8SJason M. Bills             {
65399b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
65499b78ec8SJason M. Bills                 {
65599b78ec8SJason M. Bills                     switch (selData.offset)
65699b78ec8SJason M. Bills                     {
65799b78ec8SJason M. Bills                         case 0x03:
65899b78ec8SJason M. Bills                         {
65999b78ec8SJason M. Bills                             // type = eventData2 bits [2:0]
66099b78ec8SJason M. Bills                             int type = selData.eventData2 & 0x07;
66199b78ec8SJason M. Bills                             switch (type)
66299b78ec8SJason M. Bills                             {
66399b78ec8SJason M. Bills                                 case 0x00:
66499b78ec8SJason M. Bills                                     messageID += ".MemoryParityNotKnown";
66599b78ec8SJason M. Bills                                     break;
66699b78ec8SJason M. Bills                                 case 0x03:
66799b78ec8SJason M. Bills                                     messageID +=
66899b78ec8SJason M. Bills                                         ".MemoryParityCommandAndAddress";
66999b78ec8SJason M. Bills                                     break;
67099b78ec8SJason M. Bills                                 default:
6716dd8f047SJason M. Bills                                     return defaultMessageHook(ipmiRaw);
67299b78ec8SJason M. Bills                                     break;
67399b78ec8SJason M. Bills                             }
67499b78ec8SJason M. Bills                             break;
67599b78ec8SJason M. Bills                         }
67699b78ec8SJason M. Bills                         default:
6776dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
67899b78ec8SJason M. Bills                             break;
67999b78ec8SJason M. Bills                     }
68099b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
68199b78ec8SJason M. Bills 
68299b78ec8SJason M. Bills                     // channelValid = eventData2 bit [4]
68399b78ec8SJason M. Bills                     int channelValid = selData.eventData2 >> 4 & 0x01;
68499b78ec8SJason M. Bills                     // dimmValid = eventData2 bit [3]
68599b78ec8SJason M. Bills                     int dimmValid = selData.eventData2 >> 3 & 0x01;
68699b78ec8SJason M. Bills 
68799b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:5]
68899b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 5 & 0x07;
68999b78ec8SJason M. Bills                     // Channel = eventData3 bits [4:2]
69099b78ec8SJason M. Bills                     int channel = selData.eventData3 >> 2 & 0x07;
69199b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
69299b78ec8SJason M. Bills                     channelLetter[0] += channel;
69399b78ec8SJason M. Bills                     // DIMM = eventData3 bits [1:0]
69499b78ec8SJason M. Bills                     int dimm = selData.eventData3 & 0x03;
69599b78ec8SJason M. Bills 
69699b78ec8SJason M. Bills                     // Save the messageArgs
69799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
69899b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
69999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm + 1));
70099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(channelValid));
70199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimmValid));
70299b78ec8SJason M. Bills 
70399b78ec8SJason M. Bills                     break;
70499b78ec8SJason M. Bills                 }
70599b78ec8SJason M. Bills                 default:
7066dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
70799b78ec8SJason M. Bills                     break;
70899b78ec8SJason M. Bills             }
70999b78ec8SJason M. Bills             break;
71099b78ec8SJason M. Bills         case BIOSSMISensors::pcieFatalError2:
71199b78ec8SJason M. Bills             switch (eventType)
71299b78ec8SJason M. Bills             {
71399b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete6:
71499b78ec8SJason M. Bills                 {
71599b78ec8SJason M. Bills                     switch (selData.offset)
71699b78ec8SJason M. Bills                     {
71799b78ec8SJason M. Bills                         case 0x00:
71899b78ec8SJason M. Bills                             messageID += ".PCIeFatalAtomicEgressBlocked";
71999b78ec8SJason M. Bills                             break;
72099b78ec8SJason M. Bills                         case 0x01:
72199b78ec8SJason M. Bills                             messageID += ".PCIeFatalTLPPrefixBlocked";
72299b78ec8SJason M. Bills                             break;
72399b78ec8SJason M. Bills                         case 0x0f:
72499b78ec8SJason M. Bills                             messageID +=
72599b78ec8SJason M. Bills                                 ".PCIeFatalUnspecifiedNonAERFatalError";
72699b78ec8SJason M. Bills                             break;
72799b78ec8SJason M. Bills                         default:
7286dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
72999b78ec8SJason M. Bills                             break;
73099b78ec8SJason M. Bills                     }
73199b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
73299b78ec8SJason M. Bills 
73399b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
73499b78ec8SJason M. Bills                     int bus = selData.eventData2;
73599b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
73699b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
73799b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
73899b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
73999b78ec8SJason M. Bills 
74099b78ec8SJason M. Bills                     // Save the messageArgs
74199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
74299b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
74399b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
74499b78ec8SJason M. Bills 
74599b78ec8SJason M. Bills                     break;
74699b78ec8SJason M. Bills                 }
74799b78ec8SJason M. Bills                 default:
7486dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
74999b78ec8SJason M. Bills                     break;
75099b78ec8SJason M. Bills             }
75199b78ec8SJason M. Bills             break;
75299b78ec8SJason M. Bills         case BIOSSMISensors::biosRecovery:
75399b78ec8SJason M. Bills             switch (eventType)
75499b78ec8SJason M. Bills             {
75599b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete0:
75699b78ec8SJason M. Bills                 {
75799b78ec8SJason M. Bills                     switch (selData.offset)
75899b78ec8SJason M. Bills                     {
75999b78ec8SJason M. Bills                         case 0x01:
76099b78ec8SJason M. Bills                             messageID += ".BIOSRecoveryStart";
76199b78ec8SJason M. Bills                             break;
76299b78ec8SJason M. Bills                         default:
7636dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
76499b78ec8SJason M. Bills                             break;
76599b78ec8SJason M. Bills                     }
76699b78ec8SJason M. Bills                     break;
76799b78ec8SJason M. Bills                 }
76899b78ec8SJason M. Bills                 case BIOSEventTypes::reservedF0:
76999b78ec8SJason M. Bills                 {
77099b78ec8SJason M. Bills                     switch (selData.offset)
77199b78ec8SJason M. Bills                     {
77299b78ec8SJason M. Bills                         case 0x01:
77399b78ec8SJason M. Bills                             messageID += ".BIOSRecoveryComplete";
77499b78ec8SJason M. Bills                             break;
77599b78ec8SJason M. Bills                         default:
7766dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
77799b78ec8SJason M. Bills                             break;
77899b78ec8SJason M. Bills                     }
77999b78ec8SJason M. Bills                     break;
78099b78ec8SJason M. Bills                 }
78199b78ec8SJason M. Bills                 default:
7826dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
78399b78ec8SJason M. Bills                     break;
78499b78ec8SJason M. Bills             }
78599b78ec8SJason M. Bills             break;
78699b78ec8SJason M. Bills         case BIOSSMISensors::adddcError:
78799b78ec8SJason M. Bills             switch (eventType)
78899b78ec8SJason M. Bills             {
78999b78ec8SJason M. Bills                 case BIOSEventTypes::reservedA0:
79099b78ec8SJason M. Bills                 {
79199b78ec8SJason M. Bills                     messageID += ".ADDDCCorrectable";
79299b78ec8SJason M. Bills 
79399b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
79499b78ec8SJason M. Bills 
79599b78ec8SJason M. Bills                     // dimm = eventData2 bits [7:4]
79699b78ec8SJason M. Bills                     int dimm = selData.eventData2 >> 4 & 0x0F;
79799b78ec8SJason M. Bills                     // rank = eventData2 bits [3:0]
79899b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x0F;
79999b78ec8SJason M. Bills 
80099b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:4]
80199b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 4 & 0x0F;
80299b78ec8SJason M. Bills                     // Channel = eventData3 bits [3:0]
80399b78ec8SJason M. Bills                     int channel = selData.eventData3 & 0x0F;
80499b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
80599b78ec8SJason M. Bills                     channelLetter[0] += channel;
80699b78ec8SJason M. Bills 
80799b78ec8SJason M. Bills                     // Save the messageArgs
80899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
80999b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
81099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm));
81199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
81299b78ec8SJason M. Bills 
81399b78ec8SJason M. Bills                     break;
81499b78ec8SJason M. Bills                 }
81599b78ec8SJason M. Bills                 default:
8166dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
81799b78ec8SJason M. Bills                     break;
81899b78ec8SJason M. Bills             }
81999b78ec8SJason M. Bills             break;
82099b78ec8SJason M. Bills         default:
8216dd8f047SJason M. Bills             return defaultMessageHook(ipmiRaw);
82299b78ec8SJason M. Bills             break;
82399b78ec8SJason M. Bills     }
82499b78ec8SJason M. Bills 
82599b78ec8SJason M. Bills     // Log the Redfish message to the journal with the appropriate metadata
82699b78ec8SJason M. Bills     std::string journalMsg = "BIOS SMI IPMI event: " + ipmiRaw;
82799b78ec8SJason M. Bills     std::string messageArgsString = boost::algorithm::join(messageArgs, ",");
82899b78ec8SJason M. Bills     phosphor::logging::log<phosphor::logging::level::INFO>(
82999b78ec8SJason M. Bills         journalMsg.c_str(),
83099b78ec8SJason M. Bills         phosphor::logging::entry("REDFISH_MESSAGE_ID=%s", messageID.c_str()),
83199b78ec8SJason M. Bills         phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s",
83299b78ec8SJason M. Bills                                  messageArgsString.c_str()));
83399b78ec8SJason M. Bills 
83499b78ec8SJason M. Bills     return true;
83599b78ec8SJason M. Bills }
83699b78ec8SJason M. Bills 
startRedfishHook(const SELData & selData,const std::string & ipmiRaw)83799b78ec8SJason M. Bills static bool startRedfishHook(const SELData& selData, const std::string& ipmiRaw)
83899b78ec8SJason M. Bills {
8399e58cfe1SSujoy Ray     uint8_t generatorIDLowByte = static_cast<uint8_t>(selData.generatorID);
8409e58cfe1SSujoy Ray     // Generator ID is 7 bit and LS Bit contains '1' or '0' depending on the
8419e58cfe1SSujoy Ray     // source. Refer IPMI SPEC, Table 32, SEL Event Records.
8429e58cfe1SSujoy Ray     switch (generatorIDLowByte)
84399b78ec8SJason M. Bills     {
84499b78ec8SJason M. Bills         case 0x01: // Check if this message is from the BIOS Generator ID
84599b78ec8SJason M. Bills             // Let the BIOS hook handle this request
84699b78ec8SJason M. Bills             return biosMessageHook(selData, ipmiRaw);
84799b78ec8SJason M. Bills             break;
84899b78ec8SJason M. Bills 
84999b78ec8SJason M. Bills         case 0x33: // Check if this message is from the BIOS SMI Generator ID
85099b78ec8SJason M. Bills             // Let the BIOS SMI hook handle this request
85199b78ec8SJason M. Bills             return biosSMIMessageHook(selData, ipmiRaw);
85299b78ec8SJason M. Bills             break;
853d2220ccdSAgnieszka Szlendak 
854d2220ccdSAgnieszka Szlendak         case 0x2C: // Message from Intel ME
855d2220ccdSAgnieszka Szlendak             return me::messageHook(selData, ipmiRaw);
856d2220ccdSAgnieszka Szlendak             break;
85799b78ec8SJason M. Bills     }
85899b78ec8SJason M. Bills 
8596dd8f047SJason M. Bills     // No hooks handled the request, so let it go to default
8606dd8f047SJason M. Bills     return defaultMessageHook(ipmiRaw);
86199b78ec8SJason M. Bills }
86299b78ec8SJason M. Bills } // namespace redfish_hooks
86399b78ec8SJason M. Bills 
checkRedfishHooks(uint16_t recordID,uint8_t recordType,uint32_t timestamp,uint16_t generatorID,uint8_t evmRev,uint8_t sensorType,uint8_t sensorNum,uint8_t eventType,uint8_t eventData1,uint8_t eventData2,uint8_t eventData3)8646dd8f047SJason M. Bills bool checkRedfishHooks(uint16_t recordID, uint8_t recordType,
8656dd8f047SJason M. Bills                        uint32_t timestamp, uint16_t generatorID, uint8_t evmRev,
8666dd8f047SJason M. Bills                        uint8_t sensorType, uint8_t sensorNum, uint8_t eventType,
8676dd8f047SJason M. Bills                        uint8_t eventData1, uint8_t eventData2,
8686dd8f047SJason M. Bills                        uint8_t eventData3)
86999b78ec8SJason M. Bills {
87099b78ec8SJason M. Bills     // Save the raw IPMI string of the request
87199b78ec8SJason M. Bills     std::string ipmiRaw;
8726dd8f047SJason M. Bills     std::array selBytes = {static_cast<uint8_t>(recordID),
8736dd8f047SJason M. Bills                            static_cast<uint8_t>(recordID >> 8),
8746dd8f047SJason M. Bills                            recordType,
8756dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp),
8766dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp >> 8),
8776dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp >> 16),
8786dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp >> 24),
8796dd8f047SJason M. Bills                            static_cast<uint8_t>(generatorID),
8806dd8f047SJason M. Bills                            static_cast<uint8_t>(generatorID >> 8),
8816dd8f047SJason M. Bills                            evmRev,
8826dd8f047SJason M. Bills                            sensorType,
8836dd8f047SJason M. Bills                            sensorNum,
8846dd8f047SJason M. Bills                            eventType,
8856dd8f047SJason M. Bills                            eventData1,
8866dd8f047SJason M. Bills                            eventData2,
8876dd8f047SJason M. Bills                            eventData3};
8886dd8f047SJason M. Bills     redfish_hooks::toHexStr(boost::beast::span<uint8_t>(selBytes), ipmiRaw);
8896dd8f047SJason M. Bills 
8906dd8f047SJason M. Bills     // First check that this is a system event record type since that
8916dd8f047SJason M. Bills     // determines the definition of the rest of the data
8926dd8f047SJason M. Bills     if (recordType != ipmi::sel::systemEvent)
8936dd8f047SJason M. Bills     {
8946dd8f047SJason M. Bills         // OEM record type, so let it go to the SEL
8956dd8f047SJason M. Bills         return redfish_hooks::defaultMessageHook(ipmiRaw);
8966dd8f047SJason M. Bills     }
89799b78ec8SJason M. Bills 
89899b78ec8SJason M. Bills     // Extract the SEL data for the hook
8996dd8f047SJason M. Bills     redfish_hooks::SELData selData = {.generatorID = generatorID,
9006dd8f047SJason M. Bills                                       .sensorNum = sensorNum,
9016dd8f047SJason M. Bills                                       .eventType = eventType,
9026dd8f047SJason M. Bills                                       .offset = eventData1 & 0x0F,
9036dd8f047SJason M. Bills                                       .eventData2 = eventData2,
9046dd8f047SJason M. Bills                                       .eventData3 = eventData3};
90599b78ec8SJason M. Bills 
90699b78ec8SJason M. Bills     return redfish_hooks::startRedfishHook(selData, ipmiRaw);
90799b78ec8SJason M. Bills }
90899b78ec8SJason M. Bills 
checkRedfishHooks(uint16_t generatorID,uint8_t evmRev,uint8_t sensorType,uint8_t sensorNum,uint8_t eventType,uint8_t eventData1,uint8_t eventData2,uint8_t eventData3)9099e58cfe1SSujoy Ray bool checkRedfishHooks(uint16_t generatorID, uint8_t evmRev, uint8_t sensorType,
91099b78ec8SJason M. Bills                        uint8_t sensorNum, uint8_t eventType, uint8_t eventData1,
91199b78ec8SJason M. Bills                        uint8_t eventData2, uint8_t eventData3)
91299b78ec8SJason M. Bills {
91399b78ec8SJason M. Bills     // Save the raw IPMI string of the selData
91499b78ec8SJason M. Bills     std::string ipmiRaw;
9159e58cfe1SSujoy Ray     std::array selBytes = {static_cast<uint8_t>(generatorID),
9169e58cfe1SSujoy Ray                            static_cast<uint8_t>(generatorID >> 8),
9179e58cfe1SSujoy Ray                            evmRev,
9189e58cfe1SSujoy Ray                            sensorType,
9199e58cfe1SSujoy Ray                            sensorNum,
9209e58cfe1SSujoy Ray                            eventType,
9219e58cfe1SSujoy Ray                            eventData1,
9229e58cfe1SSujoy Ray                            eventData2,
9239e58cfe1SSujoy Ray                            eventData3};
92499b78ec8SJason M. Bills     redfish_hooks::toHexStr(boost::beast::span<uint8_t>(selBytes), ipmiRaw);
92599b78ec8SJason M. Bills 
92699b78ec8SJason M. Bills     // Extract the SEL data for the hook
92799b78ec8SJason M. Bills     redfish_hooks::SELData selData = {.generatorID = generatorID,
92899b78ec8SJason M. Bills                                       .sensorNum = sensorNum,
92999b78ec8SJason M. Bills                                       .eventType = eventType,
93099b78ec8SJason M. Bills                                       .offset = eventData1 & 0x0F,
93199b78ec8SJason M. Bills                                       .eventData2 = eventData2,
93299b78ec8SJason M. Bills                                       .eventData3 = eventData3};
93399b78ec8SJason M. Bills 
93499b78ec8SJason M. Bills     return redfish_hooks::startRedfishHook(selData, ipmiRaw);
93599b78ec8SJason M. Bills }
93699b78ec8SJason M. Bills 
93799b78ec8SJason M. Bills } // namespace intel_oem::ipmi::sel
938