blob: 2bd02f4cff4de85ca22a4cd217786544104fd1ad [file] [log] [blame]
Sampa Misraaea5dde2020-08-31 08:33:47 -05001#pragma once
2
3#include "common/utils.hpp"
Sagar Srinivas78a225a2020-08-27 00:52:20 -05004#include "libpldmresponder/pdr_utils.hpp"
Sampa Misraaea5dde2020-08-31 08:33:47 -05005#include "libpldmresponder/platform.hpp"
6
7#include <string>
8
9using namespace pldm::utils;
10namespace pldm
11{
12namespace responder
13{
14
15static constexpr uint8_t pSideNum = 1;
16static constexpr uint8_t tSideNum = 2;
17static constexpr auto Pside = "P";
18static constexpr auto Tside = "T";
19
20static constexpr auto redundancyIntf =
21 "xyz.openbmc_project.Software.RedundancyPriority";
22
23/** @class CodeUpdate
24 *
25 * @brief This class performs the necessary operation in pldm for
26 * inband code update. That includes taking actions on the
27 * setStateEffecterStates calls from Host and also sending
28 * notification to phosphor-software-manager app
29 */
30class CodeUpdate
31{
32 public:
33 /** @brief Constructor to create an inband codeupdate object
34 * @param[in] dBusIntf - D-Bus handler pointer
35 */
36 CodeUpdate(const pldm::utils::DBusHandler* dBusIntf) : dBusIntf(dBusIntf)
37 {
38 currBootSide = Tside;
39 nextBootSide = Tside;
Sampa Misra3a0e3b92020-10-21 05:58:00 -050040 markerLidSensorId = PLDM_INVALID_EFFECTER_ID;
41 firmwareUpdateSensorId = PLDM_INVALID_EFFECTER_ID;
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -060042 imageActivationMatch = nullptr;
Sampa Misraaea5dde2020-08-31 08:33:47 -050043 }
44
45 /* @brief Method to return the current boot side
46 */
47 std::string fetchCurrentBootSide();
48
49 /* @brief Method to return the next boot side
50 */
51 std::string fetchNextBootSide();
52
53 /* @brief Method to set the current boot side or
54 * perform a rename operation on current boot side
55 * @param[in] currSide - current side to be set to
56 * @return PLDM_SUCCESS codes
57 */
58 int setCurrentBootSide(const std::string& currSide);
59
60 /* @brief Method to set the next boot side
61 * @param[in] nextSide - next boot side to be set to
62 * @return PLDM_SUCCESS codes
63 */
64 int setNextBootSide(const std::string& nextSide);
65
66 /* @brief Method to set the running and non-running
67 * images
68 */
69 virtual void setVersions();
70
71 /* @brief Method to return the newly upoaded image id in
72 * /tmp
73 */
74 std::string fetchnewImageId()
75 {
76 return newImageId;
77 }
78
79 /* @brief Method to set the oem platform handler in CodeUpdate class */
80 void setOemPlatformHandler(pldm::responder::oem_platform::Handler* handler);
81
Sampa Misra69508502020-09-08 00:08:21 -050082 /* @brief Method to check whether code update is
83 * going on
84 * @return - bool
85 */
86 bool isCodeUpdateInProgress()
87 {
88 return codeUpdateInProgress;
89 }
90
91 /* @brief Method to indicate whether code update
92 * is going on
93 * @param[in] progress - yes/no
94 */
95 void setCodeUpdateProgress(bool progress)
96 {
97 codeUpdateInProgress = progress;
98 }
99
Varsha Kaverappa3ca29df2020-09-27 12:39:22 -0500100 /** @brief Method to clear contents the LID staging directory that contains
101 * images such as host firmware and BMC.
102 * @param[in] dirPath - directory system path that has to be cleared
103 * @return none
104 */
105 void clearDirPath(const std::string& dirPath);
106
Sagar Srinivascfdbca72020-09-22 10:03:35 -0500107 /* @brief Method to set the RequestApplyTime D-Bus property
108 * on start update to OnReset
109 * @return - Completion codes
110 */
111 int setRequestedApplyTime();
112
113 /* @brief Method to set the RequestedActivation D-Bus property
114 * on end update to Active by fetching the newImageID and
115 * clearning it once RequestedActivation is set or on error
116 * @param[in] codeUpdate - codeUpdate pointer
117 * @return - Completion codes
118 */
119 int setRequestedActivation();
120
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500121 /* @brief Method to fetch the sensor id for marker lid
122 * validation PDR
123 * @return - sensor id
124 */
125 uint16_t getMarkerLidSensor()
126 {
127 return markerLidSensorId;
128 }
129
130 /* @brief Method to set the sensor id for marker lid
131 * validation
132 * @param[in] sensorId - sensor id for marker lid validation
133 */
134 void setMarkerLidSensor(uint16_t sensorId)
135 {
136 markerLidSensorId = sensorId;
137 }
138
139 /* @brief Method to set the sensor id for firmware update state
140 * @param[in] sensorId - sensor id for firmware update state
141 */
142 void setFirmwareUpdateSensor(uint16_t sensorId)
143 {
144 firmwareUpdateSensorId = sensorId;
145 }
146
147 /* @brief Method to fetch the sensor id for firmware update state
148 * @return - sensor id
149 */
150 uint16_t getFirmwareUpdateSensor()
151 {
152 return firmwareUpdateSensorId;
153 }
154
155 /* @brief Method to send a state sensor event to Host from CodeUpdate class
156 * @param[in] sensorId - sensor id for the event
157 * @param[in] sensorEventClass - sensor event class wrt DSP0248
158 * @param[in] sensorOffset - sensor offset
159 * @param[in] eventState - new event state
160 * @param[in] prevEventState - previous state
161 */
162 void sendStateSensorEvent(uint16_t sensorId,
163 enum sensor_event_class_states sensorEventClass,
164 uint8_t sensorOffset, uint8_t eventState,
165 uint8_t prevEventState);
166
167 /* @brief Method to delete the image from non running side prior to
168 * an inband code update
169 */
170 void deleteImage();
171
Sampa Misraaea5dde2020-08-31 08:33:47 -0500172 virtual ~CodeUpdate()
173 {}
174
175 private:
176 std::string currBootSide; //!< current boot side
177 std::string nextBootSide; //!< next boot side
178 std::string runningVersion; //!< currently running image
179 std::string nonRunningVersion; //!< alternate image
180 std::string newImageId; //!< new image id
181 bool codeUpdateInProgress =
182 false; //!< indicates whether codeupdate is going on
183 const pldm::utils::DBusHandler* dBusIntf; //!< D-Bus handler
184 std::vector<std::unique_ptr<sdbusplus::bus::match::match>>
185 captureNextBootSideChange; //!< vector to catch the D-Bus property
186 //!< change for next boot side
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600187 std::vector<std::unique_ptr<sdbusplus::bus::match::match>>
Sampa Misraaea5dde2020-08-31 08:33:47 -0500188 fwUpdateMatcher; //!< pointer to capture the interface added signal for
189 //!< new image
190 pldm::responder::oem_platform::Handler*
191 oemPlatformHandler; //!< oem platform handler
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500192 uint16_t markerLidSensorId;
193 uint16_t firmwareUpdateSensorId;
Sampa Misraaea5dde2020-08-31 08:33:47 -0500194
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600195 /** @brief D-Bus property changed signal match for image activation */
196 std::unique_ptr<sdbusplus::bus::match::match> imageActivationMatch;
197
Sampa Misraaea5dde2020-08-31 08:33:47 -0500198 /* @brief Method to take action when the subscribed D-Bus property is
199 * changed
200 * @param[in] chProperties - list of properties which have changed
201 * @return - none
202 */
Sampa Misraaea5dde2020-08-31 08:33:47 -0500203 void
204 processPriorityChangeNotification(const DbusChangedProps& chProperties);
205};
206
207/* @brief Method to fetch current or next boot side
208 * @param[in] entityInstance - entity instance for the sensor
209 * @param[in] codeUpdate - pointer to the CodeUpdate object
210 *
211 * @return - boot side
212 */
213uint8_t fetchBootSide(uint16_t entityInstance, CodeUpdate* codeUpdate);
214
215/* @brief Method to set current or next boot side
216 * @param[in] entityInstance - entity instance for the effecter
217 * @param[in] currState - state to be set
218 * @param[in] stateField - state field set as sent by Host
219 * @return - PLDM_SUCCESS codes
220 */
221int setBootSide(uint16_t entityInstance, uint8_t currState,
222 const std::vector<set_effecter_state_field>& stateField,
223 CodeUpdate* codeUpdate);
224
Adriana Kobylak727f7382020-09-01 14:38:25 -0500225/* @brief Method to process LIDs during inband update, such as verifying and
226 * removing the header to get them ready to be written to flash
227 * @param[in] filePath - Path to the LID file
228 * @return - PLDM_SUCCESS codes
229 */
230int processCodeUpdateLid(const std::string& filePath);
Adriana Kobylak837fb472020-10-16 16:53:42 -0500231
232/** @brief Method to assemble the code update tarball and trigger the
233 * phosphor software manager to create a version interface
234 * @return - PLDM_SUCCESS codes
235 */
236int assembleCodeUpdateImage();
237
Sampa Misraaea5dde2020-08-31 08:33:47 -0500238} // namespace responder
239} // namespace pldm