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 getFRUsByUnexpandedLocationCode( 79 const std::string& locationCode, const uint16_t nodeNumber); 80 81 /** @brief Implementation for GetFRUsByExpandedLocationCode 82 * A method to get list of FRU D-BUS object paths for a given expanded 83 * location code. Returns empty vector if no FRU found for that location 84 * code. 85 * 86 * @param[in] locationCode - Location code in expanded format. 87 * 88 * @return inventoryList[std::vector<sdbusplus::message::object_path>] - 89 * List of all the FRUs D-Bus object path for the given location code. 90 */ 91 inventory::ListOfPaths 92 getFRUsByExpandedLocationCode(const std::string& locationCode); 93 94 /** @brief Implementation for GetExpandedLocationCode 95 * An API to get expanded location code corresponding to a given 96 * un-expanded location code. 97 * 98 * @param[in] locationCode - Location code in un-expaned format. 99 * @param[in] nodeNumber - Denotes the node in case of multi-node 100 * configuration. Ignored in case of single node configuration. 101 * 102 * @return locationCode[std::string] - Location code in expanded format. 103 */ 104 std::string getExpandedLocationCode(const std::string& locationCode, 105 const uint16_t nodeNumber); 106 107 /** @brief Api to perform VPD recollection. 108 * This api will trigger parser to perform VPD recollection for FRUs that 109 * can be replaced at standby. 110 */ 111 void performVPDRecollection(); 112 113 /** @brief Api to delete FRU VPD. 114 * This api will set the present property of given FRU to false. If already 115 * set to false, It will log an error. 116 * @param[in] path - Object path of FRU. 117 */ 118 void deleteFRUVPD(const sdbusplus::message::object_path& path); 119 120 /** @brief Api to perform VPD collection for a single fru. 121 * @param[in] path - Dbus object path of that fru. 122 */ 123 void collectFRUVPD(const sdbusplus::message::object_path& path); 124 125 private: 126 /** 127 * @brief An api to process some initial requirements. 128 */ 129 void initManager(); 130 131 /** @brief process the given JSON file 132 */ 133 void processJSON(); 134 135 /** @brief Api to register host state callback. 136 * This api will register callback to listen for host state property change. 137 */ 138 void listenHostState(); 139 140 /** @brief Callback to listen for Host state change 141 * @param[in] msg - callback message. 142 */ 143 void hostStateCallBack(sdbusplus::message_t& msg); 144 145 /** @brief Api to register AssetTag property change. 146 * This api will register callback to listen for asset tag property change. 147 */ 148 void listenAssetTag(); 149 150 /** @brief Callback to listen for Asset tag change 151 * @param[in] msg - callback message. 152 */ 153 void assetTagCallback(sdbusplus::message_t& msg); 154 155 /** 156 * @brief Restores and defaulted VPD on the system VPD EEPROM. 157 * 158 * This function will read the system VPD EEPROM and check if any of the 159 * keywords that need to be preserved across FRU replacements are defaulted 160 * in the EEPROM. If they are, this function will restore them from the 161 * value that is in the D-Bus cache. 162 */ 163 void restoreSystemVpd(); 164 165 /** 166 * @brief An api to trigger vpd collection for a fru by bind/unbind of 167 * driver. 168 * @param[in] singleFru - Json of a single fru inder a given EEPROM path. 169 * @param[in] path - Inventory path. 170 */ 171 void triggerVpdCollection(const nlohmann::json& singleFru, 172 const std::string& path); 173 174 /** @brief Update FRU that back up system VPD. 175 * 176 * The API checks if the FRU being updated is system FRU and the record 177 * keyword pair being updated is the one that needs to be backed up and 178 * updates the back up FRU accordingly. 179 * 180 * @param[in] recordName - name of the record. 181 * @param[in] keyword - keyword whose value needs to be updated. 182 * @param[in] value - value that needs to be updated. 183 */ 184 void updateSystemVPDBackUpFRU(const std::string& recordName, 185 const std::string& keyword, 186 const Binary& value); 187 188 /** 189 * @brief Check for essential fru in the system. 190 * The api check for the presence of FRUs marked as essential and logs PEL 191 * in case they are missing. 192 */ 193 void checkEssentialFrus(); 194 195 // Shared pointer to asio context object. 196 std::shared_ptr<boost::asio::io_context>& ioContext; 197 198 // Shared pointer to Dbus interface class. 199 std::shared_ptr<sdbusplus::asio::dbus_interface>& interface; 200 201 // Shared pointer to bus connection. 202 std::shared_ptr<sdbusplus::asio::connection>& conn; 203 204 // file to store parsed json 205 nlohmann::json jsonFile; 206 207 // map to hold mapping to inventory path to vpd file path 208 // we need as map here as it is in reverse order to that of json 209 inventory::FrusMap frus; 210 211 // map to hold the mapping of location code and inventory path 212 inventory::LocationCodeMap fruLocationCode; 213 214 // map to hold FRUs which can be replaced at standby 215 inventory::ReplaceableFrus replaceableFrus; 216 217 // Shared pointer to gpio monitor object. 218 std::shared_ptr<GpioMonitor> gpioMon; 219 220 // Shared pointer to instance of the BIOS handler. 221 std::shared_ptr<BiosHandler> biosHandler; 222 223 // List of FRUs marked as essential in the system. 224 inventory::EssentialFrus essentialFrus; 225 226 // sd-bus 227 sd_bus* sdBus = nullptr; 228 }; 229 230 } // namespace manager 231 } // namespace vpd 232 } // namespace openpower 233