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