blob: 48ccd54f0b6967001a1d60c0f597b1af58569ed2 [file] [log] [blame]
Deepak Kodihalli1b24f972019-02-01 04:09:13 -06001#include "libpldm/base.h"
2
3#include "base.hpp"
4
5#include <array>
Sampa Misra432e1872019-02-13 03:49:43 -06006#include <cstring>
Deepak Kodihalli1b24f972019-02-01 04:09:13 -06007#include <map>
8#include <stdexcept>
9#include <vector>
10
11namespace pldm
12{
13namespace responder
14{
15
16using Cmd = std::vector<uint8_t>;
17
18static const std::map<Type, Cmd> capabilities{
19 {PLDM_BASE, {PLDM_GET_PLDM_TYPES, PLDM_GET_PLDM_COMMANDS}}};
20
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -060021static const std::map<Type, ver32_t> versions{
Sampa Misra432e1872019-02-13 03:49:43 -060022 {PLDM_BASE, {0xF1, 0xF0, 0xF0, 0x00}},
Zahed Hossain74c1c1e2019-06-18 02:13:48 -050023 {PLDM_PLATFORM, {0xF1, 0xF1, 0xF1, 0x00}},
24 {PLDM_BIOS, {0xF1, 0xF0, 0xF0, 0x00}},
Sampa Misra432e1872019-02-13 03:49:43 -060025};
26
vkaverapa6575b82019-04-03 05:33:52 -050027Response getPLDMTypes(const pldm_msg* request, size_t payloadLength)
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060028{
29 // DSP0240 has this as a bitfield8[N], where N = 0 to 7
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -060030 std::array<bitfield8_t, 8> types{};
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060031 for (const auto& type : capabilities)
32 {
33 auto index = type.first / 8;
34 // <Type Number> = <Array Index> * 8 + <bit position>
35 auto bit = type.first - (index * 8);
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -060036 types[index].byte |= 1 << bit;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060037 }
38
vkaverapa6575b82019-04-03 05:33:52 -050039 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_TYPES_RESP_BYTES, 0);
40 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
41 encode_get_types_resp(0, PLDM_SUCCESS, types.data(), responsePtr);
42
43 return response;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060044}
45
vkaverapa6575b82019-04-03 05:33:52 -050046Response getPLDMCommands(const pldm_msg* request, size_t payloadLength)
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060047{
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -060048 ver32_t version{};
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060049 Type type;
50
vkaverapa6575b82019-04-03 05:33:52 -050051 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_RESP_BYTES, 0);
52 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060053
vkaverapa6575b82019-04-03 05:33:52 -050054 auto rc = decode_get_commands_req(request->payload, payloadLength, &type,
55 &version);
56
57 if (rc != PLDM_SUCCESS)
58 {
59 encode_get_commands_resp(0, rc, nullptr, responsePtr);
60 return response;
61 }
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060062
63 // DSP0240 has this as a bitfield8[N], where N = 0 to 31
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -060064 std::array<bitfield8_t, 32> cmds{};
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060065 if (capabilities.find(type) == capabilities.end())
66 {
67 encode_get_commands_resp(0, PLDM_ERROR_INVALID_PLDM_TYPE, nullptr,
vkaverapa6575b82019-04-03 05:33:52 -050068 responsePtr);
69 return response;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060070 }
71
72 for (const auto& cmd : capabilities.at(type))
73 {
74 auto index = cmd / 8;
75 // <Type Number> = <Array Index> * 8 + <bit position>
76 auto bit = cmd - (index * 8);
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -060077 cmds[index].byte |= 1 << bit;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060078 }
79
vkaverapa6575b82019-04-03 05:33:52 -050080 encode_get_commands_resp(0, PLDM_SUCCESS, cmds.data(), responsePtr);
81
82 return response;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060083}
84
vkaverapa6575b82019-04-03 05:33:52 -050085Response getPLDMVersion(const pldm_msg* request, size_t payloadLength)
Sampa Misra432e1872019-02-13 03:49:43 -060086{
87 uint32_t transferHandle;
88 Type type;
89 uint8_t transferFlag;
90
vkaverapa6575b82019-04-03 05:33:52 -050091 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_RESP_BYTES, 0);
92 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
Sampa Misra432e1872019-02-13 03:49:43 -060093
vkaverapa6575b82019-04-03 05:33:52 -050094 uint8_t rc = decode_get_version_req(request->payload, payloadLength,
95 &transferHandle, &transferFlag, &type);
96
97 if (rc != PLDM_SUCCESS)
98 {
99 encode_get_version_resp(0, rc, 0, 0, nullptr, 4, responsePtr);
100 return response;
101 }
Sampa Misra432e1872019-02-13 03:49:43 -0600102
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600103 ver32_t version{};
Sampa Misra432e1872019-02-13 03:49:43 -0600104 auto search = versions.find(type);
105
106 if (search == versions.end())
107 {
108 encode_get_version_resp(0, PLDM_ERROR_INVALID_PLDM_TYPE, 0, 0, nullptr,
vkaverapa6575b82019-04-03 05:33:52 -0500109 4, responsePtr);
110 return response;
Sampa Misra432e1872019-02-13 03:49:43 -0600111 }
112
113 memcpy(&version, &(search->second), sizeof(version));
114 encode_get_version_resp(0, PLDM_SUCCESS, 0, PLDM_START_AND_END, &version,
vkaverapa6575b82019-04-03 05:33:52 -0500115 sizeof(pldm_version), responsePtr);
116
117 return response;
Sampa Misra432e1872019-02-13 03:49:43 -0600118}
119
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600120} // namespace responder
121} // namespace pldm