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 */ 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() */ 65472101c5SShawn McCarney virtual const std::string& getName() const override 66472101c5SShawn McCarney { 67472101c5SShawn McCarney return name; 68472101c5SShawn McCarney } 69472101c5SShawn McCarney 70472101c5SShawn McCarney /** @copydoc PowerSequencerDevice::getRails() */ 71472101c5SShawn 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 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