blob: 46ba52686ee5068e905ce284f0b64da8c76985af [file] [log] [blame]
#pragma once
#include "libpldm/pldm.h"
#include "common/instance_id.hpp"
#include "common/types.hpp"
#include "oem_event_manager.hpp"
#include "platform-mc/manager.hpp"
#include "requester/handler.hpp"
#include "requester/request.hpp"
namespace pldm
{
namespace oem_ampere
{
using namespace pldm::pdr;
using EventToMsgMap_t = std::unordered_map<uint8_t, std::string>;
enum sensor_ids
{
PCIE_HOT_PLUG = 169,
BOOT_OVERALL = 175,
};
namespace boot
{
namespace status
{
enum boot_status
{
BOOT_STATUS_SUCCESS = 0x80,
BOOT_STATUS_FAILURE = 0x81,
};
} // namespace status
namespace stage
{
enum boot_stage
{
UEFI_STATUS_CLASS_CODE_MIN = 0x00,
UEFI_STATUS_CLASS_CODE_MAX = 0x7f,
SECPRO = 0x90,
MPRO = 0x91,
ATF_BL1 = 0x92,
ATF_BL2 = 0x93,
DDR_INITIALIZATION = 0x94,
DDR_TRAINING = 0x95,
S0_DDR_TRAINING_FAILURE = 0x96,
ATF_BL31 = 0x97,
ATF_BL32 = 0x98,
S1_DDR_TRAINING_FAILURE = 0x99,
};
} // namespace stage
} // namespace boot
enum class log_level : int
{
OK,
WARNING,
CRITICAL,
BIOSFWPANIC,
};
/*
* PresentReading value format
* FIELD | COMMENT
* Bit 31 | Reserved
* Bit 30:24 | Media slot number (0 - 63) This field can be used by UEFI
* | to indicate the media slot number (such as NVMe/SSD slot)
* | (7 bits)
* Bit 23 | Operation status: 1 = operation failed
* | 0 = operation successful
* Bit 22 | Action: 0 - Insertion 1 - Removal
* Bit 21:18 | Function (4 bits)
* Bit 17:13 | Device (5 bits)
* Bit 12:5 | Bus (8 bits)
* Bit 4:0 | Segment (5 bits)
*/
typedef union
{
uint32_t value;
struct
{
uint32_t segment:5;
uint32_t bus:8;
uint32_t device:5;
uint32_t function:4;
uint32_t action:1;
uint32_t opStatus:1;
uint32_t mediaSlot:7;
uint32_t reserved:1;
} __attribute__((packed)) bits;
} PCIeHotPlugEventRecord_t;
/**
* @brief OemEventManager
*
*
*/
class OemEventManager
{
public:
OemEventManager() = delete;
OemEventManager(const OemEventManager&) = delete;
OemEventManager(OemEventManager&&) = delete;
OemEventManager& operator=(const OemEventManager&) = delete;
OemEventManager& operator=(OemEventManager&&) = delete;
virtual ~OemEventManager() = default;
explicit OemEventManager(
sdeventplus::Event& event,
requester::Handler<requester::Request>* /* handler */,
pldm::InstanceIdDb& /* instanceIdDb */) : event(event) {};
/** @brief Decode sensor event messages and handle correspondingly.
*
* @param[in] request - the request message of sensor event
* @param[in] payloadLength - the payload length of sensor event
* @param[in] formatVersion - the format version of sensor event
* @param[in] tid - TID
* @param[in] eventDataOffset - the event data offset of sensor event
*
* @return int - returned error code
*/
int handleSensorEvent(const pldm_msg* request, size_t payloadLength,
uint8_t /* formatVersion */, pldm_tid_t tid,
size_t eventDataOffset);
protected:
/** @brief Create prefix string for logging message.
*
* @param[in] tid - TID
* @param[in] sensorId - Sensor ID
*
* @return std::string - the prefeix string
*/
std::string prefixMsgStrCreation(pldm_tid_t tid, uint16_t sensorId);
/** @brief Log the message into Redfish SEL.
*
* @param[in] description - the logging message
* @param[in] logLevel - the logging level
*/
void sendJournalRedfish(const std::string& description,
log_level& logLevel);
/** @brief Convert the one-hot DIMM index byte into a string of DIMM
* indexes.
*
* @param[in] dimmIdxs - the one-hot DIMM index byte
*
* @return std::string - the string of DIMM indexes
*/
std::string dimmIdxsToString(uint32_t dimmIdxs);
/** @brief Handle numeric sensor event message from PCIe hot-plug sensor.
*
* @param[in] tid - TID
* @param[in] sensorId - Sensor ID
* @param[in] presentReading - the present reading of the sensor
*/
void handlePCIeHotPlugEvent(pldm_tid_t tid, uint16_t sensorId,
uint32_t presentReading);
/** @brief Handle numeric sensor event message from boot overall sensor.
*
* @param[in] tid - TID
* @param[in] sensorId - Sensor ID
* @param[in] presentReading - the present reading of the sensor
*/
void handleBootOverallEvent(pldm_tid_t /*tid*/, uint16_t /*sensorId*/,
uint32_t presentReading);
/** @brief Handle numeric sensor event messages.
*
* @param[in] tid - TID
* @param[in] sensorId - Sensor ID
* @param[in] sensorData - the sensor data
* @param[in] sensorDataLength - the length of sensor data
*
* @return int - returned error code
*/
int processNumericSensorEvent(pldm_tid_t tid, uint16_t sensorId,
const uint8_t* sensorData,
size_t sensorDataLength);
/** @brief Handle state sensor event messages.
*
* @param[in] tid - TID
* @param[in] sensorId - Sensor ID
* @param[in] sensorData - the sensor data
* @param[in] sensorDataLength - the length of sensor data
*
* @return int - returned error code
*/
int processStateSensorEvent(pldm_tid_t tid, uint16_t sensorId,
const uint8_t* sensorData,
size_t sensorDataLength);
/** @brief Handle op state sensor event messages.
*
* @param[in] tid - TID
* @param[in] sensorId - Sensor ID
* @param[in] sensorData - the sensor data
* @param[in] sensorDataLength - the length of sensor data
*
* @return int - returned error code
*/
int processSensorOpStateEvent(pldm_tid_t tid, uint16_t sensorId,
const uint8_t* sensorData,
size_t sensorDataLength);
/** @brief reference of main event loop of pldmd, primarily used to schedule
* work
*/
sdeventplus::Event& event;
};
} // namespace oem_ampere
} // namespace pldm