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