xref: /openbmc/openpower-vpd-parser/vpd-manager/include/bios_handler.hpp (revision 3aca293156c1a5ef6e32bfd9fd73edce1d5c1aee)
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