| #pragma once |
| |
| #include "types.hpp" |
| |
| #include <stdint.h> |
| |
| #include <sdbusplus/asio/connection.hpp> |
| |
| #include <string> |
| |
| namespace openpower |
| { |
| namespace vpd |
| { |
| namespace manager |
| { |
| |
| class Manager; |
| /** |
| * @brief A class that handles changes to BIOS attributes backed by VPD. |
| * |
| * This class has APIs that handle updates to BIOS attributes that need to |
| * be backed up to VPD. It mainly does the following: |
| * 1) Checks if the VPD keywords that BIOS attributes are backed to are |
| * uninitialized. If so, it initializes them. |
| * 2) Listens for changes to BIOS attributes and synchronizes them to the |
| * appropriate VPD keyword. |
| * |
| * Since on a factory reset like scenario, the BIOS attributes are initialized |
| * by PLDM, this code waits until PLDM has grabbed a bus name before attempting |
| * any syncs. |
| */ |
| class BiosHandler |
| { |
| public: |
| // Some default and deleted constructors and assignments. |
| BiosHandler() = delete; |
| BiosHandler(const BiosHandler&) = delete; |
| BiosHandler& operator=(const BiosHandler&) = delete; |
| BiosHandler(Manager&&) = delete; |
| BiosHandler& operator=(BiosHandler&&) = delete; |
| ~BiosHandler() = default; |
| |
| BiosHandler(std::shared_ptr<sdbusplus::asio::connection>& conn, |
| Manager& manager) : conn(conn), manager(manager) |
| { |
| checkAndListenPLDMService(); |
| } |
| |
| private: |
| /** |
| * @brief Check if PLDM service is running and run BIOS sync |
| * |
| * This API checks if the PLDM service is running and if yes it will start |
| * an immediate sync of BIOS attributes. If the service is not running, it |
| * registers a listener to be notified when the service starts so that a |
| * restore can be performed. |
| */ |
| void checkAndListenPLDMService(); |
| |
| /** |
| * @brief Register listener for changes to BIOS Attributes. |
| * |
| * The VPD manager needs to listen to changes to certain BIOS attributes |
| * that are backed by VPD. When the attributes we are interested in |
| * change, the VPD manager will make sure that we write them back to the |
| * VPD keywords that back them up. |
| */ |
| void listenBiosAttribs(); |
| |
| /** |
| * @brief Callback for BIOS Attribute changes |
| * |
| * Checks if the BIOS attribute(s) changed are those backed up by VPD. If |
| * yes, it will update the VPD with the new attribute value. |
| * @param[in] msg - The callback message. |
| */ |
| void biosAttribsCallback(sdbusplus::message_t& msg); |
| |
| /** |
| * @brief Persistently saves the Memory mirror mode |
| * |
| * Memory mirror mode setting is saved to the UTIL/D0 keyword in the |
| * motherboard VPD. If the mirror mode in BIOS is "Disabled", set D0 to 1, |
| * if "Enabled" set D0 to 2 |
| * |
| * @param[in] mirrorMode - The mirror mode BIOS attribute. |
| */ |
| void saveAMMToVPD(const std::string& mirrorMode); |
| |
| /** |
| * @brief Persistently saves the Field Core Override setting |
| * |
| * Saves the field core override value (FCO) into the VSYS/RG keyword in |
| * the motherboard VPD. |
| * |
| * @param[in] fcoVal - The FCO value as an integer. |
| */ |
| void saveFCOToVPD(int64_t fcoVal); |
| |
| /** |
| * @brief Persistently saves the Keep and Clear setting |
| * |
| * Keep and clear setting is saved to the UTIL/D1 keyword's 0th bit in the |
| * motherboard VPD. If the keep and clear in BIOS is "Disabled", set D1:0 to |
| * 0, if "Enabled" set D1:0 to 1 |
| * |
| * @param[in] keepAndClear - The keep and clear BIOS attribute. |
| */ |
| void saveKeepAndClearToVPD(const std::string& keepAndClear); |
| |
| /** |
| * @brief Persistently saves the Create default LPAR setting |
| * |
| * Create default LPAR setting is saved to the UTIL/D1 keyword's 1st bit in |
| * the motherboard VPD. If the create default LPAR in BIOS is "Disabled", |
| * set D1:1 to 0, if "Enabled" set D1:1 to 1 |
| * |
| * @param[in] createDefaultLpar - The mirror mode BIOS attribute. |
| */ |
| void saveCreateDefaultLparToVPD(const std::string& createDefaultLpar); |
| |
| /** |
| * @brief Persistently saves the Clear NVRAM setting |
| * |
| * Create default LPAR setting is saved to the UTIL/D1 keyword's 2nd bit in |
| * the motherboard VPD. If the clear NVRAM in BIOS is "Disabled", |
| * set D1:2 to 0, if "Enabled" set D1:2 to 1 |
| * |
| * @param[in] createDefaultLpar - The mirror mode BIOS attribute. |
| */ |
| void saveClearNVRAMToVPD(const std::string& clearNVRAM); |
| |
| /** |
| * @brief Writes Memory mirror mode to BIOS |
| * |
| * Writes to the hb_memory_mirror_mode BIOS attribute, if the value is |
| * not already the same as we are trying to write. |
| * |
| * @param[in] ammVal - The mirror mode as read from VPD. |
| * @param[in] ammInBIOS - The mirror mode in the BIOS table. |
| */ |
| void saveAMMToBIOS(const std::string& ammVal, const std::string& ammInBIOS); |
| |
| /** |
| * @brief Writes Field Core Override to BIOS |
| * |
| * Writes to the hb_field_core_override BIOS attribute, if the value is not |
| * already the same as we are trying to write. |
| * |
| * @param[in] fcoVal - The FCO value as read from VPD. |
| * @param[in] fcoInBIOS - The FCO value already in the BIOS table. |
| */ |
| void saveFCOToBIOS(const std::string& fcoVal, int64_t fcoInBIOS); |
| |
| /** |
| * @brief Writes Keep and clear setting to BIOS |
| * |
| * Writes to the pvm_keep_and_clear BIOS attribute, if the value is |
| * not already the same as we are trying to write. |
| * |
| * @param[in] keepAndClear - The keep and clear as read from VPD. |
| * @param[in] keepAndClearInBIOS - The keep and clear in the BIOS table. |
| */ |
| void saveKeepAndClearToBIOS(const std::string& keepAndClear, |
| const std::string& keepAndClearInBIOS); |
| |
| /** |
| * @brief Writes Create default LPAR setting to BIOS |
| * |
| * Writes to the pvm_create_default_lpar BIOS attribute, if the value is |
| * not already the same as we are trying to write. |
| * |
| * @param[in] createDefaultLpar - The create default LPAR as read from VPD. |
| * @param[in] createDefaultLparInBIOS - The create default LPAR in the BIOS |
| * table. |
| */ |
| void |
| saveCreateDefaultLparToBIOS(const std::string& createDefaultLpar, |
| const std::string& createDefaultLparInBIOS); |
| |
| /** |
| * @brief Writes Clear NVRAM setting to BIOS |
| * |
| * Writes to the pvm_clear_nvram BIOS attribute, if the value is |
| * not already the same as we are trying to write. |
| * |
| * @param[in] clearNVRAM - The clear NVRAM as read from VPD. |
| * @param[in] clearNVRAMInBIOS - The clear NVRAM in the BIOS table. |
| */ |
| void saveClearNVRAMToBIOS(const std::string& clearNVRAM, |
| const std::string& clearNVRAMInBIOS); |
| |
| /** |
| * @brief Reads the hb_memory_mirror_mode attribute |
| * |
| * @return std::string - The AMM BIOS attribute. Empty string on failure. |
| */ |
| std::string readBIOSAMM(); |
| |
| /** |
| * @brief Reads the hb_field_core_override attribute |
| * |
| * @return int64_t - The FCO BIOS attribute. -1 on failure. |
| */ |
| int64_t readBIOSFCO(); |
| |
| /** |
| * @brief Reads the pvm_keep_and_clear attribute |
| * |
| * @return std::string - The Keep and clear BIOS attribute. Empty string on |
| * failure. |
| */ |
| std::string readBIOSKeepAndClear(); |
| |
| /** |
| * @brief Reads the pvm_create_default_lpar attribute |
| * |
| * @return std::string - The Create default LPAR BIOS attribute. Empty |
| * string on failure. |
| */ |
| std::string readBIOSCreateDefaultLpar(); |
| |
| /** |
| * @brief Reads the pvm_clear_nvram attribute |
| * |
| * @return std::string - The Clear NVRAM BIOS attribute. Empty |
| * string on failure. |
| */ |
| std::string readBIOSClearNVRAM(); |
| |
| /** |
| * @brief Restore BIOS attributes |
| * |
| * This function checks if we are coming out of a factory reset. If yes, |
| * it checks the VPD cache for valid backed up copy of the applicable |
| * BIOS attributes. If valid values are found in the VPD, it will apply |
| * those to the BIOS attributes. |
| */ |
| void restoreBIOSAttribs(); |
| |
| /** |
| * @brief Reference to the connection. |
| */ |
| std::shared_ptr<sdbusplus::asio::connection>& conn; |
| |
| /** |
| * @brief Reference to the manager. |
| */ |
| Manager& manager; |
| }; // class BiosHandler |
| } // namespace manager |
| } // namespace vpd |
| } // namespace openpower |