xref: /openbmc/phosphor-power/phosphor-power-sequencer/src/services.hpp (revision e4fef0fcf29fb330527afd467b90b6c5dcc245ca)
1906cc3f3SShawn McCarney /**
2906cc3f3SShawn McCarney  * Copyright © 2024 IBM Corporation
3906cc3f3SShawn McCarney  *
4906cc3f3SShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
5906cc3f3SShawn McCarney  * you may not use this file except in compliance with the License.
6906cc3f3SShawn McCarney  * You may obtain a copy of the License at
7906cc3f3SShawn McCarney  *
8906cc3f3SShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
9906cc3f3SShawn McCarney  *
10906cc3f3SShawn McCarney  * Unless required by applicable law or agreed to in writing, software
11906cc3f3SShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
12906cc3f3SShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13906cc3f3SShawn McCarney  * See the License for the specific language governing permissions and
14906cc3f3SShawn McCarney  * limitations under the License.
15906cc3f3SShawn McCarney  */
16906cc3f3SShawn McCarney #pragma once
17906cc3f3SShawn McCarney 
18906cc3f3SShawn McCarney #include "pmbus.hpp"
19906cc3f3SShawn McCarney #include "xyz/openbmc_project/Logging/Entry/server.hpp"
20906cc3f3SShawn McCarney 
21906cc3f3SShawn McCarney #include <phosphor-logging/lg2.hpp>
22906cc3f3SShawn McCarney #include <sdbusplus/bus.hpp>
23906cc3f3SShawn McCarney #include <sdbusplus/exception.hpp>
24906cc3f3SShawn McCarney 
25906cc3f3SShawn McCarney #include <cstdint>
26*e4fef0fcSShawn McCarney #include <format>
27906cc3f3SShawn McCarney #include <map>
28906cc3f3SShawn McCarney #include <memory>
29906cc3f3SShawn McCarney #include <string>
30906cc3f3SShawn McCarney #include <vector>
31906cc3f3SShawn McCarney 
32906cc3f3SShawn McCarney namespace phosphor::power::sequencer
33906cc3f3SShawn McCarney {
34906cc3f3SShawn McCarney 
35906cc3f3SShawn McCarney using namespace sdbusplus::xyz::openbmc_project::Logging::server;
36906cc3f3SShawn McCarney using PMBusBase = phosphor::pmbus::PMBusBase;
37906cc3f3SShawn McCarney using PMBus = phosphor::pmbus::PMBus;
38906cc3f3SShawn McCarney 
39906cc3f3SShawn McCarney /**
40906cc3f3SShawn McCarney  * @class Services
41906cc3f3SShawn McCarney  *
42906cc3f3SShawn McCarney  * Abstract base class that provides an interface to system services like error
43906cc3f3SShawn McCarney  * logging and the journal.
44906cc3f3SShawn McCarney  */
45906cc3f3SShawn McCarney class Services
46906cc3f3SShawn McCarney {
47906cc3f3SShawn McCarney   public:
48906cc3f3SShawn McCarney     // Specify which compiler-generated methods we want
49906cc3f3SShawn McCarney     Services() = default;
50906cc3f3SShawn McCarney     Services(const Services&) = delete;
51906cc3f3SShawn McCarney     Services(Services&&) = delete;
52906cc3f3SShawn McCarney     Services& operator=(const Services&) = delete;
53906cc3f3SShawn McCarney     Services& operator=(Services&&) = delete;
54906cc3f3SShawn McCarney     virtual ~Services() = default;
55906cc3f3SShawn McCarney 
56906cc3f3SShawn McCarney     /**
57906cc3f3SShawn McCarney      * Returns the D-Bus bus object.
58906cc3f3SShawn McCarney      *
59906cc3f3SShawn McCarney      * @return D-Bus bus
60906cc3f3SShawn McCarney      */
61906cc3f3SShawn McCarney     virtual sdbusplus::bus_t& getBus() = 0;
62906cc3f3SShawn McCarney 
63906cc3f3SShawn McCarney     /**
64906cc3f3SShawn McCarney      * Logs an error message in the system journal.
65906cc3f3SShawn McCarney      *
66906cc3f3SShawn McCarney      * @param message message to log
67906cc3f3SShawn McCarney      */
68906cc3f3SShawn McCarney     virtual void logErrorMsg(const std::string& message) = 0;
69906cc3f3SShawn McCarney 
70906cc3f3SShawn McCarney     /**
71906cc3f3SShawn McCarney      * Logs an informational message in the system journal.
72906cc3f3SShawn McCarney      *
73906cc3f3SShawn McCarney      * @param message message to log
74906cc3f3SShawn McCarney      */
75906cc3f3SShawn McCarney     virtual void logInfoMsg(const std::string& message) = 0;
76906cc3f3SShawn McCarney 
77906cc3f3SShawn McCarney     /**
78906cc3f3SShawn McCarney      * Logs an error.
79906cc3f3SShawn McCarney      *
80906cc3f3SShawn McCarney      * If logging fails, a message is written to the system journal but an
81906cc3f3SShawn McCarney      * exception is not thrown.
82906cc3f3SShawn McCarney      *
83906cc3f3SShawn McCarney      * @param message Message property of the error log entry
84906cc3f3SShawn McCarney      * @param severity Severity property of the error log entry
85906cc3f3SShawn McCarney      * @param additionalData AdditionalData property of the error log entry
86906cc3f3SShawn McCarney      */
87906cc3f3SShawn McCarney     virtual void
88906cc3f3SShawn McCarney         logError(const std::string& message, Entry::Level severity,
89906cc3f3SShawn McCarney                  std::map<std::string, std::string>& additionalData) = 0;
90906cc3f3SShawn McCarney 
91906cc3f3SShawn McCarney     /**
92906cc3f3SShawn McCarney      * Returns whether the hardware with the specified inventory path is
93906cc3f3SShawn McCarney      * present.
94906cc3f3SShawn McCarney      *
95906cc3f3SShawn McCarney      * Throws an exception if an error occurs while obtaining the presence
96906cc3f3SShawn McCarney      * value.
97906cc3f3SShawn McCarney      *
98906cc3f3SShawn McCarney      * @param inventoryPath D-Bus inventory path of the hardware
99906cc3f3SShawn McCarney      * @return true if hardware is present, false otherwise
100906cc3f3SShawn McCarney      */
101906cc3f3SShawn McCarney     virtual bool isPresent(const std::string& inventoryPath) = 0;
102906cc3f3SShawn McCarney 
103906cc3f3SShawn McCarney     /**
104906cc3f3SShawn McCarney      * Reads all the GPIO values on the chip with the specified label.
105906cc3f3SShawn McCarney      *
106906cc3f3SShawn McCarney      * Throws an exception if an error occurs while obtaining the values.
107906cc3f3SShawn McCarney      *
108906cc3f3SShawn McCarney      * @param chipLabel label identifying the chip with the GPIOs
109906cc3f3SShawn McCarney      * @return GPIO values
110906cc3f3SShawn McCarney      */
111906cc3f3SShawn McCarney     virtual std::vector<int> getGPIOValues(const std::string& chipLabel) = 0;
112906cc3f3SShawn McCarney 
113906cc3f3SShawn McCarney     /**
114906cc3f3SShawn McCarney      * Creates object for communicating with a PMBus device by reading and
115906cc3f3SShawn McCarney      * writing sysfs files.
116906cc3f3SShawn McCarney      *
117906cc3f3SShawn McCarney      * Throws an exception if an error occurs.
118906cc3f3SShawn McCarney      *
119906cc3f3SShawn McCarney      * @param bus I2C bus
120906cc3f3SShawn McCarney      * @param address I2C address
121906cc3f3SShawn McCarney      * @param driverName Device driver name
122906cc3f3SShawn McCarney      * @param instance Chip instance number
123906cc3f3SShawn McCarney      * @return object for communicating with PMBus device
124906cc3f3SShawn McCarney      */
125906cc3f3SShawn McCarney     virtual std::unique_ptr<PMBusBase>
126906cc3f3SShawn McCarney         createPMBus(uint8_t bus, uint16_t address,
127906cc3f3SShawn McCarney                     const std::string& driverName = "",
128906cc3f3SShawn McCarney                     size_t instance = 0) = 0;
129*e4fef0fcSShawn McCarney 
130*e4fef0fcSShawn McCarney     /**
131*e4fef0fcSShawn McCarney      * Clear any cached data.
132*e4fef0fcSShawn McCarney      *
133*e4fef0fcSShawn McCarney      * Some data may be cached for performance reasons, such as hardware
134*e4fef0fcSShawn McCarney      * presence.  Clearing the cache results in the latest data being obtained
135*e4fef0fcSShawn McCarney      * by a subsequent method calls.
136*e4fef0fcSShawn McCarney      */
137*e4fef0fcSShawn McCarney     virtual void clearCache() = 0;
138906cc3f3SShawn McCarney };
139906cc3f3SShawn McCarney 
140906cc3f3SShawn McCarney /**
141906cc3f3SShawn McCarney  * @class BMCServices
142906cc3f3SShawn McCarney  *
143906cc3f3SShawn McCarney  * Implementation of the Services interface using standard BMC system services.
144906cc3f3SShawn McCarney  */
145906cc3f3SShawn McCarney class BMCServices : public Services
146906cc3f3SShawn McCarney {
147906cc3f3SShawn McCarney   public:
148906cc3f3SShawn McCarney     // Specify which compiler-generated methods we want
149906cc3f3SShawn McCarney     BMCServices() = delete;
150906cc3f3SShawn McCarney     BMCServices(const BMCServices&) = delete;
151906cc3f3SShawn McCarney     BMCServices(BMCServices&&) = delete;
152906cc3f3SShawn McCarney     BMCServices& operator=(const BMCServices&) = delete;
153906cc3f3SShawn McCarney     BMCServices& operator=(BMCServices&&) = delete;
154906cc3f3SShawn McCarney     virtual ~BMCServices() = default;
155906cc3f3SShawn McCarney 
156906cc3f3SShawn McCarney     /**
157906cc3f3SShawn McCarney      * Constructor.
158906cc3f3SShawn McCarney      *
159906cc3f3SShawn McCarney      * @param bus D-Bus bus object
160906cc3f3SShawn McCarney      */
161906cc3f3SShawn McCarney     explicit BMCServices(sdbusplus::bus_t& bus) : bus{bus} {}
162906cc3f3SShawn McCarney 
163906cc3f3SShawn McCarney     /** @copydoc Services::getBus() */
164906cc3f3SShawn McCarney     virtual sdbusplus::bus_t& getBus() override
165906cc3f3SShawn McCarney     {
166906cc3f3SShawn McCarney         return bus;
167906cc3f3SShawn McCarney     }
168906cc3f3SShawn McCarney 
169906cc3f3SShawn McCarney     /** @copydoc Services::logErrorMsg() */
170906cc3f3SShawn McCarney     virtual void logErrorMsg(const std::string& message) override
171906cc3f3SShawn McCarney     {
172906cc3f3SShawn McCarney         lg2::error(message.c_str());
173906cc3f3SShawn McCarney     }
174906cc3f3SShawn McCarney 
175906cc3f3SShawn McCarney     /** @copydoc Services::logInfoMsg() */
176906cc3f3SShawn McCarney     virtual void logInfoMsg(const std::string& message) override
177906cc3f3SShawn McCarney     {
178906cc3f3SShawn McCarney         lg2::info(message.c_str());
179906cc3f3SShawn McCarney     }
180906cc3f3SShawn McCarney 
181906cc3f3SShawn McCarney     /** @copydoc Services::logError() */
182906cc3f3SShawn McCarney     virtual void
183906cc3f3SShawn McCarney         logError(const std::string& message, Entry::Level severity,
184906cc3f3SShawn McCarney                  std::map<std::string, std::string>& additionalData) override;
185906cc3f3SShawn McCarney 
186906cc3f3SShawn McCarney     /** @copydoc Services::isPresent() */
187906cc3f3SShawn McCarney     virtual bool isPresent(const std::string& inventoryPath) override;
188906cc3f3SShawn McCarney 
189906cc3f3SShawn McCarney     /** @copydoc Services::getGPIOValues() */
190906cc3f3SShawn McCarney     virtual std::vector<int>
191906cc3f3SShawn McCarney         getGPIOValues(const std::string& chipLabel) override;
192906cc3f3SShawn McCarney 
193906cc3f3SShawn McCarney     /** @copydoc Services::createPMBus() */
194906cc3f3SShawn McCarney     virtual std::unique_ptr<PMBusBase>
195906cc3f3SShawn McCarney         createPMBus(uint8_t bus, uint16_t address,
196906cc3f3SShawn McCarney                     const std::string& driverName = "",
197906cc3f3SShawn McCarney                     size_t instance = 0) override
198906cc3f3SShawn McCarney     {
199*e4fef0fcSShawn McCarney         std::string path = std::format("/sys/bus/i2c/devices/{}-{:04x}", bus,
200906cc3f3SShawn McCarney                                        address);
201906cc3f3SShawn McCarney         return std::make_unique<PMBus>(path, driverName, instance);
202906cc3f3SShawn McCarney     }
203906cc3f3SShawn McCarney 
204*e4fef0fcSShawn McCarney     /** @copydoc Services::clearCache() */
205*e4fef0fcSShawn McCarney     virtual void clearCache() override
206*e4fef0fcSShawn McCarney     {
207*e4fef0fcSShawn McCarney         presenceCache.clear();
208*e4fef0fcSShawn McCarney     }
209*e4fef0fcSShawn McCarney 
210906cc3f3SShawn McCarney   private:
211906cc3f3SShawn McCarney     /**
212906cc3f3SShawn McCarney      * Returns whether the specified D-Bus exception is one of the expected
213906cc3f3SShawn McCarney      * types that can be thrown if hardware is not present.
214906cc3f3SShawn McCarney      *
215906cc3f3SShawn McCarney      * @return true if exception type is expected, false otherwise
216906cc3f3SShawn McCarney      */
217906cc3f3SShawn McCarney     bool isExpectedException(const sdbusplus::exception_t& e);
218906cc3f3SShawn McCarney 
219906cc3f3SShawn McCarney     /**
220906cc3f3SShawn McCarney      * D-Bus bus object.
221906cc3f3SShawn McCarney      */
222906cc3f3SShawn McCarney     sdbusplus::bus_t& bus;
223*e4fef0fcSShawn McCarney 
224*e4fef0fcSShawn McCarney     /**
225*e4fef0fcSShawn McCarney      * Cached presence data.
226*e4fef0fcSShawn McCarney      *
227*e4fef0fcSShawn McCarney      * Map from inventory paths to presence values.
228*e4fef0fcSShawn McCarney      */
229*e4fef0fcSShawn McCarney     std::map<std::string, bool> presenceCache{};
230906cc3f3SShawn McCarney };
231906cc3f3SShawn McCarney 
232906cc3f3SShawn McCarney } // namespace phosphor::power::sequencer
233