blob: 9c068546699548b9a8d398ee3e3e93531e1330eb [file] [log] [blame]
Sampa Misra0db1dfa2019-03-19 00:15:31 -05001#include <endian.h>
2#include <string.h>
3
4#include "platform.h"
George Liu820a9a52019-11-26 14:43:59 +08005#include "utils.h"
Sampa Misra0db1dfa2019-03-19 00:15:31 -05006
7int encode_set_state_effecter_states_resp(uint8_t instance_id,
8 uint8_t completion_code,
9 struct pldm_msg *msg)
10{
11 struct pldm_header_info header = {0};
12 int rc = PLDM_SUCCESS;
13
vkaverapa6575b82019-04-03 05:33:52 -050014 msg->payload[0] = completion_code;
Sampa Misra0db1dfa2019-03-19 00:15:31 -050015
16 header.msg_type = PLDM_RESPONSE;
17 header.instance = instance_id;
18 header.pldm_type = PLDM_PLATFORM;
19 header.command = PLDM_SET_STATE_EFFECTER_STATES;
20
21 rc = pack_pldm_header(&header, &(msg->hdr));
22
23 return rc;
24}
25
vkaverap98a2c192019-04-03 05:33:52 -050026int encode_set_state_effecter_states_req(uint8_t instance_id,
27 uint16_t effecter_id,
28 uint8_t comp_effecter_count,
29 set_effecter_state_field *field,
30 struct pldm_msg *msg)
31{
32 struct pldm_header_info header = {0};
33 int rc = PLDM_SUCCESS;
34
35 header.msg_type = PLDM_REQUEST;
36 header.instance = instance_id;
37 header.pldm_type = PLDM_PLATFORM;
38 header.command = PLDM_SET_STATE_EFFECTER_STATES;
39
40 if ((rc = pack_pldm_header(&header, &(msg->hdr))) > PLDM_SUCCESS) {
41 return rc;
42 }
43
44 if (comp_effecter_count < 0x1 || comp_effecter_count > 0x8) {
45 return PLDM_ERROR_INVALID_DATA;
46 }
47
Priyanga7257fdf2019-06-10 01:59:45 -050048 struct pldm_set_state_effecter_states_req *request =
49 (struct pldm_set_state_effecter_states_req *)msg->payload;
vkaverap98a2c192019-04-03 05:33:52 -050050 effecter_id = htole16(effecter_id);
Priyanga7257fdf2019-06-10 01:59:45 -050051 request->effecter_id = effecter_id;
52 request->comp_effecter_count = comp_effecter_count;
53 memcpy(request->field, field,
vkaverap98a2c192019-04-03 05:33:52 -050054 (sizeof(set_effecter_state_field) * comp_effecter_count));
55
56 return PLDM_SUCCESS;
57}
58
Zahed Hossain223a73d2019-07-04 12:46:18 -050059int decode_set_state_effecter_states_resp(const struct pldm_msg *msg,
vkaverapa6575b82019-04-03 05:33:52 -050060 size_t payload_length,
vkaverap98a2c192019-04-03 05:33:52 -050061 uint8_t *completion_code)
62{
63 if (msg == NULL || completion_code == NULL) {
64 return PLDM_ERROR_INVALID_DATA;
65 }
66
vkaverapa6575b82019-04-03 05:33:52 -050067 if (payload_length > PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES) {
68 return PLDM_ERROR_INVALID_LENGTH;
69 }
70
Zahed Hossain223a73d2019-07-04 12:46:18 -050071 *completion_code = msg->payload[0];
vkaverap98a2c192019-04-03 05:33:52 -050072
73 return PLDM_SUCCESS;
74}
75
Zahed Hossain223a73d2019-07-04 12:46:18 -050076int decode_set_state_effecter_states_req(const struct pldm_msg *msg,
vkaverapa6575b82019-04-03 05:33:52 -050077 size_t payload_length,
Sampa Misra0db1dfa2019-03-19 00:15:31 -050078 uint16_t *effecter_id,
79 uint8_t *comp_effecter_count,
80 set_effecter_state_field *field)
81{
82 if (msg == NULL || effecter_id == NULL || comp_effecter_count == NULL ||
83 field == NULL) {
84 return PLDM_ERROR_INVALID_DATA;
85 }
vkaverapa6575b82019-04-03 05:33:52 -050086
87 if (payload_length > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) {
88 return PLDM_ERROR_INVALID_LENGTH;
89 }
90
Priyanga7257fdf2019-06-10 01:59:45 -050091 struct pldm_set_state_effecter_states_req *request =
Zahed Hossain223a73d2019-07-04 12:46:18 -050092 (struct pldm_set_state_effecter_states_req *)msg->payload;
Priyanga7257fdf2019-06-10 01:59:45 -050093
94 *effecter_id = le16toh(request->effecter_id);
95 *comp_effecter_count = request->comp_effecter_count;
96 memcpy(field, request->field,
Sampa Misra0db1dfa2019-03-19 00:15:31 -050097 (sizeof(set_effecter_state_field) * (*comp_effecter_count)));
98
99 return PLDM_SUCCESS;
100}
Sampa Misra7fcfb662019-05-08 13:13:53 -0500101
102int decode_get_pdr_req(const struct pldm_msg *msg, size_t payload_length,
103 uint32_t *record_hndl, uint32_t *data_transfer_hndl,
104 uint8_t *transfer_op_flag, uint16_t *request_cnt,
105 uint16_t *record_chg_num)
106{
107 if (msg == NULL || record_hndl == NULL || data_transfer_hndl == NULL ||
108 transfer_op_flag == NULL || request_cnt == NULL ||
109 record_chg_num == NULL) {
110 return PLDM_ERROR_INVALID_DATA;
111 }
112 if (payload_length != PLDM_GET_PDR_REQ_BYTES) {
113 return PLDM_ERROR_INVALID_LENGTH;
114 }
115
116 struct pldm_get_pdr_req *request =
117 (struct pldm_get_pdr_req *)msg->payload;
118 *record_hndl = le32toh(request->record_handle);
119 *data_transfer_hndl = le32toh(request->data_transfer_handle);
120 *transfer_op_flag = request->transfer_op_flag;
121 *request_cnt = le16toh(request->request_count);
122 *record_chg_num = le16toh(request->record_change_number);
123
124 return PLDM_SUCCESS;
125}
126
127int encode_get_pdr_resp(uint8_t instance_id, uint8_t completion_code,
128 uint32_t next_record_hndl,
129 uint32_t next_data_transfer_hndl, uint8_t transfer_flag,
130 uint16_t resp_cnt, const uint8_t *record_data,
131 uint8_t transfer_crc, struct pldm_msg *msg)
132{
133 struct pldm_header_info header = {0};
134 int rc = PLDM_SUCCESS;
135
136 if (msg == NULL) {
137 return PLDM_ERROR_INVALID_DATA;
138 }
139 struct pldm_get_pdr_resp *response =
140 (struct pldm_get_pdr_resp *)msg->payload;
141
142 response->completion_code = completion_code;
143
144 header.msg_type = PLDM_RESPONSE;
145 header.instance = instance_id;
146 header.pldm_type = PLDM_PLATFORM;
147 header.command = PLDM_GET_PDR;
148 if ((rc = pack_pldm_header(&header, &(msg->hdr))) > PLDM_SUCCESS) {
149 return rc;
150 }
151
152 if (response->completion_code == PLDM_SUCCESS) {
153 response->next_record_handle = htole32(next_record_hndl);
154 response->next_data_transfer_handle =
155 htole32(next_data_transfer_hndl);
156 response->transfer_flag = transfer_flag;
157 response->response_count = htole16(resp_cnt);
158 if (record_data != NULL && resp_cnt > 0) {
159 memcpy(response->record_data, record_data, resp_cnt);
160 }
Deepak Kodihallie4b16ee2019-08-14 06:54:38 -0500161 if (transfer_flag == PLDM_END) {
162 uint8_t *dst = msg->payload;
163 dst +=
164 (sizeof(struct pldm_get_pdr_resp) - 1) + resp_cnt;
165 *dst = transfer_crc;
166 }
Sampa Misra7fcfb662019-05-08 13:13:53 -0500167 }
168
169 return PLDM_SUCCESS;
170}
George Liu820a9a52019-11-26 14:43:59 +0800171
172int encode_get_pdr_req(uint8_t instance_id, uint32_t record_hndl,
173 uint32_t data_transfer_hndl, uint8_t transfer_op_flag,
174 uint16_t request_cnt, uint16_t record_chg_num,
175 struct pldm_msg *msg, size_t payload_length)
176{
177 struct pldm_header_info header = {0};
178 int rc = PLDM_SUCCESS;
179
180 if (msg == NULL) {
181 return PLDM_ERROR_INVALID_DATA;
182 }
183 struct pldm_get_pdr_req *request =
184 (struct pldm_get_pdr_req *)msg->payload;
185
186 header.msg_type = PLDM_REQUEST;
187 header.instance = instance_id;
188 header.pldm_type = PLDM_PLATFORM;
189 header.command = PLDM_GET_PDR;
190
191 if ((rc = pack_pldm_header(&header, &(msg->hdr))) > PLDM_SUCCESS) {
192 return rc;
193 }
194
195 if (payload_length != PLDM_GET_PDR_REQ_BYTES) {
196 return PLDM_ERROR_INVALID_LENGTH;
197 }
198
199 request->record_handle = htole32(record_hndl);
200 request->data_transfer_handle = htole32(data_transfer_hndl);
201 request->transfer_op_flag = transfer_op_flag;
202 request->request_count = htole16(request_cnt);
203 request->record_change_number = htole16(record_chg_num);
204
205 return PLDM_SUCCESS;
206}
207
208int decode_get_pdr_resp(const struct pldm_msg *msg, size_t payload_length,
209 uint8_t *completion_code, uint32_t *next_record_hndl,
210 uint32_t *next_data_transfer_hndl,
211 uint8_t *transfer_flag, uint16_t *resp_cnt,
212 uint8_t *record_data, size_t record_data_length,
213 uint8_t *transfer_crc)
214{
215 if (msg == NULL || completion_code == NULL ||
216 next_record_hndl == NULL || next_data_transfer_hndl == NULL ||
217 transfer_flag == NULL || resp_cnt == NULL || record_data == NULL ||
218 transfer_crc == NULL) {
219 return PLDM_ERROR_INVALID_DATA;
220 }
221
222 *completion_code = msg->payload[0];
223 if (PLDM_SUCCESS != *completion_code) {
224 return *completion_code;
225 }
226
227 if (payload_length < PLDM_GET_PDR_MIN_RESP_BYTES) {
228 return PLDM_ERROR_INVALID_LENGTH;
229 }
230
231 struct pldm_get_pdr_resp *response =
232 (struct pldm_get_pdr_resp *)msg->payload;
233
234 *next_record_hndl = le32toh(response->next_record_handle);
235 *next_data_transfer_hndl = le32toh(response->next_data_transfer_handle);
236 *transfer_flag = response->transfer_flag;
237 *resp_cnt = le16toh(response->response_count);
238
239 if (*transfer_flag != PLDM_END &&
240 (int)payload_length != PLDM_GET_PDR_MIN_RESP_BYTES + *resp_cnt) {
241 return PLDM_ERROR_INVALID_LENGTH;
242 }
243
244 if (*transfer_flag == PLDM_END &&
245 (int)payload_length !=
246 PLDM_GET_PDR_MIN_RESP_BYTES + *resp_cnt + 1) {
247 return PLDM_ERROR_INVALID_LENGTH;
248 }
249
250 if (*resp_cnt > 0) {
251 if (record_data_length < *resp_cnt) {
252 return PLDM_ERROR_INVALID_LENGTH;
253 }
254 memcpy(record_data, response->record_data, *resp_cnt);
255 }
256
257 if (*transfer_flag == PLDM_END) {
258 *transfer_crc =
259 msg->payload[PLDM_GET_PDR_MIN_RESP_BYTES + *resp_cnt];
260 }
261
262 return PLDM_SUCCESS;
263}