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/algorithm/string/join.hpp>
1899b78ec8SJason M. Bills #include <boost/beast/core/span.hpp>
1999b78ec8SJason M. Bills #include <iomanip>
2099b78ec8SJason M. Bills #include <ipmi_to_redfish_hooks.hpp>
2199b78ec8SJason M. Bills #include <phosphor-logging/log.hpp>
2299b78ec8SJason M. Bills #include <sstream>
2399b78ec8SJason M. Bills #include <storagecommands.hpp>
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 {
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 
436dd8f047SJason M. Bills static bool defaultMessageHook(const std::string& ipmiRaw)
446dd8f047SJason M. Bills {
456dd8f047SJason M. Bills     // Log the record as a default Redfish message instead of a SEL record
466dd8f047SJason M. Bills 
476dd8f047SJason M. Bills     static const std::string openBMCMessageRegistryVersion("0.1");
486dd8f047SJason M. Bills     std::string messageID =
496dd8f047SJason M. Bills         "OpenBMC." + openBMCMessageRegistryVersion + ".SELEntryAdded";
506dd8f047SJason M. Bills 
516dd8f047SJason M. Bills     std::vector<std::string> messageArgs;
526dd8f047SJason M. Bills     messageArgs.push_back(ipmiRaw);
536dd8f047SJason M. Bills 
546dd8f047SJason M. Bills     // Log the Redfish message to the journal with the appropriate metadata
556dd8f047SJason M. Bills     std::string journalMsg = "SEL Entry Added: " + ipmiRaw;
566dd8f047SJason M. Bills     std::string messageArgsString = boost::algorithm::join(messageArgs, ",");
576dd8f047SJason M. Bills     phosphor::logging::log<phosphor::logging::level::INFO>(
586dd8f047SJason M. Bills         journalMsg.c_str(),
596dd8f047SJason M. Bills         phosphor::logging::entry("REDFISH_MESSAGE_ID=%s", messageID.c_str()),
606dd8f047SJason M. Bills         phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s",
616dd8f047SJason M. Bills                                  messageArgsString.c_str()));
626dd8f047SJason M. Bills 
636dd8f047SJason M. Bills     return true;
646dd8f047SJason M. Bills }
656dd8f047SJason M. Bills 
6699b78ec8SJason M. Bills // Record a BIOS message as a Redfish message instead of a SEL record
6799b78ec8SJason M. Bills static bool biosMessageHook(const SELData& selData, const std::string& ipmiRaw)
6899b78ec8SJason M. Bills {
6999b78ec8SJason M. Bills     // This is a BIOS message, so record it as a Redfish message instead
7099b78ec8SJason M. Bills     // of a SEL record
7199b78ec8SJason M. Bills 
7299b78ec8SJason M. Bills     // Walk through the SEL request record to build the appropriate Redfish
7399b78ec8SJason M. Bills     // message
7499b78ec8SJason M. Bills     static constexpr std::string_view openBMCMessageRegistryVersion = "0.1";
7599b78ec8SJason M. Bills     std::string messageID =
7699b78ec8SJason M. Bills         "OpenBMC." + std::string(openBMCMessageRegistryVersion);
7799b78ec8SJason M. Bills     std::vector<std::string> messageArgs;
7899b78ec8SJason M. Bills     BIOSSensors sensor = static_cast<BIOSSensors>(selData.sensorNum);
7999b78ec8SJason M. Bills     BIOSEventTypes eventType = static_cast<BIOSEventTypes>(selData.eventType);
8099b78ec8SJason M. Bills     switch (sensor)
8199b78ec8SJason M. Bills     {
8299b78ec8SJason M. Bills         case BIOSSensors::memoryRASConfigStatus:
8399b78ec8SJason M. Bills             switch (eventType)
8499b78ec8SJason M. Bills             {
8599b78ec8SJason M. Bills                 case BIOSEventTypes::digitalDiscrete:
8699b78ec8SJason M. Bills                 {
8799b78ec8SJason M. Bills                     switch (selData.offset)
8899b78ec8SJason M. Bills                     {
8999b78ec8SJason M. Bills                         case 0x00:
9099b78ec8SJason M. Bills                             messageID += ".MemoryRASConfigurationDisabled";
9199b78ec8SJason M. Bills                             break;
9299b78ec8SJason M. Bills                         case 0x01:
9399b78ec8SJason M. Bills                             messageID += ".MemoryRASConfigurationEnabled";
9499b78ec8SJason M. Bills                             break;
9599b78ec8SJason M. Bills                         default:
966dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
9799b78ec8SJason M. Bills                             break;
9899b78ec8SJason M. Bills                     }
9999b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
10099b78ec8SJason M. Bills 
10199b78ec8SJason M. Bills                     // error = eventData2 bits [3:0]
10299b78ec8SJason M. Bills                     int error = selData.eventData2 & 0x0F;
10399b78ec8SJason M. Bills 
10499b78ec8SJason M. Bills                     // mode = eventData3 bits [3:0]
10599b78ec8SJason M. Bills                     int mode = selData.eventData3 & 0x0F;
10699b78ec8SJason M. Bills 
10799b78ec8SJason M. Bills                     // Save the messageArgs
10899b78ec8SJason M. Bills                     switch (error)
10999b78ec8SJason M. Bills                     {
11099b78ec8SJason M. Bills                         case 0x00:
11199b78ec8SJason M. Bills                             messageArgs.push_back("None");
11299b78ec8SJason M. Bills                             break;
11399b78ec8SJason M. Bills                         case 0x03:
11499b78ec8SJason M. Bills                             messageArgs.push_back("Invalid DIMM Config");
11599b78ec8SJason M. Bills                             break;
11699b78ec8SJason M. Bills                         default:
11799b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(error));
11899b78ec8SJason M. Bills                             break;
11999b78ec8SJason M. Bills                     }
12099b78ec8SJason M. Bills                     switch (mode)
12199b78ec8SJason M. Bills                     {
12299b78ec8SJason M. Bills                         case 0x00:
12399b78ec8SJason M. Bills                             messageArgs.push_back("None");
12499b78ec8SJason M. Bills                             break;
12599b78ec8SJason M. Bills                         case 0x01:
12699b78ec8SJason M. Bills                             messageArgs.push_back("Mirroring");
12799b78ec8SJason M. Bills                             break;
12899b78ec8SJason M. Bills                         case 0x02:
12999b78ec8SJason M. Bills                             messageArgs.push_back("Lockstep");
13099b78ec8SJason M. Bills                             break;
13199b78ec8SJason M. Bills                         case 0x04:
13299b78ec8SJason M. Bills                             messageArgs.push_back("Rank Sparing");
13399b78ec8SJason M. Bills                             break;
13499b78ec8SJason M. Bills                         default:
13599b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(mode));
13699b78ec8SJason M. Bills                             break;
13799b78ec8SJason M. Bills                     }
13899b78ec8SJason M. Bills 
13999b78ec8SJason M. Bills                     break;
14099b78ec8SJason M. Bills                 }
14199b78ec8SJason M. Bills                 default:
1426dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
14399b78ec8SJason M. Bills                     break;
14499b78ec8SJason M. Bills             }
14599b78ec8SJason M. Bills             break;
14699b78ec8SJason M. Bills         case BIOSSensors::biosPOSTError:
14799b78ec8SJason M. Bills             switch (eventType)
14899b78ec8SJason M. Bills             {
14999b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
15099b78ec8SJason M. Bills                 {
15199b78ec8SJason M. Bills                     switch (selData.offset)
15299b78ec8SJason M. Bills                     {
15399b78ec8SJason M. Bills                         case 0x00:
15499b78ec8SJason M. Bills                             messageID += ".BIOSPOSTError";
15599b78ec8SJason M. Bills                             break;
15699b78ec8SJason M. Bills                         default:
1576dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
15899b78ec8SJason M. Bills                             break;
15999b78ec8SJason M. Bills                     }
16099b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
16199b78ec8SJason M. Bills 
16299b78ec8SJason M. Bills                     std::array<uint8_t, 2> post;
16399b78ec8SJason M. Bills                     // post LSB = eventData2 bits [7:0]
16499b78ec8SJason M. Bills                     post[1] = selData.eventData2;
16599b78ec8SJason M. Bills                     // post MSB = eventData3 bits [7:0]
16699b78ec8SJason M. Bills                     post[0] = selData.eventData3;
16799b78ec8SJason M. Bills 
16899b78ec8SJason M. Bills                     // Save the messageArgs
16999b78ec8SJason M. Bills                     messageArgs.emplace_back();
17099b78ec8SJason M. Bills                     std::string& postStr = messageArgs.back();
17199b78ec8SJason M. Bills                     toHexStr(boost::beast::span<uint8_t>(post), postStr);
17299b78ec8SJason M. Bills 
17399b78ec8SJason M. Bills                     break;
17499b78ec8SJason M. Bills                 }
17599b78ec8SJason M. Bills                 default:
1766dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
17799b78ec8SJason M. Bills                     break;
17899b78ec8SJason M. Bills             }
17999b78ec8SJason M. Bills             break;
18099b78ec8SJason M. Bills         case BIOSSensors::intelUPILinkWidthReduced:
18199b78ec8SJason M. Bills             switch (eventType)
18299b78ec8SJason M. Bills             {
18399b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete7:
18499b78ec8SJason M. Bills                 {
18599b78ec8SJason M. Bills                     switch (selData.offset)
18699b78ec8SJason M. Bills                     {
18799b78ec8SJason M. Bills                         case 0x01:
18899b78ec8SJason M. Bills                             messageID += ".IntelUPILinkWidthReducedToHalf";
18999b78ec8SJason M. Bills                             break;
19099b78ec8SJason M. Bills                         case 0x02:
19199b78ec8SJason M. Bills                             messageID += ".IntelUPILinkWidthReducedToQuarter";
19299b78ec8SJason M. Bills                             break;
19399b78ec8SJason M. Bills                         default:
1946dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
19599b78ec8SJason M. Bills                             break;
19699b78ec8SJason M. Bills                     }
19799b78ec8SJason M. Bills                     // Get the message data from eventData2
19899b78ec8SJason M. Bills 
19999b78ec8SJason M. Bills                     // Node ID = eventData2 bits [7:0]
20099b78ec8SJason M. Bills                     int node = selData.eventData2;
20199b78ec8SJason M. Bills 
20299b78ec8SJason M. Bills                     // Save the messageArgs
20399b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(node + 1));
20499b78ec8SJason M. Bills 
20599b78ec8SJason M. Bills                     break;
20699b78ec8SJason M. Bills                 }
20799b78ec8SJason M. Bills                 default:
2086dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
20999b78ec8SJason M. Bills                     break;
21099b78ec8SJason M. Bills             }
21199b78ec8SJason M. Bills             break;
21299b78ec8SJason M. Bills         case BIOSSensors::memoryRASModeSelect:
21399b78ec8SJason M. Bills             switch (eventType)
21499b78ec8SJason M. Bills             {
21599b78ec8SJason M. Bills                 case BIOSEventTypes::digitalDiscrete:
21699b78ec8SJason M. Bills                 {
21799b78ec8SJason M. Bills                     switch (selData.offset)
21899b78ec8SJason M. Bills                     {
21999b78ec8SJason M. Bills                         case 0x00:
22099b78ec8SJason M. Bills                             messageID += ".MemoryRASModeDisabled";
22199b78ec8SJason M. Bills                             break;
22299b78ec8SJason M. Bills                         case 0x01:
22399b78ec8SJason M. Bills                             messageID += ".MemoryRASModeEnabled";
22499b78ec8SJason M. Bills                             break;
22599b78ec8SJason M. Bills                         default:
2266dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
22799b78ec8SJason M. Bills                             break;
22899b78ec8SJason M. Bills                     }
22999b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
23099b78ec8SJason M. Bills 
23199b78ec8SJason M. Bills                     // prior mode = eventData2 bits [3:0]
23299b78ec8SJason M. Bills                     int priorMode = selData.eventData2 & 0x0F;
23399b78ec8SJason M. Bills 
23499b78ec8SJason M. Bills                     // selected mode = eventData3 bits [3:0]
23599b78ec8SJason M. Bills                     int selectedMode = selData.eventData3 & 0x0F;
23699b78ec8SJason M. Bills 
23799b78ec8SJason M. Bills                     // Save the messageArgs
23899b78ec8SJason M. Bills                     switch (priorMode)
23999b78ec8SJason M. Bills                     {
24099b78ec8SJason M. Bills                         case 0x00:
24199b78ec8SJason M. Bills                             messageArgs.push_back("None");
24299b78ec8SJason M. Bills                             break;
24399b78ec8SJason M. Bills                         case 0x01:
24499b78ec8SJason M. Bills                             messageArgs.push_back("Mirroring");
24599b78ec8SJason M. Bills                             break;
24699b78ec8SJason M. Bills                         case 0x02:
24799b78ec8SJason M. Bills                             messageArgs.push_back("Lockstep");
24899b78ec8SJason M. Bills                             break;
24999b78ec8SJason M. Bills                         case 0x04:
25099b78ec8SJason M. Bills                             messageArgs.push_back("Rank Sparing");
25199b78ec8SJason M. Bills                             break;
25299b78ec8SJason M. Bills                         default:
25399b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(priorMode));
25499b78ec8SJason M. Bills                             break;
25599b78ec8SJason M. Bills                     }
25699b78ec8SJason M. Bills                     switch (selectedMode)
25799b78ec8SJason M. Bills                     {
25899b78ec8SJason M. Bills                         case 0x00:
25999b78ec8SJason M. Bills                             messageArgs.push_back("None");
26099b78ec8SJason M. Bills                             break;
26199b78ec8SJason M. Bills                         case 0x01:
26299b78ec8SJason M. Bills                             messageArgs.push_back("Mirroring");
26399b78ec8SJason M. Bills                             break;
26499b78ec8SJason M. Bills                         case 0x02:
26599b78ec8SJason M. Bills                             messageArgs.push_back("Lockstep");
26699b78ec8SJason M. Bills                             break;
26799b78ec8SJason M. Bills                         case 0x04:
26899b78ec8SJason M. Bills                             messageArgs.push_back("Rank Sparing");
26999b78ec8SJason M. Bills                             break;
27099b78ec8SJason M. Bills                         default:
27199b78ec8SJason M. Bills                             messageArgs.push_back(std::to_string(selectedMode));
27299b78ec8SJason M. Bills                             break;
27399b78ec8SJason M. Bills                     }
27499b78ec8SJason M. Bills 
27599b78ec8SJason M. Bills                     break;
27699b78ec8SJason M. Bills                 }
27799b78ec8SJason M. Bills                 default:
2786dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
27999b78ec8SJason M. Bills                     break;
28099b78ec8SJason M. Bills             }
28199b78ec8SJason M. Bills             break;
28299b78ec8SJason M. Bills         case BIOSSensors::bootEvent:
28399b78ec8SJason M. Bills             switch (eventType)
28499b78ec8SJason M. Bills             {
28599b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
28699b78ec8SJason M. Bills                 {
28799b78ec8SJason M. Bills                     switch (selData.offset)
28899b78ec8SJason M. Bills                     {
28999b78ec8SJason M. Bills                         case 0x01:
29099b78ec8SJason M. Bills                             messageID += ".BIOSBoot";
29199b78ec8SJason M. Bills                             break;
29299b78ec8SJason M. Bills                         default:
2936dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
29499b78ec8SJason M. Bills                             break;
29599b78ec8SJason M. Bills                     }
29699b78ec8SJason M. Bills                     break;
29799b78ec8SJason M. Bills                 }
29899b78ec8SJason M. Bills                 default:
2996dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
30099b78ec8SJason M. Bills                     break;
30199b78ec8SJason M. Bills             }
30299b78ec8SJason M. Bills             break;
30399b78ec8SJason M. Bills         default:
3046dd8f047SJason M. Bills             return defaultMessageHook(ipmiRaw);
30599b78ec8SJason M. Bills             break;
30699b78ec8SJason M. Bills     }
30799b78ec8SJason M. Bills 
30899b78ec8SJason M. Bills     // Log the Redfish message to the journal with the appropriate metadata
30999b78ec8SJason M. Bills     std::string journalMsg = "BIOS POST IPMI event: " + ipmiRaw;
31099b78ec8SJason M. Bills     if (messageArgs.empty())
31199b78ec8SJason M. Bills     {
31299b78ec8SJason M. Bills         phosphor::logging::log<phosphor::logging::level::INFO>(
31399b78ec8SJason M. Bills             journalMsg.c_str(),
31499b78ec8SJason M. Bills             phosphor::logging::entry("REDFISH_MESSAGE_ID=%s",
31599b78ec8SJason M. Bills                                      messageID.c_str()));
31699b78ec8SJason M. Bills     }
31799b78ec8SJason M. Bills     else
31899b78ec8SJason M. Bills     {
31999b78ec8SJason M. Bills         std::string messageArgsString =
32099b78ec8SJason M. Bills             boost::algorithm::join(messageArgs, ",");
32199b78ec8SJason M. Bills         phosphor::logging::log<phosphor::logging::level::INFO>(
32299b78ec8SJason M. Bills             journalMsg.c_str(),
32399b78ec8SJason M. Bills             phosphor::logging::entry("REDFISH_MESSAGE_ID=%s",
32499b78ec8SJason M. Bills                                      messageID.c_str()),
32599b78ec8SJason M. Bills             phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s",
32699b78ec8SJason M. Bills                                      messageArgsString.c_str()));
32799b78ec8SJason M. Bills     }
32899b78ec8SJason M. Bills 
32999b78ec8SJason M. Bills     return true;
33099b78ec8SJason M. Bills }
33199b78ec8SJason M. Bills 
33299b78ec8SJason M. Bills // Record a BIOS SMI message as a Redfish message instead of a SEL record
33399b78ec8SJason M. Bills static bool biosSMIMessageHook(const SELData& selData,
33499b78ec8SJason M. Bills                                const std::string& ipmiRaw)
33599b78ec8SJason M. Bills {
33699b78ec8SJason M. Bills     // This is a BIOS SMI message, so record it as a Redfish message instead
33799b78ec8SJason M. Bills     // of a SEL record
33899b78ec8SJason M. Bills 
33999b78ec8SJason M. Bills     // Walk through the SEL request record to build the appropriate Redfish
34099b78ec8SJason M. Bills     // message
34199b78ec8SJason M. Bills     static constexpr std::string_view openBMCMessageRegistryVersion = "0.1";
34299b78ec8SJason M. Bills     std::string messageID =
34399b78ec8SJason M. Bills         "OpenBMC." + std::string(openBMCMessageRegistryVersion);
34499b78ec8SJason M. Bills     std::vector<std::string> messageArgs;
34599b78ec8SJason M. Bills     BIOSSMISensors sensor = static_cast<BIOSSMISensors>(selData.sensorNum);
34699b78ec8SJason M. Bills     BIOSEventTypes eventType = static_cast<BIOSEventTypes>(selData.eventType);
34799b78ec8SJason M. Bills     switch (sensor)
34899b78ec8SJason M. Bills     {
34999b78ec8SJason M. Bills         case BIOSSMISensors::mirroringRedundancyState:
35099b78ec8SJason M. Bills             switch (eventType)
35199b78ec8SJason M. Bills             {
35299b78ec8SJason M. Bills                 case BIOSEventTypes::discreteRedundancyStates:
35399b78ec8SJason M. Bills                 {
35499b78ec8SJason M. Bills                     switch (selData.offset)
35599b78ec8SJason M. Bills                     {
35699b78ec8SJason M. Bills                         case 0x00:
35799b78ec8SJason M. Bills                             messageID += ".MirroringRedundancyFull";
35899b78ec8SJason M. Bills                             break;
35999b78ec8SJason M. Bills                         case 0x02:
36099b78ec8SJason M. Bills                             messageID += ".MirroringRedundancyDegraded";
36199b78ec8SJason M. Bills                             break;
36299b78ec8SJason M. Bills                         default:
3636dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
36499b78ec8SJason M. Bills                             break;
36599b78ec8SJason M. Bills                     }
36699b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
36799b78ec8SJason M. Bills 
36899b78ec8SJason M. Bills                     // pair = eventData2 bits [7:4]
36999b78ec8SJason M. Bills                     int pair = selData.eventData2 >> 4 & 0x0F;
37099b78ec8SJason M. Bills                     // rank = eventData2 bits [1:0]
37199b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x03;
37299b78ec8SJason M. Bills 
37399b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:5]
37499b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 5 & 0x07;
37599b78ec8SJason M. Bills                     // Channel = eventData3 bits [4:2]
37699b78ec8SJason M. Bills                     int channel = selData.eventData3 >> 2 & 0x07;
37799b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
37899b78ec8SJason M. Bills                     channelLetter[0] += channel;
37999b78ec8SJason M. Bills                     // DIMM = eventData3 bits [1:0]
38099b78ec8SJason M. Bills                     int dimm = selData.eventData3 & 0x03;
38199b78ec8SJason M. Bills 
38299b78ec8SJason M. Bills                     // Save the messageArgs
38399b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
38499b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
38599b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm + 1));
38699b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(pair));
38799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
38899b78ec8SJason M. Bills 
38999b78ec8SJason M. Bills                     break;
39099b78ec8SJason M. Bills                 }
39199b78ec8SJason M. Bills                 default:
3926dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
39399b78ec8SJason M. Bills                     break;
39499b78ec8SJason M. Bills             }
39599b78ec8SJason M. Bills             break;
39699b78ec8SJason M. Bills         case BIOSSMISensors::memoryECCError:
39799b78ec8SJason M. Bills             switch (eventType)
39899b78ec8SJason M. Bills             {
39999b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
40099b78ec8SJason M. Bills                 {
40199b78ec8SJason M. Bills                     switch (selData.offset)
40299b78ec8SJason M. Bills                     {
40399b78ec8SJason M. Bills                         case 0x00:
40499b78ec8SJason M. Bills                             messageID += ".MemoryECCCorrectable";
40599b78ec8SJason M. Bills                             break;
40699b78ec8SJason M. Bills                         case 0x01:
40799b78ec8SJason M. Bills                             messageID += ".MemoryECCUncorrectable";
40899b78ec8SJason M. Bills                             break;
40999b78ec8SJason M. Bills                         default:
4106dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
41199b78ec8SJason M. Bills                             break;
41299b78ec8SJason M. Bills                     }
41399b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
41499b78ec8SJason M. Bills 
41599b78ec8SJason M. Bills                     // dimm = eventData2 bits [7:4]
41699b78ec8SJason M. Bills                     int dimm = selData.eventData2 >> 4 & 0x0F;
41799b78ec8SJason M. Bills                     // rank = eventData2 bits [3:0]
41899b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x0F;
41999b78ec8SJason M. Bills 
42099b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:4]
42199b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 4 & 0x0F;
42299b78ec8SJason M. Bills                     // Channel = eventData3 bits [3:0]
42399b78ec8SJason M. Bills                     int channel = selData.eventData3 & 0x0F;
42499b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
42599b78ec8SJason M. Bills                     channelLetter[0] += channel;
42699b78ec8SJason M. Bills 
42799b78ec8SJason M. Bills                     // Save the messageArgs
42899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
42999b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
43099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm));
43199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
43299b78ec8SJason M. Bills 
43399b78ec8SJason M. Bills                     break;
43499b78ec8SJason M. Bills                 }
43599b78ec8SJason M. Bills                 default:
4366dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
43799b78ec8SJason M. Bills                     break;
43899b78ec8SJason M. Bills             }
43999b78ec8SJason M. Bills             break;
44099b78ec8SJason M. Bills         case BIOSSMISensors::legacyPCIError:
44199b78ec8SJason M. Bills             switch (eventType)
44299b78ec8SJason M. Bills             {
44399b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
44499b78ec8SJason M. Bills                 {
44599b78ec8SJason M. Bills                     switch (selData.offset)
44699b78ec8SJason M. Bills                     {
44799b78ec8SJason M. Bills                         case 0x04:
44899b78ec8SJason M. Bills                             messageID += ".LegacyPCIPERR";
44999b78ec8SJason M. Bills                             break;
45099b78ec8SJason M. Bills                         case 0x05:
45199b78ec8SJason M. Bills                             messageID += ".LegacyPCISERR";
45299b78ec8SJason M. Bills                             break;
45399b78ec8SJason M. Bills                         default:
4546dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
45599b78ec8SJason M. Bills                             break;
45699b78ec8SJason M. Bills                     }
45799b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
45899b78ec8SJason M. Bills 
45999b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
46099b78ec8SJason M. Bills                     int bus = selData.eventData2;
46199b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
46299b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
46399b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
46499b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
46599b78ec8SJason M. Bills 
46699b78ec8SJason M. Bills                     // Save the messageArgs
46799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
46899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
46999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
47099b78ec8SJason M. Bills 
47199b78ec8SJason M. Bills                     break;
47299b78ec8SJason M. Bills                 }
47399b78ec8SJason M. Bills                 default:
4746dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
47599b78ec8SJason M. Bills                     break;
47699b78ec8SJason M. Bills             }
47799b78ec8SJason M. Bills             break;
47899b78ec8SJason M. Bills         case BIOSSMISensors::pcieFatalError:
47999b78ec8SJason M. Bills             switch (eventType)
48099b78ec8SJason M. Bills             {
48199b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete0:
48299b78ec8SJason M. Bills                 {
48399b78ec8SJason M. Bills                     switch (selData.offset)
48499b78ec8SJason M. Bills                     {
48599b78ec8SJason M. Bills                         case 0x00:
48699b78ec8SJason M. Bills                             messageID += ".PCIeFatalDataLinkLayerProtocol";
48799b78ec8SJason M. Bills                             break;
48899b78ec8SJason M. Bills                         case 0x01:
48999b78ec8SJason M. Bills                             messageID += ".PCIeFatalSurpriseLinkDown";
49099b78ec8SJason M. Bills                             break;
49199b78ec8SJason M. Bills                         case 0x02:
49299b78ec8SJason M. Bills                             messageID += ".PCIeFatalCompleterAbort";
49399b78ec8SJason M. Bills                             break;
49499b78ec8SJason M. Bills                         case 0x03:
49599b78ec8SJason M. Bills                             messageID += ".PCIeFatalUnsupportedRequest";
49699b78ec8SJason M. Bills                             break;
49799b78ec8SJason M. Bills                         case 0x04:
49899b78ec8SJason M. Bills                             messageID += ".PCIeFatalPoisonedTLP";
49999b78ec8SJason M. Bills                             break;
50099b78ec8SJason M. Bills                         case 0x05:
50199b78ec8SJason M. Bills                             messageID += ".PCIeFatalFlowControlProtocol";
50299b78ec8SJason M. Bills                             break;
50399b78ec8SJason M. Bills                         case 0x06:
50499b78ec8SJason M. Bills                             messageID += ".PCIeFatalCompletionTimeout";
50599b78ec8SJason M. Bills                             break;
50699b78ec8SJason M. Bills                         case 0x07:
50799b78ec8SJason M. Bills                             messageID += ".PCIeFatalReceiverBufferOverflow";
50899b78ec8SJason M. Bills                             break;
50999b78ec8SJason M. Bills                         case 0x08:
51099b78ec8SJason M. Bills                             messageID += ".PCIeFatalACSViolation";
51199b78ec8SJason M. Bills                             break;
51299b78ec8SJason M. Bills                         case 0x09:
51399b78ec8SJason M. Bills                             messageID += ".PCIeFatalMalformedTLP";
51499b78ec8SJason M. Bills                             break;
51599b78ec8SJason M. Bills                         case 0x0a:
51699b78ec8SJason M. Bills                             messageID += ".PCIeFatalECRCError";
51799b78ec8SJason M. Bills                             break;
51899b78ec8SJason M. Bills                         case 0x0b:
51999b78ec8SJason M. Bills                             messageID +=
52099b78ec8SJason M. Bills                                 ".PCIeFatalReceivedFatalMessageFromDownstream";
52199b78ec8SJason M. Bills                             break;
52299b78ec8SJason M. Bills                         case 0x0c:
52399b78ec8SJason M. Bills                             messageID += ".PCIeFatalUnexpectedCompletion";
52499b78ec8SJason M. Bills                             break;
52599b78ec8SJason M. Bills                         case 0x0d:
526*6757fb4eSJason M. Bills                             messageID += ".PCIeFatalReceivedErrNonFatalMessage";
52799b78ec8SJason M. Bills                             break;
52899b78ec8SJason M. Bills                         case 0x0e:
52999b78ec8SJason M. Bills                             messageID += ".PCIeFatalUncorrectableInternal";
53099b78ec8SJason M. Bills                             break;
53199b78ec8SJason M. Bills                         case 0x0f:
53299b78ec8SJason M. Bills                             messageID += ".PCIeFatalMCBlockedTLP";
53399b78ec8SJason M. Bills                             break;
53499b78ec8SJason M. Bills                         default:
5356dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
53699b78ec8SJason M. Bills                             break;
53799b78ec8SJason M. Bills                     }
53899b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
53999b78ec8SJason M. Bills 
54099b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
54199b78ec8SJason M. Bills                     int bus = selData.eventData2;
54299b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
54399b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
54499b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
54599b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
54699b78ec8SJason M. Bills 
54799b78ec8SJason M. Bills                     // Save the messageArgs
54899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
54999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
55099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
55199b78ec8SJason M. Bills 
55299b78ec8SJason M. Bills                     break;
55399b78ec8SJason M. Bills                 }
55499b78ec8SJason M. Bills                 default:
5556dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
55699b78ec8SJason M. Bills                     break;
55799b78ec8SJason M. Bills             }
55899b78ec8SJason M. Bills             break;
55999b78ec8SJason M. Bills         case BIOSSMISensors::pcieCorrectableError:
56099b78ec8SJason M. Bills             switch (eventType)
56199b78ec8SJason M. Bills             {
56299b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete1:
56399b78ec8SJason M. Bills                 {
56499b78ec8SJason M. Bills                     switch (selData.offset)
56599b78ec8SJason M. Bills                     {
56699b78ec8SJason M. Bills                         case 0x00:
56799b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableReceiverError";
56899b78ec8SJason M. Bills                             break;
56999b78ec8SJason M. Bills                         case 0x01:
57099b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableBadDLLP";
57199b78ec8SJason M. Bills                             break;
57299b78ec8SJason M. Bills                         case 0x02:
57399b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableBadTLP";
57499b78ec8SJason M. Bills                             break;
57599b78ec8SJason M. Bills                         case 0x03:
57699b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableReplayNumRollover";
57799b78ec8SJason M. Bills                             break;
57899b78ec8SJason M. Bills                         case 0x04:
57999b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableReplayTimerTimeout";
58099b78ec8SJason M. Bills                             break;
58199b78ec8SJason M. Bills                         case 0x05:
58299b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableAdvisoryNonFatal";
58399b78ec8SJason M. Bills                             break;
58499b78ec8SJason M. Bills                         case 0x06:
58599b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableLinkBWChanged";
58699b78ec8SJason M. Bills                             break;
58799b78ec8SJason M. Bills                         case 0x07:
58899b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableInternal";
58999b78ec8SJason M. Bills                             break;
59099b78ec8SJason M. Bills                         case 0x08:
59199b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableHeaderLogOverflow";
59299b78ec8SJason M. Bills                             break;
59399b78ec8SJason M. Bills                         case 0x0f:
59499b78ec8SJason M. Bills                             messageID += ".PCIeCorrectableUnspecifiedAERError";
59599b78ec8SJason M. Bills                             break;
59699b78ec8SJason M. Bills                         default:
5976dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
59899b78ec8SJason M. Bills                             break;
59999b78ec8SJason M. Bills                     }
60099b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
60199b78ec8SJason M. Bills 
60299b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
60399b78ec8SJason M. Bills                     int bus = selData.eventData2;
60499b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
60599b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
60699b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
60799b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
60899b78ec8SJason M. Bills 
60999b78ec8SJason M. Bills                     // Save the messageArgs
61099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
61199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
61299b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
61399b78ec8SJason M. Bills 
61499b78ec8SJason M. Bills                     break;
61599b78ec8SJason M. Bills                 }
61699b78ec8SJason M. Bills                 default:
6176dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
61899b78ec8SJason M. Bills                     break;
61999b78ec8SJason M. Bills             }
62099b78ec8SJason M. Bills             break;
62199b78ec8SJason M. Bills         case BIOSSMISensors::sparingRedundancyState:
62299b78ec8SJason M. Bills             switch (eventType)
62399b78ec8SJason M. Bills             {
62499b78ec8SJason M. Bills                 case BIOSEventTypes::discreteRedundancyStates:
62599b78ec8SJason M. Bills                 {
62699b78ec8SJason M. Bills                     switch (selData.offset)
62799b78ec8SJason M. Bills                     {
62899b78ec8SJason M. Bills                         case 0x00:
62999b78ec8SJason M. Bills                             messageID += ".SparingRedundancyFull";
63099b78ec8SJason M. Bills                             break;
63199b78ec8SJason M. Bills                         case 0x02:
63299b78ec8SJason M. Bills                             messageID += ".SparingRedundancyDegraded";
63399b78ec8SJason M. Bills                             break;
63499b78ec8SJason M. Bills                         default:
6356dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
63699b78ec8SJason M. Bills                             break;
63799b78ec8SJason M. Bills                     }
63899b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
63999b78ec8SJason M. Bills 
64099b78ec8SJason M. Bills                     // domain = eventData2 bits [7:4]
64199b78ec8SJason M. Bills                     int domain = selData.eventData2 >> 4 & 0x0F;
64299b78ec8SJason M. Bills                     char domainLetter[4] = {'A'};
64399b78ec8SJason M. Bills                     domainLetter[0] += domain;
64499b78ec8SJason M. Bills                     // rank = eventData2 bits [1:0]
64599b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x03;
64699b78ec8SJason M. Bills 
64799b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:5]
64899b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 5 & 0x07;
64999b78ec8SJason M. Bills                     // Channel = eventData3 bits [4:2]
65099b78ec8SJason M. Bills                     int channel = selData.eventData3 >> 2 & 0x07;
65199b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
65299b78ec8SJason M. Bills                     channelLetter[0] += channel;
65399b78ec8SJason M. Bills                     // DIMM = eventData3 bits [1:0]
65499b78ec8SJason M. Bills                     int dimm = selData.eventData3 & 0x03;
65599b78ec8SJason M. Bills 
65699b78ec8SJason M. Bills                     // Save the messageArgs
65799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
65899b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
65999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm + 1));
66099b78ec8SJason M. Bills                     messageArgs.push_back(std::string(domainLetter));
66199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
66299b78ec8SJason M. Bills 
66399b78ec8SJason M. Bills                     break;
66499b78ec8SJason M. Bills                 }
66599b78ec8SJason M. Bills                 default:
6666dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
66799b78ec8SJason M. Bills                     break;
66899b78ec8SJason M. Bills             }
66999b78ec8SJason M. Bills             break;
67099b78ec8SJason M. Bills         case BIOSSMISensors::memoryParityError:
67199b78ec8SJason M. Bills             switch (eventType)
67299b78ec8SJason M. Bills             {
67399b78ec8SJason M. Bills                 case BIOSEventTypes::sensorSpecificOffset:
67499b78ec8SJason M. Bills                 {
67599b78ec8SJason M. Bills                     switch (selData.offset)
67699b78ec8SJason M. Bills                     {
67799b78ec8SJason M. Bills                         case 0x03:
67899b78ec8SJason M. Bills                         {
67999b78ec8SJason M. Bills                             // type = eventData2 bits [2:0]
68099b78ec8SJason M. Bills                             int type = selData.eventData2 & 0x07;
68199b78ec8SJason M. Bills                             switch (type)
68299b78ec8SJason M. Bills                             {
68399b78ec8SJason M. Bills                                 case 0x00:
68499b78ec8SJason M. Bills                                     messageID += ".MemoryParityNotKnown";
68599b78ec8SJason M. Bills                                     break;
68699b78ec8SJason M. Bills                                 case 0x03:
68799b78ec8SJason M. Bills                                     messageID +=
68899b78ec8SJason M. Bills                                         ".MemoryParityCommandAndAddress";
68999b78ec8SJason M. Bills                                     break;
69099b78ec8SJason M. Bills                                 default:
6916dd8f047SJason M. Bills                                     return defaultMessageHook(ipmiRaw);
69299b78ec8SJason M. Bills                                     break;
69399b78ec8SJason M. Bills                             }
69499b78ec8SJason M. Bills                             break;
69599b78ec8SJason M. Bills                         }
69699b78ec8SJason M. Bills                         default:
6976dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
69899b78ec8SJason M. Bills                             break;
69999b78ec8SJason M. Bills                     }
70099b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
70199b78ec8SJason M. Bills 
70299b78ec8SJason M. Bills                     // channelValid = eventData2 bit [4]
70399b78ec8SJason M. Bills                     int channelValid = selData.eventData2 >> 4 & 0x01;
70499b78ec8SJason M. Bills                     // dimmValid = eventData2 bit [3]
70599b78ec8SJason M. Bills                     int dimmValid = selData.eventData2 >> 3 & 0x01;
70699b78ec8SJason M. Bills 
70799b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:5]
70899b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 5 & 0x07;
70999b78ec8SJason M. Bills                     // Channel = eventData3 bits [4:2]
71099b78ec8SJason M. Bills                     int channel = selData.eventData3 >> 2 & 0x07;
71199b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
71299b78ec8SJason M. Bills                     channelLetter[0] += channel;
71399b78ec8SJason M. Bills                     // DIMM = eventData3 bits [1:0]
71499b78ec8SJason M. Bills                     int dimm = selData.eventData3 & 0x03;
71599b78ec8SJason M. Bills 
71699b78ec8SJason M. Bills                     // Save the messageArgs
71799b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
71899b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
71999b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm + 1));
72099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(channelValid));
72199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimmValid));
72299b78ec8SJason M. Bills 
72399b78ec8SJason M. Bills                     break;
72499b78ec8SJason M. Bills                 }
72599b78ec8SJason M. Bills                 default:
7266dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
72799b78ec8SJason M. Bills                     break;
72899b78ec8SJason M. Bills             }
72999b78ec8SJason M. Bills             break;
73099b78ec8SJason M. Bills         case BIOSSMISensors::pcieFatalError2:
73199b78ec8SJason M. Bills             switch (eventType)
73299b78ec8SJason M. Bills             {
73399b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete6:
73499b78ec8SJason M. Bills                 {
73599b78ec8SJason M. Bills                     switch (selData.offset)
73699b78ec8SJason M. Bills                     {
73799b78ec8SJason M. Bills                         case 0x00:
73899b78ec8SJason M. Bills                             messageID += ".PCIeFatalAtomicEgressBlocked";
73999b78ec8SJason M. Bills                             break;
74099b78ec8SJason M. Bills                         case 0x01:
74199b78ec8SJason M. Bills                             messageID += ".PCIeFatalTLPPrefixBlocked";
74299b78ec8SJason M. Bills                             break;
74399b78ec8SJason M. Bills                         case 0x0f:
74499b78ec8SJason M. Bills                             messageID +=
74599b78ec8SJason M. Bills                                 ".PCIeFatalUnspecifiedNonAERFatalError";
74699b78ec8SJason M. Bills                             break;
74799b78ec8SJason M. Bills                         default:
7486dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
74999b78ec8SJason M. Bills                             break;
75099b78ec8SJason M. Bills                     }
75199b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
75299b78ec8SJason M. Bills 
75399b78ec8SJason M. Bills                     // Bus = eventData2 bits [7:0]
75499b78ec8SJason M. Bills                     int bus = selData.eventData2;
75599b78ec8SJason M. Bills                     // Device = eventData3 bits [7:3]
75699b78ec8SJason M. Bills                     int device = selData.eventData3 >> 3 & 0x1F;
75799b78ec8SJason M. Bills                     // Function = eventData3 bits [2:0]
75899b78ec8SJason M. Bills                     int function = selData.eventData3 >> 0x07;
75999b78ec8SJason M. Bills 
76099b78ec8SJason M. Bills                     // Save the messageArgs
76199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(bus));
76299b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(device));
76399b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(function));
76499b78ec8SJason M. Bills 
76599b78ec8SJason M. Bills                     break;
76699b78ec8SJason M. Bills                 }
76799b78ec8SJason M. Bills                 default:
7686dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
76999b78ec8SJason M. Bills                     break;
77099b78ec8SJason M. Bills             }
77199b78ec8SJason M. Bills             break;
77299b78ec8SJason M. Bills         case BIOSSMISensors::biosRecovery:
77399b78ec8SJason M. Bills             switch (eventType)
77499b78ec8SJason M. Bills             {
77599b78ec8SJason M. Bills                 case BIOSEventTypes::oemDiscrete0:
77699b78ec8SJason M. Bills                 {
77799b78ec8SJason M. Bills                     switch (selData.offset)
77899b78ec8SJason M. Bills                     {
77999b78ec8SJason M. Bills                         case 0x01:
78099b78ec8SJason M. Bills                             messageID += ".BIOSRecoveryStart";
78199b78ec8SJason M. Bills                             break;
78299b78ec8SJason M. Bills                         default:
7836dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
78499b78ec8SJason M. Bills                             break;
78599b78ec8SJason M. Bills                     }
78699b78ec8SJason M. Bills                     break;
78799b78ec8SJason M. Bills                 }
78899b78ec8SJason M. Bills                 case BIOSEventTypes::reservedF0:
78999b78ec8SJason M. Bills                 {
79099b78ec8SJason M. Bills                     switch (selData.offset)
79199b78ec8SJason M. Bills                     {
79299b78ec8SJason M. Bills                         case 0x01:
79399b78ec8SJason M. Bills                             messageID += ".BIOSRecoveryComplete";
79499b78ec8SJason M. Bills                             break;
79599b78ec8SJason M. Bills                         default:
7966dd8f047SJason M. Bills                             return defaultMessageHook(ipmiRaw);
79799b78ec8SJason M. Bills                             break;
79899b78ec8SJason M. Bills                     }
79999b78ec8SJason M. Bills                     break;
80099b78ec8SJason M. Bills                 }
80199b78ec8SJason M. Bills                 default:
8026dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
80399b78ec8SJason M. Bills                     break;
80499b78ec8SJason M. Bills             }
80599b78ec8SJason M. Bills             break;
80699b78ec8SJason M. Bills         case BIOSSMISensors::adddcError:
80799b78ec8SJason M. Bills             switch (eventType)
80899b78ec8SJason M. Bills             {
80999b78ec8SJason M. Bills                 case BIOSEventTypes::reservedA0:
81099b78ec8SJason M. Bills                 {
81199b78ec8SJason M. Bills                     messageID += ".ADDDCCorrectable";
81299b78ec8SJason M. Bills 
81399b78ec8SJason M. Bills                     // Get the message data from eventData2 and eventData3
81499b78ec8SJason M. Bills 
81599b78ec8SJason M. Bills                     // dimm = eventData2 bits [7:4]
81699b78ec8SJason M. Bills                     int dimm = selData.eventData2 >> 4 & 0x0F;
81799b78ec8SJason M. Bills                     // rank = eventData2 bits [3:0]
81899b78ec8SJason M. Bills                     int rank = selData.eventData2 & 0x0F;
81999b78ec8SJason M. Bills 
82099b78ec8SJason M. Bills                     // Socket ID = eventData3 bits [7:4]
82199b78ec8SJason M. Bills                     int socket = selData.eventData3 >> 4 & 0x0F;
82299b78ec8SJason M. Bills                     // Channel = eventData3 bits [3:0]
82399b78ec8SJason M. Bills                     int channel = selData.eventData3 & 0x0F;
82499b78ec8SJason M. Bills                     char channelLetter[4] = {'A'};
82599b78ec8SJason M. Bills                     channelLetter[0] += channel;
82699b78ec8SJason M. Bills 
82799b78ec8SJason M. Bills                     // Save the messageArgs
82899b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(socket + 1));
82999b78ec8SJason M. Bills                     messageArgs.push_back(std::string(channelLetter));
83099b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(dimm));
83199b78ec8SJason M. Bills                     messageArgs.push_back(std::to_string(rank));
83299b78ec8SJason M. Bills 
83399b78ec8SJason M. Bills                     break;
83499b78ec8SJason M. Bills                 }
83599b78ec8SJason M. Bills                 default:
8366dd8f047SJason M. Bills                     return defaultMessageHook(ipmiRaw);
83799b78ec8SJason M. Bills                     break;
83899b78ec8SJason M. Bills             }
83999b78ec8SJason M. Bills             break;
84099b78ec8SJason M. Bills         default:
8416dd8f047SJason M. Bills             return defaultMessageHook(ipmiRaw);
84299b78ec8SJason M. Bills             break;
84399b78ec8SJason M. Bills     }
84499b78ec8SJason M. Bills 
84599b78ec8SJason M. Bills     // Log the Redfish message to the journal with the appropriate metadata
84699b78ec8SJason M. Bills     std::string journalMsg = "BIOS SMI IPMI event: " + ipmiRaw;
84799b78ec8SJason M. Bills     std::string messageArgsString = boost::algorithm::join(messageArgs, ",");
84899b78ec8SJason M. Bills     phosphor::logging::log<phosphor::logging::level::INFO>(
84999b78ec8SJason M. Bills         journalMsg.c_str(),
85099b78ec8SJason M. Bills         phosphor::logging::entry("REDFISH_MESSAGE_ID=%s", messageID.c_str()),
85199b78ec8SJason M. Bills         phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s",
85299b78ec8SJason M. Bills                                  messageArgsString.c_str()));
85399b78ec8SJason M. Bills 
85499b78ec8SJason M. Bills     return true;
85599b78ec8SJason M. Bills }
85699b78ec8SJason M. Bills 
85799b78ec8SJason M. Bills static bool startRedfishHook(const SELData& selData, const std::string& ipmiRaw)
85899b78ec8SJason M. Bills {
85999b78ec8SJason M. Bills     switch (selData.generatorID)
86099b78ec8SJason M. Bills     {
86199b78ec8SJason M. Bills         case 0x01: // Check if this message is from the BIOS Generator ID
86299b78ec8SJason M. Bills             // Let the BIOS hook handle this request
86399b78ec8SJason M. Bills             return biosMessageHook(selData, ipmiRaw);
86499b78ec8SJason M. Bills             break;
86599b78ec8SJason M. Bills 
86699b78ec8SJason M. Bills         case 0x33: // Check if this message is from the BIOS SMI Generator ID
86799b78ec8SJason M. Bills             // Let the BIOS SMI hook handle this request
86899b78ec8SJason M. Bills             return biosSMIMessageHook(selData, ipmiRaw);
86999b78ec8SJason M. Bills             break;
87099b78ec8SJason M. Bills     }
87199b78ec8SJason M. Bills 
8726dd8f047SJason M. Bills     // No hooks handled the request, so let it go to default
8736dd8f047SJason M. Bills     return defaultMessageHook(ipmiRaw);
87499b78ec8SJason M. Bills }
87599b78ec8SJason M. Bills } // namespace redfish_hooks
87699b78ec8SJason M. Bills 
8776dd8f047SJason M. Bills bool checkRedfishHooks(uint16_t recordID, uint8_t recordType,
8786dd8f047SJason M. Bills                        uint32_t timestamp, uint16_t generatorID, uint8_t evmRev,
8796dd8f047SJason M. Bills                        uint8_t sensorType, uint8_t sensorNum, uint8_t eventType,
8806dd8f047SJason M. Bills                        uint8_t eventData1, uint8_t eventData2,
8816dd8f047SJason M. Bills                        uint8_t eventData3)
88299b78ec8SJason M. Bills {
88399b78ec8SJason M. Bills     // Save the raw IPMI string of the request
88499b78ec8SJason M. Bills     std::string ipmiRaw;
8856dd8f047SJason M. Bills     std::array selBytes = {static_cast<uint8_t>(recordID),
8866dd8f047SJason M. Bills                            static_cast<uint8_t>(recordID >> 8),
8876dd8f047SJason M. Bills                            recordType,
8886dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp),
8896dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp >> 8),
8906dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp >> 16),
8916dd8f047SJason M. Bills                            static_cast<uint8_t>(timestamp >> 24),
8926dd8f047SJason M. Bills                            static_cast<uint8_t>(generatorID),
8936dd8f047SJason M. Bills                            static_cast<uint8_t>(generatorID >> 8),
8946dd8f047SJason M. Bills                            evmRev,
8956dd8f047SJason M. Bills                            sensorType,
8966dd8f047SJason M. Bills                            sensorNum,
8976dd8f047SJason M. Bills                            eventType,
8986dd8f047SJason M. Bills                            eventData1,
8996dd8f047SJason M. Bills                            eventData2,
9006dd8f047SJason M. Bills                            eventData3};
9016dd8f047SJason M. Bills     redfish_hooks::toHexStr(boost::beast::span<uint8_t>(selBytes), ipmiRaw);
9026dd8f047SJason M. Bills 
9036dd8f047SJason M. Bills     // First check that this is a system event record type since that
9046dd8f047SJason M. Bills     // determines the definition of the rest of the data
9056dd8f047SJason M. Bills     if (recordType != ipmi::sel::systemEvent)
9066dd8f047SJason M. Bills     {
9076dd8f047SJason M. Bills         // OEM record type, so let it go to the SEL
9086dd8f047SJason M. Bills         return redfish_hooks::defaultMessageHook(ipmiRaw);
9096dd8f047SJason M. Bills     }
91099b78ec8SJason M. Bills 
91199b78ec8SJason M. Bills     // Extract the SEL data for the hook
9126dd8f047SJason M. Bills     redfish_hooks::SELData selData = {.generatorID = generatorID,
9136dd8f047SJason M. Bills                                       .sensorNum = sensorNum,
9146dd8f047SJason M. Bills                                       .eventType = eventType,
9156dd8f047SJason M. Bills                                       .offset = eventData1 & 0x0F,
9166dd8f047SJason M. Bills                                       .eventData2 = eventData2,
9176dd8f047SJason M. Bills                                       .eventData3 = eventData3};
91899b78ec8SJason M. Bills 
91999b78ec8SJason M. Bills     return redfish_hooks::startRedfishHook(selData, ipmiRaw);
92099b78ec8SJason M. Bills }
92199b78ec8SJason M. Bills 
92299b78ec8SJason M. Bills bool checkRedfishHooks(uint8_t generatorID, uint8_t evmRev, uint8_t sensorType,
92399b78ec8SJason M. Bills                        uint8_t sensorNum, uint8_t eventType, uint8_t eventData1,
92499b78ec8SJason M. Bills                        uint8_t eventData2, uint8_t eventData3)
92599b78ec8SJason M. Bills {
92699b78ec8SJason M. Bills     // Save the raw IPMI string of the selData
92799b78ec8SJason M. Bills     std::string ipmiRaw;
92899b78ec8SJason M. Bills     std::array selBytes = {generatorID, evmRev,     sensorType, sensorNum,
92999b78ec8SJason M. Bills                            eventType,   eventData1, eventData2, eventData3};
93099b78ec8SJason M. Bills     redfish_hooks::toHexStr(boost::beast::span<uint8_t>(selBytes), ipmiRaw);
93199b78ec8SJason M. Bills 
93299b78ec8SJason M. Bills     // Extract the SEL data for the hook
93399b78ec8SJason M. Bills     redfish_hooks::SELData selData = {.generatorID = generatorID,
93499b78ec8SJason M. Bills                                       .sensorNum = sensorNum,
93599b78ec8SJason M. Bills                                       .eventType = eventType,
93699b78ec8SJason M. Bills                                       .offset = eventData1 & 0x0F,
93799b78ec8SJason M. Bills                                       .eventData2 = eventData2,
93899b78ec8SJason M. Bills                                       .eventData3 = eventData3};
93999b78ec8SJason M. Bills 
94099b78ec8SJason M. Bills     return redfish_hooks::startRedfishHook(selData, ipmiRaw);
94199b78ec8SJason M. Bills }
94299b78ec8SJason M. Bills 
94399b78ec8SJason M. Bills } // namespace intel_oem::ipmi::sel
944