blob: 68f021a83fd81844afbb128432e878d77907e489 [file] [log] [blame]
Sunny Srivastava867ee752025-04-15 12:24:23 +05301#pragma once
2
Sunny Srivastavac74c8ef2025-04-16 12:45:27 +05303#include "backup_restore.hpp"
4#include "gpio_monitor.hpp"
Anupama B Rc7565ed2025-06-19 02:08:39 -05005#include "listener.hpp"
Sunny Srivastavac74c8ef2025-04-16 12:45:27 +05306#include "worker.hpp"
7
8#include <sdbusplus/asio/object_server.hpp>
9
10#include <memory>
11
Sunny Srivastava867ee752025-04-15 12:24:23 +053012namespace vpd
13{
14/**
Sunny Srivastavac74c8ef2025-04-16 12:45:27 +053015 * @brief Class to handle OEM specific use case.
Sunny Srivastava867ee752025-04-15 12:24:23 +053016 *
17 * Few pre-requisites needs to be taken case specifically, which will be
18 * encapsulated by this class.
19 */
20class IbmHandler
21{
22 public:
23 /**
24 * List of deleted methods.
25 */
26 IbmHandler(const IbmHandler&) = delete;
27 IbmHandler& operator=(const IbmHandler&) = delete;
28 IbmHandler(IbmHandler&&) = delete;
29
30 /**
31 * @brief Constructor.
Sunny Srivastavac74c8ef2025-04-16 12:45:27 +053032 *
33 * @param[in] o_worker - Reference to worker class object.
34 * @param[in] o_backupAndRestoreObj - Ref to back up and restore class
35 * object.
36 * @param[in] i_iFace - interface to implement.
37 * @param[in] i_ioCon - IO context.
38 * @param[in] i_asioConnection - Dbus Connection.
Sunny Srivastava867ee752025-04-15 12:24:23 +053039 */
Sunny Srivastavac74c8ef2025-04-16 12:45:27 +053040 IbmHandler(
41 std::shared_ptr<Worker>& o_worker,
42 std::shared_ptr<BackupAndRestore>& o_backupAndRestoreObj,
43 const std::shared_ptr<sdbusplus::asio::dbus_interface>& i_iFace,
44 const std::shared_ptr<boost::asio::io_context>& i_ioCon,
45 const std::shared_ptr<sdbusplus::asio::connection>& i_asioConnection);
46
47 private:
48 /**
49 * @brief API to set timer to detect system VPD over D-Bus.
50 *
51 * System VPD is required before bus name for VPD-Manager is claimed. Once
52 * system VPD is published, VPD for other FRUs should be collected. This API
53 * detects id system VPD is already published on D-Bus and based on that
54 * triggers VPD collection for rest of the FRUs.
55 *
56 * Note: Throws exception in case of any failure. Needs to be handled by the
57 * caller.
58 */
59 void SetTimerToDetectSVPDOnDbus();
60
61 /**
62 * @brief Set timer to detect and set VPD collection status for the system.
63 *
64 * Collection of FRU VPD is triggered in a separate thread. Resulting in
65 * multiple threads at a given time. The API creates a timer which on
66 * regular interval will check if all the threads were collected back and
67 * sets the status of the VPD collection for the system accordingly.
68 *
69 * @throw std::runtime_error
70 */
71 void SetTimerToDetectVpdCollectionStatus();
72
73 /**
Sunny Srivastavac74c8ef2025-04-16 12:45:27 +053074 * @brief API to process VPD collection thread failed EEPROMs.
75 */
76 void processFailedEeproms();
77
78 /**
79 * @brief API to check and update PowerVS VPD.
80 *
81 * The API will read the existing data from the DBus and if found
82 * different than what has been read from JSON, it will update the VPD with
83 * JSON data on hardware and DBus both.
84 *
85 * @param[in] i_powerVsJsonObj - PowerVS JSON object.
86 * @param[out] o_failedPathList - List of path failed to update.
87 */
88 void checkAndUpdatePowerVsVpd(const nlohmann::json& i_powerVsJsonObj,
89 std::vector<std::string>& o_failedPathList);
90 /**
91 * @brief API to handle configuration w.r.t. PowerVS systems.
92 *
93 * Some FRUs VPD is specific to powerVS system. The API detects the
94 * powerVS configuration and updates the VPD accordingly.
95 */
96 void ConfigurePowerVsSystem();
97
Sunny Srivastava78a50422025-04-25 11:17:56 +053098 /**
99 * @brief API to perform initial setup before manager claims Bus name.
100 *
101 * Before BUS name for VPD-Manager is claimed, fitconfig whould be set for
102 * corret device tree, inventory JSON w.r.t system should be linked and
103 * system VPD should be on DBus.
104 */
105 void performInitialSetup();
106
107 /**
108 * @brief API to prime system blueprint.
109 *
110 * The API will traverse the system config JSON and will prime all the FRU
111 * paths which qualifies for priming.
112 */
113 void primeSystemBlueprint();
114
115 /**
116 * @brief Function to enable and bring MUX out of idle state.
117 *
118 * This finds all the MUX defined in the system json and enables them by
119 * setting the holdidle parameter to 0.
120 *
121 * @throw std::runtime_error
122 */
123 void enableMuxChips();
124
Anupama B Rec7f8862025-05-23 01:21:01 -0500125 /**
126 * @brief API to check if priming is required.
127 *
128 * The API will traverse the system config JSON and counts the FRU
129 * paths which qualifies for priming and compares with count of object paths
130 * found under PIM which hosts the "com.ibm.VPD.Collection" interface. If
131 * the dbus count is equal to or greater than the count from JSON config
132 * consider as priming is not required.
133 *
134 * @return true if priming is required, false otherwise.
135 */
136 bool isPrimingRequired() const noexcept;
137
Sunny Srivastavac74c8ef2025-04-16 12:45:27 +0530138 // Parsed system config json object.
139 nlohmann::json m_sysCfgJsonObj{};
140
141 // Shared pointer to worker class
142 std::shared_ptr<Worker>& m_worker;
143
144 // Shared pointer to backup and restore object.
145 std::shared_ptr<BackupAndRestore>& m_backupAndRestoreObj;
146
147 // Shared pointer to GpioMonitor object.
148 std::shared_ptr<GpioMonitor> m_gpioMonitor;
149
150 // Shared pointer to Dbus interface class.
151 const std::shared_ptr<sdbusplus::asio::dbus_interface>& m_interface;
152
153 // Shared pointer to asio context object.
154 const std::shared_ptr<boost::asio::io_context>& m_ioContext;
155
156 // Shared pointer to bus connection.
157 const std::shared_ptr<sdbusplus::asio::connection>& m_asioConnection;
Anupama B Rc7565ed2025-06-19 02:08:39 -0500158
159 // Shared pointer to Listener object.
160 std::shared_ptr<Listener> m_eventListener;
Sunny Srivastava867ee752025-04-15 12:24:23 +0530161};
162} // namespace vpd