blob: 0bcd6f967ca75003ce4f5dea254e1cd5c61b465a [file] [log] [blame]
/*
// Copyright (c) 2017 2018 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 <cstdint>
#include <ipmid/api.hpp>
#include <sdrutils.hpp>
#pragma pack(push, 1)
struct SensorThresholdResp
{
uint8_t readable;
uint8_t lowernc;
uint8_t lowercritical;
uint8_t lowernonrecoverable;
uint8_t uppernc;
uint8_t uppercritical;
uint8_t uppernonrecoverable;
};
struct SensorEventStatusResp
{
uint8_t enabled;
uint8_t assertionsLSB;
uint8_t assertionsMSB;
uint8_t deassertionsLSB;
uint8_t deassertionsMSB;
};
#pragma pack(pop)
enum class IPMIThresholdRespBits
{
lowerNonCritical,
lowerCritical,
lowerNonRecoverable,
upperNonCritical,
upperCritical,
upperNonRecoverable
};
enum class IPMISensorReadingByte2 : uint8_t
{
eventMessagesEnable = (1 << 7),
sensorScanningEnable = (1 << 6),
readingStateUnavailable = (1 << 5),
};
enum class IPMISensorReadingByte3 : uint8_t
{
upperNonRecoverable = (1 << 5),
upperCritical = (1 << 4),
upperNonCritical = (1 << 3),
lowerNonRecoverable = (1 << 2),
lowerCritical = (1 << 1),
lowerNonCritical = (1 << 0),
};
enum class IPMISensorEventEnableByte2 : uint8_t
{
eventMessagesEnable = (1 << 7),
sensorScanningEnable = (1 << 6),
};
enum class IPMISensorEventEnableThresholds : uint8_t
{
upperNonRecoverableGoingHigh = (1 << 3),
upperNonRecoverableGoingLow = (1 << 2),
upperCriticalGoingHigh = (1 << 1),
upperCriticalGoingLow = (1 << 0),
upperNonCriticalGoingHigh = (1 << 7),
upperNonCriticalGoingLow = (1 << 6),
lowerNonRecoverableGoingHigh = (1 << 5),
lowerNonRecoverableGoingLow = (1 << 4),
lowerCriticalGoingHigh = (1 << 3),
lowerCriticalGoingLow = (1 << 2),
lowerNonCriticalGoingHigh = (1 << 1),
lowerNonCriticalGoingLow = (1 << 0),
};
enum class IPMINetfnSensorCmds : ipmi_cmd_t
{
ipmiCmdGetDeviceSDRInfo = 0x20,
ipmiCmdGetDeviceSDR = 0x21,
ipmiCmdReserveDeviceSDRRepo = 0x22,
ipmiCmdSetSensorThreshold = 0x26,
ipmiCmdGetSensorThreshold = 0x27,
ipmiCmdGetSensorEventEnable = 0x29,
ipmiCmdGetSensorEventStatus = 0x2B,
ipmiCmdGetSensorReading = 0x2D,
ipmiCmdGetSensorType = 0x2F,
ipmiCmdSetSensorReadingAndEventStatus = 0x30,
};
namespace ipmi
{
extern SensorSubTree sensorTree;
static ipmi_ret_t getSensorConnection(uint8_t sensnum, std::string &connection,
std::string &path)
{
if (sensorTree.empty() && !getSensorSubtree(sensorTree))
{
return IPMI_CC_RESPONSE_ERROR;
}
if (sensorTree.size() < (sensnum + 1))
{
return IPMI_CC_INVALID_FIELD_REQUEST;
}
uint8_t sensorIndex = sensnum;
for (const auto &sensor : sensorTree)
{
if (sensorIndex-- == 0)
{
if (!sensor.second.size())
{
return IPMI_CC_RESPONSE_ERROR;
}
connection = sensor.second.begin()->first;
path = sensor.first;
break;
}
}
return 0;
}
struct IPMIThresholds
{
std::optional<uint8_t> warningLow;
std::optional<uint8_t> warningHigh;
std::optional<uint8_t> criticalLow;
std::optional<uint8_t> criticalHigh;
};
} // namespace ipmi