blob: d10e157d51aa4408919c490ceb24ad4aafbef8ae [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
PriyangaRamasamy794ad822021-03-29 02:44:16 -050020/** @class EditorImpl */
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060021class EditorImpl
22{
23 public:
24 EditorImpl() = delete;
25 EditorImpl(const EditorImpl&) = delete;
26 EditorImpl& operator=(const EditorImpl&) = delete;
27 EditorImpl(EditorImpl&&) = delete;
28 EditorImpl& operator=(EditorImpl&&) = delete;
SunnySrivastava1984e12b1812020-05-26 02:23:11 -050029 ~EditorImpl()
30 {
31 }
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060032
33 /** @brief Construct EditorImpl class
34 *
PriyangaRamasamy794ad822021-03-29 02:44:16 -050035 * @param[in] record - Record Name
36 * @param[in] kwd - Keyword
37 * @param[in] vpd - Vpd Vector
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060038 */
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -050039 EditorImpl(const std::string& record, const std::string& kwd,
40 Binary&& vpd) :
SunnySrivastava1984e12b1812020-05-26 02:23:11 -050041 startOffset(0),
42 thisRecord(record, kwd), vpdFile(std::move(vpd))
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -050043 {
44 }
45
46 /** @brief Construct EditorImpl class
47 *
48 * @param[in] path - Path to the vpd file
PriyangaRamasamy794ad822021-03-29 02:44:16 -050049 * @param[in] json - Parsed inventory json
50 * @param[in] record - Record name
51 * @param[in] kwd - Keyword
52 * @param[in] inventoryPath - Inventory path of the vpd
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -050053 */
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -060054 EditorImpl(const inventory::Path& path, const nlohmann::json& json,
Alpana Kumari920408d2020-05-14 00:07:03 -050055 const std::string& record, const std::string& kwd,
56 const sdbusplus::message::object_path& inventoryPath) :
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060057 vpdFilePath(path),
SunnySrivastava1984e12b1812020-05-26 02:23:11 -050058 objPath(inventoryPath), startOffset(0), jsonFile(json),
59 thisRecord(record, kwd)
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060060 {
61 }
62
PriyangaRamasamyc0a534f2020-08-24 21:29:18 +053063 /** @brief Construct EditorImpl class
64 *
65 * @param[in] path - EEPROM path
66 * @param[in] json - Parsed inventory json object
67 * @param[in] record - Record name
68 * @param[in] kwd - Keyword name
69 */
70 EditorImpl(const inventory::Path& path, const nlohmann::json& json,
71 const std::string& record, const std::string& kwd) :
72 vpdFilePath(path),
73 jsonFile(json), thisRecord(record, kwd)
74 {
75 }
76
PriyangaRamasamy794ad822021-03-29 02:44:16 -050077 /**
78 * @brief Update data for keyword
79 * The method looks for the record name to update in VTOC and then
80 * looks for the keyword name in that record. when found it updates the data
81 * of keyword with the given data. It does not block keyword data update in
82 * case the length of new data is greater than or less than the current data
83 * length. If the new data length is more than the length alotted to that
84 * keyword the new data will be truncated to update only the allotted
85 * length. Similarly if the new data length is less then only that much data
86 * will be updated for the keyword and remaining bits will be left
87 * unchanged.
88 *
89 * Following is the algorithm used to update keyword:
90 * 1) Look for the record name in the given VPD file
91 * 2) Look for the keyword name for which data needs to be updated
92 * which is the table of contents record.
93 * 3) update the data for that keyword with the new data
94 *
95 * @param[in] kwdData - data to update
Santosh Puranika0b23912022-02-10 13:37:09 +053096 * @param[in] offset - offset at which the VPD starts
PriyangaRamasamy794ad822021-03-29 02:44:16 -050097 * @param[in] updCache - Flag which tells whether to update Cache or not.
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060098 */
Santosh Puranika0b23912022-02-10 13:37:09 +053099 void updateKeyword(const Binary& kwdData, uint32_t offset,
100 const bool& updCache);
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600101
SunnySrivastava198443306542020-04-01 02:50:20 -0500102 /** @brief Expands location code on DBUS
103 * @param[in] locationCodeType - "fcs" or "mts"
104 */
105 void expandLocationCode(const std::string& locationCodeType);
106
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600107 private:
108 /** @brief read VTOC record from the vpd file
109 */
110 void readVTOC();
111
112 /** @brief validate ecc data for the VTOC record
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500113 * @param[in] itrToRecData -iterator to the record data
114 * @param[in] itrToECCData - iterator to the ECC data
115 * @param[in] recLength - Length of the record
116 * @param[in] eccLength - Length of the record's ECC
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600117 */
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500118 void checkECC(Binary::const_iterator& itrToRecData,
119 Binary::const_iterator& itrToECCData,
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600120 openpower::vpd::constants::RecordLength recLength,
121 openpower::vpd::constants::ECCLength eccLength);
122
123 /** @brief reads value at the given offset
124 * @param[in] offset - offset value
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500125 * @return value at that offset in bigendian
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600126 */
127 auto getValue(openpower::vpd::constants::offsets::Offsets offset);
128
129 /** @brief Checks if required record name exist in the VPD file
130 * @param[in] iterator - pointing to start of PT kwd
131 * @param[in] ptLength - length of the PT kwd
132 */
133 void checkPTForRecord(Binary::const_iterator& iterator, Byte ptLength);
134
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500135 /** @brief Checks for required keyword in the record */
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600136 void checkRecordForKwd();
137
138 /** @brief update data for given keyword
139 * @param[in] kwdData- data to be updated
140 */
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500141 void updateData(const Binary& kwdData);
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600142
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500143 /** @brief update record ECC */
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600144 void updateRecordECC();
145
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500146 /** @brief method to update cache once the data for keyword has been updated
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600147 */
148 void updateCache();
149
150 /** @brief method to process and update CI in case required
151 * @param[in] - objectPath - path of the object to introspect
152 */
153 void processAndUpdateCI(const std::string& objectPath);
154
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500155 /** @brief method to process and update extra interface
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600156 * @param[in] Inventory - single inventory json subpart
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500157 * @param[in] objPath - path of the object to introspect
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600158 */
159 void processAndUpdateEI(const nlohmann::json& Inventory,
160 const inventory::Path& objPath);
161
SunnySrivastava1984d076da82020-03-05 05:33:35 -0600162 /** @brief method to make busctl call
163 *
164 * @param[in] object - bus object path
165 * @param[in] interface - bus interface
166 * @param[in] property - property to update on BUS
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500167 * @param[in] data - data to be updated on Bus
SunnySrivastava1984d076da82020-03-05 05:33:35 -0600168 *
169 */
170 template <typename T>
171 void makeDbusCall(const std::string& object, const std::string& interface,
172 const std::string& property, const std::variant<T>& data);
173
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600174 // path to the VPD file to edit
Alpana Kumari920408d2020-05-14 00:07:03 -0500175 inventory::Path vpdFilePath;
176
PriyangaRamasamy794ad822021-03-29 02:44:16 -0500177 // inventory path of the vpd fru to update keyword
Sunny Srivastavaf31a91b2022-06-09 08:11:29 -0500178 inventory::Path objPath{};
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600179
180 // stream to perform operation on file
181 std::fstream vpdFileStream;
182
Alpana Kumari920408d2020-05-14 00:07:03 -0500183 // offset to get vpd data from EEPROM
SunnySrivastava1984e12b1812020-05-26 02:23:11 -0500184 uint32_t startOffset;
Alpana Kumari920408d2020-05-14 00:07:03 -0500185
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600186 // file to store parsed json
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -0500187 const nlohmann::json jsonFile;
SunnySrivastava1984b421bfd2020-03-02 08:59:32 -0600188
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600189 // structure to hold info about record to edit
190 struct RecInfo
191 {
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500192 Binary kwdUpdatedData; // need access to it in case encoding is needed
SunnySrivastava1984a0d460e2020-06-03 07:49:26 -0500193 const std::string recName;
194 const std::string recKWd;
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600195 openpower::vpd::constants::RecordOffset recOffset;
196 openpower::vpd::constants::ECCOffset recECCoffset;
197 std::size_t recECCLength;
198 std::size_t kwdDataLength;
199 openpower::vpd::constants::RecordSize recSize;
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500200 openpower::vpd::constants::DataOffset kwDataOffset;
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600201 // constructor
202 RecInfo(const std::string& rec, const std::string& kwd) :
203 recName(rec), recKWd(kwd), recOffset(0), recECCoffset(0),
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500204 recECCLength(0), kwdDataLength(0), recSize(0), kwDataOffset(0)
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600205 {
206 }
207 } thisRecord;
208
SunnySrivastava19846d8314d2020-05-15 09:34:58 -0500209 Binary vpdFile;
210
Alpana Kumari920408d2020-05-14 00:07:03 -0500211 // If requested Interface is common Interface
212 bool isCI;
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -0600213}; // class EditorImpl
214
215} // namespace editor
216} // namespace manager
217} // namespace vpd
Santosh Puranik32c46502022-02-10 08:55:07 +0530218} // namespace openpower