blob: 8b9506f1e7afbf09740fce8851478c987d27f93b [file] [log] [blame]
Sampa Misra0db1dfa2019-03-19 00:15:31 -05001#include <endian.h>
2#include <string.h>
3
4#include "platform.h"
5
6int encode_set_state_effecter_states_resp(uint8_t instance_id,
7 uint8_t completion_code,
8 struct pldm_msg *msg)
9{
10 struct pldm_header_info header = {0};
11 int rc = PLDM_SUCCESS;
12
vkaverapa6575b82019-04-03 05:33:52 -050013 msg->payload[0] = completion_code;
Sampa Misra0db1dfa2019-03-19 00:15:31 -050014
15 header.msg_type = PLDM_RESPONSE;
16 header.instance = instance_id;
17 header.pldm_type = PLDM_PLATFORM;
18 header.command = PLDM_SET_STATE_EFFECTER_STATES;
19
20 rc = pack_pldm_header(&header, &(msg->hdr));
21
22 return rc;
23}
24
vkaverap98a2c192019-04-03 05:33:52 -050025int encode_set_state_effecter_states_req(uint8_t instance_id,
26 uint16_t effecter_id,
27 uint8_t comp_effecter_count,
28 set_effecter_state_field *field,
29 struct pldm_msg *msg)
30{
31 struct pldm_header_info header = {0};
32 int rc = PLDM_SUCCESS;
33
34 header.msg_type = PLDM_REQUEST;
35 header.instance = instance_id;
36 header.pldm_type = PLDM_PLATFORM;
37 header.command = PLDM_SET_STATE_EFFECTER_STATES;
38
39 if ((rc = pack_pldm_header(&header, &(msg->hdr))) > PLDM_SUCCESS) {
40 return rc;
41 }
42
43 if (comp_effecter_count < 0x1 || comp_effecter_count > 0x8) {
44 return PLDM_ERROR_INVALID_DATA;
45 }
46
Priyanga7257fdf2019-06-10 01:59:45 -050047 struct pldm_set_state_effecter_states_req *request =
48 (struct pldm_set_state_effecter_states_req *)msg->payload;
vkaverap98a2c192019-04-03 05:33:52 -050049 effecter_id = htole16(effecter_id);
Priyanga7257fdf2019-06-10 01:59:45 -050050 request->effecter_id = effecter_id;
51 request->comp_effecter_count = comp_effecter_count;
52 memcpy(request->field, field,
vkaverap98a2c192019-04-03 05:33:52 -050053 (sizeof(set_effecter_state_field) * comp_effecter_count));
54
55 return PLDM_SUCCESS;
56}
57
Zahed Hossain223a73d2019-07-04 12:46:18 -050058int decode_set_state_effecter_states_resp(const struct pldm_msg *msg,
vkaverapa6575b82019-04-03 05:33:52 -050059 size_t payload_length,
vkaverap98a2c192019-04-03 05:33:52 -050060 uint8_t *completion_code)
61{
62 if (msg == NULL || completion_code == NULL) {
63 return PLDM_ERROR_INVALID_DATA;
64 }
65
vkaverapa6575b82019-04-03 05:33:52 -050066 if (payload_length > PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES) {
67 return PLDM_ERROR_INVALID_LENGTH;
68 }
69
Zahed Hossain223a73d2019-07-04 12:46:18 -050070 *completion_code = msg->payload[0];
vkaverap98a2c192019-04-03 05:33:52 -050071
72 return PLDM_SUCCESS;
73}
74
Zahed Hossain223a73d2019-07-04 12:46:18 -050075int decode_set_state_effecter_states_req(const struct pldm_msg *msg,
vkaverapa6575b82019-04-03 05:33:52 -050076 size_t payload_length,
Sampa Misra0db1dfa2019-03-19 00:15:31 -050077 uint16_t *effecter_id,
78 uint8_t *comp_effecter_count,
79 set_effecter_state_field *field)
80{
81 if (msg == NULL || effecter_id == NULL || comp_effecter_count == NULL ||
82 field == NULL) {
83 return PLDM_ERROR_INVALID_DATA;
84 }
vkaverapa6575b82019-04-03 05:33:52 -050085
86 if (payload_length > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) {
87 return PLDM_ERROR_INVALID_LENGTH;
88 }
89
Priyanga7257fdf2019-06-10 01:59:45 -050090 struct pldm_set_state_effecter_states_req *request =
Zahed Hossain223a73d2019-07-04 12:46:18 -050091 (struct pldm_set_state_effecter_states_req *)msg->payload;
Priyanga7257fdf2019-06-10 01:59:45 -050092
93 *effecter_id = le16toh(request->effecter_id);
94 *comp_effecter_count = request->comp_effecter_count;
95 memcpy(field, request->field,
Sampa Misra0db1dfa2019-03-19 00:15:31 -050096 (sizeof(set_effecter_state_field) * (*comp_effecter_count)));
97
98 return PLDM_SUCCESS;
99}
Sampa Misra7fcfb662019-05-08 13:13:53 -0500100
101int decode_get_pdr_req(const struct pldm_msg *msg, size_t payload_length,
102 uint32_t *record_hndl, uint32_t *data_transfer_hndl,
103 uint8_t *transfer_op_flag, uint16_t *request_cnt,
104 uint16_t *record_chg_num)
105{
106 if (msg == NULL || record_hndl == NULL || data_transfer_hndl == NULL ||
107 transfer_op_flag == NULL || request_cnt == NULL ||
108 record_chg_num == NULL) {
109 return PLDM_ERROR_INVALID_DATA;
110 }
111 if (payload_length != PLDM_GET_PDR_REQ_BYTES) {
112 return PLDM_ERROR_INVALID_LENGTH;
113 }
114
115 struct pldm_get_pdr_req *request =
116 (struct pldm_get_pdr_req *)msg->payload;
117 *record_hndl = le32toh(request->record_handle);
118 *data_transfer_hndl = le32toh(request->data_transfer_handle);
119 *transfer_op_flag = request->transfer_op_flag;
120 *request_cnt = le16toh(request->request_count);
121 *record_chg_num = le16toh(request->record_change_number);
122
123 return PLDM_SUCCESS;
124}
125
126int encode_get_pdr_resp(uint8_t instance_id, uint8_t completion_code,
127 uint32_t next_record_hndl,
128 uint32_t next_data_transfer_hndl, uint8_t transfer_flag,
129 uint16_t resp_cnt, const uint8_t *record_data,
130 uint8_t transfer_crc, struct pldm_msg *msg)
131{
132 struct pldm_header_info header = {0};
133 int rc = PLDM_SUCCESS;
134
135 if (msg == NULL) {
136 return PLDM_ERROR_INVALID_DATA;
137 }
138 struct pldm_get_pdr_resp *response =
139 (struct pldm_get_pdr_resp *)msg->payload;
140
141 response->completion_code = completion_code;
142
143 header.msg_type = PLDM_RESPONSE;
144 header.instance = instance_id;
145 header.pldm_type = PLDM_PLATFORM;
146 header.command = PLDM_GET_PDR;
147 if ((rc = pack_pldm_header(&header, &(msg->hdr))) > PLDM_SUCCESS) {
148 return rc;
149 }
150
151 if (response->completion_code == PLDM_SUCCESS) {
152 response->next_record_handle = htole32(next_record_hndl);
153 response->next_data_transfer_handle =
154 htole32(next_data_transfer_hndl);
155 response->transfer_flag = transfer_flag;
156 response->response_count = htole16(resp_cnt);
157 if (record_data != NULL && resp_cnt > 0) {
158 memcpy(response->record_data, record_data, resp_cnt);
159 }
Deepak Kodihallie4b16ee2019-08-14 06:54:38 -0500160 if (transfer_flag == PLDM_END) {
161 uint8_t *dst = msg->payload;
162 dst +=
163 (sizeof(struct pldm_get_pdr_resp) - 1) + resp_cnt;
164 *dst = transfer_crc;
165 }
Sampa Misra7fcfb662019-05-08 13:13:53 -0500166 }
167
168 return PLDM_SUCCESS;
169}
George Liu820a9a52019-11-26 14:43:59 +0800170
171int encode_get_pdr_req(uint8_t instance_id, uint32_t record_hndl,
172 uint32_t data_transfer_hndl, uint8_t transfer_op_flag,
173 uint16_t request_cnt, uint16_t record_chg_num,
174 struct pldm_msg *msg, size_t payload_length)
175{
176 struct pldm_header_info header = {0};
177 int rc = PLDM_SUCCESS;
178
179 if (msg == NULL) {
180 return PLDM_ERROR_INVALID_DATA;
181 }
182 struct pldm_get_pdr_req *request =
183 (struct pldm_get_pdr_req *)msg->payload;
184
185 header.msg_type = PLDM_REQUEST;
186 header.instance = instance_id;
187 header.pldm_type = PLDM_PLATFORM;
188 header.command = PLDM_GET_PDR;
189
190 if ((rc = pack_pldm_header(&header, &(msg->hdr))) > PLDM_SUCCESS) {
191 return rc;
192 }
193
194 if (payload_length != PLDM_GET_PDR_REQ_BYTES) {
195 return PLDM_ERROR_INVALID_LENGTH;
196 }
197
198 request->record_handle = htole32(record_hndl);
199 request->data_transfer_handle = htole32(data_transfer_hndl);
200 request->transfer_op_flag = transfer_op_flag;
201 request->request_count = htole16(request_cnt);
202 request->record_change_number = htole16(record_chg_num);
203
204 return PLDM_SUCCESS;
205}
206
207int decode_get_pdr_resp(const struct pldm_msg *msg, size_t payload_length,
208 uint8_t *completion_code, uint32_t *next_record_hndl,
209 uint32_t *next_data_transfer_hndl,
210 uint8_t *transfer_flag, uint16_t *resp_cnt,
211 uint8_t *record_data, size_t record_data_length,
212 uint8_t *transfer_crc)
213{
214 if (msg == NULL || completion_code == NULL ||
215 next_record_hndl == NULL || next_data_transfer_hndl == NULL ||
216 transfer_flag == NULL || resp_cnt == NULL || record_data == NULL ||
217 transfer_crc == NULL) {
218 return PLDM_ERROR_INVALID_DATA;
219 }
220
221 *completion_code = msg->payload[0];
222 if (PLDM_SUCCESS != *completion_code) {
223 return *completion_code;
224 }
225
226 if (payload_length < PLDM_GET_PDR_MIN_RESP_BYTES) {
227 return PLDM_ERROR_INVALID_LENGTH;
228 }
229
230 struct pldm_get_pdr_resp *response =
231 (struct pldm_get_pdr_resp *)msg->payload;
232
233 *next_record_hndl = le32toh(response->next_record_handle);
234 *next_data_transfer_hndl = le32toh(response->next_data_transfer_handle);
235 *transfer_flag = response->transfer_flag;
236 *resp_cnt = le16toh(response->response_count);
237
238 if (*transfer_flag != PLDM_END &&
239 (int)payload_length != PLDM_GET_PDR_MIN_RESP_BYTES + *resp_cnt) {
240 return PLDM_ERROR_INVALID_LENGTH;
241 }
242
243 if (*transfer_flag == PLDM_END &&
244 (int)payload_length !=
245 PLDM_GET_PDR_MIN_RESP_BYTES + *resp_cnt + 1) {
246 return PLDM_ERROR_INVALID_LENGTH;
247 }
248
249 if (*resp_cnt > 0) {
250 if (record_data_length < *resp_cnt) {
251 return PLDM_ERROR_INVALID_LENGTH;
252 }
253 memcpy(record_data, response->record_data, *resp_cnt);
254 }
255
256 if (*transfer_flag == PLDM_END) {
257 *transfer_crc =
258 msg->payload[PLDM_GET_PDR_MIN_RESP_BYTES + *resp_cnt];
259 }
260
261 return PLDM_SUCCESS;
262}
George Liu30b859f2020-01-07 15:03:22 +0800263
264int decode_set_numeric_effecter_value_req(const struct pldm_msg *msg,
265 size_t payload_length,
266 uint16_t *effecter_id,
267 uint8_t *effecter_data_size,
268 uint8_t *effecter_value)
269{
270 if (msg == NULL || effecter_id == NULL || effecter_data_size == NULL ||
271 effecter_value == NULL) {
272 return PLDM_ERROR_INVALID_DATA;
273 }
274
275 if (payload_length < PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES) {
276 return PLDM_ERROR_INVALID_LENGTH;
277 }
278
279 struct pldm_set_numeric_effecter_value_req *request =
280 (struct pldm_set_numeric_effecter_value_req *)msg->payload;
281 *effecter_id = le16toh(request->effecter_id);
282 *effecter_data_size = request->effecter_data_size;
283
284 if (*effecter_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) {
285 return PLDM_ERROR_INVALID_DATA;
286 }
287
288 if (*effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT8 ||
289 *effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT8) {
290
291 if (payload_length !=
292 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES) {
293 return PLDM_ERROR_INVALID_LENGTH;
294 }
295
296 *effecter_value = request->effecter_value[0];
297 }
298
299 if (*effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT16 ||
300 *effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT16) {
301
302 if (payload_length !=
303 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1) {
304 return PLDM_ERROR_INVALID_LENGTH;
305 }
306
307 memcpy(effecter_value, request->effecter_value, 2);
308 *effecter_value = le16toh(*effecter_value);
309 }
310
311 if (*effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT32 ||
312 *effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT32) {
313
314 if (payload_length !=
315 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3) {
316 return PLDM_ERROR_INVALID_LENGTH;
317 }
318
319 memcpy(effecter_value, request->effecter_value, 4);
320 *effecter_value = le32toh(*effecter_value);
321 }
322
323 return PLDM_SUCCESS;
324}
325
326int encode_set_numeric_effecter_value_resp(uint8_t instance_id,
327 uint8_t completion_code,
328 struct pldm_msg *msg,
329 size_t payload_length)
330{
331 struct pldm_header_info header = {0};
332 int rc = PLDM_SUCCESS;
333
334 if (msg == NULL) {
335 return PLDM_ERROR_INVALID_DATA;
336 }
337
338 if (payload_length != PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES) {
339 return PLDM_ERROR_INVALID_LENGTH;
340 }
341
342 msg->payload[0] = completion_code;
343
344 header.msg_type = PLDM_RESPONSE;
345 header.instance = instance_id;
346 header.pldm_type = PLDM_PLATFORM;
347 header.command = PLDM_SET_NUMERIC_EFFECTER_VALUE;
348
349 rc = pack_pldm_header(&header, &(msg->hdr));
350
351 return rc;
352}
353
354int encode_set_numeric_effecter_value_req(
355 uint8_t instance_id, uint16_t effecter_id, uint8_t effecter_data_size,
356 uint8_t *effecter_value, struct pldm_msg *msg, size_t payload_length)
357{
358 struct pldm_header_info header = {0};
359 int rc = PLDM_SUCCESS;
360
361 if (msg == NULL || effecter_value == NULL) {
362 return PLDM_ERROR_INVALID_DATA;
363 }
364 struct pldm_set_numeric_effecter_value_req *request =
365 (struct pldm_set_numeric_effecter_value_req *)msg->payload;
366
367 header.msg_type = PLDM_REQUEST;
368 header.instance = instance_id;
369 header.pldm_type = PLDM_PLATFORM;
370 header.command = PLDM_SET_NUMERIC_EFFECTER_VALUE;
371
372 if ((rc = pack_pldm_header(&header, &(msg->hdr))) > PLDM_SUCCESS) {
373 return rc;
374 }
375
376 if (effecter_data_size > PLDM_EFFECTER_DATA_SIZE_SINT32) {
377 return PLDM_ERROR_INVALID_DATA;
378 }
379
380 if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT8 ||
381 effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT8) {
382 if (payload_length !=
383 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES) {
384 return PLDM_ERROR_INVALID_LENGTH;
385 }
386 request->effecter_value[0] = *effecter_value;
387 } else if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT16 ||
388 effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT16) {
389 if (payload_length !=
390 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1) {
391 return PLDM_ERROR_INVALID_LENGTH;
392 }
393
394 memcpy(request->effecter_value, effecter_value, 2);
395 *request->effecter_value = htole16(*request->effecter_value);
396 } else if (effecter_data_size == PLDM_EFFECTER_DATA_SIZE_UINT32 ||
397 effecter_data_size == PLDM_EFFECTER_DATA_SIZE_SINT32) {
398 if (payload_length !=
399 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3) {
400 return PLDM_ERROR_INVALID_LENGTH;
401 }
402
403 memcpy(request->effecter_value, effecter_value, 4);
404 *request->effecter_value = htole32(*request->effecter_value);
405 }
406
407 request->effecter_id = htole16(effecter_id);
408 request->effecter_data_size = effecter_data_size;
409
410 return PLDM_SUCCESS;
411}
412
413int decode_set_numeric_effecter_value_resp(const struct pldm_msg *msg,
414 size_t payload_length,
415 uint8_t *completion_code)
416{
417 if (msg == NULL || completion_code == NULL) {
418 return PLDM_ERROR_INVALID_DATA;
419 }
420
421 if (payload_length != PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES) {
422 return PLDM_ERROR_INVALID_LENGTH;
423 }
424
425 *completion_code = msg->payload[0];
426
427 return PLDM_SUCCESS;
428}