1 #pragma once
2 
3 #include "bios_handler.hpp"
4 #include "editor_impl.hpp"
5 #include "gpioMonitor.hpp"
6 
7 #include <sdbusplus/asio/object_server.hpp>
8 
9 #include <map>
10 
11 namespace openpower
12 {
13 namespace vpd
14 {
15 namespace manager
16 {
17 
18 /** @class Manager
19  *  @brief OpenBMC VPD Manager implementation.
20  *
21  *  Implements methods under interface com.ibm.vpd.Manager.
22  */
23 class Manager
24 {
25   public:
26     /* Define all of the basic class operations:
27      * Not allowed:
28      * - Default constructor to avoid nullptrs.
29      * - Copy operations due to internal unique_ptr.
30      * - Move operations due to 'this' being registered as the
31      *  'context' with sdbus.
32      * Allowed:
33      * - Destructor.
34      */
35     Manager() = delete;
36     Manager(const Manager&) = delete;
37     Manager& operator=(const Manager&) = delete;
38     Manager(Manager&&) = delete;
~Manager()39     ~Manager()
40     {
41         sd_bus_unref(sdBus);
42     }
43 
44     /** @brief Constructor.
45      *  @param[in] ioCon - IO context.
46      *  @param[in] iFace - interface to implement.
47      *  @param[in] connection - Dbus Connection.
48      */
49     Manager(std::shared_ptr<boost::asio::io_context>& ioCon,
50             std::shared_ptr<sdbusplus::asio::dbus_interface>& iFace,
51             std::shared_ptr<sdbusplus::asio::connection>& conn);
52 
53     /** @brief Implementation for WriteKeyword
54      *  Api to update the keyword value for a given inventory.
55      *
56      *  @param[in] path - Path to the D-Bus object that represents the FRU.
57      *  @param[in] recordName - name of the record for which the keyword value
58      *  has to be modified
59      *  @param[in] keyword - keyword whose value needs to be updated
60      *  @param[in] value - value that needs to be updated
61      */
62     void writeKeyword(const sdbusplus::message::object_path& path,
63                       const std::string& recordName, const std::string& keyword,
64                       const Binary& value);
65 
66     /** @brief Implementation for GetFRUsByUnexpandedLocationCode
67      *  A method to get list of FRU D-BUS object paths for a given unexpanded
68      *  location code. Returns empty vector if no FRU found for that location
69      *  code.
70      *
71      *  @param[in] locationCode - An un-expanded Location code.
72      *  @param[in] nodeNumber - Denotes the node in case of a multi-node
73      *  configuration, ignored on a single node system.
74      *
75      *  @return inventoryList[std::vector<sdbusplus::message::object_path>] -
76      *  List of all the FRUs D-Bus object paths for the given location code.
77      */
78     inventory::ListOfPaths
79         getFRUsByUnexpandedLocationCode(const std::string& locationCode,
80                                         const uint16_t nodeNumber);
81 
82     /** @brief Implementation for GetFRUsByExpandedLocationCode
83      *  A method to get list of FRU D-BUS object paths for a given expanded
84      *  location code. Returns empty vector if no FRU found for that location
85      *  code.
86      *
87      *  @param[in] locationCode - Location code in expanded format.
88      *
89      *  @return inventoryList[std::vector<sdbusplus::message::object_path>] -
90      *  List of all the FRUs D-Bus object path for the given location code.
91      */
92     inventory::ListOfPaths
93         getFRUsByExpandedLocationCode(const std::string& locationCode);
94 
95     /** @brief Implementation for GetExpandedLocationCode
96      *  An API to get expanded location code corresponding to a given
97      *  un-expanded location code.
98      *
99      *  @param[in] locationCode - Location code in un-expaned format.
100      *  @param[in] nodeNumber - Denotes the node in case of multi-node
101      *  configuration. Ignored in case of single node configuration.
102      *
103      *  @return locationCode[std::string] - Location code in expanded format.
104      */
105     std::string getExpandedLocationCode(const std::string& locationCode,
106                                         const uint16_t nodeNumber);
107 
108     /** @brief Api to perform VPD recollection.
109      * This api will trigger parser to perform VPD recollection for FRUs that
110      * can be replaced at standby.
111      */
112     void performVPDRecollection();
113 
114     /** @brief Api to delete FRU VPD.
115      * This api will set the present property of given FRU to false. If already
116      * set to false, It will log an error.
117      * @param[in] path - Object path of FRU.
118      */
119     void deleteFRUVPD(const sdbusplus::message::object_path& path);
120 
121     /** @brief Api to perform VPD collection for a single fru.
122      *  @param[in] path - Dbus object path of that fru.
123      */
124     void collectFRUVPD(const sdbusplus::message::object_path& path);
125 
126   private:
127     /**
128      * @brief An api to process some initial requirements.
129      */
130     void initManager();
131 
132     /** @brief process the given JSON file
133      */
134     void processJSON();
135 
136     /** @brief Api to register host state callback.
137      * This api will register callback to listen for host state property change.
138      */
139     void listenHostState();
140 
141     /** @brief Callback to listen for Host state change
142      *  @param[in] msg - callback message.
143      */
144     void hostStateCallBack(sdbusplus::message_t& msg);
145 
146     /** @brief Api to register AssetTag property change.
147      * This api will register callback to listen for asset tag property change.
148      */
149     void listenAssetTag();
150 
151     /** @brief Callback to listen for Asset tag change
152      *  @param[in] msg - callback message.
153      */
154     void assetTagCallback(sdbusplus::message_t& msg);
155 
156     /**
157      * @brief Restores and defaulted VPD on the system VPD EEPROM.
158      *
159      * This function will read the system VPD EEPROM and check if any of the
160      * keywords that need to be preserved across FRU replacements are defaulted
161      * in the EEPROM. If they are, this function will restore them from the
162      * value that is in the D-Bus cache.
163      */
164     void restoreSystemVpd();
165 
166     /**
167      * @brief An api to trigger vpd collection for a fru by bind/unbind of
168      * driver.
169      * @param[in] singleFru - Json of a single fru inder a given EEPROM path.
170      * @param[in] path - Inventory path.
171      */
172     void triggerVpdCollection(const nlohmann::json& singleFru,
173                               const std::string& path);
174 
175     /** @brief Update FRU that back up system VPD.
176      *
177      * The API checks if the FRU being updated is system FRU and the record
178      * keyword pair being updated is the one that needs to be backed up and
179      * updates the back up FRU accordingly.
180      *
181      *  @param[in] recordName - name of the record.
182      *  @param[in] keyword - keyword whose value needs to be updated.
183      *  @param[in] value - value that needs to be updated.
184      */
185     void updateSystemVPDBackUpFRU(const std::string& recordName,
186                                   const std::string& keyword,
187                                   const Binary& value);
188 
189     /**
190      * @brief Check for essential fru in the system.
191      * The api check for the presence of FRUs marked as essential and logs PEL
192      * in case they are missing.
193      */
194     void checkEssentialFrus();
195 
196     // Shared pointer to asio context object.
197     std::shared_ptr<boost::asio::io_context>& ioContext;
198 
199     // Shared pointer to Dbus interface class.
200     std::shared_ptr<sdbusplus::asio::dbus_interface>& interface;
201 
202     // Shared pointer to bus connection.
203     std::shared_ptr<sdbusplus::asio::connection>& conn;
204 
205     // file to store parsed json
206     nlohmann::json jsonFile;
207 
208     // map to hold mapping to inventory path to vpd file path
209     // we need as map here as it is in reverse order to that of json
210     inventory::FrusMap frus;
211 
212     // map to hold the mapping of location code and inventory path
213     inventory::LocationCodeMap fruLocationCode;
214 
215     // map to hold FRUs which can be replaced at standby
216     inventory::ReplaceableFrus replaceableFrus;
217 
218     // Shared pointer to gpio monitor object.
219     std::shared_ptr<GpioMonitor> gpioMon;
220 
221     // Shared pointer to instance of the BIOS handler.
222     std::shared_ptr<BiosHandler> biosHandler;
223 
224     // List of FRUs marked as essential in the system.
225     inventory::EssentialFrus essentialFrus;
226 
227     // sd-bus
228     sd_bus* sdBus = nullptr;
229 };
230 
231 } // namespace manager
232 } // namespace vpd
233 } // namespace openpower
234