blob: 76f8b92500f6f755544540a3442e51517d3abcad [file] [log] [blame]
/*
// Copyright (c) 2019 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#pragma once
#include <boost/algorithm/string/join.hpp>
#include <phosphor-logging/log.hpp>
#include <storagecommands.hpp>
namespace intel_oem::ipmi::sel
{
bool checkRedfishHooks(uint16_t recordID, uint8_t recordType,
uint32_t timestamp, uint16_t generatorID, uint8_t evmRev,
uint8_t sensorType, uint8_t sensorNum, uint8_t eventType,
uint8_t eventData1, uint8_t eventData2,
uint8_t eventData3);
bool checkRedfishHooks(uint16_t generatorID, uint8_t evmRev, uint8_t sensorType,
uint8_t sensorNum, uint8_t eventType, uint8_t eventData1,
uint8_t eventData2, uint8_t eventData3);
namespace redfish_hooks
{
struct SELData
{
int generatorID;
int sensorNum;
int eventType;
int offset;
int eventData2;
int eventData3;
};
enum class BIOSSensors
{
memoryRASConfigStatus = 0x02,
biosPOSTError = 0x06,
intelUPILinkWidthReduced = 0x09,
memoryRASModeSelect = 0x12,
bootEvent = 0x83,
};
enum class BIOSSMISensors
{
mirroringRedundancyState = 0x01,
memoryECCError = 0x02,
legacyPCIError = 0x03,
pcieFatalError = 0x04,
pcieCorrectableError = 0x05,
sparingRedundancyState = 0x11,
memoryParityError = 0x13,
pcieFatalError2 = 0x14,
biosRecovery = 0x15,
adddcError = 0x20,
};
enum class BIOSEventTypes
{
digitalDiscrete = 0x09,
discreteRedundancyStates = 0x0b,
sensorSpecificOffset = 0x6f,
oemDiscrete0 = 0x70,
oemDiscrete1 = 0x71,
oemDiscrete6 = 0x76,
oemDiscrete7 = 0x77,
reservedA0 = 0xa0,
reservedF0 = 0xf0,
};
static inline bool defaultMessageHook(const std::string& ipmiRaw)
{
// Log the record as a default Redfish message instead of a SEL record
static const std::string openBMCMessageRegistryVersion("0.1");
std::string messageID =
"OpenBMC." + openBMCMessageRegistryVersion + ".SELEntryAdded";
std::vector<std::string> messageArgs;
messageArgs.push_back(ipmiRaw);
// Log the Redfish message to the journal with the appropriate metadata
std::string journalMsg = "SEL Entry Added: " + ipmiRaw;
std::string messageArgsString = boost::algorithm::join(messageArgs, ",");
phosphor::logging::log<phosphor::logging::level::INFO>(
journalMsg.c_str(),
phosphor::logging::entry("REDFISH_MESSAGE_ID=%s", messageID.c_str()),
phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s",
messageArgsString.c_str()));
return true;
}
} // namespace redfish_hooks
} // namespace intel_oem::ipmi::sel