blob: fdb8461f6a00d9d1dbeddacd2cec9a400be23b4f [file] [log] [blame]
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -05001/**
2 * Copyright © 2020 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 */
Matthew Barth29e9e382020-01-23 13:40:49 -060016#pragma once
17
Shawn McCarneyb464c8b2020-07-16 17:51:38 -050018#include "services.hpp"
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -050019#include "system.hpp"
20
Matthew Barth29e9e382020-01-23 13:40:49 -060021#include <interfaces/manager_interface.hpp>
22#include <sdbusplus/bus.hpp>
Matthew Barth250d0a92020-02-28 13:04:24 -060023#include <sdbusplus/bus/match.hpp>
Matthew Barth29e9e382020-01-23 13:40:49 -060024#include <sdbusplus/server/object.hpp>
Matthew Barthf2bcf1f2020-01-29 14:42:47 -060025#include <sdeventplus/event.hpp>
Matthew Barth7cbc5532020-01-29 15:13:13 -060026#include <sdeventplus/source/signal.hpp>
Matthew Barthf2bcf1f2020-01-29 14:42:47 -060027#include <sdeventplus/utility/timer.hpp>
Matthew Barth29e9e382020-01-23 13:40:49 -060028
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -050029#include <filesystem>
30#include <memory>
31#include <string>
32#include <vector>
Matthew Barthbbc7c582020-02-03 15:55:15 -060033
Matthew Barth29e9e382020-01-23 13:40:49 -060034namespace phosphor::power::regulators
35{
36
Matthew Barthf2bcf1f2020-01-29 14:42:47 -060037using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
38
Patrick Williams7354ce62022-07-22 19:26:56 -050039using ManagerObject = sdbusplus::server::object_t<
Matthew Barth29e9e382020-01-23 13:40:49 -060040 phosphor::power::regulators::interface::ManagerInterface>;
41
42class Manager : public ManagerObject
43{
44 public:
45 Manager() = delete;
46 Manager(const Manager&) = delete;
47 Manager(Manager&&) = delete;
48 Manager& operator=(const Manager&) = delete;
49 Manager& operator=(Manager&&) = delete;
50 ~Manager() = default;
51
52 /**
53 * Constructor
54 * Creates a manager over the regulators.
55 *
Shawn McCarneyb464c8b2020-07-16 17:51:38 -050056 * @param bus the D-Bus bus
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -050057 * @param event the sdevent event
Matthew Barth29e9e382020-01-23 13:40:49 -060058 */
Patrick Williams7354ce62022-07-22 19:26:56 -050059 Manager(sdbusplus::bus_t& bus, const sdeventplus::Event& event);
Matthew Barth29e9e382020-01-23 13:40:49 -060060
61 /**
Shawn McCarneyd9c8be52021-05-18 10:07:53 -050062 * Implements the D-Bus "configure" method.
63 *
64 * Configures all the voltage regulators in the system.
65 *
66 * This method should be called when the system is being powered on. It
67 * needs to occur before the regulators have been enabled/turned on.
Matthew Barth29e9e382020-01-23 13:40:49 -060068 */
69 void configure() override;
70
71 /**
Shawn McCarney589c1812021-01-14 12:13:26 -060072 * Callback function to handle interfacesAdded D-Bus signals
73 *
74 * @param msg Expanded sdbusplus message data
75 */
Patrick Williams7354ce62022-07-22 19:26:56 -050076 void interfacesAddedHandler(sdbusplus::message_t& msg);
Shawn McCarney589c1812021-01-14 12:13:26 -060077
78 /**
Shawn McCarneyd9c8be52021-05-18 10:07:53 -050079 * Implements the D-Bus "monitor" method.
Matthew Barth29e9e382020-01-23 13:40:49 -060080 *
Shawn McCarneyd9c8be52021-05-18 10:07:53 -050081 * Sets whether regulator monitoring is enabled.
82 *
83 * When monitoring is enabled:
84 * - regulator sensors will be read and published on D-Bus
85 * - phase fault detection will be performed
86 *
87 * Regulator monitoring should be enabled when the system is being powered
88 * on. It needs to occur after the regulators have been configured and
89 * enabled/turned on.
90 *
91 * Regulator monitoring should be disabled when the system is being powered
92 * off. It needs to occur before the regulators have been disabled/turned
93 * off.
94 *
95 * Regulator monitoring can also be temporarily disabled and then re-enabled
96 * while the system is powered on. This allows other applications or tools
97 * to temporarily communicate with the regulators for testing or debug.
98 * Monitoring should be disabled for only short periods of time; other
99 * applications, such as fan control, may be dependent on regulator sensors.
100 *
101 * @param enable true if monitoring should be enabled, false if it should be
102 * disabled
Matthew Barth29e9e382020-01-23 13:40:49 -0600103 */
104 void monitor(bool enable) override;
105
Matthew Barthf2bcf1f2020-01-29 14:42:47 -0600106 /**
Shawn McCarneyc8cbeac2021-09-10 15:42:56 -0500107 * Phase fault detection timer expired callback function.
108 */
109 void phaseFaultTimerExpired();
110
111 /**
112 * Sensor monitoring timer expired callback function.
113 */
114 void sensorTimerExpired();
115
116 /**
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500117 * Callback function to handle receiving a HUP signal
Matthew Barth7cbc5532020-01-29 15:13:13 -0600118 * to reload the configuration data.
119 *
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500120 * @param sigSrc sd_event_source signal wrapper
121 * @param sigInfo signal info on signal fd
Matthew Barth7cbc5532020-01-29 15:13:13 -0600122 */
123 void sighupHandler(sdeventplus::source::Signal& sigSrc,
124 const struct signalfd_siginfo* sigInfo);
125
Matthew Barth29e9e382020-01-23 13:40:49 -0600126 private:
127 /**
Shawn McCarney9bd94d32021-01-25 19:40:42 -0600128 * Clear any cached data or error history related to hardware devices.
129 *
130 * This method should be called when the system is powering on (booting).
131 * While the system was powered off, hardware could have been added,
132 * removed, or replaced.
133 */
134 void clearHardwareData();
135
136 /**
Shawn McCarney589c1812021-01-14 12:13:26 -0600137 * Finds the list of compatible system types using D-Bus methods.
Matthew Barthbbc7c582020-02-03 15:55:15 -0600138 *
Shawn McCarney589c1812021-01-14 12:13:26 -0600139 * This list is used to find the correct JSON configuration file for the
140 * current system.
Matthew Barthbbc7c582020-02-03 15:55:15 -0600141 *
Shawn McCarney589c1812021-01-14 12:13:26 -0600142 * Note that some systems do not support the D-Bus compatible interface.
143 *
144 * If a list of compatible system types is found, it is stored in the
145 * compatibleSystemTypes data member.
Matthew Barthbbc7c582020-02-03 15:55:15 -0600146 */
Shawn McCarney589c1812021-01-14 12:13:26 -0600147 void findCompatibleSystemTypes();
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500148
149 /**
150 * Finds the JSON configuration file.
151 *
Shawn McCarneyd9c8be52021-05-18 10:07:53 -0500152 * Looks for a configuration file based on the list of compatible system
Shawn McCarney589c1812021-01-14 12:13:26 -0600153 * types. If no file is found, looks for a file with the default name.
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500154 *
Shawn McCarney589c1812021-01-14 12:13:26 -0600155 * Looks for the file in the test directory and standard directory.
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500156 *
Shawn McCarney589c1812021-01-14 12:13:26 -0600157 * Throws an exception if an operating system error occurs while checking
Shawn McCarneyd9c8be52021-05-18 10:07:53 -0500158 * for the existence of a file.
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500159 *
Shawn McCarney589c1812021-01-14 12:13:26 -0600160 * @return absolute path to config file, or an empty path if none found
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500161 */
162 std::filesystem::path findConfigFile();
163
164 /**
Shawn McCarney8acaf542021-03-30 10:38:37 -0500165 * Returns whether the JSON configuration file has been loaded.
166 *
167 * @return true if config file loaded, false otherwise
168 */
169 bool isConfigFileLoaded() const
170 {
171 // If System object exists, the config file has been loaded
172 return (system != nullptr);
173 }
174
175 /**
Shawn McCarneyd9c8be52021-05-18 10:07:53 -0500176 * Returns whether the system is currently powered on.
177 *
178 * @return true if system is powered on, false otherwise
179 */
180 bool isSystemPoweredOn();
181
182 /**
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500183 * Loads the JSON configuration file.
184 *
Shawn McCarney589c1812021-01-14 12:13:26 -0600185 * Looks for the config file using findConfigFile().
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500186 *
187 * If the config file is found, it is parsed and the resulting information
Shawn McCarney589c1812021-01-14 12:13:26 -0600188 * is stored in the system data member. If parsing fails, an error is
189 * logged.
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500190 */
191 void loadConfigFile();
192
193 /**
Shawn McCarney8acaf542021-03-30 10:38:37 -0500194 * Waits until the JSON configuration file has been loaded.
195 *
196 * If the config file has not yet been loaded, waits until one of the
197 * following occurs:
198 * - config file is loaded
199 * - maximum amount of time to wait has elapsed
200 */
201 void waitUntilConfigFileLoaded();
202
203 /**
Shawn McCarneyb464c8b2020-07-16 17:51:38 -0500204 * The D-Bus bus
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500205 */
Patrick Williams7354ce62022-07-22 19:26:56 -0500206 sdbusplus::bus_t& bus;
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500207
208 /**
209 * Event to loop on
210 */
Shawn McCarneyd9c8be52021-05-18 10:07:53 -0500211 const sdeventplus::Event& eventLoop;
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500212
213 /**
Shawn McCarneyb464c8b2020-07-16 17:51:38 -0500214 * System services like error logging and the journal.
215 */
216 BMCServices services;
217
218 /**
Shawn McCarneyc8cbeac2021-09-10 15:42:56 -0500219 * Event timer used to initiate phase fault detection.
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500220 */
Shawn McCarneyc8cbeac2021-09-10 15:42:56 -0500221 Timer phaseFaultTimer;
222
223 /**
224 * Event timer used to initiate sensor monitoring.
225 */
226 Timer sensorTimer;
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500227
228 /**
Shawn McCarneyd9c8be52021-05-18 10:07:53 -0500229 * List of D-Bus signal matches
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500230 */
Patrick Williams7354ce62022-07-22 19:26:56 -0500231 std::vector<std::unique_ptr<sdbusplus::bus::match_t>> signals{};
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500232
233 /**
Shawn McCarneyd9c8be52021-05-18 10:07:53 -0500234 * Indicates whether regulator monitoring is enabled.
235 */
236 bool isMonitoringEnabled{false};
237
238 /**
Shawn McCarney589c1812021-01-14 12:13:26 -0600239 * List of compatible system types for the current system.
240 *
241 * Used to find the JSON configuration file.
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500242 */
Shawn McCarney589c1812021-01-14 12:13:26 -0600243 std::vector<std::string> compatibleSystemTypes{};
Shawn McCarneye0c6a2d2020-05-01 11:37:08 -0500244
245 /**
246 * Computer system being controlled and monitored by the BMC.
247 *
248 * Contains the information loaded from the JSON configuration file.
249 * Contains nullptr if the configuration file has not been loaded.
250 */
251 std::unique_ptr<System> system{};
Matthew Barth29e9e382020-01-23 13:40:49 -0600252};
253
254} // namespace phosphor::power::regulators