1 /*
2 // Copyright (c) 2017 2018 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 "sdrutils.hpp"
19 
20 #include <ipmid/api.hpp>
21 
22 #include <cstdint>
23 
24 #pragma pack(push, 1)
25 
26 struct SensorThresholdResp
27 {
28     uint8_t readable;
29     uint8_t lowernc;
30     uint8_t lowercritical;
31     uint8_t lowernonrecoverable;
32     uint8_t uppernc;
33     uint8_t uppercritical;
34     uint8_t uppernonrecoverable;
35 };
36 
37 #pragma pack(pop)
38 
39 enum class IPMIThresholdRespBits
40 {
41     lowerNonCritical,
42     lowerCritical,
43     lowerNonRecoverable,
44     upperNonCritical,
45     upperCritical,
46     upperNonRecoverable
47 };
48 
49 enum class IPMISensorReadingByte2 : uint8_t
50 {
51     eventMessagesEnable = (1 << 7),
52     sensorScanningEnable = (1 << 6),
53     readingStateUnavailable = (1 << 5),
54 };
55 
56 enum class IPMISensorReadingByte3 : uint8_t
57 {
58     upperNonRecoverable = (1 << 5),
59     upperCritical = (1 << 4),
60     upperNonCritical = (1 << 3),
61     lowerNonRecoverable = (1 << 2),
62     lowerCritical = (1 << 1),
63     lowerNonCritical = (1 << 0),
64 };
65 
66 enum class IPMISensorEventEnableByte2 : uint8_t
67 {
68     eventMessagesEnable = (1 << 7),
69     sensorScanningEnable = (1 << 6),
70 };
71 
72 enum class IPMISensorEventEnableThresholds : uint8_t
73 {
74     nonRecoverableThreshold = (1 << 6),
75     criticalThreshold = (1 << 5),
76     nonCriticalThreshold = (1 << 4),
77     upperNonRecoverableGoingHigh = (1 << 3),
78     upperNonRecoverableGoingLow = (1 << 2),
79     upperCriticalGoingHigh = (1 << 1),
80     upperCriticalGoingLow = (1 << 0),
81     upperNonCriticalGoingHigh = (1 << 7),
82     upperNonCriticalGoingLow = (1 << 6),
83     lowerNonRecoverableGoingHigh = (1 << 5),
84     lowerNonRecoverableGoingLow = (1 << 4),
85     lowerCriticalGoingHigh = (1 << 3),
86     lowerCriticalGoingLow = (1 << 2),
87     lowerNonCriticalGoingHigh = (1 << 1),
88     lowerNonCriticalGoingLow = (1 << 0),
89 };
90 
91 enum class IPMIGetSensorEventEnableThresholds : uint8_t
92 {
93     lowerNonCriticalGoingLow = 0,
94     lowerNonCriticalGoingHigh = 1,
95     lowerCriticalGoingLow = 2,
96     lowerCriticalGoingHigh = 3,
97     lowerNonRecoverableGoingLow = 4,
98     lowerNonRecoverableGoingHigh = 5,
99     upperNonCriticalGoingLow = 6,
100     upperNonCriticalGoingHigh = 7,
101     upperCriticalGoingLow = 8,
102     upperCriticalGoingHigh = 9,
103     upperNonRecoverableGoingLow = 10,
104     upperNonRecoverableGoingHigh = 11,
105 };
106 
107 enum class IPMINetfnSensorCmds : ipmi_cmd_t
108 {
109     ipmiCmdGetDeviceSDRInfo = 0x20,
110     ipmiCmdGetDeviceSDR = 0x21,
111     ipmiCmdReserveDeviceSDRRepo = 0x22,
112     ipmiCmdSetSensorThreshold = 0x26,
113     ipmiCmdGetSensorThreshold = 0x27,
114     ipmiCmdGetSensorEventEnable = 0x29,
115     ipmiCmdGetSensorEventStatus = 0x2B,
116     ipmiCmdGetSensorReading = 0x2D,
117     ipmiCmdGetSensorType = 0x2F,
118     ipmiCmdSetSensorReadingAndEventStatus = 0x30,
119 };
120 
121 namespace ipmi
122 {
123 extern SensorSubTree sensorTree;
124 static ipmi_ret_t getSensorConnection(uint8_t sensnum, std::string& connection,
125                                       std::string& path)
126 {
127     if (sensorTree.empty() && !getSensorSubtree(sensorTree))
128     {
129         return IPMI_CC_RESPONSE_ERROR;
130     }
131 
132     if (sensorTree.size() < (sensnum + 1))
133     {
134         return IPMI_CC_INVALID_FIELD_REQUEST;
135     }
136 
137     uint8_t sensorIndex = sensnum;
138     for (const auto& sensor : sensorTree)
139     {
140         if (sensorIndex-- == 0)
141         {
142             if (!sensor.second.size())
143             {
144                 return IPMI_CC_RESPONSE_ERROR;
145             }
146             connection = sensor.second.begin()->first;
147             path = sensor.first;
148             break;
149         }
150     }
151 
152     return 0;
153 }
154 
155 struct IPMIThresholds
156 {
157     std::optional<uint8_t> warningLow;
158     std::optional<uint8_t> warningHigh;
159     std::optional<uint8_t> criticalLow;
160     std::optional<uint8_t> criticalHigh;
161 };
162 
163 } // namespace ipmi
164