1472101c5SShawn McCarney /**
2472101c5SShawn McCarney  * Copyright © 2024 IBM Corporation
3472101c5SShawn McCarney  *
4472101c5SShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
5472101c5SShawn McCarney  * you may not use this file except in compliance with the License.
6472101c5SShawn McCarney  * You may obtain a copy of the License at
7472101c5SShawn McCarney  *
8472101c5SShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
9472101c5SShawn McCarney  *
10472101c5SShawn McCarney  * Unless required by applicable law or agreed to in writing, software
11472101c5SShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
12472101c5SShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13472101c5SShawn McCarney  * See the License for the specific language governing permissions and
14472101c5SShawn McCarney  * limitations under the License.
15472101c5SShawn McCarney  */
16472101c5SShawn McCarney #pragma once
17472101c5SShawn McCarney 
18472101c5SShawn McCarney #include "power_sequencer_device.hpp"
19472101c5SShawn McCarney #include "rail.hpp"
20472101c5SShawn McCarney #include "services.hpp"
21472101c5SShawn McCarney 
22472101c5SShawn McCarney #include <map>
23472101c5SShawn McCarney #include <memory>
24472101c5SShawn McCarney #include <string>
25472101c5SShawn McCarney #include <utility>
26472101c5SShawn McCarney #include <vector>
27472101c5SShawn McCarney 
28472101c5SShawn McCarney namespace phosphor::power::sequencer
29472101c5SShawn McCarney {
30472101c5SShawn McCarney 
31472101c5SShawn McCarney /**
32472101c5SShawn McCarney  * @class StandardDevice
33472101c5SShawn McCarney  *
34472101c5SShawn McCarney  * PowerSequencerDevice sub-class that implements the standard pgood fault
35472101c5SShawn McCarney  * detection algorithm.
36472101c5SShawn McCarney  *
37472101c5SShawn McCarney  * When adding support for a new power sequencer device type, create a sub-class
38472101c5SShawn McCarney  * of StandardDevice if possible.  This will ensure that pgood fault detection
39472101c5SShawn McCarney  * works consistently across device types.
40472101c5SShawn McCarney  */
41472101c5SShawn McCarney class StandardDevice : public PowerSequencerDevice
42472101c5SShawn McCarney {
43472101c5SShawn McCarney   public:
44472101c5SShawn McCarney     // Specify which compiler-generated methods we want
45472101c5SShawn McCarney     StandardDevice() = delete;
46472101c5SShawn McCarney     StandardDevice(const StandardDevice&) = delete;
47472101c5SShawn McCarney     StandardDevice(StandardDevice&&) = delete;
48472101c5SShawn McCarney     StandardDevice& operator=(const StandardDevice&) = delete;
49472101c5SShawn McCarney     StandardDevice& operator=(StandardDevice&&) = delete;
50472101c5SShawn McCarney     virtual ~StandardDevice() = default;
51472101c5SShawn McCarney 
52472101c5SShawn McCarney     /**
53472101c5SShawn McCarney      * Constructor.
54472101c5SShawn McCarney      *
55472101c5SShawn McCarney      * @param name device name
56472101c5SShawn McCarney      * @param rails voltage rails that are enabled and monitored by this device
57472101c5SShawn McCarney      */
StandardDevice(const std::string & name,std::vector<std::unique_ptr<Rail>> rails)58472101c5SShawn McCarney     explicit StandardDevice(const std::string& name,
59472101c5SShawn McCarney                             std::vector<std::unique_ptr<Rail>> rails) :
60472101c5SShawn McCarney         name{name},
61472101c5SShawn McCarney         rails{std::move(rails)}
62472101c5SShawn McCarney     {}
63472101c5SShawn McCarney 
64472101c5SShawn McCarney     /** @copydoc PowerSequencerDevice::getName() */
getName() const65472101c5SShawn McCarney     virtual const std::string& getName() const override
66472101c5SShawn McCarney     {
67472101c5SShawn McCarney         return name;
68472101c5SShawn McCarney     }
69472101c5SShawn McCarney 
70472101c5SShawn McCarney     /** @copydoc PowerSequencerDevice::getRails() */
getRails() const71472101c5SShawn McCarney     virtual const std::vector<std::unique_ptr<Rail>>& getRails() const override
72472101c5SShawn McCarney     {
73472101c5SShawn McCarney         return rails;
74472101c5SShawn McCarney     }
75472101c5SShawn McCarney 
76472101c5SShawn McCarney     /** @copydoc PowerSequencerDevice::findPgoodFault()
77472101c5SShawn McCarney      *
78472101c5SShawn McCarney      * Calls prepareForPgoodFaultDetection() before starting detection.  If a
79472101c5SShawn McCarney      * pgood fault is detected, calls storePgoodFaultDebugData().
80472101c5SShawn McCarney      */
81472101c5SShawn McCarney     virtual std::string findPgoodFault(
82472101c5SShawn McCarney         Services& services, const std::string& powerSupplyError,
83472101c5SShawn McCarney         std::map<std::string, std::string>& additionalData) override;
84472101c5SShawn McCarney 
85472101c5SShawn McCarney   protected:
86472101c5SShawn McCarney     /**
87472101c5SShawn McCarney      * Prepare for pgood fault detection.
88472101c5SShawn McCarney      *
89472101c5SShawn McCarney      * Perform any actions that are necessary to prepare for fault detection.
90472101c5SShawn McCarney      * For example, cache information that is slow to obtain and is used
91472101c5SShawn McCarney      * multiple times during detection.
92472101c5SShawn McCarney      *
93472101c5SShawn McCarney      * Default implementation does nothing.  Override in sub-classes if needed.
94472101c5SShawn McCarney      *
95472101c5SShawn McCarney      * @param services System services like hardware presence and the journal
96472101c5SShawn McCarney      */
97472101c5SShawn McCarney     virtual void
prepareForPgoodFaultDetection(Services & services)98472101c5SShawn McCarney         prepareForPgoodFaultDetection([[maybe_unused]] Services& services)
99472101c5SShawn McCarney     {}
100472101c5SShawn McCarney 
101472101c5SShawn McCarney     /**
102472101c5SShawn McCarney      * Returns the GPIO values that can be read from the device, if possible.
103472101c5SShawn McCarney      *
104472101c5SShawn McCarney      * If the device does not support reading GPIO values or an error occurs, an
105472101c5SShawn McCarney      * empty vector is returned.
106472101c5SShawn McCarney      *
107fc3f31fbSShawn McCarney      * @param services System services like hardware presence and the journal
108472101c5SShawn McCarney      * @return GPIO values, or empty vector if values could not be read
109472101c5SShawn McCarney      */
110fc3f31fbSShawn McCarney     virtual std::vector<int> getGPIOValuesIfPossible(Services& services);
111472101c5SShawn McCarney 
112472101c5SShawn McCarney     /**
113*16275831SShawn McCarney      * Checks whether a pgood fault has occurred on one of the rails being
114*16275831SShawn McCarney      * monitored by this device.
115*16275831SShawn McCarney      *
116*16275831SShawn McCarney      * If a pgood fault was found in a rail, a pointer to the Rail object is
117*16275831SShawn McCarney      * returned.
118*16275831SShawn McCarney      *
119*16275831SShawn McCarney      * Throws an exception if an error occurs while trying to obtain the status
120*16275831SShawn McCarney      * of the rails.
121*16275831SShawn McCarney      *
122*16275831SShawn McCarney      * @param services System services like hardware presence and the journal
123*16275831SShawn McCarney      * @param gpioValues GPIO values obtained from the device (if any)
124*16275831SShawn McCarney      * @param additionalData Additional data to include in the error log if
125*16275831SShawn McCarney      *                       a pgood fault was found
126*16275831SShawn McCarney      * @return pointer to Rail object where fault was found, or nullptr if no
127*16275831SShawn McCarney      *         Rail found
128*16275831SShawn McCarney      */
129*16275831SShawn McCarney     virtual Rail* findRailWithPgoodFault(
130*16275831SShawn McCarney         Services& services, const std::vector<int>& gpioValues,
131*16275831SShawn McCarney         std::map<std::string, std::string>& additionalData);
132*16275831SShawn McCarney 
133*16275831SShawn McCarney     /**
134472101c5SShawn McCarney      * Store pgood fault debug data in the specified additional data map.
135472101c5SShawn McCarney      *
136fe78c178SShawn McCarney      * The default implementation stores the device name and then calls
137fe78c178SShawn McCarney      * storeGPIOValues().
138472101c5SShawn McCarney      *
139fe78c178SShawn McCarney      * Sub-classes should override if needed to store device-specific data.
140472101c5SShawn McCarney      *
141472101c5SShawn McCarney      * This method should NOT throw exceptions.  If debug data cannot be
142472101c5SShawn McCarney      * obtained, the error should be caught and ignored so that pgood error
143472101c5SShawn McCarney      * handling can continue.
144472101c5SShawn McCarney      *
145472101c5SShawn McCarney      * @param services System services like hardware presence and the journal
146472101c5SShawn McCarney      * @param gpioValues GPIO values obtained from the device (if any)
147472101c5SShawn McCarney      * @param additionalData Additional data to include in an error log
148472101c5SShawn McCarney      */
149472101c5SShawn McCarney     virtual void storePgoodFaultDebugData(
150472101c5SShawn McCarney         Services& services, const std::vector<int>& gpioValues,
151472101c5SShawn McCarney         std::map<std::string, std::string>& additionalData);
152472101c5SShawn McCarney 
153472101c5SShawn McCarney     /**
154fe78c178SShawn McCarney      * Store GPIO values in the specified additional data map.
155fe78c178SShawn McCarney      *
156fe78c178SShawn McCarney      * The default implementation stores the values as a simple list of
157fe78c178SShawn McCarney      * integers.
158fe78c178SShawn McCarney      *
159fe78c178SShawn McCarney      * Sub-classes should override if more advanced formatting is needed.  For
160fe78c178SShawn McCarney      * example, GPIOs could be stored individually with a name and value, or
161fe78c178SShawn McCarney      * related GPIOs could be formatted as a group.
162fe78c178SShawn McCarney      *
163fe78c178SShawn McCarney      * @param services System services like hardware presence and the journal
164fe78c178SShawn McCarney      * @param values GPIO values obtained from the device (if any)
165fe78c178SShawn McCarney      * @param additionalData Additional data to include in an error log
166fe78c178SShawn McCarney      */
167fe78c178SShawn McCarney     virtual void
168fe78c178SShawn McCarney         storeGPIOValues(Services& services, const std::vector<int>& values,
169fe78c178SShawn McCarney                         std::map<std::string, std::string>& additionalData);
170fe78c178SShawn McCarney 
171fe78c178SShawn McCarney     /**
172472101c5SShawn McCarney      * Device name.
173472101c5SShawn McCarney      */
174472101c5SShawn McCarney     std::string name{};
175472101c5SShawn McCarney 
176472101c5SShawn McCarney     /**
177472101c5SShawn McCarney      * Voltage rails that are enabled and monitored by this device.
178472101c5SShawn McCarney      */
179472101c5SShawn McCarney     std::vector<std::unique_ptr<Rail>> rails{};
180472101c5SShawn McCarney };
181472101c5SShawn McCarney 
182472101c5SShawn McCarney } // namespace phosphor::power::sequencer
183