1 /*
2 // Copyright (c) 2019 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16
17 #pragma once
18 #include <boost/algorithm/string/join.hpp>
19 #include <phosphor-logging/log.hpp>
20 #include <storagecommands.hpp>
21
22 namespace intel_oem::ipmi::sel
23 {
24 bool checkRedfishHooks(uint16_t recordID, uint8_t recordType,
25 uint32_t timestamp, uint16_t generatorID, uint8_t evmRev,
26 uint8_t sensorType, uint8_t sensorNum, uint8_t eventType,
27 uint8_t eventData1, uint8_t eventData2,
28 uint8_t eventData3);
29 bool checkRedfishHooks(uint16_t generatorID, uint8_t evmRev, uint8_t sensorType,
30 uint8_t sensorNum, uint8_t eventType, uint8_t eventData1,
31 uint8_t eventData2, uint8_t eventData3);
32 namespace redfish_hooks
33 {
34 struct SELData
35 {
36 int generatorID;
37 int sensorNum;
38 int eventType;
39 int offset;
40 int eventData2;
41 int eventData3;
42 };
43
44 enum class BIOSSensors
45 {
46 memoryRASConfigStatus = 0x02,
47 biosPOSTError = 0x06,
48 intelUPILinkWidthReduced = 0x09,
49 memoryRASModeSelect = 0x12,
50 bootEvent = 0x83,
51 };
52
53 enum class BIOSSMISensors
54 {
55 mirroringRedundancyState = 0x01,
56 memoryECCError = 0x02,
57 legacyPCIError = 0x03,
58 pcieFatalError = 0x04,
59 pcieCorrectableError = 0x05,
60 sparingRedundancyState = 0x11,
61 memoryParityError = 0x13,
62 pcieFatalError2 = 0x14,
63 biosRecovery = 0x15,
64 adddcError = 0x20,
65 };
66
67 enum class BIOSEventTypes
68 {
69 digitalDiscrete = 0x09,
70 discreteRedundancyStates = 0x0b,
71 sensorSpecificOffset = 0x6f,
72 oemDiscrete0 = 0x70,
73 oemDiscrete1 = 0x71,
74 oemDiscrete6 = 0x76,
75 oemDiscrete7 = 0x77,
76 reservedA0 = 0xa0,
77 reservedF0 = 0xf0,
78 };
79
defaultMessageHook(const std::string & ipmiRaw)80 static inline bool defaultMessageHook(const std::string& ipmiRaw)
81 {
82 // Log the record as a default Redfish message instead of a SEL record
83
84 static const std::string openBMCMessageRegistryVersion("0.1");
85 std::string messageID =
86 "OpenBMC." + openBMCMessageRegistryVersion + ".SELEntryAdded";
87
88 std::vector<std::string> messageArgs;
89 messageArgs.push_back(ipmiRaw);
90
91 // Log the Redfish message to the journal with the appropriate metadata
92 std::string journalMsg = "SEL Entry Added: " + ipmiRaw;
93 std::string messageArgsString = boost::algorithm::join(messageArgs, ",");
94 phosphor::logging::log<phosphor::logging::level::INFO>(
95 journalMsg.c_str(),
96 phosphor::logging::entry("REDFISH_MESSAGE_ID=%s", messageID.c_str()),
97 phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s",
98 messageArgsString.c_str()));
99
100 return true;
101 }
102
103 } // namespace redfish_hooks
104 } // namespace intel_oem::ipmi::sel
105