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(uint8_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 
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