1f7f5da97SDeepak Kodihalli #include "pldm_base_cmd.hpp"
2f7f5da97SDeepak Kodihalli
3f7f5da97SDeepak Kodihalli #include "pldm_cmd_helper.hpp"
4f7f5da97SDeepak Kodihalli
5c453e164SGeorge Liu #include <libpldm/utils.h>
6c453e164SGeorge Liu
7f7f5da97SDeepak Kodihalli #ifdef OEM_IBM
821f128d8SAndrew Jeffery #include <libpldm/oem/ibm/file_io.h>
921f128d8SAndrew Jeffery #include <libpldm/oem/ibm/host.h>
10f7f5da97SDeepak Kodihalli #endif
11f7f5da97SDeepak Kodihalli
12ca4a815bSSridevi Ramesh #include <string>
13ca4a815bSSridevi Ramesh
14f7f5da97SDeepak Kodihalli namespace pldmtool
15f7f5da97SDeepak Kodihalli {
16f7f5da97SDeepak Kodihalli
17f7f5da97SDeepak Kodihalli namespace base
18f7f5da97SDeepak Kodihalli {
19f7f5da97SDeepak Kodihalli
20f7f5da97SDeepak Kodihalli namespace
21f7f5da97SDeepak Kodihalli {
22f7f5da97SDeepak Kodihalli
23f7f5da97SDeepak Kodihalli using namespace pldmtool::helper;
24f7f5da97SDeepak Kodihalli
25f7f5da97SDeepak Kodihalli std::vector<std::unique_ptr<CommandInterface>> commands;
26f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_supported_types> pldmTypes{
27f7f5da97SDeepak Kodihalli {"base", PLDM_BASE}, {"platform", PLDM_PLATFORM},
28f7f5da97SDeepak Kodihalli {"bios", PLDM_BIOS}, {"fru", PLDM_FRU},
29f7f5da97SDeepak Kodihalli #ifdef OEM_IBM
30f7f5da97SDeepak Kodihalli {"oem-ibm", PLDM_OEM},
31f7f5da97SDeepak Kodihalli #endif
32f7f5da97SDeepak Kodihalli };
33f7f5da97SDeepak Kodihalli
34f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_supported_commands> pldmBaseCmds{
35b8e3b0d8SThu Nguyen {"SetTID", PLDM_SET_TID},
36f7f5da97SDeepak Kodihalli {"GetTID", PLDM_GET_TID},
37f7f5da97SDeepak Kodihalli {"GetPLDMVersion", PLDM_GET_PLDM_VERSION},
38f7f5da97SDeepak Kodihalli {"GetPLDMTypes", PLDM_GET_PLDM_TYPES},
39b8e3b0d8SThu Nguyen {"GetPLDMCommands", PLDM_GET_PLDM_COMMANDS},
40b8e3b0d8SThu Nguyen {"SelectPLDMVersion", PLDM_SELECT_PLDM_VERSION},
41b8e3b0d8SThu Nguyen {"NegotiateTransferParameters", PLDM_NEGOTIATE_TRANSFER_PARAMETERS},
42b8e3b0d8SThu Nguyen {"MultipartSend", PLDM_MULTIPART_SEND},
43b8e3b0d8SThu Nguyen {"MultipartReceive", PLDM_MULTIPART_RECEIVE},
44b8e3b0d8SThu Nguyen {"GetMultipartTransferSupport", PLDM_GET_MULTIPART_TRANSFER_SUPPORT}};
45f7f5da97SDeepak Kodihalli
46f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_bios_commands> pldmBiosCmds{
47f7f5da97SDeepak Kodihalli {"GetBIOSTable", PLDM_GET_BIOS_TABLE},
488fb11c97SSridevi Ramesh {"SetBIOSTable", PLDM_SET_BIOS_TABLE},
49f7f5da97SDeepak Kodihalli {"SetBIOSAttributeCurrentValue", PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE},
50f7f5da97SDeepak Kodihalli {"GetBIOSAttributeCurrentValueByHandle",
51f7f5da97SDeepak Kodihalli PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE},
52f7f5da97SDeepak Kodihalli {"GetDateTime", PLDM_GET_DATE_TIME},
53f7f5da97SDeepak Kodihalli {"SetDateTime", PLDM_SET_DATE_TIME}};
54f7f5da97SDeepak Kodihalli
55f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_platform_commands> pldmPlatformCmds{
56f1c0e7caSThu Nguyen {"GetTerminusUID", PLDM_GET_TERMINUS_UID},
57f1c0e7caSThu Nguyen {"SetEventReceiver", PLDM_SET_EVENT_RECEIVER},
58f1c0e7caSThu Nguyen {"GetEventReceiver", PLDM_GET_EVENT_RECEIVER},
59f1c0e7caSThu Nguyen {"PlatformEventMessage", PLDM_PLATFORM_EVENT_MESSAGE},
60f1c0e7caSThu Nguyen {"PollForPlatformEventMessage", PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE},
61f1c0e7caSThu Nguyen {"EventMessageSupported", PLDM_EVENT_MESSAGE_SUPPORTED},
62f1c0e7caSThu Nguyen {"EventMessageBufferSize", PLDM_EVENT_MESSAGE_BUFFER_SIZE},
63f1c0e7caSThu Nguyen {"SetNumericSensorEnable", PLDM_SET_NUMERIC_SENSOR_ENABLE},
64f1c0e7caSThu Nguyen {"GetSensorReading", PLDM_GET_SENSOR_READING},
65f1c0e7caSThu Nguyen {"GetSensorThresholds", PLDM_GET_SENSOR_THRESHOLDS},
66f1c0e7caSThu Nguyen {"SetSensorThresholds", PLDM_SET_SENSOR_THRESHOLDS},
67f1c0e7caSThu Nguyen {"RestoreSensorThresholds", PLDM_RESTORE_SENSOR_THRESHOLDS},
68f1c0e7caSThu Nguyen {"GetSensorHysteresis", PLDM_GET_SENSOR_HYSTERESIS},
69f1c0e7caSThu Nguyen {"SetSensorHysteresis", PLDM_SET_SENSOR_HYSTERESIS},
70f1c0e7caSThu Nguyen {"InitNumericSensor", PLDM_INIT_NUMERIC_SENSOR},
71f1c0e7caSThu Nguyen {"SetStateSensorEnables", PLDM_SET_STATE_SENSOR_ENABLES},
72f1c0e7caSThu Nguyen {"GetStateSensorReadings", PLDM_GET_STATE_SENSOR_READINGS},
73f1c0e7caSThu Nguyen {"InitStateSensor", PLDM_INIT_STATE_SENSOR},
74f1c0e7caSThu Nguyen {"SetNumericEffecterEnable", PLDM_SET_NUMERIC_EFFECTER_ENABLE},
75f7f5da97SDeepak Kodihalli {"SetNumericEffecterValue", PLDM_SET_NUMERIC_EFFECTER_VALUE},
76f1c0e7caSThu Nguyen {"GetNumericEffecterValue", PLDM_GET_NUMERIC_EFFECTER_VALUE},
77f1c0e7caSThu Nguyen {"SetStateEffecterEnables", PLDM_SET_STATE_EFFECTER_ENABLES},
78f7f5da97SDeepak Kodihalli {"SetStateEffecterStates", PLDM_SET_STATE_EFFECTER_STATES},
798570fcc6STal Yacobi {"GetStateEffecterStates", PLDM_GET_STATE_EFFECTER_STATES},
80f1c0e7caSThu Nguyen {"GetPLDMEventLogInfo", PLDM_GET_PLDM_EVENT_LOG_INFO},
81f1c0e7caSThu Nguyen {"EnablePLDMEventLogging", PLDM_ENABLE_PLDM_EVENT_LOGGING},
82f1c0e7caSThu Nguyen {"ClearPLDMEventLog", PLDM_CLEAR_PLDM_EVENT_LOG},
83f1c0e7caSThu Nguyen {"GetPLDMEventLogTimestamp", PLDM_GET_PLDM_EVENT_LOG_TIMESTAMP},
84f1c0e7caSThu Nguyen {"SetPLDMEventLogTimestamp", PLDM_SET_PLDM_EVENT_LOG_TIMESTAMP},
85f1c0e7caSThu Nguyen {"ReadPLDMEventLog", PLDM_READ_PLDM_EVENT_LOG},
86f1c0e7caSThu Nguyen {"GetPLDMEventLogPolicyInfo", PLDM_GET_PLDM_EVENT_LOG_POLICY_INFO},
87f1c0e7caSThu Nguyen {"SetPLDMEventLogPolicy", PLDM_SET_PLDM_EVENT_LOG_POLICY},
88f1c0e7caSThu Nguyen {"FindPLDMEventLogEntry", PLDM_FIND_PLDM_EVENT_LOG_ENTRY},
89f1c0e7caSThu Nguyen {"GetPDRRepositoryInfo", PLDM_GET_PDR_REPOSITORY_INFO},
908fb11c97SSridevi Ramesh {"GetPDR", PLDM_GET_PDR},
91f1c0e7caSThu Nguyen {"FindPDR", PLDM_FIND_PDR},
92f1c0e7caSThu Nguyen {"RunInitAgent", PLDM_RUN_INIT_AGENT},
93f1c0e7caSThu Nguyen {"GetPDRRepositorySignature", PLDM_GET_PDR_REPOSITORY_SIGNATURE}};
94f7f5da97SDeepak Kodihalli
95f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_fru_commands> pldmFruCmds{
96f7f5da97SDeepak Kodihalli {"GetFRURecordTableMetadata", PLDM_GET_FRU_RECORD_TABLE_METADATA},
975bdde3a4SJohn Wang {"GetFRURecordTable", PLDM_GET_FRU_RECORD_TABLE},
985bdde3a4SJohn Wang {"GetFRURecordByOption", PLDM_GET_FRU_RECORD_BY_OPTION}};
99f7f5da97SDeepak Kodihalli
100f7f5da97SDeepak Kodihalli #ifdef OEM_IBM
101f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_host_commands> pldmIBMHostCmds{
102f7f5da97SDeepak Kodihalli {"GetAlertStatus", PLDM_HOST_GET_ALERT_STATUS}};
103f7f5da97SDeepak Kodihalli
104f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_fileio_commands> pldmIBMFileIOCmds{
105f7f5da97SDeepak Kodihalli {"GetFileTable", PLDM_GET_FILE_TABLE},
106f7f5da97SDeepak Kodihalli {"ReadFile", PLDM_READ_FILE},
107f7f5da97SDeepak Kodihalli {"WriteFile", PLDM_WRITE_FILE},
108f7f5da97SDeepak Kodihalli {"ReadFileInToMemory", PLDM_READ_FILE_INTO_MEMORY},
109f7f5da97SDeepak Kodihalli {"WriteFileFromMemory", PLDM_WRITE_FILE_FROM_MEMORY},
110f7f5da97SDeepak Kodihalli {"ReadFileByTypeIntoMemory", PLDM_READ_FILE_BY_TYPE_INTO_MEMORY},
111f7f5da97SDeepak Kodihalli {"WriteFileByTypeFromMemory", PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY},
112f7f5da97SDeepak Kodihalli {"NewFileAvailable", PLDM_NEW_FILE_AVAILABLE},
113f7f5da97SDeepak Kodihalli {"ReadFileByType", PLDM_READ_FILE_BY_TYPE},
114f7f5da97SDeepak Kodihalli {"WriteFileByType", PLDM_WRITE_FILE_BY_TYPE},
115f7f5da97SDeepak Kodihalli {"FileAck", PLDM_FILE_ACK}};
116f7f5da97SDeepak Kodihalli #endif
117f7f5da97SDeepak Kodihalli
118f7f5da97SDeepak Kodihalli } // namespace
119f7f5da97SDeepak Kodihalli
120f7f5da97SDeepak Kodihalli class GetPLDMTypes : public CommandInterface
121f7f5da97SDeepak Kodihalli {
122f7f5da97SDeepak Kodihalli public:
123f7f5da97SDeepak Kodihalli ~GetPLDMTypes() = default;
124f7f5da97SDeepak Kodihalli GetPLDMTypes() = delete;
125f7f5da97SDeepak Kodihalli GetPLDMTypes(const GetPLDMTypes&) = delete;
126f7f5da97SDeepak Kodihalli GetPLDMTypes(GetPLDMTypes&&) = default;
127f7f5da97SDeepak Kodihalli GetPLDMTypes& operator=(const GetPLDMTypes&) = delete;
128a7dbca53SPavithra Barithaya GetPLDMTypes& operator=(GetPLDMTypes&&) = delete;
129f7f5da97SDeepak Kodihalli
130f7f5da97SDeepak Kodihalli using CommandInterface::CommandInterface;
131f7f5da97SDeepak Kodihalli
createRequestMsg()132f7f5da97SDeepak Kodihalli std::pair<int, std::vector<uint8_t>> createRequestMsg() override
133f7f5da97SDeepak Kodihalli {
134f7f5da97SDeepak Kodihalli std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
1355c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
136f7f5da97SDeepak Kodihalli auto rc = encode_get_types_req(instanceId, request);
137f7f5da97SDeepak Kodihalli return {rc, requestMsg};
138f7f5da97SDeepak Kodihalli }
139f7f5da97SDeepak Kodihalli
parseResponseMsg(pldm_msg * responsePtr,size_t payloadLength)140f7f5da97SDeepak Kodihalli void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
141f7f5da97SDeepak Kodihalli {
142f7f5da97SDeepak Kodihalli uint8_t cc = 0;
143f7f5da97SDeepak Kodihalli std::vector<bitfield8_t> types(8);
144f7f5da97SDeepak Kodihalli auto rc = decode_get_types_resp(responsePtr, payloadLength, &cc,
145f7f5da97SDeepak Kodihalli types.data());
146f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
147f7f5da97SDeepak Kodihalli {
148f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
149f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)cc << "\n";
150f7f5da97SDeepak Kodihalli return;
151f7f5da97SDeepak Kodihalli }
152f7f5da97SDeepak Kodihalli
153f7f5da97SDeepak Kodihalli printPldmTypes(types);
154f7f5da97SDeepak Kodihalli }
155f7f5da97SDeepak Kodihalli
156f7f5da97SDeepak Kodihalli private:
printPldmTypes(std::vector<bitfield8_t> & types)157f7f5da97SDeepak Kodihalli void printPldmTypes(std::vector<bitfield8_t>& types)
158f7f5da97SDeepak Kodihalli {
159ca4a815bSSridevi Ramesh ordered_json data;
160ca4a815bSSridevi Ramesh ordered_json jarray;
161f7f5da97SDeepak Kodihalli for (int i = 0; i < PLDM_MAX_TYPES; i++)
162f7f5da97SDeepak Kodihalli {
163f7f5da97SDeepak Kodihalli bitfield8_t b = types[i / 8];
164f7f5da97SDeepak Kodihalli if (b.byte & (1 << i % 8))
165f7f5da97SDeepak Kodihalli {
166a675662cSPatrick Williams auto it = std::find_if(
167a675662cSPatrick Williams pldmTypes.begin(), pldmTypes.end(),
168a675662cSPatrick Williams [i](const auto& typePair) { return typePair.second == i; });
169f7f5da97SDeepak Kodihalli if (it != pldmTypes.end())
170f7f5da97SDeepak Kodihalli {
171ca4a815bSSridevi Ramesh jarray["PLDM Type"] = it->first;
172ca4a815bSSridevi Ramesh jarray["PLDM Type Code"] = i;
173ca4a815bSSridevi Ramesh data.emplace_back(jarray);
174f7f5da97SDeepak Kodihalli }
175f7f5da97SDeepak Kodihalli }
176f7f5da97SDeepak Kodihalli }
177ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(data);
178f7f5da97SDeepak Kodihalli }
179f7f5da97SDeepak Kodihalli };
180f7f5da97SDeepak Kodihalli
181f7f5da97SDeepak Kodihalli class GetPLDMVersion : public CommandInterface
182f7f5da97SDeepak Kodihalli {
183f7f5da97SDeepak Kodihalli public:
184f7f5da97SDeepak Kodihalli ~GetPLDMVersion() = default;
185f7f5da97SDeepak Kodihalli GetPLDMVersion() = delete;
186f7f5da97SDeepak Kodihalli GetPLDMVersion(const GetPLDMVersion&) = delete;
187f7f5da97SDeepak Kodihalli GetPLDMVersion(GetPLDMVersion&&) = default;
188f7f5da97SDeepak Kodihalli GetPLDMVersion& operator=(const GetPLDMVersion&) = delete;
189a7dbca53SPavithra Barithaya GetPLDMVersion& operator=(GetPLDMVersion&&) = delete;
190f7f5da97SDeepak Kodihalli
GetPLDMVersion(const char * type,const char * name,CLI::App * app)191f7f5da97SDeepak Kodihalli explicit GetPLDMVersion(const char* type, const char* name, CLI::App* app) :
192f7f5da97SDeepak Kodihalli CommandInterface(type, name, app)
193f7f5da97SDeepak Kodihalli {
194f7f5da97SDeepak Kodihalli app->add_option("-t,--type", pldmType, "pldm supported type")
195f7f5da97SDeepak Kodihalli ->required()
196f7f5da97SDeepak Kodihalli ->transform(CLI::CheckedTransformer(pldmTypes, CLI::ignore_case));
197f7f5da97SDeepak Kodihalli }
createRequestMsg()198f7f5da97SDeepak Kodihalli std::pair<int, std::vector<uint8_t>> createRequestMsg() override
199f7f5da97SDeepak Kodihalli {
20016c2a0a0SPatrick Williams std::vector<uint8_t> requestMsg(
20116c2a0a0SPatrick Williams sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES);
2025c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
203f7f5da97SDeepak Kodihalli
204f7f5da97SDeepak Kodihalli auto rc = encode_get_version_req(instanceId, 0, PLDM_GET_FIRSTPART,
205f7f5da97SDeepak Kodihalli pldmType, request);
206f7f5da97SDeepak Kodihalli return {rc, requestMsg};
207f7f5da97SDeepak Kodihalli }
208f7f5da97SDeepak Kodihalli
parseResponseMsg(pldm_msg * responsePtr,size_t payloadLength)209f7f5da97SDeepak Kodihalli void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
210f7f5da97SDeepak Kodihalli {
211f7f5da97SDeepak Kodihalli uint8_t cc = 0, transferFlag = 0;
212f7f5da97SDeepak Kodihalli uint32_t transferHandle = 0;
213f7f5da97SDeepak Kodihalli ver32_t version;
21416c2a0a0SPatrick Williams auto rc =
21516c2a0a0SPatrick Williams decode_get_version_resp(responsePtr, payloadLength, &cc,
21616c2a0a0SPatrick Williams &transferHandle, &transferFlag, &version);
217f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
218f7f5da97SDeepak Kodihalli {
219f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
220f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)cc << "\n";
221f7f5da97SDeepak Kodihalli return;
222f7f5da97SDeepak Kodihalli }
223f7f5da97SDeepak Kodihalli char buffer[16] = {0};
224f7f5da97SDeepak Kodihalli ver2str(&version, buffer, sizeof(buffer));
225ca4a815bSSridevi Ramesh ordered_json data;
226a675662cSPatrick Williams auto it = std::find_if(
227a675662cSPatrick Williams pldmTypes.begin(), pldmTypes.end(),
228a675662cSPatrick Williams [&](const auto& typePair) { return typePair.second == pldmType; });
229f7f5da97SDeepak Kodihalli
230f7f5da97SDeepak Kodihalli if (it != pldmTypes.end())
231f7f5da97SDeepak Kodihalli {
232ca4a815bSSridevi Ramesh data["Response"] = buffer;
233f7f5da97SDeepak Kodihalli }
234ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(data);
235f7f5da97SDeepak Kodihalli }
236f7f5da97SDeepak Kodihalli
237f7f5da97SDeepak Kodihalli private:
238f7f5da97SDeepak Kodihalli pldm_supported_types pldmType;
239f7f5da97SDeepak Kodihalli };
240f7f5da97SDeepak Kodihalli
241f7f5da97SDeepak Kodihalli class GetTID : public CommandInterface
242f7f5da97SDeepak Kodihalli {
243f7f5da97SDeepak Kodihalli public:
244f7f5da97SDeepak Kodihalli ~GetTID() = default;
245f7f5da97SDeepak Kodihalli GetTID() = delete;
246f7f5da97SDeepak Kodihalli GetTID(const GetTID&) = delete;
247f7f5da97SDeepak Kodihalli GetTID(GetTID&&) = default;
248f7f5da97SDeepak Kodihalli GetTID& operator=(const GetTID&) = delete;
249a7dbca53SPavithra Barithaya GetTID& operator=(GetTID&&) = delete;
250f7f5da97SDeepak Kodihalli
251f7f5da97SDeepak Kodihalli using CommandInterface::CommandInterface;
252f7f5da97SDeepak Kodihalli
createRequestMsg()253f7f5da97SDeepak Kodihalli std::pair<int, std::vector<uint8_t>> createRequestMsg() override
254f7f5da97SDeepak Kodihalli {
255f7f5da97SDeepak Kodihalli std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
2565c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
257f7f5da97SDeepak Kodihalli auto rc = encode_get_tid_req(instanceId, request);
258f7f5da97SDeepak Kodihalli return {rc, requestMsg};
259f7f5da97SDeepak Kodihalli }
260f7f5da97SDeepak Kodihalli
parseResponseMsg(pldm_msg * responsePtr,size_t payloadLength)261f7f5da97SDeepak Kodihalli void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
262f7f5da97SDeepak Kodihalli {
263f7f5da97SDeepak Kodihalli uint8_t cc = 0;
264f7f5da97SDeepak Kodihalli uint8_t tid = 0;
265f7f5da97SDeepak Kodihalli std::vector<bitfield8_t> types(8);
266f7f5da97SDeepak Kodihalli auto rc = decode_get_tid_resp(responsePtr, payloadLength, &cc, &tid);
267f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
268f7f5da97SDeepak Kodihalli {
269f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
270f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)cc << "\n";
271f7f5da97SDeepak Kodihalli return;
272f7f5da97SDeepak Kodihalli }
273ca4a815bSSridevi Ramesh ordered_json data;
274ca4a815bSSridevi Ramesh data["Response"] = static_cast<uint32_t>(tid);
275ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(data);
276f7f5da97SDeepak Kodihalli }
277f7f5da97SDeepak Kodihalli };
278f7f5da97SDeepak Kodihalli
279f7f5da97SDeepak Kodihalli class GetPLDMCommands : public CommandInterface
280f7f5da97SDeepak Kodihalli {
281f7f5da97SDeepak Kodihalli public:
282f7f5da97SDeepak Kodihalli ~GetPLDMCommands() = default;
283f7f5da97SDeepak Kodihalli GetPLDMCommands() = delete;
284f7f5da97SDeepak Kodihalli GetPLDMCommands(const GetPLDMCommands&) = delete;
285f7f5da97SDeepak Kodihalli GetPLDMCommands(GetPLDMCommands&&) = default;
286f7f5da97SDeepak Kodihalli GetPLDMCommands& operator=(const GetPLDMCommands&) = delete;
287a7dbca53SPavithra Barithaya GetPLDMCommands& operator=(GetPLDMCommands&&) = delete;
288f7f5da97SDeepak Kodihalli
GetPLDMCommands(const char * type,const char * name,CLI::App * app)289f7f5da97SDeepak Kodihalli explicit GetPLDMCommands(const char* type, const char* name,
29016c2a0a0SPatrick Williams CLI::App* app) : CommandInterface(type, name, app)
291f7f5da97SDeepak Kodihalli {
292f7f5da97SDeepak Kodihalli app->add_option("-t,--type", pldmType, "pldm supported type")
293f7f5da97SDeepak Kodihalli ->required()
294f7f5da97SDeepak Kodihalli ->transform(CLI::CheckedTransformer(pldmTypes, CLI::ignore_case));
2956c83d3bcSThu Nguyen app->add_option(
2966c83d3bcSThu Nguyen "-d,--data", inputVersion,
2976c83d3bcSThu Nguyen "Set PLDM type version. Which is got from GetPLDMVersion\n"
2986c83d3bcSThu Nguyen "eg: version 1.1.0 then data will be `0xf1 0xf1 0xf0 0x00`");
299f7f5da97SDeepak Kodihalli }
300f7f5da97SDeepak Kodihalli
createRequestMsg()301f7f5da97SDeepak Kodihalli std::pair<int, std::vector<uint8_t>> createRequestMsg() override
302f7f5da97SDeepak Kodihalli {
30316c2a0a0SPatrick Williams std::vector<uint8_t> requestMsg(
30416c2a0a0SPatrick Williams sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_REQ_BYTES);
3055c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
306f7f5da97SDeepak Kodihalli ver32_t version{0xFF, 0xFF, 0xFF, 0xFF};
3076c83d3bcSThu Nguyen if (inputVersion.size() != 0)
3086c83d3bcSThu Nguyen {
3096c83d3bcSThu Nguyen if (inputVersion.size() != 4)
3106c83d3bcSThu Nguyen {
3116c83d3bcSThu Nguyen std::cerr << "Invalid version format. "
3126c83d3bcSThu Nguyen << "\n";
3136c83d3bcSThu Nguyen }
3146c83d3bcSThu Nguyen else
3156c83d3bcSThu Nguyen {
3166c83d3bcSThu Nguyen version.major = inputVersion[3];
3176c83d3bcSThu Nguyen version.minor = inputVersion[2];
3186c83d3bcSThu Nguyen version.update = inputVersion[1];
3196c83d3bcSThu Nguyen version.alpha = inputVersion[0];
3206c83d3bcSThu Nguyen }
3216c83d3bcSThu Nguyen }
32216c2a0a0SPatrick Williams auto rc =
32316c2a0a0SPatrick Williams encode_get_commands_req(instanceId, pldmType, version, request);
324f7f5da97SDeepak Kodihalli return {rc, requestMsg};
325f7f5da97SDeepak Kodihalli }
326f7f5da97SDeepak Kodihalli
parseResponseMsg(pldm_msg * responsePtr,size_t payloadLength)327f7f5da97SDeepak Kodihalli void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
328f7f5da97SDeepak Kodihalli {
329f7f5da97SDeepak Kodihalli uint8_t cc = 0;
330f7f5da97SDeepak Kodihalli std::vector<bitfield8_t> cmdTypes(32);
331f7f5da97SDeepak Kodihalli auto rc = decode_get_commands_resp(responsePtr, payloadLength, &cc,
332f7f5da97SDeepak Kodihalli cmdTypes.data());
333f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
334f7f5da97SDeepak Kodihalli {
335f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
336f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)cc << "\n";
337f7f5da97SDeepak Kodihalli return;
338f7f5da97SDeepak Kodihalli }
339f7f5da97SDeepak Kodihalli printPldmCommands(cmdTypes, pldmType);
340f7f5da97SDeepak Kodihalli }
341f7f5da97SDeepak Kodihalli
342f7f5da97SDeepak Kodihalli private:
343f7f5da97SDeepak Kodihalli pldm_supported_types pldmType;
3446c83d3bcSThu Nguyen std::vector<uint8_t> inputVersion;
345f7f5da97SDeepak Kodihalli
346f7f5da97SDeepak Kodihalli template <typename CommandMap>
printCommand(CommandMap & commandMap,int i,ordered_json & jarray)347ca4a815bSSridevi Ramesh void printCommand(CommandMap& commandMap, int i, ordered_json& jarray)
348f7f5da97SDeepak Kodihalli {
349a675662cSPatrick Williams auto it = std::find_if(
350a675662cSPatrick Williams commandMap.begin(), commandMap.end(),
351a675662cSPatrick Williams [i](const auto& typePair) { return typePair.second == i; });
352f7f5da97SDeepak Kodihalli if (it != commandMap.end())
353f7f5da97SDeepak Kodihalli {
354ca4a815bSSridevi Ramesh jarray["PLDM Command Code"] = i;
355ca4a815bSSridevi Ramesh jarray["PLDM Command"] = it->first;
356f7f5da97SDeepak Kodihalli }
357f7f5da97SDeepak Kodihalli }
358f7f5da97SDeepak Kodihalli
printPldmCommands(std::vector<bitfield8_t> & cmdTypes,pldm_supported_types pldmType)359f7f5da97SDeepak Kodihalli void printPldmCommands(std::vector<bitfield8_t>& cmdTypes,
360f7f5da97SDeepak Kodihalli pldm_supported_types pldmType)
361f7f5da97SDeepak Kodihalli {
362ca4a815bSSridevi Ramesh ordered_json output;
363f7f5da97SDeepak Kodihalli for (int i = 0; i < PLDM_MAX_CMDS_PER_TYPE; i++)
364f7f5da97SDeepak Kodihalli {
365ca4a815bSSridevi Ramesh ordered_json cmdinfo;
366f7f5da97SDeepak Kodihalli bitfield8_t b = cmdTypes[i / 8];
367f7f5da97SDeepak Kodihalli if (b.byte & (1 << i % 8))
368f7f5da97SDeepak Kodihalli {
369f7f5da97SDeepak Kodihalli switch (pldmType)
370f7f5da97SDeepak Kodihalli {
371f7f5da97SDeepak Kodihalli case PLDM_BASE:
372ca4a815bSSridevi Ramesh printCommand(pldmBaseCmds, i, cmdinfo);
373f7f5da97SDeepak Kodihalli break;
374f7f5da97SDeepak Kodihalli case PLDM_PLATFORM:
375ca4a815bSSridevi Ramesh printCommand(pldmPlatformCmds, i, cmdinfo);
376f7f5da97SDeepak Kodihalli break;
377f7f5da97SDeepak Kodihalli case PLDM_BIOS:
378ca4a815bSSridevi Ramesh printCommand(pldmBiosCmds, i, cmdinfo);
379f7f5da97SDeepak Kodihalli break;
380f7f5da97SDeepak Kodihalli case PLDM_FRU:
381ca4a815bSSridevi Ramesh printCommand(pldmFruCmds, i, cmdinfo);
382f7f5da97SDeepak Kodihalli break;
383f7f5da97SDeepak Kodihalli case PLDM_OEM:
384f7f5da97SDeepak Kodihalli #ifdef OEM_IBM
385ca4a815bSSridevi Ramesh printCommand(pldmIBMHostCmds, i, cmdinfo);
386ca4a815bSSridevi Ramesh printCommand(pldmIBMFileIOCmds, i, cmdinfo);
387f7f5da97SDeepak Kodihalli #endif
388f7f5da97SDeepak Kodihalli break;
389f7f5da97SDeepak Kodihalli default:
390f7f5da97SDeepak Kodihalli break;
391f7f5da97SDeepak Kodihalli }
392ca4a815bSSridevi Ramesh output.emplace_back(cmdinfo);
393f7f5da97SDeepak Kodihalli }
394f7f5da97SDeepak Kodihalli }
395ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(output);
396f7f5da97SDeepak Kodihalli }
397f7f5da97SDeepak Kodihalli };
398f7f5da97SDeepak Kodihalli
399*1b89451bSRoger G. Coscojuela class SetTID : public CommandInterface
400*1b89451bSRoger G. Coscojuela {
401*1b89451bSRoger G. Coscojuela public:
402*1b89451bSRoger G. Coscojuela ~SetTID() = default;
403*1b89451bSRoger G. Coscojuela SetTID() = delete;
404*1b89451bSRoger G. Coscojuela SetTID(const SetTID&) = delete;
405*1b89451bSRoger G. Coscojuela SetTID(SetTID&&) = default;
406*1b89451bSRoger G. Coscojuela SetTID& operator=(const SetTID&) = delete;
407*1b89451bSRoger G. Coscojuela SetTID& operator=(SetTID&&) = delete;
408*1b89451bSRoger G. Coscojuela
SetTID(const char * type,const char * name,CLI::App * app)409*1b89451bSRoger G. Coscojuela explicit SetTID(const char* type, const char* name, CLI::App* app) :
410*1b89451bSRoger G. Coscojuela CommandInterface(type, name, app)
411*1b89451bSRoger G. Coscojuela {
412*1b89451bSRoger G. Coscojuela app->add_option("-t,--tid", tid,
413*1b89451bSRoger G. Coscojuela "The TID to be set.\n"
414*1b89451bSRoger G. Coscojuela "Special value: 0x00, 0xFF = reserved. \n")
415*1b89451bSRoger G. Coscojuela ->required();
416*1b89451bSRoger G. Coscojuela }
createRequestMsg()417*1b89451bSRoger G. Coscojuela std::pair<int, std::vector<uint8_t>> createRequestMsg() override
418*1b89451bSRoger G. Coscojuela {
419*1b89451bSRoger G. Coscojuela std::vector<uint8_t> requestMsg(
420*1b89451bSRoger G. Coscojuela sizeof(pldm_msg_hdr) + PLDM_SET_TID_REQ_BYTES);
421*1b89451bSRoger G. Coscojuela auto request = new (requestMsg.data()) pldm_msg;
422*1b89451bSRoger G. Coscojuela auto rc = encode_set_tid_req(instanceId, tid, request);
423*1b89451bSRoger G. Coscojuela if (rc != PLDM_SUCCESS)
424*1b89451bSRoger G. Coscojuela {
425*1b89451bSRoger G. Coscojuela std::cerr << "Failed to encode_set_tid_req, rc = " << rc
426*1b89451bSRoger G. Coscojuela << std::endl;
427*1b89451bSRoger G. Coscojuela }
428*1b89451bSRoger G. Coscojuela return {rc, requestMsg};
429*1b89451bSRoger G. Coscojuela }
parseResponseMsg(pldm_msg * responsePtr,size_t payloadLength)430*1b89451bSRoger G. Coscojuela void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
431*1b89451bSRoger G. Coscojuela {
432*1b89451bSRoger G. Coscojuela uint8_t completionCode = pldm_completion_codes::PLDM_SUCCESS;
433*1b89451bSRoger G. Coscojuela if (payloadLength != PLDM_SET_TID_RESP_BYTES)
434*1b89451bSRoger G. Coscojuela {
435*1b89451bSRoger G. Coscojuela completionCode = pldm_completion_codes::PLDM_ERROR_INVALID_LENGTH;
436*1b89451bSRoger G. Coscojuela }
437*1b89451bSRoger G. Coscojuela else
438*1b89451bSRoger G. Coscojuela {
439*1b89451bSRoger G. Coscojuela completionCode = responsePtr->payload[0];
440*1b89451bSRoger G. Coscojuela }
441*1b89451bSRoger G. Coscojuela ordered_json data;
442*1b89451bSRoger G. Coscojuela data["completionCode"] = completionCode;
443*1b89451bSRoger G. Coscojuela pldmtool::helper::DisplayInJson(data);
444*1b89451bSRoger G. Coscojuela }
445*1b89451bSRoger G. Coscojuela
446*1b89451bSRoger G. Coscojuela private:
447*1b89451bSRoger G. Coscojuela uint8_t tid;
448*1b89451bSRoger G. Coscojuela };
449*1b89451bSRoger G. Coscojuela
registerCommand(CLI::App & app)450f7f5da97SDeepak Kodihalli void registerCommand(CLI::App& app)
451f7f5da97SDeepak Kodihalli {
452f7f5da97SDeepak Kodihalli auto base = app.add_subcommand("base", "base type command");
453f7f5da97SDeepak Kodihalli base->require_subcommand(1);
454f7f5da97SDeepak Kodihalli
45516c2a0a0SPatrick Williams auto getPLDMTypes =
45616c2a0a0SPatrick Williams base->add_subcommand("GetPLDMTypes", "get pldm supported types");
457f7f5da97SDeepak Kodihalli commands.push_back(
458f7f5da97SDeepak Kodihalli std::make_unique<GetPLDMTypes>("base", "GetPLDMTypes", getPLDMTypes));
459f7f5da97SDeepak Kodihalli
46016c2a0a0SPatrick Williams auto getPLDMVersion =
46116c2a0a0SPatrick Williams base->add_subcommand("GetPLDMVersion", "get version of a certain type");
462f7f5da97SDeepak Kodihalli commands.push_back(std::make_unique<GetPLDMVersion>(
463f7f5da97SDeepak Kodihalli "base", "GetPLDMVersion", getPLDMVersion));
464f7f5da97SDeepak Kodihalli
465f7f5da97SDeepak Kodihalli auto getPLDMTID = base->add_subcommand("GetTID", "get Terminus ID (TID)");
466f7f5da97SDeepak Kodihalli commands.push_back(std::make_unique<GetTID>("base", "GetTID", getPLDMTID));
467f7f5da97SDeepak Kodihalli
468f7f5da97SDeepak Kodihalli auto getPLDMCommands = base->add_subcommand(
469f7f5da97SDeepak Kodihalli "GetPLDMCommands", "get supported commands of pldm type");
470f7f5da97SDeepak Kodihalli commands.push_back(std::make_unique<GetPLDMCommands>(
471f7f5da97SDeepak Kodihalli "base", "GetPLDMCommands", getPLDMCommands));
472*1b89451bSRoger G. Coscojuela
473*1b89451bSRoger G. Coscojuela auto setTID = base->add_subcommand(
474*1b89451bSRoger G. Coscojuela "SetTID", "set the Terminus ID (TID) for a PLDM Terminus.");
475*1b89451bSRoger G. Coscojuela commands.push_back(std::make_unique<SetTID>("base", "SetTID", setTID));
476f7f5da97SDeepak Kodihalli }
477f7f5da97SDeepak Kodihalli
478f7f5da97SDeepak Kodihalli } // namespace base
479f7f5da97SDeepak Kodihalli } // namespace pldmtool
480