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