| #pragma once | 
 | #include "manager.hpp" | 
 | #include "types.hpp" | 
 |  | 
 | #include <sdbusplus/asio/connection.hpp> | 
 | #include <sdbusplus/bus.hpp> | 
 |  | 
 | namespace vpd | 
 | { | 
 |  | 
 | /** | 
 |  * @brief Interface class for BIOS handling. | 
 |  * | 
 |  * The class layout has the virtual methods required to be implemented by any | 
 |  * concrete class that intends to use the feature provided via BIOS handler | 
 |  * class. | 
 |  */ | 
 | class BiosHandlerInterface | 
 | { | 
 |   public: | 
 |     /** | 
 |      * @brief API to back up or restore BIOS attributes. | 
 |      * | 
 |      * Concrete class should implement the API and read the backed up data from | 
 |      * its designated location and take a call if it should be backed up or | 
 |      * restored. | 
 |      */ | 
 |     virtual void backUpOrRestoreBiosAttributes() = 0; | 
 |  | 
 |     /** | 
 |      * @brief Callback API to be triggered on BIOS attribute change. | 
 |      * | 
 |      * Concrete class should implement the API to extract the attribute and its | 
 |      * value from DBus message broadcasted on BIOS attribute change. | 
 |      * The definition should be overridden in concrete class to deal with BIOS | 
 |      * attributes interested in. | 
 |      * | 
 |      * @param[in] i_msg - The callback message. | 
 |      */ | 
 |     virtual void biosAttributesCallback(sdbusplus::message_t& i_msg) = 0; | 
 | }; | 
 |  | 
 | /** | 
 |  * @brief IBM specifc BIOS handler class. | 
 |  */ | 
 | class IbmBiosHandler : public BiosHandlerInterface | 
 | { | 
 |   public: | 
 |     /** | 
 |      * @brief Construct a new IBM BIOS Handler object | 
 |      * | 
 |      * This constructor constructs a new IBM BIOS Handler object | 
 |      * @param[in] i_manager - Manager object. | 
 |      */ | 
 |     explicit IbmBiosHandler(const std::shared_ptr<Manager>& i_manager) : | 
 |         m_manager(i_manager) | 
 |     {} | 
 |  | 
 |     /** | 
 |      * @brief API to back up or restore BIOS attributes. | 
 |      * | 
 |      * The API will read the backed up data from the VPD keyword and based on | 
 |      * its value, either backs up or restores the data. | 
 |      */ | 
 |     virtual void backUpOrRestoreBiosAttributes(); | 
 |  | 
 |     /** | 
 |      * @brief Callback API to be triggered on BIOS attribute change. | 
 |      * | 
 |      * The API to extract the required attribute and its value from DBus message | 
 |      * broadcasted on BIOS attribute change. | 
 |      * | 
 |      * @param[in] i_msg - The callback message. | 
 |      */ | 
 |     virtual void biosAttributesCallback(sdbusplus::message_t& i_msg); | 
 |  | 
 |   private: | 
 |     /** | 
 |      * @brief API to read given attribute from BIOS table. | 
 |      * | 
 |      * @param[in] attributeName - Attribute to be read. | 
 |      * @return - Bios attribute current value. | 
 |      */ | 
 |     types::BiosAttributeCurrentValue readBiosAttribute( | 
 |         const std::string& attributeName); | 
 |  | 
 |     /** | 
 |      * @brief API to process "hb_field_core_override" attribute. | 
 |      * | 
 |      * The API checks value stored in VPD. If found default then the BIOS value | 
 |      * is saved to VPD else VPD value is restored in BIOS pending attribute | 
 |      * table. | 
 |      */ | 
 |     void processFieldCoreOverride(); | 
 |  | 
 |     /** | 
 |      * @brief API to save FCO data into VPD. | 
 |      * | 
 |      * @param[in] i_fcoInBios - FCO value. | 
 |      */ | 
 |     void saveFcoToVpd(int64_t i_fcoInBios); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to "hb_field_core_override" attribute. | 
 |      * | 
 |      * @param[in] i_fcoVal - FCO value. | 
 |      */ | 
 |     void saveFcoToBios(const types::BinaryVector& i_fcoVal); | 
 |  | 
 |     /** | 
 |      * @brief API to save AMM data into VPD. | 
 |      * | 
 |      * @param[in] i_memoryMirrorMode - Memory mirror mode value. | 
 |      */ | 
 |     void saveAmmToVpd(const std::string& i_memoryMirrorMode); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to "hb_memory_mirror_mode" attribute. | 
 |      * | 
 |      * @param[in] i_ammVal - AMM value. | 
 |      */ | 
 |     void saveAmmToBios(const uint8_t& i_ammVal); | 
 |  | 
 |     /** | 
 |      * @brief API to process "hb_memory_mirror_mode" attribute. | 
 |      * | 
 |      * The API checks value stored in VPD. If found default then the BIOS value | 
 |      * is saved to VPD else VPD value is restored in BIOS pending attribute | 
 |      * table. | 
 |      */ | 
 |     void processActiveMemoryMirror(); | 
 |  | 
 |     /** | 
 |      * @brief API to process "pvm_create_default_lpar" attribute. | 
 |      * | 
 |      * The API reads the value from VPD and restore it to the BIOS attribute | 
 |      * in BIOS pending attribute table. | 
 |      */ | 
 |     void processCreateDefaultLpar(); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to "pvm_create_default_lpar" attribute. | 
 |      * | 
 |      * @param[in] i_createDefaultLparVal - Value to be saved; | 
 |      */ | 
 |     void saveCreateDefaultLparToBios(const std::string& i_createDefaultLparVal); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to VPD. | 
 |      * | 
 |      * @param[in] i_createDefaultLparVal - Value to be saved. | 
 |      * | 
 |      */ | 
 |     void saveCreateDefaultLparToVpd(const std::string& i_createDefaultLparVal); | 
 |  | 
 |     /** | 
 |      * @brief API to process "pvm_clear_nvram" attribute. | 
 |      * | 
 |      * The API reads the value from VPD and restores it to the BIOS pending | 
 |      * attribute table. | 
 |      */ | 
 |     void processClearNvram(); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to "pvm_clear_nvram" attribute. | 
 |      * | 
 |      * @param[in] i_clearNvramVal - Value to be saved. | 
 |      */ | 
 |     void saveClearNvramToBios(const std::string& i_clearNvramVal); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to VPD. | 
 |      * | 
 |      * @param[in] i_clearNvramVal - Value to be saved. | 
 |      */ | 
 |     void saveClearNvramToVpd(const std::string& i_clearNvramVal); | 
 |  | 
 |     /** | 
 |      * @brief API to process "pvm_keep_and_clear" attribute. | 
 |      * | 
 |      * The API reads the value from VPD and restore it to the BIOS pending | 
 |      * attribute table. | 
 |      */ | 
 |     void processKeepAndClear(); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to "pvm_keep_and_clear" attribute. | 
 |      * | 
 |      * @param[in] i_KeepAndClearVal - Value to be saved. | 
 |      */ | 
 |     void saveKeepAndClearToBios(const std::string& i_KeepAndClearVal); | 
 |  | 
 |     /** | 
 |      * @brief API to save given value to VPD. | 
 |      * | 
 |      * @param[in] i_KeepAndClearVal - Value to be saved. | 
 |      */ | 
 |     void saveKeepAndClearToVpd(const std::string& i_KeepAndClearVal); | 
 |  | 
 |     // const reference to shared pointer to Manager object. | 
 |     const std::shared_ptr<Manager>& m_manager; | 
 | }; | 
 |  | 
 | /** | 
 |  * @brief A class to operate upon BIOS attributes. | 
 |  * | 
 |  * The class along with specific BIOS handler class(es), provides a feature | 
 |  * where specific BIOS attributes identified by the concrete specific class can | 
 |  * be listened for any change and can be backed up to a desired location or | 
 |  * restored back to the BIOS table. | 
 |  * | 
 |  * To use the feature, "BiosHandlerInterface" should be implemented by a | 
 |  * concrete class and the same should be used to instantiate BiosHandler. | 
 |  * | 
 |  * This class registers call back to listen to PLDM service as it is being used | 
 |  * for reading/writing BIOS attributes. | 
 |  * | 
 |  * The feature can be used in a factory reset scenario where backed up values | 
 |  * can be used to restore BIOS. | 
 |  * | 
 |  */ | 
 | template <typename T> | 
 | class BiosHandler | 
 | { | 
 |   public: | 
 |     // deleted APIs | 
 |     BiosHandler() = delete; | 
 |     BiosHandler(const BiosHandler&) = delete; | 
 |     BiosHandler& operator=(const BiosHandler&) = delete; | 
 |     BiosHandler& operator=(BiosHandler&&) = delete; | 
 |     ~BiosHandler() = default; | 
 |  | 
 |     /** | 
 |      * @brief Constructor. | 
 |      * | 
 |      * @param[in] i_connection - Asio connection object. | 
 |      * @param[in] i_manager - Manager object. | 
 |      */ | 
 |     BiosHandler( | 
 |         const std::shared_ptr<sdbusplus::asio::connection>& i_connection, | 
 |         const std::shared_ptr<Manager>& i_manager) : m_asioConn(i_connection) | 
 |     { | 
 |         m_specificBiosHandler = std::make_shared<T>(i_manager); | 
 |         checkAndListenPldmService(); | 
 |     } | 
 |  | 
 |   private: | 
 |     /** | 
 |      * @brief API to 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 BIOS attribute property change. | 
 |      * | 
 |      * The VPD manager needs to listen for property change of certain BIOS | 
 |      * attributes that are backed in VPD. When the attributes change, the new | 
 |      * value is written back to the VPD keywords that backs them up. | 
 |      */ | 
 |     void listenBiosAttributes(); | 
 |  | 
 |     // Reference to the connection. | 
 |     const std::shared_ptr<sdbusplus::asio::connection>& m_asioConn; | 
 |  | 
 |     // shared pointer to specific BIOS handler. | 
 |     std::shared_ptr<T> m_specificBiosHandler; | 
 | }; | 
 | } // namespace vpd |