1fa5e4d32SSunny Srivastava #pragma once 2fa5e4d32SSunny Srivastava #include "manager.hpp" 3fa5e4d32SSunny Srivastava #include "types.hpp" 4fa5e4d32SSunny Srivastava 5fa5e4d32SSunny Srivastava #include <sdbusplus/asio/connection.hpp> 6fa5e4d32SSunny Srivastava #include <sdbusplus/bus.hpp> 7fa5e4d32SSunny Srivastava 8fa5e4d32SSunny Srivastava namespace vpd 9fa5e4d32SSunny Srivastava { 10fa5e4d32SSunny Srivastava 11fa5e4d32SSunny Srivastava /** 12fa5e4d32SSunny Srivastava * @brief Interface class for BIOS handling. 13fa5e4d32SSunny Srivastava * 14fa5e4d32SSunny Srivastava * The class layout has the virtual methods required to be implemented by any 15fa5e4d32SSunny Srivastava * concrete class that intends to use the feature provided via BIOS handler 16fa5e4d32SSunny Srivastava * class. 17fa5e4d32SSunny Srivastava */ 18fa5e4d32SSunny Srivastava class BiosHandlerInterface 19fa5e4d32SSunny Srivastava { 20fa5e4d32SSunny Srivastava public: 21fa5e4d32SSunny Srivastava /** 22fa5e4d32SSunny Srivastava * @brief API to back up or restore BIOS attributes. 23fa5e4d32SSunny Srivastava * 24fa5e4d32SSunny Srivastava * Concrete class should implement the API and read the backed up data from 25fa5e4d32SSunny Srivastava * its designated location and take a call if it should be backed up or 26fa5e4d32SSunny Srivastava * restored. 27fa5e4d32SSunny Srivastava */ 28fa5e4d32SSunny Srivastava virtual void backUpOrRestoreBiosAttributes() = 0; 29fa5e4d32SSunny Srivastava 30fa5e4d32SSunny Srivastava /** 31fa5e4d32SSunny Srivastava * @brief Callback API to be triggered on BIOS attribute change. 32fa5e4d32SSunny Srivastava * 33fa5e4d32SSunny Srivastava * Concrete class should implement the API to extract the attribute and its 34fa5e4d32SSunny Srivastava * value from DBus message broadcasted on BIOS attribute change. 35fa5e4d32SSunny Srivastava * The definition should be overridden in concrete class to deal with BIOS 36fa5e4d32SSunny Srivastava * attributes interested in. 37fa5e4d32SSunny Srivastava * 38fa5e4d32SSunny Srivastava * @param[in] i_msg - The callback message. 39fa5e4d32SSunny Srivastava */ 40fa5e4d32SSunny Srivastava virtual void biosAttributesCallback(sdbusplus::message_t& i_msg) = 0; 41fa5e4d32SSunny Srivastava }; 42fa5e4d32SSunny Srivastava 43fa5e4d32SSunny Srivastava /** 44fa5e4d32SSunny Srivastava * @brief IBM specifc BIOS handler class. 45fa5e4d32SSunny Srivastava */ 46fa5e4d32SSunny Srivastava class IbmBiosHandler : public BiosHandlerInterface 47fa5e4d32SSunny Srivastava { 48fa5e4d32SSunny Srivastava public: 49fa5e4d32SSunny Srivastava /** 50fa5e4d32SSunny Srivastava * @brief Construct a new IBM BIOS Handler object 51fa5e4d32SSunny Srivastava * 52fa5e4d32SSunny Srivastava * This constructor constructs a new IBM BIOS Handler object 53fa5e4d32SSunny Srivastava * @param[in] i_manager - Manager object. 54fa5e4d32SSunny Srivastava */ IbmBiosHandler(const std::shared_ptr<Manager> & i_manager)55fa5e4d32SSunny Srivastava explicit IbmBiosHandler(const std::shared_ptr<Manager>& i_manager) : 56fa5e4d32SSunny Srivastava m_manager(i_manager) 57fa5e4d32SSunny Srivastava {} 58fa5e4d32SSunny Srivastava 59fa5e4d32SSunny Srivastava /** 60fa5e4d32SSunny Srivastava * @brief API to back up or restore BIOS attributes. 61fa5e4d32SSunny Srivastava * 62fa5e4d32SSunny Srivastava * The API will read the backed up data from the VPD keyword and based on 63fa5e4d32SSunny Srivastava * its value, either backs up or restores the data. 64fa5e4d32SSunny Srivastava */ 65fa5e4d32SSunny Srivastava virtual void backUpOrRestoreBiosAttributes(); 66fa5e4d32SSunny Srivastava 67fa5e4d32SSunny Srivastava /** 68fa5e4d32SSunny Srivastava * @brief Callback API to be triggered on BIOS attribute change. 69fa5e4d32SSunny Srivastava * 70fa5e4d32SSunny Srivastava * The API to extract the required attribute and its value from DBus message 71fa5e4d32SSunny Srivastava * broadcasted on BIOS attribute change. 72fa5e4d32SSunny Srivastava * 73fa5e4d32SSunny Srivastava * @param[in] i_msg - The callback message. 74fa5e4d32SSunny Srivastava */ 75fa5e4d32SSunny Srivastava virtual void biosAttributesCallback(sdbusplus::message_t& i_msg); 76fa5e4d32SSunny Srivastava 77fa5e4d32SSunny Srivastava private: 78fa5e4d32SSunny Srivastava /** 79fa5e4d32SSunny Srivastava * @brief API to read given attribute from BIOS table. 80fa5e4d32SSunny Srivastava * 81fa5e4d32SSunny Srivastava * @param[in] attributeName - Attribute to be read. 82fa5e4d32SSunny Srivastava * @return - Bios attribute current value. 83fa5e4d32SSunny Srivastava */ 8443fedabcSPatrick Williams types::BiosAttributeCurrentValue readBiosAttribute( 8543fedabcSPatrick Williams const std::string& attributeName); 86fa5e4d32SSunny Srivastava 87fa5e4d32SSunny Srivastava /** 88fa5e4d32SSunny Srivastava * @brief API to process "hb_field_core_override" attribute. 89fa5e4d32SSunny Srivastava * 90fa5e4d32SSunny Srivastava * The API checks value stored in VPD. If found default then the BIOS value 91fa5e4d32SSunny Srivastava * is saved to VPD else VPD value is restored in BIOS pending attribute 92fa5e4d32SSunny Srivastava * table. 93fa5e4d32SSunny Srivastava */ 94fa5e4d32SSunny Srivastava void processFieldCoreOverride(); 95fa5e4d32SSunny Srivastava 96fa5e4d32SSunny Srivastava /** 97fa5e4d32SSunny Srivastava * @brief API to save FCO data into VPD. 98fa5e4d32SSunny Srivastava * 99fa5e4d32SSunny Srivastava * @param[in] i_fcoInBios - FCO value. 100fa5e4d32SSunny Srivastava */ 101fa5e4d32SSunny Srivastava void saveFcoToVpd(int64_t i_fcoInBios); 102fa5e4d32SSunny Srivastava 103fa5e4d32SSunny Srivastava /** 104fa5e4d32SSunny Srivastava * @brief API to save given value to "hb_field_core_override" attribute. 105fa5e4d32SSunny Srivastava * 106fa5e4d32SSunny Srivastava * @param[in] i_fcoVal - FCO value. 107fa5e4d32SSunny Srivastava */ 108fa5e4d32SSunny Srivastava void saveFcoToBios(const types::BinaryVector& i_fcoVal); 109fa5e4d32SSunny Srivastava 110fa5e4d32SSunny Srivastava /** 111fa5e4d32SSunny Srivastava * @brief API to save AMM data into VPD. 112fa5e4d32SSunny Srivastava * 113fa5e4d32SSunny Srivastava * @param[in] i_memoryMirrorMode - Memory mirror mode value. 114fa5e4d32SSunny Srivastava */ 115fa5e4d32SSunny Srivastava void saveAmmToVpd(const std::string& i_memoryMirrorMode); 116fa5e4d32SSunny Srivastava 117fa5e4d32SSunny Srivastava /** 118fa5e4d32SSunny Srivastava * @brief API to save given value to "hb_memory_mirror_mode" attribute. 119fa5e4d32SSunny Srivastava * 120fa5e4d32SSunny Srivastava * @param[in] i_ammVal - AMM value. 121fa5e4d32SSunny Srivastava */ 122*3aca2931SAnupama B R void saveAmmToBios(const uint8_t& i_ammVal); 123fa5e4d32SSunny Srivastava 124fa5e4d32SSunny Srivastava /** 125fa5e4d32SSunny Srivastava * @brief API to process "hb_memory_mirror_mode" attribute. 126fa5e4d32SSunny Srivastava * 127fa5e4d32SSunny Srivastava * The API checks value stored in VPD. If found default then the BIOS value 128fa5e4d32SSunny Srivastava * is saved to VPD else VPD value is restored in BIOS pending attribute 129fa5e4d32SSunny Srivastava * table. 130fa5e4d32SSunny Srivastava */ 131fa5e4d32SSunny Srivastava void processActiveMemoryMirror(); 132fa5e4d32SSunny Srivastava 133fa5e4d32SSunny Srivastava /** 134fa5e4d32SSunny Srivastava * @brief API to process "pvm_create_default_lpar" attribute. 135fa5e4d32SSunny Srivastava * 136fa5e4d32SSunny Srivastava * The API reads the value from VPD and restore it to the BIOS attribute 137fa5e4d32SSunny Srivastava * in BIOS pending attribute table. 138fa5e4d32SSunny Srivastava */ 139fa5e4d32SSunny Srivastava void processCreateDefaultLpar(); 140fa5e4d32SSunny Srivastava 141fa5e4d32SSunny Srivastava /** 142fa5e4d32SSunny Srivastava * @brief API to save given value to "pvm_create_default_lpar" attribute. 143fa5e4d32SSunny Srivastava * 144fa5e4d32SSunny Srivastava * @param[in] i_createDefaultLparVal - Value to be saved; 145fa5e4d32SSunny Srivastava */ 146fa5e4d32SSunny Srivastava void saveCreateDefaultLparToBios(const std::string& i_createDefaultLparVal); 147fa5e4d32SSunny Srivastava 148fa5e4d32SSunny Srivastava /** 149fa5e4d32SSunny Srivastava * @brief API to save given value to VPD. 150fa5e4d32SSunny Srivastava * 151fa5e4d32SSunny Srivastava * @param[in] i_createDefaultLparVal - Value to be saved. 152fa5e4d32SSunny Srivastava * 153fa5e4d32SSunny Srivastava */ 154fa5e4d32SSunny Srivastava void saveCreateDefaultLparToVpd(const std::string& i_createDefaultLparVal); 155fa5e4d32SSunny Srivastava 156fa5e4d32SSunny Srivastava /** 157fa5e4d32SSunny Srivastava * @brief API to process "pvm_clear_nvram" attribute. 158fa5e4d32SSunny Srivastava * 159fa5e4d32SSunny Srivastava * The API reads the value from VPD and restores it to the BIOS pending 160fa5e4d32SSunny Srivastava * attribute table. 161fa5e4d32SSunny Srivastava */ 162fa5e4d32SSunny Srivastava void processClearNvram(); 163fa5e4d32SSunny Srivastava 164fa5e4d32SSunny Srivastava /** 165fa5e4d32SSunny Srivastava * @brief API to save given value to "pvm_clear_nvram" attribute. 166fa5e4d32SSunny Srivastava * 167fa5e4d32SSunny Srivastava * @param[in] i_clearNvramVal - Value to be saved. 168fa5e4d32SSunny Srivastava */ 169fa5e4d32SSunny Srivastava void saveClearNvramToBios(const std::string& i_clearNvramVal); 170fa5e4d32SSunny Srivastava 171fa5e4d32SSunny Srivastava /** 172fa5e4d32SSunny Srivastava * @brief API to save given value to VPD. 173fa5e4d32SSunny Srivastava * 174fa5e4d32SSunny Srivastava * @param[in] i_clearNvramVal - Value to be saved. 175fa5e4d32SSunny Srivastava */ 176fa5e4d32SSunny Srivastava void saveClearNvramToVpd(const std::string& i_clearNvramVal); 177fa5e4d32SSunny Srivastava 178fa5e4d32SSunny Srivastava /** 179fa5e4d32SSunny Srivastava * @brief API to process "pvm_keep_and_clear" attribute. 180fa5e4d32SSunny Srivastava * 181fa5e4d32SSunny Srivastava * The API reads the value from VPD and restore it to the BIOS pending 182fa5e4d32SSunny Srivastava * attribute table. 183fa5e4d32SSunny Srivastava */ 184fa5e4d32SSunny Srivastava void processKeepAndClear(); 185fa5e4d32SSunny Srivastava 186fa5e4d32SSunny Srivastava /** 187fa5e4d32SSunny Srivastava * @brief API to save given value to "pvm_keep_and_clear" attribute. 188fa5e4d32SSunny Srivastava * 189fa5e4d32SSunny Srivastava * @param[in] i_KeepAndClearVal - Value to be saved. 190fa5e4d32SSunny Srivastava */ 191fa5e4d32SSunny Srivastava void saveKeepAndClearToBios(const std::string& i_KeepAndClearVal); 192fa5e4d32SSunny Srivastava 193fa5e4d32SSunny Srivastava /** 194fa5e4d32SSunny Srivastava * @brief API to save given value to VPD. 195fa5e4d32SSunny Srivastava * 196fa5e4d32SSunny Srivastava * @param[in] i_KeepAndClearVal - Value to be saved. 197fa5e4d32SSunny Srivastava */ 198fa5e4d32SSunny Srivastava void saveKeepAndClearToVpd(const std::string& i_KeepAndClearVal); 199fa5e4d32SSunny Srivastava 200fa5e4d32SSunny Srivastava // const reference to shared pointer to Manager object. 201fa5e4d32SSunny Srivastava const std::shared_ptr<Manager>& m_manager; 202fa5e4d32SSunny Srivastava }; 203fa5e4d32SSunny Srivastava 204fa5e4d32SSunny Srivastava /** 205fa5e4d32SSunny Srivastava * @brief A class to operate upon BIOS attributes. 206fa5e4d32SSunny Srivastava * 207fa5e4d32SSunny Srivastava * The class along with specific BIOS handler class(es), provides a feature 208fa5e4d32SSunny Srivastava * where specific BIOS attributes identified by the concrete specific class can 209fa5e4d32SSunny Srivastava * be listened for any change and can be backed up to a desired location or 210fa5e4d32SSunny Srivastava * restored back to the BIOS table. 211fa5e4d32SSunny Srivastava * 212fa5e4d32SSunny Srivastava * To use the feature, "BiosHandlerInterface" should be implemented by a 213fa5e4d32SSunny Srivastava * concrete class and the same should be used to instantiate BiosHandler. 214fa5e4d32SSunny Srivastava * 215fa5e4d32SSunny Srivastava * This class registers call back to listen to PLDM service as it is being used 216fa5e4d32SSunny Srivastava * for reading/writing BIOS attributes. 217fa5e4d32SSunny Srivastava * 218fa5e4d32SSunny Srivastava * The feature can be used in a factory reset scenario where backed up values 219fa5e4d32SSunny Srivastava * can be used to restore BIOS. 220fa5e4d32SSunny Srivastava * 221fa5e4d32SSunny Srivastava */ 222fa5e4d32SSunny Srivastava template <typename T> 223fa5e4d32SSunny Srivastava class BiosHandler 224fa5e4d32SSunny Srivastava { 225fa5e4d32SSunny Srivastava public: 226fa5e4d32SSunny Srivastava // deleted APIs 227fa5e4d32SSunny Srivastava BiosHandler() = delete; 228fa5e4d32SSunny Srivastava BiosHandler(const BiosHandler&) = delete; 229fa5e4d32SSunny Srivastava BiosHandler& operator=(const BiosHandler&) = delete; 230fa5e4d32SSunny Srivastava BiosHandler& operator=(BiosHandler&&) = delete; 231fa5e4d32SSunny Srivastava ~BiosHandler() = default; 232fa5e4d32SSunny Srivastava 233fa5e4d32SSunny Srivastava /** 234fa5e4d32SSunny Srivastava * @brief Constructor. 235fa5e4d32SSunny Srivastava * 236fa5e4d32SSunny Srivastava * @param[in] i_connection - Asio connection object. 237fa5e4d32SSunny Srivastava * @param[in] i_manager - Manager object. 238fa5e4d32SSunny Srivastava */ BiosHandler(const std::shared_ptr<sdbusplus::asio::connection> & i_connection,const std::shared_ptr<Manager> & i_manager)239fa5e4d32SSunny Srivastava BiosHandler( 240fa5e4d32SSunny Srivastava const std::shared_ptr<sdbusplus::asio::connection>& i_connection, 241fa5e4d32SSunny Srivastava const std::shared_ptr<Manager>& i_manager) : m_asioConn(i_connection) 242fa5e4d32SSunny Srivastava { 243fa5e4d32SSunny Srivastava m_specificBiosHandler = std::make_shared<T>(i_manager); 244fa5e4d32SSunny Srivastava checkAndListenPldmService(); 245fa5e4d32SSunny Srivastava } 246fa5e4d32SSunny Srivastava 247fa5e4d32SSunny Srivastava private: 248fa5e4d32SSunny Srivastava /** 249fa5e4d32SSunny Srivastava * @brief API to check if PLDM service is running and run BIOS sync. 250fa5e4d32SSunny Srivastava * 251fa5e4d32SSunny Srivastava * This API checks if the PLDM service is running and if yes it will start 252fa5e4d32SSunny Srivastava * an immediate sync of BIOS attributes. If the service is not running, it 253fa5e4d32SSunny Srivastava * registers a listener to be notified when the service starts so that a 254fa5e4d32SSunny Srivastava * restore can be performed. 255fa5e4d32SSunny Srivastava */ 256fa5e4d32SSunny Srivastava void checkAndListenPldmService(); 257fa5e4d32SSunny Srivastava 258fa5e4d32SSunny Srivastava /** 259fa5e4d32SSunny Srivastava * @brief Register listener for BIOS attribute property change. 260fa5e4d32SSunny Srivastava * 261fa5e4d32SSunny Srivastava * The VPD manager needs to listen for property change of certain BIOS 262fa5e4d32SSunny Srivastava * attributes that are backed in VPD. When the attributes change, the new 263fa5e4d32SSunny Srivastava * value is written back to the VPD keywords that backs them up. 264fa5e4d32SSunny Srivastava */ 265fa5e4d32SSunny Srivastava void listenBiosAttributes(); 266fa5e4d32SSunny Srivastava 267fa5e4d32SSunny Srivastava // Reference to the connection. 268fa5e4d32SSunny Srivastava const std::shared_ptr<sdbusplus::asio::connection>& m_asioConn; 269fa5e4d32SSunny Srivastava 270fa5e4d32SSunny Srivastava // shared pointer to specific BIOS handler. 271fa5e4d32SSunny Srivastava std::shared_ptr<T> m_specificBiosHandler; 272fa5e4d32SSunny Srivastava }; 273fa5e4d32SSunny Srivastava } // namespace vpd 274