xref: /openbmc/pldm/pldmtool/pldm_base_cmd.cpp (revision 1b89451bff7ef74978a8fcfc4b34edd3f8ed1ddb)
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