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