1a2461b34SShawn McCarney /**
2a2461b34SShawn McCarney  * Copyright © 2019 IBM Corporation
3a2461b34SShawn McCarney  *
4a2461b34SShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
5a2461b34SShawn McCarney  * you may not use this file except in compliance with the License.
6a2461b34SShawn McCarney  * You may obtain a copy of the License at
7a2461b34SShawn McCarney  *
8a2461b34SShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
9a2461b34SShawn McCarney  *
10a2461b34SShawn McCarney  * Unless required by applicable law or agreed to in writing, software
11a2461b34SShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
12a2461b34SShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a2461b34SShawn McCarney  * See the License for the specific language governing permissions and
14a2461b34SShawn McCarney  * limitations under the License.
15a2461b34SShawn McCarney  */
16a2461b34SShawn McCarney #pragma once
17a2461b34SShawn McCarney 
184bf310e3SShawn McCarney #include "configuration.hpp"
194bf310e3SShawn McCarney #include "sensor_monitoring.hpp"
2023243f84SBob King #include "services.hpp"
214bf310e3SShawn McCarney 
224bf310e3SShawn McCarney #include <memory>
23a2461b34SShawn McCarney #include <string>
244bf310e3SShawn McCarney #include <utility>
25a2461b34SShawn McCarney 
26ea7385b8SShawn McCarney namespace phosphor::power::regulators
27a2461b34SShawn McCarney {
28a2461b34SShawn McCarney 
29779b9565SShawn McCarney // Forward declarations to avoid circular dependencies
30779b9565SShawn McCarney class Chassis;
31779b9565SShawn McCarney class Device;
32779b9565SShawn McCarney class System;
33779b9565SShawn McCarney 
34a2461b34SShawn McCarney /**
35a2461b34SShawn McCarney  * @class Rail
36a2461b34SShawn McCarney  *
37a2461b34SShawn McCarney  * A voltage rail produced by a voltage regulator.
38a2461b34SShawn McCarney  *
39a2461b34SShawn McCarney  * Voltage regulators produce one or more rails.  Each rail typically provides a
40a2461b34SShawn McCarney  * different output voltage level, such as 1.1V.
41a2461b34SShawn McCarney  */
42a2461b34SShawn McCarney class Rail
43a2461b34SShawn McCarney {
44a2461b34SShawn McCarney   public:
45a2461b34SShawn McCarney     // Specify which compiler-generated methods we want
46a2461b34SShawn McCarney     Rail() = delete;
47a2461b34SShawn McCarney     Rail(const Rail&) = delete;
48a2461b34SShawn McCarney     Rail(Rail&&) = delete;
49a2461b34SShawn McCarney     Rail& operator=(const Rail&) = delete;
50a2461b34SShawn McCarney     Rail& operator=(Rail&&) = delete;
51a2461b34SShawn McCarney     ~Rail() = default;
52a2461b34SShawn McCarney 
53a2461b34SShawn McCarney     /**
54a2461b34SShawn McCarney      * Constructor.
55a2461b34SShawn McCarney      *
56a2461b34SShawn McCarney      * @param id unique rail ID
574bf310e3SShawn McCarney      * @param configuration configuration changes to apply to this rail, if any
584bf310e3SShawn McCarney      * @param sensorMonitoring sensor monitoring for this rail, if any
59a2461b34SShawn McCarney      */
Rail(const std::string & id,std::unique_ptr<Configuration> configuration=nullptr,std::unique_ptr<SensorMonitoring> sensorMonitoring=nullptr)604bf310e3SShawn McCarney     explicit Rail(
614bf310e3SShawn McCarney         const std::string& id,
624bf310e3SShawn McCarney         std::unique_ptr<Configuration> configuration = nullptr,
634bf310e3SShawn McCarney         std::unique_ptr<SensorMonitoring> sensorMonitoring = nullptr) :
644bf310e3SShawn McCarney         id{id},
65*48781aefSPatrick Williams         configuration{std::move(configuration)},
66*48781aefSPatrick Williams         sensorMonitoring{std::move(sensorMonitoring)}
670c9a33d6SAdriana Kobylak     {}
68a2461b34SShawn McCarney 
69a2461b34SShawn McCarney     /**
702ccf9617SShawn McCarney      * Clears all error history.
712ccf9617SShawn McCarney      *
722ccf9617SShawn McCarney      * All data on previously logged errors will be deleted.  If errors occur
732ccf9617SShawn McCarney      * again in the future they will be logged again.
742ccf9617SShawn McCarney      *
752ccf9617SShawn McCarney      * This method is normally called when the system is being powered on.
762ccf9617SShawn McCarney      */
772ccf9617SShawn McCarney     void clearErrorHistory();
782ccf9617SShawn McCarney 
792ccf9617SShawn McCarney     /**
80779b9565SShawn McCarney      * Configure this rail.
81779b9565SShawn McCarney      *
82779b9565SShawn McCarney      * Applies the configuration changes that are defined for this rail, if any.
83779b9565SShawn McCarney      *
84779b9565SShawn McCarney      * This method should be called during the boot before regulators are
85779b9565SShawn McCarney      * enabled.
86779b9565SShawn McCarney      *
8723243f84SBob King      * @param services system services like error logging and the journal
88779b9565SShawn McCarney      * @param system system that contains the chassis
89779b9565SShawn McCarney      * @param chassis chassis that contains the device
90779b9565SShawn McCarney      * @param device device that contains this rail
91779b9565SShawn McCarney      */
9223243f84SBob King     void configure(Services& services, System& system, Chassis& chassis,
9323243f84SBob King                    Device& device);
94779b9565SShawn McCarney 
95779b9565SShawn McCarney     /**
964bf310e3SShawn McCarney      * Returns the configuration changes to apply to this rail, if any.
974bf310e3SShawn McCarney      *
984bf310e3SShawn McCarney      * @return Pointer to Configuration object.  Will equal nullptr if no
994bf310e3SShawn McCarney      *         configuration changes are defined for this rail.
1004bf310e3SShawn McCarney      */
getConfiguration() const1014bf310e3SShawn McCarney     const std::unique_ptr<Configuration>& getConfiguration() const
1024bf310e3SShawn McCarney     {
1034bf310e3SShawn McCarney         return configuration;
1044bf310e3SShawn McCarney     }
1054bf310e3SShawn McCarney 
1064bf310e3SShawn McCarney     /**
107a2461b34SShawn McCarney      * Returns the unique ID of this rail.
108a2461b34SShawn McCarney      *
109a2461b34SShawn McCarney      * @return rail ID
110a2461b34SShawn McCarney      */
getID() const1114afb285eSShawn McCarney     const std::string& getID() const
112a2461b34SShawn McCarney     {
113a2461b34SShawn McCarney         return id;
114a2461b34SShawn McCarney     }
115a2461b34SShawn McCarney 
1164bf310e3SShawn McCarney     /**
1177b743431SBob King      * Monitor the sensors for this rail.
1187b743431SBob King      *
1197b743431SBob King      * Sensor monitoring is optional.  If sensor monitoring is defined for this
1207b743431SBob King      * rail, the sensor values are read.
1217b743431SBob King      *
12254b3ab9bSShawn McCarney      * This method should be called repeatedly based on a timer.
1237b743431SBob King      *
1248a55292dSBob King      * @param services system services like error logging and the journal
1257b743431SBob King      * @param system system that contains the chassis
1267b743431SBob King      * @param chassis chassis that contains the device
1277b743431SBob King      * @param device device that contains this rail
1287b743431SBob King      */
1298a55292dSBob King     void monitorSensors(Services& services, System& system, Chassis& chassis,
1308a55292dSBob King                         Device& device);
1317b743431SBob King 
1327b743431SBob King     /**
1334bf310e3SShawn McCarney      * Returns the sensor monitoring for this rail, if any.
1344bf310e3SShawn McCarney      *
1354bf310e3SShawn McCarney      * @return Pointer to SensorMonitoring object.  Will equal nullptr if no
1364bf310e3SShawn McCarney      *         sensor monitoring is defined for this rail.
1374bf310e3SShawn McCarney      */
getSensorMonitoring() const1384bf310e3SShawn McCarney     const std::unique_ptr<SensorMonitoring>& getSensorMonitoring() const
1394bf310e3SShawn McCarney     {
1404bf310e3SShawn McCarney         return sensorMonitoring;
1414bf310e3SShawn McCarney     }
1424bf310e3SShawn McCarney 
143a2461b34SShawn McCarney   private:
144a2461b34SShawn McCarney     /**
145a2461b34SShawn McCarney      * Unique ID of this rail.
146a2461b34SShawn McCarney      */
147a2461b34SShawn McCarney     const std::string id{};
1484bf310e3SShawn McCarney 
1494bf310e3SShawn McCarney     /**
1504bf310e3SShawn McCarney      * Configuration changes to apply to this rail, if any.  Set to nullptr if
1514bf310e3SShawn McCarney      * no configuration changes are defined for this rail.
1524bf310e3SShawn McCarney      */
1534bf310e3SShawn McCarney     std::unique_ptr<Configuration> configuration{};
1544bf310e3SShawn McCarney 
1554bf310e3SShawn McCarney     /**
1564bf310e3SShawn McCarney      * Sensor monitoring for this rail, if any.  Set to nullptr if no sensor
1574bf310e3SShawn McCarney      * monitoring is defined for this rail.
1584bf310e3SShawn McCarney      */
1594bf310e3SShawn McCarney     std::unique_ptr<SensorMonitoring> sensorMonitoring{};
160a2461b34SShawn McCarney };
161a2461b34SShawn McCarney 
162ea7385b8SShawn McCarney } // namespace phosphor::power::regulators
163