blob: 2e037ccd50eea7944e1f1de10f1e0f3c1cb4bb60 [file] [log] [blame]
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -05001#include "pldm_base_cmd.hpp"
2
George Liu6492f522020-06-16 10:34:05 +08003#include "pldm_cmd_helper.hpp"
4
George Liuc453e162022-12-21 17:16:23 +08005#include <libpldm/utils.h>
6
Sridevi Ramesh45e52542020-04-03 07:54:18 -05007#ifdef OEM_IBM
Andrew Jeffery21f128d2024-01-15 15:34:26 +10308#include <libpldm/oem/ibm/file_io.h>
9#include <libpldm/oem/ibm/host.h>
Sridevi Ramesh45e52542020-04-03 07:54:18 -050010#endif
11
Sridevi Rameshca4a8152020-08-11 09:26:19 -050012#include <string>
13
John Wang58a0e062019-11-08 15:38:15 +080014namespace pldmtool
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050015{
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050016
John Wang58a0e062019-11-08 15:38:15 +080017namespace base
Lakshminarayana R. Kammath27693a42019-06-24 00:51:47 -050018{
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050019
John Wang58a0e062019-11-08 15:38:15 +080020namespace
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -050021{
John Wang58a0e062019-11-08 15:38:15 +080022
23using namespace pldmtool::helper;
24
25std::vector<std::unique_ptr<CommandInterface>> commands;
26const std::map<const char*, pldm_supported_types> pldmTypes{
Sridevi Ramesh45e52542020-04-03 07:54:18 -050027 {"base", PLDM_BASE}, {"platform", PLDM_PLATFORM},
28 {"bios", PLDM_BIOS}, {"fru", PLDM_FRU},
29#ifdef OEM_IBM
30 {"oem-ibm", PLDM_OEM},
31#endif
John Wang58a0e062019-11-08 15:38:15 +080032};
33
Sridevi Ramesh66294d32020-02-21 03:52:07 -060034const std::map<const char*, pldm_supported_commands> pldmBaseCmds{
Thu Nguyenb8e3b0d2024-11-21 02:05:20 +000035 {"SetTID", PLDM_SET_TID},
Sridevi Ramesh66294d32020-02-21 03:52:07 -060036 {"GetTID", PLDM_GET_TID},
37 {"GetPLDMVersion", PLDM_GET_PLDM_VERSION},
38 {"GetPLDMTypes", PLDM_GET_PLDM_TYPES},
Thu Nguyenb8e3b0d2024-11-21 02:05:20 +000039 {"GetPLDMCommands", PLDM_GET_PLDM_COMMANDS},
40 {"SelectPLDMVersion", PLDM_SELECT_PLDM_VERSION},
41 {"NegotiateTransferParameters", PLDM_NEGOTIATE_TRANSFER_PARAMETERS},
42 {"MultipartSend", PLDM_MULTIPART_SEND},
43 {"MultipartReceive", PLDM_MULTIPART_RECEIVE},
44 {"GetMultipartTransferSupport", PLDM_GET_MULTIPART_TRANSFER_SUPPORT}};
Sridevi Ramesh66294d32020-02-21 03:52:07 -060045
46const std::map<const char*, pldm_bios_commands> pldmBiosCmds{
47 {"GetBIOSTable", PLDM_GET_BIOS_TABLE},
Sridevi Ramesh8fb11c92021-06-08 08:45:01 -050048 {"SetBIOSTable", PLDM_SET_BIOS_TABLE},
Sridevi Ramesh66294d32020-02-21 03:52:07 -060049 {"SetBIOSAttributeCurrentValue", PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE},
50 {"GetBIOSAttributeCurrentValueByHandle",
51 PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE},
52 {"GetDateTime", PLDM_GET_DATE_TIME},
53 {"SetDateTime", PLDM_SET_DATE_TIME}};
54
55const std::map<const char*, pldm_platform_commands> pldmPlatformCmds{
Thu Nguyenf1c0e7c2024-11-20 15:50:21 +000056 {"GetTerminusUID", PLDM_GET_TERMINUS_UID},
57 {"SetEventReceiver", PLDM_SET_EVENT_RECEIVER},
58 {"GetEventReceiver", PLDM_GET_EVENT_RECEIVER},
59 {"PlatformEventMessage", PLDM_PLATFORM_EVENT_MESSAGE},
60 {"PollForPlatformEventMessage", PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE},
61 {"EventMessageSupported", PLDM_EVENT_MESSAGE_SUPPORTED},
62 {"EventMessageBufferSize", PLDM_EVENT_MESSAGE_BUFFER_SIZE},
63 {"SetNumericSensorEnable", PLDM_SET_NUMERIC_SENSOR_ENABLE},
64 {"GetSensorReading", PLDM_GET_SENSOR_READING},
65 {"GetSensorThresholds", PLDM_GET_SENSOR_THRESHOLDS},
66 {"SetSensorThresholds", PLDM_SET_SENSOR_THRESHOLDS},
67 {"RestoreSensorThresholds", PLDM_RESTORE_SENSOR_THRESHOLDS},
68 {"GetSensorHysteresis", PLDM_GET_SENSOR_HYSTERESIS},
69 {"SetSensorHysteresis", PLDM_SET_SENSOR_HYSTERESIS},
70 {"InitNumericSensor", PLDM_INIT_NUMERIC_SENSOR},
71 {"SetStateSensorEnables", PLDM_SET_STATE_SENSOR_ENABLES},
72 {"GetStateSensorReadings", PLDM_GET_STATE_SENSOR_READINGS},
73 {"InitStateSensor", PLDM_INIT_STATE_SENSOR},
74 {"SetNumericEffecterEnable", PLDM_SET_NUMERIC_EFFECTER_ENABLE},
Sridevi Ramesh66294d32020-02-21 03:52:07 -060075 {"SetNumericEffecterValue", PLDM_SET_NUMERIC_EFFECTER_VALUE},
Thu Nguyenf1c0e7c2024-11-20 15:50:21 +000076 {"GetNumericEffecterValue", PLDM_GET_NUMERIC_EFFECTER_VALUE},
77 {"SetStateEffecterEnables", PLDM_SET_STATE_EFFECTER_ENABLES},
Sridevi Ramesh66294d32020-02-21 03:52:07 -060078 {"SetStateEffecterStates", PLDM_SET_STATE_EFFECTER_STATES},
Tal Yacobi8570fcc2024-05-28 11:11:23 +030079 {"GetStateEffecterStates", PLDM_GET_STATE_EFFECTER_STATES},
Thu Nguyenf1c0e7c2024-11-20 15:50:21 +000080 {"GetPLDMEventLogInfo", PLDM_GET_PLDM_EVENT_LOG_INFO},
81 {"EnablePLDMEventLogging", PLDM_ENABLE_PLDM_EVENT_LOGGING},
82 {"ClearPLDMEventLog", PLDM_CLEAR_PLDM_EVENT_LOG},
83 {"GetPLDMEventLogTimestamp", PLDM_GET_PLDM_EVENT_LOG_TIMESTAMP},
84 {"SetPLDMEventLogTimestamp", PLDM_SET_PLDM_EVENT_LOG_TIMESTAMP},
85 {"ReadPLDMEventLog", PLDM_READ_PLDM_EVENT_LOG},
86 {"GetPLDMEventLogPolicyInfo", PLDM_GET_PLDM_EVENT_LOG_POLICY_INFO},
87 {"SetPLDMEventLogPolicy", PLDM_SET_PLDM_EVENT_LOG_POLICY},
88 {"FindPLDMEventLogEntry", PLDM_FIND_PLDM_EVENT_LOG_ENTRY},
89 {"GetPDRRepositoryInfo", PLDM_GET_PDR_REPOSITORY_INFO},
Sridevi Ramesh8fb11c92021-06-08 08:45:01 -050090 {"GetPDR", PLDM_GET_PDR},
Thu Nguyenf1c0e7c2024-11-20 15:50:21 +000091 {"FindPDR", PLDM_FIND_PDR},
92 {"RunInitAgent", PLDM_RUN_INIT_AGENT},
93 {"GetPDRRepositorySignature", PLDM_GET_PDR_REPOSITORY_SIGNATURE}};
Sridevi Ramesh66294d32020-02-21 03:52:07 -060094
95const std::map<const char*, pldm_fru_commands> pldmFruCmds{
96 {"GetFRURecordTableMetadata", PLDM_GET_FRU_RECORD_TABLE_METADATA},
John Wang5bdde3a2020-06-16 15:02:33 +080097 {"GetFRURecordTable", PLDM_GET_FRU_RECORD_TABLE},
98 {"GetFRURecordByOption", PLDM_GET_FRU_RECORD_BY_OPTION}};
Sridevi Ramesh66294d32020-02-21 03:52:07 -060099
Sridevi Ramesh45e52542020-04-03 07:54:18 -0500100#ifdef OEM_IBM
101const std::map<const char*, pldm_host_commands> pldmIBMHostCmds{
102 {"GetAlertStatus", PLDM_HOST_GET_ALERT_STATUS}};
103
104const std::map<const char*, pldm_fileio_commands> pldmIBMFileIOCmds{
105 {"GetFileTable", PLDM_GET_FILE_TABLE},
106 {"ReadFile", PLDM_READ_FILE},
107 {"WriteFile", PLDM_WRITE_FILE},
108 {"ReadFileInToMemory", PLDM_READ_FILE_INTO_MEMORY},
109 {"WriteFileFromMemory", PLDM_WRITE_FILE_FROM_MEMORY},
110 {"ReadFileByTypeIntoMemory", PLDM_READ_FILE_BY_TYPE_INTO_MEMORY},
111 {"WriteFileByTypeFromMemory", PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY},
112 {"NewFileAvailable", PLDM_NEW_FILE_AVAILABLE},
113 {"ReadFileByType", PLDM_READ_FILE_BY_TYPE},
114 {"WriteFileByType", PLDM_WRITE_FILE_BY_TYPE},
115 {"FileAck", PLDM_FILE_ACK}};
116#endif
117
John Wang58a0e062019-11-08 15:38:15 +0800118} // namespace
119
120class GetPLDMTypes : public CommandInterface
121{
122 public:
123 ~GetPLDMTypes() = default;
124 GetPLDMTypes() = delete;
125 GetPLDMTypes(const GetPLDMTypes&) = delete;
126 GetPLDMTypes(GetPLDMTypes&&) = default;
127 GetPLDMTypes& operator=(const GetPLDMTypes&) = delete;
Pavithra Barithayaa7dbca52023-07-07 04:19:37 -0500128 GetPLDMTypes& operator=(GetPLDMTypes&&) = delete;
John Wang58a0e062019-11-08 15:38:15 +0800129
130 using CommandInterface::CommandInterface;
131
132 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500133 {
John Wang58a0e062019-11-08 15:38:15 +0800134 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
Pavithra Barithaya5c3f0d12025-01-30 14:05:49 +0530135 auto request = new (requestMsg.data()) pldm_msg;
Pavithra Barithayaac3c45a2020-03-05 02:28:26 -0600136 auto rc = encode_get_types_req(instanceId, request);
John Wang58a0e062019-11-08 15:38:15 +0800137 return {rc, requestMsg};
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500138 }
139
John Wang58a0e062019-11-08 15:38:15 +0800140 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500141 {
John Wang58a0e062019-11-08 15:38:15 +0800142 uint8_t cc = 0;
143 std::vector<bitfield8_t> types(8);
144 auto rc = decode_get_types_resp(responsePtr, payloadLength, &cc,
145 types.data());
rajeeranjan0cb341d2025-04-08 00:09:17 +0530146 if (rc != PLDM_SUCCESS)
John Wang58a0e062019-11-08 15:38:15 +0800147 {
148 std::cerr << "Response Message Error: "
Sampa Misraaa8ae722019-12-12 03:20:40 -0600149 << "rc=" << rc << ",cc=" << (int)cc << "\n";
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500150 return;
John Wang58a0e062019-11-08 15:38:15 +0800151 }
152
rajeeranjan0cb341d2025-04-08 00:09:17 +0530153 ordered_json data;
154 fillCompletionCode(cc, data, PLDM_BASE);
155 if (cc == PLDM_SUCCESS)
156 {
157 printPLDMTypes(types, data);
158 }
159
160 pldmtool::helper::DisplayInJson(data);
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500161 }
162
John Wang58a0e062019-11-08 15:38:15 +0800163 private:
rajeeranjan0cb341d2025-04-08 00:09:17 +0530164 void printPLDMTypes(std::vector<bitfield8_t>& types, ordered_json& data)
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500165 {
rajeeranjan0cb341d2025-04-08 00:09:17 +0530166 ordered_json jPldmTypes;
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500167 ordered_json jarray;
John Wang58a0e062019-11-08 15:38:15 +0800168 for (int i = 0; i < PLDM_MAX_TYPES; i++)
169 {
170 bitfield8_t b = types[i / 8];
171 if (b.byte & (1 << i % 8))
172 {
Patrick Williamsa6756622023-10-20 11:19:15 -0500173 auto it = std::find_if(
174 pldmTypes.begin(), pldmTypes.end(),
175 [i](const auto& typePair) { return typePair.second == i; });
John Wang58a0e062019-11-08 15:38:15 +0800176 if (it != pldmTypes.end())
177 {
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500178 jarray["PLDM Type"] = it->first;
179 jarray["PLDM Type Code"] = i;
rajeeranjan0cb341d2025-04-08 00:09:17 +0530180 jPldmTypes.emplace_back(jarray);
John Wang58a0e062019-11-08 15:38:15 +0800181 }
182 }
183 }
rajeeranjan0cb341d2025-04-08 00:09:17 +0530184 data["PLDMTypes"] = jPldmTypes;
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500185 }
John Wang58a0e062019-11-08 15:38:15 +0800186};
187
188class GetPLDMVersion : public CommandInterface
189{
190 public:
191 ~GetPLDMVersion() = default;
192 GetPLDMVersion() = delete;
193 GetPLDMVersion(const GetPLDMVersion&) = delete;
194 GetPLDMVersion(GetPLDMVersion&&) = default;
195 GetPLDMVersion& operator=(const GetPLDMVersion&) = delete;
Pavithra Barithayaa7dbca52023-07-07 04:19:37 -0500196 GetPLDMVersion& operator=(GetPLDMVersion&&) = delete;
John Wang58a0e062019-11-08 15:38:15 +0800197
198 explicit GetPLDMVersion(const char* type, const char* name, CLI::App* app) :
199 CommandInterface(type, name, app)
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500200 {
John Wang58a0e062019-11-08 15:38:15 +0800201 app->add_option("-t,--type", pldmType, "pldm supported type")
202 ->required()
203 ->transform(CLI::CheckedTransformer(pldmTypes, CLI::ignore_case));
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500204 }
John Wang58a0e062019-11-08 15:38:15 +0800205 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
206 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400207 std::vector<uint8_t> requestMsg(
208 sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES);
Pavithra Barithaya5c3f0d12025-01-30 14:05:49 +0530209 auto request = new (requestMsg.data()) pldm_msg;
John Wang58a0e062019-11-08 15:38:15 +0800210
Pavithra Barithayaac3c45a2020-03-05 02:28:26 -0600211 auto rc = encode_get_version_req(instanceId, 0, PLDM_GET_FIRSTPART,
212 pldmType, request);
John Wang58a0e062019-11-08 15:38:15 +0800213 return {rc, requestMsg};
214 }
215
216 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
217 {
218 uint8_t cc = 0, transferFlag = 0;
219 uint32_t transferHandle = 0;
220 ver32_t version;
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400221 auto rc =
222 decode_get_version_resp(responsePtr, payloadLength, &cc,
223 &transferHandle, &transferFlag, &version);
rajeeranjan0cb341d2025-04-08 00:09:17 +0530224 if (rc != PLDM_SUCCESS)
John Wang58a0e062019-11-08 15:38:15 +0800225 {
226 std::cerr << "Response Message Error: "
Sampa Misraaa8ae722019-12-12 03:20:40 -0600227 << "rc=" << rc << ",cc=" << (int)cc << "\n";
John Wang58a0e062019-11-08 15:38:15 +0800228 return;
229 }
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500230 ordered_json data;
rajeeranjan0cb341d2025-04-08 00:09:17 +0530231 fillCompletionCode(cc, data, PLDM_BASE);
232 if (cc == PLDM_SUCCESS)
John Wang58a0e062019-11-08 15:38:15 +0800233 {
rajeeranjan0cb341d2025-04-08 00:09:17 +0530234 char buffer[16] = {0};
235 ver2str(&version, buffer, sizeof(buffer));
236 auto it = std::find_if(pldmTypes.begin(), pldmTypes.end(),
237 [&](const auto& typePair) {
238 return typePair.second == pldmType;
239 });
240
241 if (it != pldmTypes.end())
242 {
243 data["Response"] = buffer;
244 }
John Wang58a0e062019-11-08 15:38:15 +0800245 }
rajeeranjan0cb341d2025-04-08 00:09:17 +0530246
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500247 pldmtool::helper::DisplayInJson(data);
John Wang58a0e062019-11-08 15:38:15 +0800248 }
249
250 private:
251 pldm_supported_types pldmType;
252};
253
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600254class GetTID : public CommandInterface
255{
256 public:
257 ~GetTID() = default;
258 GetTID() = delete;
259 GetTID(const GetTID&) = delete;
260 GetTID(GetTID&&) = default;
261 GetTID& operator=(const GetTID&) = delete;
Pavithra Barithayaa7dbca52023-07-07 04:19:37 -0500262 GetTID& operator=(GetTID&&) = delete;
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600263
264 using CommandInterface::CommandInterface;
265
266 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
267 {
268 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
Pavithra Barithaya5c3f0d12025-01-30 14:05:49 +0530269 auto request = new (requestMsg.data()) pldm_msg;
Pavithra Barithayaac3c45a2020-03-05 02:28:26 -0600270 auto rc = encode_get_tid_req(instanceId, request);
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600271 return {rc, requestMsg};
272 }
273
274 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
275 {
276 uint8_t cc = 0;
277 uint8_t tid = 0;
278 std::vector<bitfield8_t> types(8);
279 auto rc = decode_get_tid_resp(responsePtr, payloadLength, &cc, &tid);
280 if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
281 {
282 std::cerr << "Response Message Error: "
283 << "rc=" << rc << ",cc=" << (int)cc << "\n";
284 return;
285 }
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500286 ordered_json data;
287 data["Response"] = static_cast<uint32_t>(tid);
288 pldmtool::helper::DisplayInJson(data);
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600289 }
290};
291
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600292class GetPLDMCommands : public CommandInterface
293{
294 public:
295 ~GetPLDMCommands() = default;
296 GetPLDMCommands() = delete;
297 GetPLDMCommands(const GetPLDMCommands&) = delete;
298 GetPLDMCommands(GetPLDMCommands&&) = default;
299 GetPLDMCommands& operator=(const GetPLDMCommands&) = delete;
Pavithra Barithayaa7dbca52023-07-07 04:19:37 -0500300 GetPLDMCommands& operator=(GetPLDMCommands&&) = delete;
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600301
302 explicit GetPLDMCommands(const char* type, const char* name,
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400303 CLI::App* app) : CommandInterface(type, name, app)
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600304 {
305 app->add_option("-t,--type", pldmType, "pldm supported type")
306 ->required()
307 ->transform(CLI::CheckedTransformer(pldmTypes, CLI::ignore_case));
Thu Nguyen6c83d3b2024-06-22 13:06:12 +0000308 app->add_option(
309 "-d,--data", inputVersion,
310 "Set PLDM type version. Which is got from GetPLDMVersion\n"
311 "eg: version 1.1.0 then data will be `0xf1 0xf1 0xf0 0x00`");
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600312 }
313
314 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
315 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400316 std::vector<uint8_t> requestMsg(
317 sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_REQ_BYTES);
Pavithra Barithaya5c3f0d12025-01-30 14:05:49 +0530318 auto request = new (requestMsg.data()) pldm_msg;
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600319 ver32_t version{0xFF, 0xFF, 0xFF, 0xFF};
Thu Nguyen6c83d3b2024-06-22 13:06:12 +0000320 if (inputVersion.size() != 0)
321 {
322 if (inputVersion.size() != 4)
323 {
324 std::cerr << "Invalid version format. "
325 << "\n";
326 }
327 else
328 {
329 version.major = inputVersion[3];
330 version.minor = inputVersion[2];
331 version.update = inputVersion[1];
332 version.alpha = inputVersion[0];
333 }
334 }
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400335 auto rc =
336 encode_get_commands_req(instanceId, pldmType, version, request);
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600337 return {rc, requestMsg};
338 }
339
340 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
341 {
342 uint8_t cc = 0;
343 std::vector<bitfield8_t> cmdTypes(32);
344 auto rc = decode_get_commands_resp(responsePtr, payloadLength, &cc,
345 cmdTypes.data());
346 if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
347 {
348 std::cerr << "Response Message Error: "
349 << "rc=" << rc << ",cc=" << (int)cc << "\n";
350 return;
351 }
352 printPldmCommands(cmdTypes, pldmType);
353 }
354
355 private:
356 pldm_supported_types pldmType;
Thu Nguyen6c83d3b2024-06-22 13:06:12 +0000357 std::vector<uint8_t> inputVersion;
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600358
359 template <typename CommandMap>
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500360 void printCommand(CommandMap& commandMap, int i, ordered_json& jarray)
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600361 {
Patrick Williamsa6756622023-10-20 11:19:15 -0500362 auto it = std::find_if(
363 commandMap.begin(), commandMap.end(),
364 [i](const auto& typePair) { return typePair.second == i; });
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600365 if (it != commandMap.end())
366 {
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500367 jarray["PLDM Command Code"] = i;
368 jarray["PLDM Command"] = it->first;
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600369 }
370 }
371
372 void printPldmCommands(std::vector<bitfield8_t>& cmdTypes,
373 pldm_supported_types pldmType)
374 {
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500375 ordered_json output;
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600376 for (int i = 0; i < PLDM_MAX_CMDS_PER_TYPE; i++)
377 {
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500378 ordered_json cmdinfo;
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600379 bitfield8_t b = cmdTypes[i / 8];
380 if (b.byte & (1 << i % 8))
381 {
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600382 switch (pldmType)
383 {
384 case PLDM_BASE:
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500385 printCommand(pldmBaseCmds, i, cmdinfo);
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600386 break;
387 case PLDM_PLATFORM:
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500388 printCommand(pldmPlatformCmds, i, cmdinfo);
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600389 break;
390 case PLDM_BIOS:
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500391 printCommand(pldmBiosCmds, i, cmdinfo);
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600392 break;
393 case PLDM_FRU:
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500394 printCommand(pldmFruCmds, i, cmdinfo);
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600395 break;
Sridevi Ramesh45e52542020-04-03 07:54:18 -0500396 case PLDM_OEM:
Pavithra Barithaya6f4e9042020-04-20 23:33:46 -0500397#ifdef OEM_IBM
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500398 printCommand(pldmIBMHostCmds, i, cmdinfo);
399 printCommand(pldmIBMFileIOCmds, i, cmdinfo);
Pavithra Barithaya6f4e9042020-04-20 23:33:46 -0500400#endif
Sridevi Ramesh45e52542020-04-03 07:54:18 -0500401 break;
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600402 default:
403 break;
404 }
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500405 output.emplace_back(cmdinfo);
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600406 }
407 }
Sridevi Rameshca4a8152020-08-11 09:26:19 -0500408 pldmtool::helper::DisplayInJson(output);
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600409 }
410};
411
Roger G. Coscojuela1b894512025-03-10 16:00:21 +0100412class SetTID : public CommandInterface
413{
414 public:
415 ~SetTID() = default;
416 SetTID() = delete;
417 SetTID(const SetTID&) = delete;
418 SetTID(SetTID&&) = default;
419 SetTID& operator=(const SetTID&) = delete;
420 SetTID& operator=(SetTID&&) = delete;
421
422 explicit SetTID(const char* type, const char* name, CLI::App* app) :
423 CommandInterface(type, name, app)
424 {
425 app->add_option("-t,--tid", tid,
426 "The TID to be set.\n"
427 "Special value: 0x00, 0xFF = reserved. \n")
428 ->required();
429 }
430 std::pair<int, std::vector<uint8_t>> createRequestMsg() override
431 {
432 std::vector<uint8_t> requestMsg(
433 sizeof(pldm_msg_hdr) + PLDM_SET_TID_REQ_BYTES);
434 auto request = new (requestMsg.data()) pldm_msg;
435 auto rc = encode_set_tid_req(instanceId, tid, request);
436 if (rc != PLDM_SUCCESS)
437 {
438 std::cerr << "Failed to encode_set_tid_req, rc = " << rc
439 << std::endl;
440 }
441 return {rc, requestMsg};
442 }
443 void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
444 {
445 uint8_t completionCode = pldm_completion_codes::PLDM_SUCCESS;
446 if (payloadLength != PLDM_SET_TID_RESP_BYTES)
447 {
448 completionCode = pldm_completion_codes::PLDM_ERROR_INVALID_LENGTH;
449 }
450 else
451 {
452 completionCode = responsePtr->payload[0];
453 }
454 ordered_json data;
455 data["completionCode"] = completionCode;
456 pldmtool::helper::DisplayInJson(data);
457 }
458
459 private:
460 uint8_t tid;
461};
462
John Wang58a0e062019-11-08 15:38:15 +0800463void registerCommand(CLI::App& app)
464{
465 auto base = app.add_subcommand("base", "base type command");
466 base->require_subcommand(1);
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600467
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400468 auto getPLDMTypes =
469 base->add_subcommand("GetPLDMTypes", "get pldm supported types");
John Wang58a0e062019-11-08 15:38:15 +0800470 commands.push_back(
471 std::make_unique<GetPLDMTypes>("base", "GetPLDMTypes", getPLDMTypes));
472
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400473 auto getPLDMVersion =
474 base->add_subcommand("GetPLDMVersion", "get version of a certain type");
John Wang58a0e062019-11-08 15:38:15 +0800475 commands.push_back(std::make_unique<GetPLDMVersion>(
476 "base", "GetPLDMVersion", getPLDMVersion));
Sridevi Rameshadd56f02020-01-20 23:44:22 -0600477
478 auto getPLDMTID = base->add_subcommand("GetTID", "get Terminus ID (TID)");
479 commands.push_back(std::make_unique<GetTID>("base", "GetTID", getPLDMTID));
Sridevi Ramesh66294d32020-02-21 03:52:07 -0600480
481 auto getPLDMCommands = base->add_subcommand(
482 "GetPLDMCommands", "get supported commands of pldm type");
483 commands.push_back(std::make_unique<GetPLDMCommands>(
484 "base", "GetPLDMCommands", getPLDMCommands));
Roger G. Coscojuela1b894512025-03-10 16:00:21 +0100485
486 auto setTID = base->add_subcommand(
487 "SetTID", "set the Terminus ID (TID) for a PLDM Terminus.");
488 commands.push_back(std::make_unique<SetTID>("base", "SetTID", setTID));
Lakshminarayana R. Kammath58229b22019-08-09 06:30:04 -0500489}
John Wang58a0e062019-11-08 15:38:15 +0800490
491} // namespace base
492} // namespace pldmtool