1 /**
2 * Copyright © 2021 IBM 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 #pragma once
17
18 #include <string>
19
20 namespace phosphor::power::regulators
21 {
22
23 /**
24 * Voltage regulator sensor type.
25 */
26 enum class SensorType : unsigned char
27 {
28 /**
29 * Output current.
30 */
31 iout,
32
33 /**
34 * Highest output current.
35 */
36 iout_peak,
37
38 /**
39 * Lowest output current.
40 */
41 iout_valley,
42
43 /**
44 * Output power.
45 */
46 pout,
47
48 /**
49 * Temperature.
50 */
51 temperature,
52
53 /**
54 * Highest temperature.
55 */
56 temperature_peak,
57
58 /**
59 * Output voltage.
60 */
61 vout,
62
63 /**
64 * Highest output voltage.
65 */
66 vout_peak,
67
68 /**
69 * Lowest output voltage.
70 */
71 vout_valley
72 };
73
74 /**
75 * @namespace sensors
76 *
77 * Contains utility functions related to voltage regulator sensors.
78 */
79 namespace sensors
80 {
81
82 /**
83 * Returns the name of the specified SensorType.
84 *
85 * The returned string will exactly match the enumerator name, such as
86 * "temperature_peak".
87 *
88 * @param type sensor type
89 * @return sensor type name
90 */
toString(SensorType type)91 inline std::string toString(SensorType type)
92 {
93 std::string name{};
94 switch (type)
95 {
96 case SensorType::iout:
97 name = "iout";
98 break;
99 case SensorType::iout_peak:
100 name = "iout_peak";
101 break;
102 case SensorType::iout_valley:
103 name = "iout_valley";
104 break;
105 case SensorType::pout:
106 name = "pout";
107 break;
108 case SensorType::temperature:
109 name = "temperature";
110 break;
111 case SensorType::temperature_peak:
112 name = "temperature_peak";
113 break;
114 case SensorType::vout:
115 name = "vout";
116 break;
117 case SensorType::vout_peak:
118 name = "vout_peak";
119 break;
120 case SensorType::vout_valley:
121 name = "vout_valley";
122 break;
123 }
124 return name;
125 }
126
127 } // namespace sensors
128
129 /**
130 * @class Sensors
131 *
132 * Abstract base class for a service that maintains a list of voltage regulator
133 * sensors.
134 *
135 * This service makes the voltage regulator sensors available to other BMC
136 * applications. For example, the Redfish support obtains sensor data from this
137 * service.
138 *
139 * Each voltage rail in the system may provide multiple types of sensor data,
140 * such as temperature, output voltage, and output current (see SensorType). A
141 * sensor tracks one of these data types for a voltage rail.
142 *
143 * Voltage regulator sensors are typically read frequently based on a timer.
144 * Reading all the sensors once is called a monitoring cycle. The application
145 * will loop through all voltage rails, reading all supported sensor types for
146 * each rail. During a monitoring cycle, the following sensor service methods
147 * should be called in the specified order:
148 * - startCycle() // At the start of a sensor monitoring cycle
149 * - startRail() // Before reading all the sensors for one rail
150 * - setValue() // To set the value of one sensor for the current rail
151 * - endRail() // After reading all the sensors for one rail
152 * - endCycle() // At the end of a sensor monitoring cycle
153 *
154 * This service can be enabled or disabled. It is typically enabled when the
155 * system is powered on and voltage regulators begin producing output. It is
156 * typically disabled when the system is powered off. It can also be
157 * temporarily disabled if other BMC applications need to communicate with the
158 * voltage regulator devices. When the service is disabled, the sensors still
159 * exist but are in an inactive state since their values are not being updated.
160 */
161 class Sensors
162 {
163 public:
164 // Specify which compiler-generated methods we want
165 Sensors() = default;
166 Sensors(const Sensors&) = delete;
167 Sensors(Sensors&&) = delete;
168 Sensors& operator=(const Sensors&) = delete;
169 Sensors& operator=(Sensors&&) = delete;
170 virtual ~Sensors() = default;
171
172 /**
173 * Enable the sensors service.
174 *
175 * While the service is enabled, the sensors that it provides will be in an
176 * active state. This indicates that their value is being updated
177 * periodically.
178 */
179 virtual void enable() = 0;
180
181 /**
182 * Notify the sensors service that the current sensor monitoring cycle has
183 * ended.
184 */
185 virtual void endCycle() = 0;
186
187 /**
188 * Notify the sensors service that sensor monitoring has ended for the
189 * current voltage rail.
190 *
191 * @param errorOccurred specifies whether an error occurred while trying to
192 * read all the sensors for the current rail
193 */
194 virtual void endRail(bool errorOccurred) = 0;
195
196 /**
197 * Disable the sensors service.
198 *
199 * While the service is disabled, the sensors that it provides will be in an
200 * inactive state. This indicates that their value is not being updated.
201 */
202 virtual void disable() = 0;
203
204 /**
205 * Sets the value of one sensor for the current voltage rail.
206 *
207 * Throws an exception if an error occurs.
208 *
209 * @param type sensor type
210 * @param value sensor value
211 */
212 virtual void setValue(SensorType type, double value) = 0;
213
214 /**
215 * Notify the sensors service that a sensor monitoring cycle is starting.
216 */
217 virtual void startCycle() = 0;
218
219 /**
220 * Notify the sensors service that sensor monitoring is starting for the
221 * specified voltage rail.
222 *
223 * Calls to setValue() will update sensors for this rail.
224 *
225 * @param rail unique rail ID
226 * @param deviceInventoryPath D-Bus inventory path of the voltage regulator
227 * device that produces the rail
228 * @param chassisInventoryPath D-Bus inventory path of the chassis that
229 * contains the voltage regulator device
230 */
231 virtual void startRail(const std::string& rail,
232 const std::string& deviceInventoryPath,
233 const std::string& chassisInventoryPath) = 0;
234 };
235
236 } // namespace phosphor::power::regulators
237