xref: /openbmc/phosphor-power/phosphor-power-sequencer/src/standard_device.hpp (revision 92261f88729b618b1c31d20f28328a8aff73b83b)
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) :
60f5402197SPatrick Williams         name{name}, rails{std::move(rails)}
61472101c5SShawn McCarney     {}
62472101c5SShawn McCarney 
63472101c5SShawn McCarney     /** @copydoc PowerSequencerDevice::getName() */
getName() const64472101c5SShawn McCarney     virtual const std::string& getName() const override
65472101c5SShawn McCarney     {
66472101c5SShawn McCarney         return name;
67472101c5SShawn McCarney     }
68472101c5SShawn McCarney 
69472101c5SShawn McCarney     /** @copydoc PowerSequencerDevice::getRails() */
getRails() const70472101c5SShawn McCarney     virtual const std::vector<std::unique_ptr<Rail>>& getRails() const override
71472101c5SShawn McCarney     {
72472101c5SShawn McCarney         return rails;
73472101c5SShawn McCarney     }
74472101c5SShawn McCarney 
75472101c5SShawn McCarney     /** @copydoc PowerSequencerDevice::findPgoodFault()
76472101c5SShawn McCarney      *
77472101c5SShawn McCarney      * Calls prepareForPgoodFaultDetection() before starting detection.  If a
78472101c5SShawn McCarney      * pgood fault is detected, calls storePgoodFaultDebugData().
79472101c5SShawn McCarney      */
80472101c5SShawn McCarney     virtual std::string findPgoodFault(
81472101c5SShawn McCarney         Services& services, const std::string& powerSupplyError,
82472101c5SShawn McCarney         std::map<std::string, std::string>& additionalData) override;
83472101c5SShawn McCarney 
84472101c5SShawn McCarney   protected:
85472101c5SShawn McCarney     /**
86472101c5SShawn McCarney      * Prepare for pgood fault detection.
87472101c5SShawn McCarney      *
88472101c5SShawn McCarney      * Perform any actions that are necessary to prepare for fault detection.
89472101c5SShawn McCarney      * For example, cache information that is slow to obtain and is used
90472101c5SShawn McCarney      * multiple times during detection.
91472101c5SShawn McCarney      *
92472101c5SShawn McCarney      * Default implementation does nothing.  Override in sub-classes if needed.
93472101c5SShawn McCarney      *
94472101c5SShawn McCarney      * @param services System services like hardware presence and the journal
95472101c5SShawn McCarney      */
prepareForPgoodFaultDetection(Services & services)96*92261f88SPatrick Williams     virtual void prepareForPgoodFaultDetection(
97*92261f88SPatrick Williams         [[maybe_unused]] Services& services)
98472101c5SShawn McCarney     {}
99472101c5SShawn McCarney 
100472101c5SShawn McCarney     /**
101472101c5SShawn McCarney      * Returns the GPIO values that can be read from the device, if possible.
102472101c5SShawn McCarney      *
103472101c5SShawn McCarney      * If the device does not support reading GPIO values or an error occurs, an
104472101c5SShawn McCarney      * empty vector is returned.
105472101c5SShawn McCarney      *
106fc3f31fbSShawn McCarney      * @param services System services like hardware presence and the journal
107472101c5SShawn McCarney      * @return GPIO values, or empty vector if values could not be read
108472101c5SShawn McCarney      */
109fc3f31fbSShawn McCarney     virtual std::vector<int> getGPIOValuesIfPossible(Services& services);
110472101c5SShawn McCarney 
111472101c5SShawn McCarney     /**
11216275831SShawn McCarney      * Checks whether a pgood fault has occurred on one of the rails being
11316275831SShawn McCarney      * monitored by this device.
11416275831SShawn McCarney      *
11516275831SShawn McCarney      * If a pgood fault was found in a rail, a pointer to the Rail object is
11616275831SShawn McCarney      * returned.
11716275831SShawn McCarney      *
11816275831SShawn McCarney      * Throws an exception if an error occurs while trying to obtain the status
11916275831SShawn McCarney      * of the rails.
12016275831SShawn McCarney      *
12116275831SShawn McCarney      * @param services System services like hardware presence and the journal
12216275831SShawn McCarney      * @param gpioValues GPIO values obtained from the device (if any)
12316275831SShawn McCarney      * @param additionalData Additional data to include in the error log if
12416275831SShawn McCarney      *                       a pgood fault was found
12516275831SShawn McCarney      * @return pointer to Rail object where fault was found, or nullptr if no
12616275831SShawn McCarney      *         Rail found
12716275831SShawn McCarney      */
12816275831SShawn McCarney     virtual Rail* findRailWithPgoodFault(
12916275831SShawn McCarney         Services& services, const std::vector<int>& gpioValues,
13016275831SShawn McCarney         std::map<std::string, std::string>& additionalData);
13116275831SShawn McCarney 
13216275831SShawn McCarney     /**
133472101c5SShawn McCarney      * Store pgood fault debug data in the specified additional data map.
134472101c5SShawn McCarney      *
135fe78c178SShawn McCarney      * The default implementation stores the device name and then calls
136fe78c178SShawn McCarney      * storeGPIOValues().
137472101c5SShawn McCarney      *
138fe78c178SShawn McCarney      * Sub-classes should override if needed to store device-specific data.
139472101c5SShawn McCarney      *
140472101c5SShawn McCarney      * This method should NOT throw exceptions.  If debug data cannot be
141472101c5SShawn McCarney      * obtained, the error should be caught and ignored so that pgood error
142472101c5SShawn McCarney      * handling can continue.
143472101c5SShawn McCarney      *
144472101c5SShawn McCarney      * @param services System services like hardware presence and the journal
145472101c5SShawn McCarney      * @param gpioValues GPIO values obtained from the device (if any)
146472101c5SShawn McCarney      * @param additionalData Additional data to include in an error log
147472101c5SShawn McCarney      */
148472101c5SShawn McCarney     virtual void storePgoodFaultDebugData(
149472101c5SShawn McCarney         Services& services, const std::vector<int>& gpioValues,
150472101c5SShawn McCarney         std::map<std::string, std::string>& additionalData);
151472101c5SShawn McCarney 
152472101c5SShawn McCarney     /**
153fe78c178SShawn McCarney      * Store GPIO values in the specified additional data map.
154fe78c178SShawn McCarney      *
155fe78c178SShawn McCarney      * The default implementation stores the values as a simple list of
156fe78c178SShawn McCarney      * integers.
157fe78c178SShawn McCarney      *
158fe78c178SShawn McCarney      * Sub-classes should override if more advanced formatting is needed.  For
159fe78c178SShawn McCarney      * example, GPIOs could be stored individually with a name and value, or
160fe78c178SShawn McCarney      * related GPIOs could be formatted as a group.
161fe78c178SShawn McCarney      *
162fe78c178SShawn McCarney      * @param services System services like hardware presence and the journal
163fe78c178SShawn McCarney      * @param values GPIO values obtained from the device (if any)
164fe78c178SShawn McCarney      * @param additionalData Additional data to include in an error log
165fe78c178SShawn McCarney      */
166*92261f88SPatrick Williams     virtual void storeGPIOValues(
167*92261f88SPatrick Williams         Services& services, const std::vector<int>& values,
168fe78c178SShawn McCarney         std::map<std::string, std::string>& additionalData);
169fe78c178SShawn McCarney 
170fe78c178SShawn McCarney     /**
171472101c5SShawn McCarney      * Device name.
172472101c5SShawn McCarney      */
173472101c5SShawn McCarney     std::string name{};
174472101c5SShawn McCarney 
175472101c5SShawn McCarney     /**
176472101c5SShawn McCarney      * Voltage rails that are enabled and monitored by this device.
177472101c5SShawn McCarney      */
178472101c5SShawn McCarney     std::vector<std::unique_ptr<Rail>> rails{};
179472101c5SShawn McCarney };
180472101c5SShawn McCarney 
181472101c5SShawn McCarney } // namespace phosphor::power::sequencer
182