blob: 36b9d8f1609ff052137c1d3ce3668bc9ff7f56c8 [file] [log] [blame]
Deepak Kodihalli1b24f972019-02-01 04:09:13 -06001#ifndef BASE_H
2#define BASE_H
3
4#ifdef __cplusplus
5extern "C" {
6#endif
7
8#include <asm/byteorder.h>
9#include <stddef.h>
10#include <stdint.h>
11
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -060012#include "pldm_types.h"
13
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060014/** @brief PLDM Types
15 */
16enum pldm_supported_types {
17 PLDM_BASE = 0x00,
Sampa Misra0db1dfa2019-03-19 00:15:31 -050018 PLDM_PLATFORM = 0x02,
Sampa Misra032bd502019-03-06 05:03:22 -060019 PLDM_BIOS = 0x03,
Jinu Joy Thomas8e92c6c2019-08-06 12:22:34 +053020 PLDM_FRU = 0x04,
gokulsanker138ceba2021-04-05 13:25:25 +053021 PLDM_FWUP = 0x05,
Jinu Joy Thomasf666db12019-05-29 05:22:31 -050022 PLDM_OEM = 0x3F,
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060023};
24
25/** @brief PLDM Commands
26 */
27enum pldm_supported_commands {
John Wang5c4f80d2019-07-29 11:12:18 +080028 PLDM_GET_TID = 0x2,
Sampa Misra432e1872019-02-13 03:49:43 -060029 PLDM_GET_PLDM_VERSION = 0x3,
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060030 PLDM_GET_PLDM_TYPES = 0x4,
31 PLDM_GET_PLDM_COMMANDS = 0x5
32};
33
34/** @brief PLDM base codes
35 */
36enum pldm_completion_codes {
37 PLDM_SUCCESS = 0x00,
38 PLDM_ERROR = 0x01,
39 PLDM_ERROR_INVALID_DATA = 0x02,
40 PLDM_ERROR_INVALID_LENGTH = 0x03,
41 PLDM_ERROR_NOT_READY = 0x04,
42 PLDM_ERROR_UNSUPPORTED_PLDM_CMD = 0x05,
43 PLDM_ERROR_INVALID_PLDM_TYPE = 0x20
44};
45
Sampa Misra432e1872019-02-13 03:49:43 -060046enum transfer_op_flag {
47 PLDM_GET_NEXTPART = 0,
48 PLDM_GET_FIRSTPART = 1,
49};
50
51enum transfer_resp_flag {
52 PLDM_START = 0x01,
53 PLDM_MIDDLE = 0x02,
54 PLDM_END = 0x04,
55 PLDM_START_AND_END = 0x05,
56};
57
Sagar Srinivas535bccd2021-03-24 12:18:26 -050058/** @brief PLDM transport protocol type
59 */
60enum pldm_transport_protocol_type {
61 PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP = 0x00,
62 PLDM_TRANSPORT_PROTOCOL_TYPE_OEM = 0xFF,
63};
64
Tom Joseph41251042019-02-07 16:17:07 +053065/** @enum MessageType
66 *
67 * The different message types supported by the PLDM specification.
68 */
69typedef enum {
70 PLDM_RESPONSE, //!< PLDM response
71 PLDM_REQUEST, //!< PLDM request
72 PLDM_RESERVED, //!< Reserved
73 PLDM_ASYNC_REQUEST_NOTIFY, //!< Unacknowledged PLDM request messages
74} MessageType;
75
76#define PLDM_INSTANCE_MAX 31
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060077#define PLDM_MAX_TYPES 64
78#define PLDM_MAX_CMDS_PER_TYPE 256
79
80/* Message payload lengths */
81#define PLDM_GET_COMMANDS_REQ_BYTES 5
Sampa Misra432e1872019-02-13 03:49:43 -060082#define PLDM_GET_VERSION_REQ_BYTES 6
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060083
84/* Response lengths are inclusive of completion code */
85#define PLDM_GET_TYPES_RESP_BYTES 9
John Wang5c4f80d2019-07-29 11:12:18 +080086#define PLDM_GET_TID_RESP_BYTES 2
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060087#define PLDM_GET_COMMANDS_RESP_BYTES 33
Sampa Misra432e1872019-02-13 03:49:43 -060088/* Response data has only one version and does not contain the checksum */
89#define PLDM_GET_VERSION_RESP_BYTES 10
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060090
Christian Geddes6c146f12020-05-01 14:48:23 -050091#define PLDM_VERSION_0 0
92#define PLDM_CURRENT_VERSION PLDM_VERSION_0
93
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060094/** @struct pldm_msg_hdr
95 *
96 * Structure representing PLDM message header fields
97 */
98struct pldm_msg_hdr {
99#if defined(__LITTLE_ENDIAN_BITFIELD)
100 uint8_t instance_id : 5; //!< Instance ID
Deepak Kodihalli826c9d42020-05-26 01:58:06 -0500101 uint8_t reserved : 1; //!< Reserved
102 uint8_t datagram : 1; //!< Datagram bit
103 uint8_t request : 1; //!< Request bit
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600104#elif defined(__BIG_ENDIAN_BITFIELD)
Deepak Kodihalli826c9d42020-05-26 01:58:06 -0500105 uint8_t request : 1; //!< Request bit
106 uint8_t datagram : 1; //!< Datagram bit
107 uint8_t reserved : 1; //!< Reserved
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600108 uint8_t instance_id : 5; //!< Instance ID
109#endif
110
111#if defined(__LITTLE_ENDIAN_BITFIELD)
Deepak Kodihalli826c9d42020-05-26 01:58:06 -0500112 uint8_t type : 6; //!< PLDM type
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600113 uint8_t header_ver : 2; //!< Header version
114#elif defined(__BIG_ENDIAN_BITFIELD)
Deepak Kodihalli826c9d42020-05-26 01:58:06 -0500115 uint8_t header_ver : 2; //!< Header version
116 uint8_t type : 6; //!< PLDM type
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600117#endif
118 uint8_t command; //!< PLDM command code
119} __attribute__((packed));
120
Zach Clarkb728eee2020-06-18 10:01:31 -0500121// Macros for byte-swapping variables in-place
122#define HTOLE32(X) (X = htole32(X))
123#define HTOLE16(X) (X = htole16(X))
George Liucae18662020-05-15 09:32:57 +0800124#define LE32TOH(X) (X = le32toh(X))
125#define LE16TOH(X) (X = le16toh(X))
Zach Clarkb728eee2020-06-18 10:01:31 -0500126
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600127/** @struct pldm_msg
128 *
129 * Structure representing PLDM message
130 */
131struct pldm_msg {
vkaverapa6575b82019-04-03 05:33:52 -0500132 struct pldm_msg_hdr hdr; //!< PLDM message header
133 uint8_t payload[1]; //!< &payload[0] is the beginning of the payload
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600134} __attribute__((packed));
135
Tom Joseph41251042019-02-07 16:17:07 +0530136/** @struct pldm_header_info
137 *
138 * The information needed to prepare PLDM header and this is passed to the
139 * pack_pldm_header and unpack_pldm_header API.
140 */
141struct pldm_header_info {
Deepak Kodihalli826c9d42020-05-26 01:58:06 -0500142 MessageType msg_type; //!< PLDM message type
143 uint8_t instance; //!< PLDM instance id
144 uint8_t pldm_type; //!< PLDM type
Tom Joseph41251042019-02-07 16:17:07 +0530145 uint8_t command; //!< PLDM command code
146 uint8_t completion_code; //!< PLDM completion code, applies for response
147};
148
Priyanga4b790ce2019-06-10 01:30:09 -0500149/** @struct pldm_get_types_resp
150 *
151 * Structure representing PLDM get types response.
152 */
153struct pldm_get_types_resp {
154 uint8_t completion_code; //!< completion code
155 bitfield8_t types[8]; //!< each bit represents whether a given PLDM Type
156 //!< is supported
157} __attribute__((packed));
158
159/** @struct pldm_get_commands_req
160 *
161 * Structure representing PLDM get commands request.
162 */
163struct pldm_get_commands_req {
Deepak Kodihalli826c9d42020-05-26 01:58:06 -0500164 uint8_t type; //!< PLDM Type for which command support information is
Priyanga4b790ce2019-06-10 01:30:09 -0500165 //!< being requested
166 ver32_t version; //!< version for the specified PLDM Type
167} __attribute__((packed));
168
169/** @struct pldm_get_commands_resp
170 *
171 * Structure representing PLDM get commands response.
172 */
173struct pldm_get_commands_resp {
174 uint8_t completion_code; //!< completion code
175 bitfield8_t commands[32]; //!< each bit represents whether a given PLDM
176 //!< command is supported
177} __attribute__((packed));
178
179/** @struct pldm_get_version_req
180 *
181 * Structure representing PLDM get version request.
182 */
183struct pldm_get_version_req {
184 uint32_t
185 transfer_handle; //!< handle to identify PLDM version data transfer
186 uint8_t transfer_opflag; //!< PLDM GetVersion operation flag
187 uint8_t type; //!< PLDM Type for which version information is being
188 //!< requested
189} __attribute__((packed));
190
191/** @struct pldm_get_version_resp
192 *
193 * Structure representing PLDM get version response.
194 */
195
196struct pldm_get_version_resp {
197 uint8_t completion_code; //!< completion code
198 uint32_t next_transfer_handle; //!< next portion of PLDM version data
199 //!< transfer
Deepak Kodihalli826c9d42020-05-26 01:58:06 -0500200 uint8_t transfer_flag; //!< PLDM GetVersion transfer flag
Priyanga4b790ce2019-06-10 01:30:09 -0500201 uint8_t version_data[1]; //!< PLDM GetVersion version field
202} __attribute__((packed));
203
John Wang5c4f80d2019-07-29 11:12:18 +0800204/** @struct pldm_get_tid_resp
205 *
206 * Structure representing PLDM get tid response.
207 */
208
209struct pldm_get_tid_resp {
210 uint8_t completion_code; //!< completion code
211 uint8_t tid; //!< PLDM GetTID TID field
212} __attribute__((packed));
213
Tom Joseph41251042019-02-07 16:17:07 +0530214/**
215 * @brief Populate the PLDM message with the PLDM header.The caller of this API
216 * allocates buffer for the PLDM header when forming the PLDM message.
217 * The buffer is passed to this API to pack the PLDM header.
218 *
219 * @param[in] hdr - Pointer to the PLDM header information
220 * @param[out] msg - Pointer to PLDM message header
221 *
222 * @return 0 on success, otherwise PLDM error codes.
Christian Geddes6c146f12020-05-01 14:48:23 -0500223 * @note Caller is responsible for alloc and dealloc of msg
224 * and hdr params
Tom Joseph41251042019-02-07 16:17:07 +0530225 */
226int pack_pldm_header(const struct pldm_header_info *hdr,
227 struct pldm_msg_hdr *msg);
228
229/**
230 * @brief Unpack the PLDM header from the PLDM message.
231 *
232 * @param[in] msg - Pointer to the PLDM message header
233 * @param[out] hdr - Pointer to the PLDM header information
234 *
235 * @return 0 on success, otherwise PLDM error codes.
Christian Geddes6c146f12020-05-01 14:48:23 -0500236 * @note Caller is responsible for alloc and dealloc of msg
237 * and hdr params
Tom Joseph41251042019-02-07 16:17:07 +0530238 */
239int unpack_pldm_header(const struct pldm_msg_hdr *msg,
240 struct pldm_header_info *hdr);
241
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600242/* Requester */
243
244/* GetPLDMTypes */
245
246/** @brief Create a PLDM request message for GetPLDMTypes
247 *
248 * @param[in] instance_id - Message's instance id
249 * @param[in,out] msg - Message will be written to this
250 * @return pldm_completion_codes
251 * @note Caller is responsible for memory alloc and dealloc of param
vkaverapa6575b82019-04-03 05:33:52 -0500252 * 'msg.payload'
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600253 */
254int encode_get_types_req(uint8_t instance_id, struct pldm_msg *msg);
255
256/** @brief Decode a GetPLDMTypes response message
257 *
George Liu684a7162019-12-06 15:10:52 +0800258 * Note:
259 * * If the return value is not PLDM_SUCCESS, it represents a
260 * transport layer error.
261 * * If the completion_code value is not PLDM_SUCCESS, it represents a
262 * protocol layer error and all the out-parameters are invalid.
263 *
Zahed Hossain223a73d2019-07-04 12:46:18 -0500264 * @param[in] msg - Response message
vkaverapa6575b82019-04-03 05:33:52 -0500265 * @param[in] payload_length - Length of response message payload
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600266 * @param[out] completion_code - Pointer to response msg's PLDM completion code
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600267 * @param[out] types - pointer to array bitfield8_t[8] containing supported
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600268 * types (MAX_TYPES/8) = 8), as per DSP0240
269 * @return pldm_completion_codes
270 */
Zahed Hossain223a73d2019-07-04 12:46:18 -0500271int decode_get_types_resp(const struct pldm_msg *msg, size_t payload_length,
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600272 uint8_t *completion_code, bitfield8_t *types);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600273
274/* GetPLDMCommands */
275
276/** @brief Create a PLDM request message for GetPLDMCommands
277 *
278 * @param[in] instance_id - Message's instance id
279 * @param[in] type - PLDM Type
280 * @param[in] version - Version for PLDM Type
281 * @param[in,out] msg - Message will be written to this
282 * @return pldm_completion_codes
283 * @note Caller is responsible for memory alloc and dealloc of param
vkaverapa6575b82019-04-03 05:33:52 -0500284 * 'msg.payload'
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600285 */
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600286int encode_get_commands_req(uint8_t instance_id, uint8_t type, ver32_t version,
287 struct pldm_msg *msg);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600288
289/** @brief Decode a GetPLDMCommands response message
290 *
George Liu684a7162019-12-06 15:10:52 +0800291 * Note:
292 * * If the return value is not PLDM_SUCCESS, it represents a
293 * transport layer error.
294 * * If the completion_code value is not PLDM_SUCCESS, it represents a
295 * protocol layer error and all the out-parameters are invalid.
296 *
Zahed Hossain223a73d2019-07-04 12:46:18 -0500297 * @param[in] msg - Response message
vkaverapa6575b82019-04-03 05:33:52 -0500298 * @param[in] payload_length - Length of reponse message payload
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600299 * @param[out] completion_code - Pointer to response msg's PLDM completion code
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600300 * @param[in] commands - pointer to array bitfield8_t[32] containing supported
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600301 * commands (PLDM_MAX_CMDS_PER_TYPE/8) = 32), as per DSP0240
302 * @return pldm_completion_codes
303 */
Zahed Hossain223a73d2019-07-04 12:46:18 -0500304int decode_get_commands_resp(const struct pldm_msg *msg, size_t payload_length,
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600305 uint8_t *completion_code, bitfield8_t *commands);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600306
Sampa Misra432e1872019-02-13 03:49:43 -0600307/* GetPLDMVersion */
308
309/** @brief Create a PLDM request for GetPLDMVersion
310 *
311 * @param[in] instance_id - Message's instance id
312 * @param[in] transfer_handle - Handle to identify PLDM version data transfer.
313 * This handle is ignored by the responder when the
314 * transferop_flag is set to getFirstPart.
315 * @param[in] transfer_opflag - flag to indicate whether it is start of
316 * transfer
317 * @param[in] type - PLDM Type for which version is requested
318 * @param[in,out] msg - Message will be written to this
319 * @return pldm_completion_codes
320 * @note Caller is responsible for memory alloc and dealloc of param
vkaverapa6575b82019-04-03 05:33:52 -0500321 * 'msg.payload'
Sampa Misra432e1872019-02-13 03:49:43 -0600322 */
323int encode_get_version_req(uint8_t instance_id, uint32_t transfer_handle,
324 uint8_t transfer_opflag, uint8_t type,
325 struct pldm_msg *msg);
326
327/** @brief Decode a GetPLDMVersion response message
328 *
George Liu684a7162019-12-06 15:10:52 +0800329 * Note:
330 * * If the return value is not PLDM_SUCCESS, it represents a
331 * transport layer error.
332 * * If the completion_code value is not PLDM_SUCCESS, it represents a
333 * protocol layer error and all the out-parameters are invalid.
334 *
Zahed Hossain223a73d2019-07-04 12:46:18 -0500335 * @param[in] msg - Response message
vkaverapa6575b82019-04-03 05:33:52 -0500336 * @param[in] payload_length - Length of reponse message payload
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600337 * @param[out] completion_code - Pointer to response msg's PLDM completion code
Sampa Misra432e1872019-02-13 03:49:43 -0600338 * @param[out] next_transfer_handle - the next handle for the next part of data
339 * @param[out] transfer_flag - flag to indicate the part of data
340 * @return pldm_completion_codes
341 */
Zahed Hossain223a73d2019-07-04 12:46:18 -0500342int decode_get_version_resp(const struct pldm_msg *msg, size_t payload_length,
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600343 uint8_t *completion_code,
Sampa Misra432e1872019-02-13 03:49:43 -0600344 uint32_t *next_transfer_handle,
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600345 uint8_t *transfer_flag, ver32_t *version);
Sampa Misra432e1872019-02-13 03:49:43 -0600346
John Wang5c4f80d2019-07-29 11:12:18 +0800347/* GetTID */
348
349/** @brief Decode a GetTID response message
350 *
George Liu684a7162019-12-06 15:10:52 +0800351 * Note:
352 * * If the return value is not PLDM_SUCCESS, it represents a
353 * transport layer error.
354 * * If the completion_code value is not PLDM_SUCCESS, it represents a
355 * protocol layer error and all the out-parameters are invalid.
356 *
John Wang5c4f80d2019-07-29 11:12:18 +0800357 * @param[in] msg - Response message
358 * @param[in] payload_length - Length of response message payload
359 * @param[out] completion_code - Pointer to response msg's PLDM completion code
360 * @param[out] tid - Pointer to the terminus id
361 * @return pldm_completion_codes
362 */
363int decode_get_tid_resp(const struct pldm_msg *msg, size_t payload_length,
364 uint8_t *completion_code, uint8_t *tid);
365
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600366/* Responder */
367
368/* GetPLDMTypes */
369
370/** @brief Create a PLDM response message for GetPLDMTypes
371 *
372 * @param[in] instance_id - Message's instance id
373 * @param[in] completion_code - PLDM completion code
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600374 * @param[in] types - pointer to array bitfield8_t[8] containing supported
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600375 * types (MAX_TYPES/8) = 8), as per DSP0240
376 * @param[in,out] msg - Message will be written to this
377 * @return pldm_completion_codes
378 * @note Caller is responsible for memory alloc and dealloc of param
vkaverapa6575b82019-04-03 05:33:52 -0500379 * 'msg.payload'
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600380 */
381int encode_get_types_resp(uint8_t instance_id, uint8_t completion_code,
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600382 const bitfield8_t *types, struct pldm_msg *msg);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600383
384/* GetPLDMCommands */
385
386/** @brief Decode GetPLDMCommands' request data
387 *
vkaverapa6575b82019-04-03 05:33:52 -0500388 * @param[in] msg - Request message
389 * @param[in] payload_length - Length of request message payload
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600390 * @param[out] type - PLDM Type
391 * @param[out] version - Version for PLDM Type
392 * @return pldm_completion_codes
393 */
Zahed Hossain223a73d2019-07-04 12:46:18 -0500394int decode_get_commands_req(const struct pldm_msg *msg, size_t payload_length,
vkaverapa6575b82019-04-03 05:33:52 -0500395 uint8_t *type, ver32_t *version);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600396
397/** @brief Create a PLDM response message for GetPLDMCommands
398 *
399 * @param[in] instance_id - Message's instance id
400 * @param[in] completion_code - PLDM completion code
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600401 * @param[in] commands - pointer to array bitfield8_t[32] containing supported
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600402 * commands (PLDM_MAX_CMDS_PER_TYPE/8) = 32), as per DSP0240
403 * @param[in,out] msg - Message will be written to this
404 * @return pldm_completion_codes
405 * @note Caller is responsible for memory alloc and dealloc of param
vkaverapa6575b82019-04-03 05:33:52 -0500406 * 'msg.payload'
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600407 */
408int encode_get_commands_resp(uint8_t instance_id, uint8_t completion_code,
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600409 const bitfield8_t *commands, struct pldm_msg *msg);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600410
Sampa Misra432e1872019-02-13 03:49:43 -0600411/* GetPLDMVersion */
412
413/** @brief Create a PLDM response for GetPLDMVersion
414 *
415 * @param[in] instance_id - Message's instance id
416 * @param[in] completion_code - PLDM completion code
417 * @param[in] next_transfer_handle - Handle to identify next portion of
418 * data transfer
419 * @param[in] transfer_flag - Represents the part of transfer
420 * @param[in] version_data - the version data
421 * @param[in] version_size - size of version data
422 * @param[in,out] msg - Message will be written to this
423 * @return pldm_completion_codes
424 * @note Caller is responsible for memory alloc and dealloc of param
vkaverapa6575b82019-04-03 05:33:52 -0500425 * 'msg.payload'
Sampa Misra432e1872019-02-13 03:49:43 -0600426 */
427int encode_get_version_resp(uint8_t instance_id, uint8_t completion_code,
428 uint32_t next_transfer_handle,
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600429 uint8_t transfer_flag, const ver32_t *version_data,
Sampa Misra432e1872019-02-13 03:49:43 -0600430 size_t version_size, struct pldm_msg *msg);
431
432/** @brief Decode a GetPLDMVersion request message
433 *
vkaverapa6575b82019-04-03 05:33:52 -0500434 * @param[in] msg - Request message
435 * @param[in] payload_length - length of request message payload
Sampa Misra432e1872019-02-13 03:49:43 -0600436 * @param[out] transfer_handle - the handle of data
437 * @param[out] transfer_opflag - Transfer Flag
438 * @param[out] type - PLDM type for which version is requested
439 * @return pldm_completion_codes
440 */
Zahed Hossain223a73d2019-07-04 12:46:18 -0500441int decode_get_version_req(const struct pldm_msg *msg, size_t payload_length,
Sampa Misra432e1872019-02-13 03:49:43 -0600442 uint32_t *transfer_handle, uint8_t *transfer_opflag,
443 uint8_t *type);
444
Sridevi Rameshbc6ff262019-12-12 04:58:35 -0600445/* Requester */
446
John Wang5c4f80d2019-07-29 11:12:18 +0800447/* GetTID */
448
Sridevi Rameshbc6ff262019-12-12 04:58:35 -0600449/** @brief Create a PLDM request message for GetTID
450 *
451 * @param[in] instance_id - Message's instance id
452 * @param[in,out] msg - Message will be written to this
453 * @return pldm_completion_codes
454 * @note Caller is responsible for memory alloc and dealloc of param
455 * 'msg.payload'
456 */
457int encode_get_tid_req(uint8_t instance_id, struct pldm_msg *msg);
458
John Wang5c4f80d2019-07-29 11:12:18 +0800459/** @brief Create a PLDM response message for GetTID
460 *
461 * @param[in] instance_id - Message's instance id
462 * @param[in] completion_code - PLDM completion code
463 * @param[in] tid - Terminus ID
464 * @param[in,out] msg - Message will be written to this
465 * @return pldm_completion_codes
466 * @note Caller is responsible for memory alloc and dealloc of param
467 * 'msg.payload'
468 */
469int encode_get_tid_resp(uint8_t instance_id, uint8_t completion_code,
470 uint8_t tid, struct pldm_msg *msg);
471
John Wang7f02d702019-12-03 13:38:14 +0800472/** @brief Create a PLDM response message containing only cc
473 *
474 * @param[in] instance_id - Message's instance id
475 * @param[in] type - PLDM Type
476 * @param[in] command - PLDM Command
477 * @param[in] cc - PLDM Completion Code
478 * @param[out] msg - Message will be written to this
479 * @return pldm_completion_codes
480 */
481int encode_cc_only_resp(uint8_t instance_id, uint8_t type, uint8_t command,
482 uint8_t cc, struct pldm_msg *msg);
483
gokulsanker138ceba2021-04-05 13:25:25 +0530484/** @brief Create a PLDM message only with the header
485 *
486 * @param[in] msg_type - PLDM message type
487 * @param[in] instance_id - Message's instance id
488 * @param[in] pldm_type - PLDM Type
489 * @param[in] command - PLDM Command
490 * @param[out] msg - Message will be written to this
491 *
492 * @return pldm_completion_codes
493 */
494int encode_pldm_header_only(uint8_t msg_type, uint8_t instance_id,
495 uint8_t pldm_type, uint8_t command,
496 struct pldm_msg *msg);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600497#ifdef __cplusplus
498}
499#endif
500
501#endif /* BASE_H */