blob: 96cfd072451667c992b374f1a05a75b73d77702b [file] [log] [blame]
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -06001#pragma once
2
3#include "const.hpp"
4#include "types.hpp"
5
6#include <cstddef>
7#include <fstream>
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -06008#include <nlohmann/json.hpp>
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -06009#include <tuple>
10
11namespace openpower
12{
13namespace vpd
14{
15namespace manager
16{
17namespace editor
18{
19
20/** @class Editor
21 * @brief Implements VPD editing related functinality, currently
22 * implemented to support only keyword data update functionality.
23 *
24 * An Editor object must be constructed by passing in VPD in
25 * binary format. To edit the keyword data, call the updateKeyword() method.
26 * The method looks for the record name to update in VTOC and
27 * then looks for the keyword name in that record.
28 * when found it updates the data of keyword with the given data.
29 * It does not block keyword data update in case the length of new data is
30 * greater than or less than the current data length.
31 * If the new data length is more than the length alotted to that keyword
32 * the new data will be truncated to update only the allotted length.
33 * Similarly if the new data length is less then only that much data will
34 * be updated for the keyword and remaining bits will be left unchanged.
35 *
36 * Following is the algorithm used to update keyword:
37 * 1) Look for the record name in the given VPD file
38 * 2) Look for the keyword name for which data needs to be updated
39 * which is the table of contents record.
40 * 3) update the data for that keyword with the new data
41 */
42class EditorImpl
43{
44 public:
45 EditorImpl() = delete;
46 EditorImpl(const EditorImpl&) = delete;
47 EditorImpl& operator=(const EditorImpl&) = delete;
48 EditorImpl(EditorImpl&&) = delete;
49 EditorImpl& operator=(EditorImpl&&) = delete;
SunnySrivastava1984e12b1812020-05-26 02:23:11 -050050 ~EditorImpl()
51 {
52 }
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060053
54 /** @brief Construct EditorImpl class
55 *
56 * @param[in] path - Path to the vpd file
57 */
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -050058 EditorImpl(const std::string& record, const std::string& kwd,
59 Binary&& vpd) :
SunnySrivastava1984e12b1812020-05-26 02:23:11 -050060 startOffset(0),
61 thisRecord(record, kwd), vpdFile(std::move(vpd))
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -050062 {
63 }
64
65 /** @brief Construct EditorImpl class
66 *
67 * @param[in] path - Path to the vpd file
68 */
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -060069 EditorImpl(const inventory::Path& path, const nlohmann::json& json,
Alpana Kumari920408d2020-05-14 00:07:03 -050070 const std::string& record, const std::string& kwd,
71 const sdbusplus::message::object_path& inventoryPath) :
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060072 vpdFilePath(path),
SunnySrivastava1984e12b1812020-05-26 02:23:11 -050073 objPath(inventoryPath), startOffset(0), jsonFile(json),
74 thisRecord(record, kwd)
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060075 {
76 }
77
PriyangaRamasamyc0a534f2020-08-24 21:29:18 +053078 /** @brief Construct EditorImpl class
79 *
80 * @param[in] path - EEPROM path
81 * @param[in] json - Parsed inventory json object
82 * @param[in] record - Record name
83 * @param[in] kwd - Keyword name
84 */
85 EditorImpl(const inventory::Path& path, const nlohmann::json& json,
86 const std::string& record, const std::string& kwd) :
87 vpdFilePath(path),
88 jsonFile(json), thisRecord(record, kwd)
89 {
90 }
91
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060092 /** @brief Update data for keyword
93 * @param[in] kwdData - data to update
PriyangaRamasamyc0a534f2020-08-24 21:29:18 +053094 * @param[in] updCache - Flag which tells whether to update Cache or not.
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060095 */
PriyangaRamasamyc0a534f2020-08-24 21:29:18 +053096 void updateKeyword(const Binary& kwdData, const bool& updCache);
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060097
SunnySrivastava198443306542020-04-01 02:50:20 -050098 /** @brief Expands location code on DBUS
99 * @param[in] locationCodeType - "fcs" or "mts"
100 */
101 void expandLocationCode(const std::string& locationCodeType);
102
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600103 private:
104 /** @brief read VTOC record from the vpd file
105 */
106 void readVTOC();
107
108 /** @brief validate ecc data for the VTOC record
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500109 * @param[in] iterator to VTOC record data
110 * @param[in] iterator to VTOC ECC data
111 * @param[in] Lenght of VTOC record
112 * @param[in] Length of ECC record
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600113 */
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500114 void checkECC(Binary::const_iterator& itrToRecData,
115 Binary::const_iterator& itrToECCData,
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600116 openpower::vpd::constants::RecordLength recLength,
117 openpower::vpd::constants::ECCLength eccLength);
118
119 /** @brief reads value at the given offset
120 * @param[in] offset - offset value
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500121 * @return value at that offset in bigendian
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600122 */
123 auto getValue(openpower::vpd::constants::offsets::Offsets offset);
124
125 /** @brief Checks if required record name exist in the VPD file
126 * @param[in] iterator - pointing to start of PT kwd
127 * @param[in] ptLength - length of the PT kwd
128 */
129 void checkPTForRecord(Binary::const_iterator& iterator, Byte ptLength);
130
131 /** @brief Checks for reuired keyword in the record
132 */
133 void checkRecordForKwd();
134
135 /** @brief update data for given keyword
136 * @param[in] kwdData- data to be updated
137 */
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500138 void updateData(const Binary& kwdData);
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600139
140 /** @brief update record ECC
141 */
142 void updateRecordECC();
143
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600144 /** @brief method to update cache once the data for kwd has been updated
145 */
146 void updateCache();
147
148 /** @brief method to process and update CI in case required
149 * @param[in] - objectPath - path of the object to introspect
150 */
151 void processAndUpdateCI(const std::string& objectPath);
152
153 /** @brief method to process and update Extra Interface
154 * @param[in] Inventory - single inventory json subpart
155 * @param[in] objectPath - path of the object to introspect
156 */
157 void processAndUpdateEI(const nlohmann::json& Inventory,
158 const inventory::Path& objPath);
159
SunnySrivastava1984d076da82020-03-05 05:33:35 -0600160 /** @brief method to make busctl call
161 *
162 * @param[in] object - bus object path
163 * @param[in] interface - bus interface
164 * @param[in] property - property to update on BUS
165 * @param[in] data - data to be updayed on Bus
166 *
167 */
168 template <typename T>
169 void makeDbusCall(const std::string& object, const std::string& interface,
170 const std::string& property, const std::variant<T>& data);
171
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600172 // path to the VPD file to edit
Alpana Kumari920408d2020-05-14 00:07:03 -0500173 inventory::Path vpdFilePath;
174
175 // inventory path of fru/module to update keyword
176 const inventory::Path objPath;
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600177
178 // stream to perform operation on file
179 std::fstream vpdFileStream;
180
Alpana Kumari920408d2020-05-14 00:07:03 -0500181 // offset to get vpd data from EEPROM
SunnySrivastava1984e12b1812020-05-26 02:23:11 -0500182 uint32_t startOffset;
Alpana Kumari920408d2020-05-14 00:07:03 -0500183
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600184 // file to store parsed json
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -0500185 const nlohmann::json jsonFile;
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600186
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600187 // structure to hold info about record to edit
188 struct RecInfo
189 {
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500190 Binary kwdUpdatedData; // need access to it in case encoding is needed
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -0500191 const std::string recName;
192 const std::string recKWd;
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600193 openpower::vpd::constants::RecordOffset recOffset;
194 openpower::vpd::constants::ECCOffset recECCoffset;
195 std::size_t recECCLength;
196 std::size_t kwdDataLength;
197 openpower::vpd::constants::RecordSize recSize;
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500198 openpower::vpd::constants::DataOffset kwDataOffset;
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600199 // constructor
200 RecInfo(const std::string& rec, const std::string& kwd) :
201 recName(rec), recKWd(kwd), recOffset(0), recECCoffset(0),
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500202 recECCLength(0), kwdDataLength(0), recSize(0), kwDataOffset(0)
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600203 {
204 }
205 } thisRecord;
206
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500207 Binary vpdFile;
208
Alpana Kumari920408d2020-05-14 00:07:03 -0500209 // If requested Interface is common Interface
210 bool isCI;
211
212 /** @brief This API will be used to find out Parent FRU of Module/CPU
213 *
214 * @param[in] - moduleObjPath, object path of that FRU
215 * @param[in] - fruType, Type of Parent FRU
216 * for Module/CPU Parent Type- FruAndModule
217 *
218 * @return returns vpd file path of Parent Fru of that Module
219 */
220 std::string getSysPathForThisFruType(const std::string& moduleObjPath,
221 const std::string& fruType);
222
223 /** @brief This API will search for correct EEPROM path for asked CPU
224 * and will init vpdFilePath
225 */
226 void getVpdPathForCpu();
227
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600228}; // class EditorImpl
229
230} // namespace editor
231} // namespace manager
232} // namespace vpd
233} // namespace openpower