xref: /openbmc/libpldm/src/dsp/bios.c (revision 36324f6bea8c5de1e380659bb56aca5e0b8724b4)
148761c62SAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
248761c62SAndrew Jeffery #include <libpldm/base.h>
348761c62SAndrew Jeffery #include <libpldm/bios.h>
448761c62SAndrew Jeffery #include <libpldm/utils.h>
548761c62SAndrew Jeffery 
648761c62SAndrew Jeffery #include <endian.h>
748761c62SAndrew Jeffery #include <string.h>
848761c62SAndrew Jeffery 
948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_get_date_time_req(uint8_t instance_id,struct pldm_msg * msg)1048761c62SAndrew Jeffery int encode_get_date_time_req(uint8_t instance_id, struct pldm_msg *msg)
1148761c62SAndrew Jeffery {
1248761c62SAndrew Jeffery 	if (msg == NULL) {
1348761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
1448761c62SAndrew Jeffery 	}
1548761c62SAndrew Jeffery 
1648761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
1748761c62SAndrew Jeffery 	header.msg_type = PLDM_REQUEST;
1848761c62SAndrew Jeffery 	header.instance = instance_id;
1948761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
2048761c62SAndrew Jeffery 	header.command = PLDM_GET_DATE_TIME;
2148761c62SAndrew Jeffery 	return pack_pldm_header(&header, &(msg->hdr));
2248761c62SAndrew Jeffery }
2348761c62SAndrew Jeffery 
2448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_get_date_time_resp(uint8_t instance_id,uint8_t completion_code,uint8_t seconds,uint8_t minutes,uint8_t hours,uint8_t day,uint8_t month,uint16_t year,struct pldm_msg * msg)2548761c62SAndrew Jeffery int encode_get_date_time_resp(uint8_t instance_id, uint8_t completion_code,
2648761c62SAndrew Jeffery 			      uint8_t seconds, uint8_t minutes, uint8_t hours,
2748761c62SAndrew Jeffery 			      uint8_t day, uint8_t month, uint16_t year,
2848761c62SAndrew Jeffery 			      struct pldm_msg *msg)
2948761c62SAndrew Jeffery {
3048761c62SAndrew Jeffery 	if (msg == NULL) {
3148761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
3248761c62SAndrew Jeffery 	}
3348761c62SAndrew Jeffery 
3448761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
3548761c62SAndrew Jeffery 	header.msg_type = PLDM_RESPONSE;
3648761c62SAndrew Jeffery 	header.instance = instance_id;
3748761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
3848761c62SAndrew Jeffery 	header.command = PLDM_GET_DATE_TIME;
3948761c62SAndrew Jeffery 
4048761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
4148761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
4248761c62SAndrew Jeffery 		return rc;
4348761c62SAndrew Jeffery 	}
4448761c62SAndrew Jeffery 
4548761c62SAndrew Jeffery 	struct pldm_get_date_time_resp *response =
4648761c62SAndrew Jeffery 		(struct pldm_get_date_time_resp *)msg->payload;
4748761c62SAndrew Jeffery 	response->completion_code = completion_code;
4848761c62SAndrew Jeffery 	if (response->completion_code == PLDM_SUCCESS) {
4948761c62SAndrew Jeffery 		response->completion_code = completion_code;
5048761c62SAndrew Jeffery 		response->seconds = seconds;
5148761c62SAndrew Jeffery 		response->minutes = minutes;
5248761c62SAndrew Jeffery 		response->hours = hours;
5348761c62SAndrew Jeffery 		response->day = day;
5448761c62SAndrew Jeffery 		response->month = month;
5548761c62SAndrew Jeffery 		response->year = htole16(year);
5648761c62SAndrew Jeffery 	}
5748761c62SAndrew Jeffery 	return PLDM_SUCCESS;
5848761c62SAndrew Jeffery }
5948761c62SAndrew Jeffery 
6048761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_get_date_time_resp(const struct pldm_msg * msg,size_t payload_length,uint8_t * completion_code,uint8_t * seconds,uint8_t * minutes,uint8_t * hours,uint8_t * day,uint8_t * month,uint16_t * year)6148761c62SAndrew Jeffery int decode_get_date_time_resp(const struct pldm_msg *msg, size_t payload_length,
6248761c62SAndrew Jeffery 			      uint8_t *completion_code, uint8_t *seconds,
6348761c62SAndrew Jeffery 			      uint8_t *minutes, uint8_t *hours, uint8_t *day,
6448761c62SAndrew Jeffery 			      uint8_t *month, uint16_t *year)
6548761c62SAndrew Jeffery {
6648761c62SAndrew Jeffery 	if (msg == NULL || seconds == NULL || minutes == NULL ||
6748761c62SAndrew Jeffery 	    hours == NULL || day == NULL || month == NULL || year == NULL ||
6848761c62SAndrew Jeffery 	    completion_code == NULL) {
6948761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
7048761c62SAndrew Jeffery 	}
7148761c62SAndrew Jeffery 
7248761c62SAndrew Jeffery 	*completion_code = msg->payload[0];
7348761c62SAndrew Jeffery 	if (PLDM_SUCCESS != *completion_code) {
7448761c62SAndrew Jeffery 		return PLDM_SUCCESS;
7548761c62SAndrew Jeffery 	}
7648761c62SAndrew Jeffery 
7748761c62SAndrew Jeffery 	if (payload_length != PLDM_GET_DATE_TIME_RESP_BYTES) {
7848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
7948761c62SAndrew Jeffery 	}
8048761c62SAndrew Jeffery 
8148761c62SAndrew Jeffery 	struct pldm_get_date_time_resp *response =
8248761c62SAndrew Jeffery 		(struct pldm_get_date_time_resp *)msg->payload;
8348761c62SAndrew Jeffery 
8448761c62SAndrew Jeffery 	*seconds = response->seconds;
8548761c62SAndrew Jeffery 	*minutes = response->minutes;
8648761c62SAndrew Jeffery 	*hours = response->hours;
8748761c62SAndrew Jeffery 	*day = response->day;
8848761c62SAndrew Jeffery 	*month = response->month;
8948761c62SAndrew Jeffery 	*year = le16toh(response->year);
9048761c62SAndrew Jeffery 
9148761c62SAndrew Jeffery 	return PLDM_SUCCESS;
9248761c62SAndrew Jeffery }
9348761c62SAndrew Jeffery 
9448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_set_date_time_req(uint8_t instance_id,uint8_t seconds,uint8_t minutes,uint8_t hours,uint8_t day,uint8_t month,uint16_t year,struct pldm_msg * msg,size_t payload_length)9548761c62SAndrew Jeffery int encode_set_date_time_req(uint8_t instance_id, uint8_t seconds,
9648761c62SAndrew Jeffery 			     uint8_t minutes, uint8_t hours, uint8_t day,
9748761c62SAndrew Jeffery 			     uint8_t month, uint16_t year, struct pldm_msg *msg,
9848761c62SAndrew Jeffery 			     size_t payload_length)
9948761c62SAndrew Jeffery {
10048761c62SAndrew Jeffery 	if (msg == NULL) {
10148761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
10248761c62SAndrew Jeffery 	}
10348761c62SAndrew Jeffery 	if (payload_length != sizeof(struct pldm_set_date_time_req)) {
10448761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
10548761c62SAndrew Jeffery 	}
10648761c62SAndrew Jeffery 
10748761c62SAndrew Jeffery 	if (!is_time_legal(seconds, minutes, hours, day, month, year)) {
10848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
10948761c62SAndrew Jeffery 	}
11048761c62SAndrew Jeffery 
11148761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
11248761c62SAndrew Jeffery 	header.instance = instance_id;
11348761c62SAndrew Jeffery 	header.msg_type = PLDM_REQUEST;
11448761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
11548761c62SAndrew Jeffery 	header.command = PLDM_SET_DATE_TIME;
11648761c62SAndrew Jeffery 
11748761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
11848761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
11948761c62SAndrew Jeffery 		return rc;
12048761c62SAndrew Jeffery 	}
12148761c62SAndrew Jeffery 
12248761c62SAndrew Jeffery 	struct pldm_set_date_time_req *request =
12348761c62SAndrew Jeffery 		(struct pldm_set_date_time_req *)msg->payload;
12448761c62SAndrew Jeffery 	request->seconds = dec2bcd8(seconds);
12548761c62SAndrew Jeffery 	request->minutes = dec2bcd8(minutes);
12648761c62SAndrew Jeffery 	request->hours = dec2bcd8(hours);
12748761c62SAndrew Jeffery 	request->day = dec2bcd8(day);
12848761c62SAndrew Jeffery 	request->month = dec2bcd8(month);
12948761c62SAndrew Jeffery 	request->year = htole16(dec2bcd16(year));
13048761c62SAndrew Jeffery 
13148761c62SAndrew Jeffery 	return PLDM_SUCCESS;
13248761c62SAndrew Jeffery }
13348761c62SAndrew Jeffery 
13448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_set_date_time_req(const struct pldm_msg * msg,size_t payload_length,uint8_t * seconds,uint8_t * minutes,uint8_t * hours,uint8_t * day,uint8_t * month,uint16_t * year)13548761c62SAndrew Jeffery int decode_set_date_time_req(const struct pldm_msg *msg, size_t payload_length,
13648761c62SAndrew Jeffery 			     uint8_t *seconds, uint8_t *minutes, uint8_t *hours,
13748761c62SAndrew Jeffery 			     uint8_t *day, uint8_t *month, uint16_t *year)
13848761c62SAndrew Jeffery {
13948761c62SAndrew Jeffery 	if (msg == NULL || seconds == NULL || minutes == NULL ||
14048761c62SAndrew Jeffery 	    hours == NULL || day == NULL || month == NULL || year == NULL) {
14148761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
14248761c62SAndrew Jeffery 	}
14348761c62SAndrew Jeffery 	if (payload_length != sizeof(struct pldm_set_date_time_req)) {
14448761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
14548761c62SAndrew Jeffery 	}
14648761c62SAndrew Jeffery 
14748761c62SAndrew Jeffery 	const struct pldm_set_date_time_req *request =
14848761c62SAndrew Jeffery 		(struct pldm_set_date_time_req *)msg->payload;
14948761c62SAndrew Jeffery 
15048761c62SAndrew Jeffery 	*seconds = bcd2dec8(request->seconds);
15148761c62SAndrew Jeffery 	*minutes = bcd2dec8(request->minutes);
15248761c62SAndrew Jeffery 	*hours = bcd2dec8(request->hours);
15348761c62SAndrew Jeffery 	*day = bcd2dec8(request->day);
15448761c62SAndrew Jeffery 	*month = bcd2dec8(request->month);
15548761c62SAndrew Jeffery 	*year = bcd2dec16(le16toh(request->year));
15648761c62SAndrew Jeffery 
15748761c62SAndrew Jeffery 	if (!is_time_legal(*seconds, *minutes, *hours, *day, *month, *year)) {
15848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
15948761c62SAndrew Jeffery 	}
16048761c62SAndrew Jeffery 
16148761c62SAndrew Jeffery 	return PLDM_SUCCESS;
16248761c62SAndrew Jeffery }
16348761c62SAndrew Jeffery 
16448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_set_date_time_resp(uint8_t instance_id,uint8_t completion_code,struct pldm_msg * msg,size_t payload_length)16548761c62SAndrew Jeffery int encode_set_date_time_resp(uint8_t instance_id, uint8_t completion_code,
16648761c62SAndrew Jeffery 			      struct pldm_msg *msg, size_t payload_length)
16748761c62SAndrew Jeffery {
16848761c62SAndrew Jeffery 	if (msg == NULL) {
16948761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
17048761c62SAndrew Jeffery 	}
17148761c62SAndrew Jeffery 	if (payload_length != sizeof(struct pldm_only_cc_resp)) {
17248761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
17348761c62SAndrew Jeffery 	}
17448761c62SAndrew Jeffery 
17548761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
17648761c62SAndrew Jeffery 	header.instance = instance_id;
17748761c62SAndrew Jeffery 	header.msg_type = PLDM_RESPONSE;
17848761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
17948761c62SAndrew Jeffery 	header.command = PLDM_SET_DATE_TIME;
18048761c62SAndrew Jeffery 
18148761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
18248761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
18348761c62SAndrew Jeffery 		return rc;
18448761c62SAndrew Jeffery 	}
18548761c62SAndrew Jeffery 
18648761c62SAndrew Jeffery 	struct pldm_only_cc_resp *response =
18748761c62SAndrew Jeffery 		(struct pldm_only_cc_resp *)msg->payload;
18848761c62SAndrew Jeffery 	response->completion_code = completion_code;
18948761c62SAndrew Jeffery 
19048761c62SAndrew Jeffery 	return PLDM_SUCCESS;
19148761c62SAndrew Jeffery }
19248761c62SAndrew Jeffery 
19348761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_set_date_time_resp(const struct pldm_msg * msg,size_t payload_length,uint8_t * completion_code)19448761c62SAndrew Jeffery int decode_set_date_time_resp(const struct pldm_msg *msg, size_t payload_length,
19548761c62SAndrew Jeffery 			      uint8_t *completion_code)
19648761c62SAndrew Jeffery {
19748761c62SAndrew Jeffery 	if (msg == NULL || completion_code == NULL) {
19848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
19948761c62SAndrew Jeffery 	}
20048761c62SAndrew Jeffery 
20148761c62SAndrew Jeffery 	*completion_code = msg->payload[0];
20248761c62SAndrew Jeffery 	if (PLDM_SUCCESS != *completion_code) {
20348761c62SAndrew Jeffery 		return PLDM_SUCCESS;
20448761c62SAndrew Jeffery 	}
20548761c62SAndrew Jeffery 
20648761c62SAndrew Jeffery 	if (payload_length != sizeof(struct pldm_only_cc_resp)) {
20748761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
20848761c62SAndrew Jeffery 	}
20948761c62SAndrew Jeffery 
21048761c62SAndrew Jeffery 	return PLDM_SUCCESS;
21148761c62SAndrew Jeffery }
21248761c62SAndrew Jeffery 
213*36324f6bSAndrew Jeffery LIBPLDM_ABI_DEPRECATED_UNSAFE
encode_get_bios_table_resp(uint8_t instance_id,uint8_t completion_code,uint32_t next_transfer_handle,uint8_t transfer_flag,uint8_t * table_data,size_t payload_length,struct pldm_msg * msg)21448761c62SAndrew Jeffery int encode_get_bios_table_resp(uint8_t instance_id, uint8_t completion_code,
21548761c62SAndrew Jeffery 			       uint32_t next_transfer_handle,
21648761c62SAndrew Jeffery 			       uint8_t transfer_flag, uint8_t *table_data,
21748761c62SAndrew Jeffery 			       size_t payload_length, struct pldm_msg *msg)
21848761c62SAndrew Jeffery {
21948761c62SAndrew Jeffery 	if (msg == NULL) {
22048761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
22148761c62SAndrew Jeffery 	}
22248761c62SAndrew Jeffery 
22348761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
22448761c62SAndrew Jeffery 	header.msg_type = PLDM_RESPONSE;
22548761c62SAndrew Jeffery 	header.instance = instance_id;
22648761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
22748761c62SAndrew Jeffery 	header.command = PLDM_GET_BIOS_TABLE;
22848761c62SAndrew Jeffery 
22948761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
23048761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
23148761c62SAndrew Jeffery 		return rc;
23248761c62SAndrew Jeffery 	}
23348761c62SAndrew Jeffery 
23448761c62SAndrew Jeffery 	struct pldm_get_bios_table_resp *response =
23548761c62SAndrew Jeffery 		(struct pldm_get_bios_table_resp *)msg->payload;
23648761c62SAndrew Jeffery 	response->completion_code = completion_code;
23748761c62SAndrew Jeffery 	if (response->completion_code == PLDM_SUCCESS) {
23848761c62SAndrew Jeffery 		response->next_transfer_handle = htole32(next_transfer_handle);
23948761c62SAndrew Jeffery 		response->transfer_flag = transfer_flag;
24048761c62SAndrew Jeffery 		if (table_data != NULL &&
24148761c62SAndrew Jeffery 		    payload_length > (sizeof(struct pldm_msg_hdr) +
24248761c62SAndrew Jeffery 				      PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES)) {
24348761c62SAndrew Jeffery 			memcpy(response->table_data, table_data,
24448761c62SAndrew Jeffery 			       payload_length -
24548761c62SAndrew Jeffery 				       (sizeof(struct pldm_msg_hdr) +
24648761c62SAndrew Jeffery 					PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES));
24748761c62SAndrew Jeffery 		}
24848761c62SAndrew Jeffery 	}
24948761c62SAndrew Jeffery 	return PLDM_SUCCESS;
25048761c62SAndrew Jeffery }
25148761c62SAndrew Jeffery 
25248761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_get_bios_table_req(uint8_t instance_id,uint32_t transfer_handle,uint8_t transfer_op_flag,uint8_t table_type,struct pldm_msg * msg)25348761c62SAndrew Jeffery int encode_get_bios_table_req(uint8_t instance_id, uint32_t transfer_handle,
25448761c62SAndrew Jeffery 			      uint8_t transfer_op_flag, uint8_t table_type,
25548761c62SAndrew Jeffery 			      struct pldm_msg *msg)
25648761c62SAndrew Jeffery {
25748761c62SAndrew Jeffery 	if (msg == NULL) {
25848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
25948761c62SAndrew Jeffery 	}
26048761c62SAndrew Jeffery 
26148761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
26248761c62SAndrew Jeffery 	header.msg_type = PLDM_REQUEST;
26348761c62SAndrew Jeffery 	header.instance = instance_id;
26448761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
26548761c62SAndrew Jeffery 	header.command = PLDM_GET_BIOS_TABLE;
26648761c62SAndrew Jeffery 
26748761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
26848761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
26948761c62SAndrew Jeffery 		return rc;
27048761c62SAndrew Jeffery 	}
27148761c62SAndrew Jeffery 
27248761c62SAndrew Jeffery 	struct pldm_get_bios_table_req *request =
27348761c62SAndrew Jeffery 		(struct pldm_get_bios_table_req *)msg->payload;
27448761c62SAndrew Jeffery 
27548761c62SAndrew Jeffery 	request->transfer_handle = htole32(transfer_handle);
27648761c62SAndrew Jeffery 	request->transfer_op_flag = transfer_op_flag;
27748761c62SAndrew Jeffery 	request->table_type = table_type;
27848761c62SAndrew Jeffery 	return PLDM_SUCCESS;
27948761c62SAndrew Jeffery }
28048761c62SAndrew Jeffery 
28148761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_get_bios_table_req(const struct pldm_msg * msg,size_t payload_length,uint32_t * transfer_handle,uint8_t * transfer_op_flag,uint8_t * table_type)28248761c62SAndrew Jeffery int decode_get_bios_table_req(const struct pldm_msg *msg, size_t payload_length,
28348761c62SAndrew Jeffery 			      uint32_t *transfer_handle,
28448761c62SAndrew Jeffery 			      uint8_t *transfer_op_flag, uint8_t *table_type)
28548761c62SAndrew Jeffery {
28648761c62SAndrew Jeffery 	if (msg == NULL || transfer_op_flag == NULL || table_type == NULL ||
28748761c62SAndrew Jeffery 	    transfer_handle == NULL) {
28848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
28948761c62SAndrew Jeffery 	}
29048761c62SAndrew Jeffery 
29148761c62SAndrew Jeffery 	if (payload_length != PLDM_GET_BIOS_TABLE_REQ_BYTES) {
29248761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
29348761c62SAndrew Jeffery 	}
29448761c62SAndrew Jeffery 
29548761c62SAndrew Jeffery 	struct pldm_get_bios_table_req *request =
29648761c62SAndrew Jeffery 		(struct pldm_get_bios_table_req *)msg->payload;
29748761c62SAndrew Jeffery 	*transfer_handle = le32toh(request->transfer_handle);
29848761c62SAndrew Jeffery 	*transfer_op_flag = request->transfer_op_flag;
29948761c62SAndrew Jeffery 	*table_type = request->table_type;
30048761c62SAndrew Jeffery 
30148761c62SAndrew Jeffery 	return PLDM_SUCCESS;
30248761c62SAndrew Jeffery }
30348761c62SAndrew Jeffery 
30448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_get_bios_table_resp(const struct pldm_msg * msg,size_t payload_length,uint8_t * completion_code,uint32_t * next_transfer_handle,uint8_t * transfer_flag,size_t * bios_table_offset)30548761c62SAndrew Jeffery int decode_get_bios_table_resp(const struct pldm_msg *msg,
30648761c62SAndrew Jeffery 			       size_t payload_length, uint8_t *completion_code,
30748761c62SAndrew Jeffery 			       uint32_t *next_transfer_handle,
30848761c62SAndrew Jeffery 			       uint8_t *transfer_flag,
30948761c62SAndrew Jeffery 			       size_t *bios_table_offset)
31048761c62SAndrew Jeffery 
31148761c62SAndrew Jeffery {
31248761c62SAndrew Jeffery 	if (msg == NULL || transfer_flag == NULL ||
31348761c62SAndrew Jeffery 	    next_transfer_handle == NULL || completion_code == NULL) {
31448761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
31548761c62SAndrew Jeffery 	}
31648761c62SAndrew Jeffery 	if (payload_length <= PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES) {
31748761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
31848761c62SAndrew Jeffery 	}
31948761c62SAndrew Jeffery 
32048761c62SAndrew Jeffery 	struct pldm_get_bios_table_resp *response =
32148761c62SAndrew Jeffery 		(struct pldm_get_bios_table_resp *)msg->payload;
32248761c62SAndrew Jeffery 
32348761c62SAndrew Jeffery 	*completion_code = response->completion_code;
32448761c62SAndrew Jeffery 
32548761c62SAndrew Jeffery 	if (PLDM_SUCCESS != *completion_code) {
32648761c62SAndrew Jeffery 		return PLDM_SUCCESS;
32748761c62SAndrew Jeffery 	}
32848761c62SAndrew Jeffery 
32948761c62SAndrew Jeffery 	*next_transfer_handle = le32toh(response->next_transfer_handle);
33048761c62SAndrew Jeffery 	*transfer_flag = response->transfer_flag;
33148761c62SAndrew Jeffery 
33248761c62SAndrew Jeffery 	*bios_table_offset = sizeof(*completion_code) +
33348761c62SAndrew Jeffery 			     sizeof(*next_transfer_handle) +
33448761c62SAndrew Jeffery 			     sizeof(*transfer_flag);
33548761c62SAndrew Jeffery 
33648761c62SAndrew Jeffery 	return PLDM_SUCCESS;
33748761c62SAndrew Jeffery }
33848761c62SAndrew Jeffery 
33948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_get_bios_attribute_current_value_by_handle_req(uint8_t instance_id,uint32_t transfer_handle,uint8_t transfer_op_flag,uint16_t attribute_handle,struct pldm_msg * msg)34048761c62SAndrew Jeffery int encode_get_bios_attribute_current_value_by_handle_req(
34148761c62SAndrew Jeffery 	uint8_t instance_id, uint32_t transfer_handle, uint8_t transfer_op_flag,
34248761c62SAndrew Jeffery 	uint16_t attribute_handle, struct pldm_msg *msg)
34348761c62SAndrew Jeffery {
34448761c62SAndrew Jeffery 	if (msg == NULL) {
34548761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
34648761c62SAndrew Jeffery 	}
34748761c62SAndrew Jeffery 
34848761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
34948761c62SAndrew Jeffery 	header.msg_type = PLDM_REQUEST;
35048761c62SAndrew Jeffery 	header.instance = instance_id;
35148761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
35248761c62SAndrew Jeffery 	header.command = PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE;
35348761c62SAndrew Jeffery 
35448761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
35548761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
35648761c62SAndrew Jeffery 		return rc;
35748761c62SAndrew Jeffery 	}
35848761c62SAndrew Jeffery 
35948761c62SAndrew Jeffery 	struct pldm_get_bios_attribute_current_value_by_handle_req *request =
36048761c62SAndrew Jeffery 		(struct pldm_get_bios_attribute_current_value_by_handle_req *)
36148761c62SAndrew Jeffery 			msg->payload;
36248761c62SAndrew Jeffery 
36348761c62SAndrew Jeffery 	request->transfer_handle = htole32(transfer_handle);
36448761c62SAndrew Jeffery 	request->transfer_op_flag = transfer_op_flag;
36548761c62SAndrew Jeffery 	request->attribute_handle = htole16(attribute_handle);
36648761c62SAndrew Jeffery 	return PLDM_SUCCESS;
36748761c62SAndrew Jeffery }
36848761c62SAndrew Jeffery 
36948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_get_bios_attribute_current_value_by_handle_resp(const struct pldm_msg * msg,size_t payload_length,uint8_t * completion_code,uint32_t * next_transfer_handle,uint8_t * transfer_flag,struct variable_field * attribute_data)37048761c62SAndrew Jeffery int decode_get_bios_attribute_current_value_by_handle_resp(
37148761c62SAndrew Jeffery 	const struct pldm_msg *msg, size_t payload_length,
37248761c62SAndrew Jeffery 	uint8_t *completion_code, uint32_t *next_transfer_handle,
37348761c62SAndrew Jeffery 	uint8_t *transfer_flag, struct variable_field *attribute_data)
37448761c62SAndrew Jeffery {
37548761c62SAndrew Jeffery 	if (msg == NULL || transfer_flag == NULL ||
37648761c62SAndrew Jeffery 	    next_transfer_handle == NULL || completion_code == NULL) {
37748761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
37848761c62SAndrew Jeffery 	}
37948761c62SAndrew Jeffery 
38048761c62SAndrew Jeffery 	struct pldm_get_bios_attribute_current_value_by_handle_resp *response =
38148761c62SAndrew Jeffery 		(struct pldm_get_bios_attribute_current_value_by_handle_resp *)
38248761c62SAndrew Jeffery 			msg->payload;
38348761c62SAndrew Jeffery 
38448761c62SAndrew Jeffery 	*completion_code = response->completion_code;
38548761c62SAndrew Jeffery 
38648761c62SAndrew Jeffery 	if (PLDM_SUCCESS != *completion_code) {
38748761c62SAndrew Jeffery 		return PLDM_SUCCESS;
38848761c62SAndrew Jeffery 	}
38948761c62SAndrew Jeffery 
39048761c62SAndrew Jeffery 	if (payload_length <=
39148761c62SAndrew Jeffery 	    PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_MIN_RESP_BYTES) {
39248761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
39348761c62SAndrew Jeffery 	}
39448761c62SAndrew Jeffery 
39548761c62SAndrew Jeffery 	*next_transfer_handle = le32toh(response->next_transfer_handle);
39648761c62SAndrew Jeffery 	*transfer_flag = response->transfer_flag;
39748761c62SAndrew Jeffery 
39848761c62SAndrew Jeffery 	attribute_data->ptr = response->attribute_data;
39948761c62SAndrew Jeffery 	attribute_data->length = payload_length - sizeof(*response) + 1;
40048761c62SAndrew Jeffery 
40148761c62SAndrew Jeffery 	return PLDM_SUCCESS;
40248761c62SAndrew Jeffery }
40348761c62SAndrew Jeffery 
40448761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_get_bios_attribute_current_value_by_handle_req(const struct pldm_msg * msg,size_t payload_length,uint32_t * transfer_handle,uint8_t * transfer_op_flag,uint16_t * attribute_handle)40548761c62SAndrew Jeffery int decode_get_bios_attribute_current_value_by_handle_req(
40648761c62SAndrew Jeffery 	const struct pldm_msg *msg, size_t payload_length,
40748761c62SAndrew Jeffery 	uint32_t *transfer_handle, uint8_t *transfer_op_flag,
40848761c62SAndrew Jeffery 	uint16_t *attribute_handle)
40948761c62SAndrew Jeffery {
41048761c62SAndrew Jeffery 	if (msg == NULL || transfer_handle == NULL ||
41148761c62SAndrew Jeffery 	    transfer_op_flag == NULL || attribute_handle == NULL) {
41248761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
41348761c62SAndrew Jeffery 	}
41448761c62SAndrew Jeffery 
41548761c62SAndrew Jeffery 	if (payload_length != PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_REQ_BYTES) {
41648761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
41748761c62SAndrew Jeffery 	}
41848761c62SAndrew Jeffery 
41948761c62SAndrew Jeffery 	struct pldm_get_bios_attribute_current_value_by_handle_req *request =
42048761c62SAndrew Jeffery 		(struct pldm_get_bios_attribute_current_value_by_handle_req *)
42148761c62SAndrew Jeffery 			msg->payload;
42248761c62SAndrew Jeffery 	*transfer_handle = le32toh(request->transfer_handle);
42348761c62SAndrew Jeffery 	*transfer_op_flag = request->transfer_op_flag;
42448761c62SAndrew Jeffery 	*attribute_handle = le16toh(request->attribute_handle);
42548761c62SAndrew Jeffery 
42648761c62SAndrew Jeffery 	return PLDM_SUCCESS;
42748761c62SAndrew Jeffery }
42848761c62SAndrew Jeffery 
429*36324f6bSAndrew Jeffery LIBPLDM_ABI_DEPRECATED_UNSAFE
encode_get_bios_current_value_by_handle_resp(uint8_t instance_id,uint8_t completion_code,uint32_t next_transfer_handle,uint8_t transfer_flag,const uint8_t * attribute_data,size_t attribute_length,struct pldm_msg * msg)43048761c62SAndrew Jeffery int encode_get_bios_current_value_by_handle_resp(uint8_t instance_id,
43148761c62SAndrew Jeffery 						 uint8_t completion_code,
43248761c62SAndrew Jeffery 						 uint32_t next_transfer_handle,
43348761c62SAndrew Jeffery 						 uint8_t transfer_flag,
43448761c62SAndrew Jeffery 						 const uint8_t *attribute_data,
43548761c62SAndrew Jeffery 						 size_t attribute_length,
43648761c62SAndrew Jeffery 						 struct pldm_msg *msg)
43748761c62SAndrew Jeffery {
43848761c62SAndrew Jeffery 	if (msg == NULL || attribute_data == NULL) {
43948761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
44048761c62SAndrew Jeffery 	}
44148761c62SAndrew Jeffery 
44248761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
44348761c62SAndrew Jeffery 	header.msg_type = PLDM_RESPONSE;
44448761c62SAndrew Jeffery 	header.instance = instance_id;
44548761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
44648761c62SAndrew Jeffery 	header.command = PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE;
44748761c62SAndrew Jeffery 
44848761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
44948761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
45048761c62SAndrew Jeffery 		return rc;
45148761c62SAndrew Jeffery 	}
45248761c62SAndrew Jeffery 
45348761c62SAndrew Jeffery 	struct pldm_get_bios_attribute_current_value_by_handle_resp *response =
45448761c62SAndrew Jeffery 		(struct pldm_get_bios_attribute_current_value_by_handle_resp *)
45548761c62SAndrew Jeffery 			msg->payload;
45648761c62SAndrew Jeffery 	response->completion_code = completion_code;
45748761c62SAndrew Jeffery 	if (response->completion_code == PLDM_SUCCESS) {
45848761c62SAndrew Jeffery 		response->next_transfer_handle = htole32(next_transfer_handle);
45948761c62SAndrew Jeffery 		response->transfer_flag = transfer_flag;
46048761c62SAndrew Jeffery 		if (attribute_data != NULL) {
46148761c62SAndrew Jeffery 			memcpy(response->attribute_data, attribute_data,
46248761c62SAndrew Jeffery 			       attribute_length);
46348761c62SAndrew Jeffery 		}
46448761c62SAndrew Jeffery 	}
46548761c62SAndrew Jeffery 	return PLDM_SUCCESS;
46648761c62SAndrew Jeffery }
46748761c62SAndrew Jeffery 
46848761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_set_bios_attribute_current_value_req(uint8_t instance_id,uint32_t transfer_handle,uint8_t transfer_flag,const uint8_t * attribute_data,size_t attribute_length,struct pldm_msg * msg,size_t payload_length)46948761c62SAndrew Jeffery int encode_set_bios_attribute_current_value_req(
47048761c62SAndrew Jeffery 	uint8_t instance_id, uint32_t transfer_handle, uint8_t transfer_flag,
47148761c62SAndrew Jeffery 	const uint8_t *attribute_data, size_t attribute_length,
47248761c62SAndrew Jeffery 	struct pldm_msg *msg, size_t payload_length)
47348761c62SAndrew Jeffery {
47448761c62SAndrew Jeffery 	if (msg == NULL || attribute_data == NULL) {
47548761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
47648761c62SAndrew Jeffery 	}
4773b33c135SAndrew Jeffery 
4783b33c135SAndrew Jeffery 	if (payload_length < PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES) {
47948761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
48048761c62SAndrew Jeffery 	}
4813b33c135SAndrew Jeffery 
4823b33c135SAndrew Jeffery 	if (payload_length - PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES <
4833b33c135SAndrew Jeffery 	    attribute_length) {
4843b33c135SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
4853b33c135SAndrew Jeffery 	}
4863b33c135SAndrew Jeffery 
48748761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
48848761c62SAndrew Jeffery 	header.instance = instance_id;
48948761c62SAndrew Jeffery 	header.msg_type = PLDM_REQUEST;
49048761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
49148761c62SAndrew Jeffery 	header.command = PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE;
49248761c62SAndrew Jeffery 
49348761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
49448761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
49548761c62SAndrew Jeffery 		return rc;
49648761c62SAndrew Jeffery 	}
49748761c62SAndrew Jeffery 
49848761c62SAndrew Jeffery 	struct pldm_set_bios_attribute_current_value_req *request =
49948761c62SAndrew Jeffery 		(struct pldm_set_bios_attribute_current_value_req *)msg->payload;
50048761c62SAndrew Jeffery 	request->transfer_handle = htole32(transfer_handle);
50148761c62SAndrew Jeffery 	request->transfer_flag = transfer_flag;
50248761c62SAndrew Jeffery 	memcpy(request->attribute_data, attribute_data, attribute_length);
50348761c62SAndrew Jeffery 
50448761c62SAndrew Jeffery 	return PLDM_SUCCESS;
50548761c62SAndrew Jeffery }
50648761c62SAndrew Jeffery 
50748761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_set_bios_attribute_current_value_resp(const struct pldm_msg * msg,size_t payload_length,uint8_t * completion_code,uint32_t * next_transfer_handle)50848761c62SAndrew Jeffery int decode_set_bios_attribute_current_value_resp(const struct pldm_msg *msg,
50948761c62SAndrew Jeffery 						 size_t payload_length,
51048761c62SAndrew Jeffery 						 uint8_t *completion_code,
51148761c62SAndrew Jeffery 						 uint32_t *next_transfer_handle)
51248761c62SAndrew Jeffery {
51348761c62SAndrew Jeffery 	if (msg == NULL || completion_code == NULL ||
51448761c62SAndrew Jeffery 	    next_transfer_handle == NULL) {
51548761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
51648761c62SAndrew Jeffery 	}
51748761c62SAndrew Jeffery 
51848761c62SAndrew Jeffery 	*completion_code = msg->payload[0];
51948761c62SAndrew Jeffery 	if (PLDM_SUCCESS != *completion_code) {
52048761c62SAndrew Jeffery 		return PLDM_SUCCESS;
52148761c62SAndrew Jeffery 	}
52248761c62SAndrew Jeffery 
52348761c62SAndrew Jeffery 	if (payload_length != PLDM_SET_BIOS_ATTR_CURR_VAL_RESP_BYTES) {
52448761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
52548761c62SAndrew Jeffery 	}
52648761c62SAndrew Jeffery 
52748761c62SAndrew Jeffery 	struct pldm_set_bios_attribute_current_value_resp *response =
52848761c62SAndrew Jeffery 		(struct pldm_set_bios_attribute_current_value_resp *)
52948761c62SAndrew Jeffery 			msg->payload;
53048761c62SAndrew Jeffery 
53148761c62SAndrew Jeffery 	*next_transfer_handle = le32toh(response->next_transfer_handle);
53248761c62SAndrew Jeffery 
53348761c62SAndrew Jeffery 	return PLDM_SUCCESS;
53448761c62SAndrew Jeffery }
53548761c62SAndrew Jeffery 
53648761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_set_bios_attribute_current_value_req(const struct pldm_msg * msg,size_t payload_length,uint32_t * transfer_handle,uint8_t * transfer_flag,struct variable_field * attribute)53748761c62SAndrew Jeffery int decode_set_bios_attribute_current_value_req(
53848761c62SAndrew Jeffery 	const struct pldm_msg *msg, size_t payload_length,
53948761c62SAndrew Jeffery 	uint32_t *transfer_handle, uint8_t *transfer_flag,
54048761c62SAndrew Jeffery 	struct variable_field *attribute)
54148761c62SAndrew Jeffery {
54248761c62SAndrew Jeffery 	if (msg == NULL || transfer_handle == NULL || transfer_flag == NULL ||
54348761c62SAndrew Jeffery 	    attribute == NULL) {
54448761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
54548761c62SAndrew Jeffery 	}
54648761c62SAndrew Jeffery 	if (payload_length < PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES) {
54748761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
54848761c62SAndrew Jeffery 	}
54948761c62SAndrew Jeffery 
55048761c62SAndrew Jeffery 	struct pldm_set_bios_attribute_current_value_req *request =
55148761c62SAndrew Jeffery 		(struct pldm_set_bios_attribute_current_value_req *)msg->payload;
55248761c62SAndrew Jeffery 	*transfer_handle = le32toh(request->transfer_handle);
55348761c62SAndrew Jeffery 	*transfer_flag = request->transfer_flag;
55448761c62SAndrew Jeffery 	attribute->length =
55548761c62SAndrew Jeffery 		payload_length - PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES;
55648761c62SAndrew Jeffery 	attribute->ptr = request->attribute_data;
55748761c62SAndrew Jeffery 	return PLDM_SUCCESS;
55848761c62SAndrew Jeffery }
55948761c62SAndrew Jeffery 
56048761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_set_bios_attribute_current_value_resp(uint8_t instance_id,uint8_t completion_code,uint32_t next_transfer_handle,struct pldm_msg * msg)56148761c62SAndrew Jeffery int encode_set_bios_attribute_current_value_resp(uint8_t instance_id,
56248761c62SAndrew Jeffery 						 uint8_t completion_code,
56348761c62SAndrew Jeffery 						 uint32_t next_transfer_handle,
56448761c62SAndrew Jeffery 						 struct pldm_msg *msg)
56548761c62SAndrew Jeffery {
56648761c62SAndrew Jeffery 	if (msg == NULL) {
56748761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
56848761c62SAndrew Jeffery 	}
56948761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
57048761c62SAndrew Jeffery 	header.instance = instance_id;
57148761c62SAndrew Jeffery 	header.msg_type = PLDM_RESPONSE;
57248761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
57348761c62SAndrew Jeffery 	header.command = PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE;
57448761c62SAndrew Jeffery 
57548761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
57648761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
57748761c62SAndrew Jeffery 		return rc;
57848761c62SAndrew Jeffery 	}
57948761c62SAndrew Jeffery 
58048761c62SAndrew Jeffery 	struct pldm_set_bios_attribute_current_value_resp *response =
58148761c62SAndrew Jeffery 		(struct pldm_set_bios_attribute_current_value_resp *)
58248761c62SAndrew Jeffery 			msg->payload;
58348761c62SAndrew Jeffery 	response->completion_code = completion_code;
58448761c62SAndrew Jeffery 	response->next_transfer_handle = htole32(next_transfer_handle);
58548761c62SAndrew Jeffery 
58648761c62SAndrew Jeffery 	return PLDM_SUCCESS;
58748761c62SAndrew Jeffery }
58848761c62SAndrew Jeffery 
58948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_set_bios_table_req(uint8_t instance_id,uint32_t transfer_handle,uint8_t transfer_flag,uint8_t table_type,const uint8_t * table_data,size_t table_length,struct pldm_msg * msg,size_t payload_length)59048761c62SAndrew Jeffery int encode_set_bios_table_req(uint8_t instance_id, uint32_t transfer_handle,
59148761c62SAndrew Jeffery 			      uint8_t transfer_flag, uint8_t table_type,
59248761c62SAndrew Jeffery 			      const uint8_t *table_data, size_t table_length,
59348761c62SAndrew Jeffery 			      struct pldm_msg *msg, size_t payload_length)
59448761c62SAndrew Jeffery {
59548761c62SAndrew Jeffery 	if (msg == NULL || table_data == NULL) {
59648761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
59748761c62SAndrew Jeffery 	}
59848761c62SAndrew Jeffery 
59937016fefSAndrew Jeffery 	if (payload_length < PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES) {
60037016fefSAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
60137016fefSAndrew Jeffery 	}
60237016fefSAndrew Jeffery 
60337016fefSAndrew Jeffery 	if (payload_length - PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES < table_length) {
60437016fefSAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
60537016fefSAndrew Jeffery 	}
60637016fefSAndrew Jeffery 
60737016fefSAndrew Jeffery 	if (payload_length - PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES > table_length) {
60848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
60948761c62SAndrew Jeffery 	}
61048761c62SAndrew Jeffery 
61148761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
61248761c62SAndrew Jeffery 	header.instance = instance_id;
61348761c62SAndrew Jeffery 	header.msg_type = PLDM_REQUEST;
61448761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
61548761c62SAndrew Jeffery 	header.command = PLDM_SET_BIOS_TABLE;
61648761c62SAndrew Jeffery 
61748761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
61848761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
61948761c62SAndrew Jeffery 		return rc;
62048761c62SAndrew Jeffery 	}
62148761c62SAndrew Jeffery 
62248761c62SAndrew Jeffery 	struct pldm_set_bios_table_req *request =
62348761c62SAndrew Jeffery 		(struct pldm_set_bios_table_req *)msg->payload;
62448761c62SAndrew Jeffery 	request->transfer_handle = htole32(transfer_handle);
62548761c62SAndrew Jeffery 	request->transfer_flag = transfer_flag;
62648761c62SAndrew Jeffery 	request->table_type = table_type;
62748761c62SAndrew Jeffery 	memcpy(request->table_data, table_data, table_length);
62848761c62SAndrew Jeffery 
62948761c62SAndrew Jeffery 	return PLDM_SUCCESS;
63048761c62SAndrew Jeffery }
63148761c62SAndrew Jeffery 
63248761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_set_bios_table_resp(const struct pldm_msg * msg,size_t payload_length,uint8_t * completion_code,uint32_t * next_transfer_handle)63348761c62SAndrew Jeffery int decode_set_bios_table_resp(const struct pldm_msg *msg,
63448761c62SAndrew Jeffery 			       size_t payload_length, uint8_t *completion_code,
63548761c62SAndrew Jeffery 			       uint32_t *next_transfer_handle)
63648761c62SAndrew Jeffery {
63748761c62SAndrew Jeffery 	if (msg == NULL || completion_code == NULL ||
63848761c62SAndrew Jeffery 	    next_transfer_handle == NULL) {
63948761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
64048761c62SAndrew Jeffery 	}
64148761c62SAndrew Jeffery 
64248761c62SAndrew Jeffery 	*completion_code = msg->payload[0];
64348761c62SAndrew Jeffery 	if (PLDM_SUCCESS != *completion_code) {
64448761c62SAndrew Jeffery 		return PLDM_SUCCESS;
64548761c62SAndrew Jeffery 	}
64648761c62SAndrew Jeffery 
64748761c62SAndrew Jeffery 	if (payload_length != PLDM_SET_BIOS_TABLE_RESP_BYTES) {
64848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
64948761c62SAndrew Jeffery 	}
65048761c62SAndrew Jeffery 
65148761c62SAndrew Jeffery 	struct pldm_set_bios_table_resp *response =
65248761c62SAndrew Jeffery 		(struct pldm_set_bios_table_resp *)msg->payload;
65348761c62SAndrew Jeffery 
65448761c62SAndrew Jeffery 	*next_transfer_handle = le32toh(response->next_transfer_handle);
65548761c62SAndrew Jeffery 
65648761c62SAndrew Jeffery 	return PLDM_SUCCESS;
65748761c62SAndrew Jeffery }
65848761c62SAndrew Jeffery 
65948761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
encode_set_bios_table_resp(uint8_t instance_id,uint8_t completion_code,uint32_t next_transfer_handle,struct pldm_msg * msg)66048761c62SAndrew Jeffery int encode_set_bios_table_resp(uint8_t instance_id, uint8_t completion_code,
66148761c62SAndrew Jeffery 			       uint32_t next_transfer_handle,
66248761c62SAndrew Jeffery 			       struct pldm_msg *msg)
66348761c62SAndrew Jeffery {
66448761c62SAndrew Jeffery 	if (msg == NULL) {
66548761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
66648761c62SAndrew Jeffery 	}
66748761c62SAndrew Jeffery 
66848761c62SAndrew Jeffery 	struct pldm_header_info header = { 0 };
66948761c62SAndrew Jeffery 	header.instance = instance_id;
67048761c62SAndrew Jeffery 	header.msg_type = PLDM_RESPONSE;
67148761c62SAndrew Jeffery 	header.pldm_type = PLDM_BIOS;
67248761c62SAndrew Jeffery 	header.command = PLDM_SET_BIOS_TABLE;
67348761c62SAndrew Jeffery 
67448761c62SAndrew Jeffery 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
67548761c62SAndrew Jeffery 	if (rc != PLDM_SUCCESS) {
67648761c62SAndrew Jeffery 		return rc;
67748761c62SAndrew Jeffery 	}
67848761c62SAndrew Jeffery 
67948761c62SAndrew Jeffery 	struct pldm_set_bios_table_resp *response =
68048761c62SAndrew Jeffery 		(struct pldm_set_bios_table_resp *)msg->payload;
68148761c62SAndrew Jeffery 	response->completion_code = completion_code;
68248761c62SAndrew Jeffery 	response->next_transfer_handle = htole32(next_transfer_handle);
68348761c62SAndrew Jeffery 
68448761c62SAndrew Jeffery 	return PLDM_SUCCESS;
68548761c62SAndrew Jeffery }
68648761c62SAndrew Jeffery 
68748761c62SAndrew Jeffery LIBPLDM_ABI_STABLE
decode_set_bios_table_req(const struct pldm_msg * msg,size_t payload_length,uint32_t * transfer_handle,uint8_t * transfer_flag,uint8_t * table_type,struct variable_field * table)68848761c62SAndrew Jeffery int decode_set_bios_table_req(const struct pldm_msg *msg, size_t payload_length,
68948761c62SAndrew Jeffery 			      uint32_t *transfer_handle, uint8_t *transfer_flag,
69048761c62SAndrew Jeffery 			      uint8_t *table_type, struct variable_field *table)
69148761c62SAndrew Jeffery {
69248761c62SAndrew Jeffery 	if (msg == NULL || transfer_handle == NULL || transfer_flag == NULL ||
69348761c62SAndrew Jeffery 	    table_type == NULL || table == NULL) {
69448761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_DATA;
69548761c62SAndrew Jeffery 	}
69648761c62SAndrew Jeffery 
69748761c62SAndrew Jeffery 	if (payload_length < PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES) {
69848761c62SAndrew Jeffery 		return PLDM_ERROR_INVALID_LENGTH;
69948761c62SAndrew Jeffery 	}
70048761c62SAndrew Jeffery 
70148761c62SAndrew Jeffery 	struct pldm_set_bios_table_req *request =
70248761c62SAndrew Jeffery 		(struct pldm_set_bios_table_req *)msg->payload;
70348761c62SAndrew Jeffery 	*transfer_handle = le32toh(request->transfer_handle);
70448761c62SAndrew Jeffery 	*transfer_flag = request->transfer_flag;
70548761c62SAndrew Jeffery 	*table_type = request->table_type;
70648761c62SAndrew Jeffery 	table->length = payload_length - PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES;
70748761c62SAndrew Jeffery 	table->ptr = request->table_data;
70848761c62SAndrew Jeffery 
70948761c62SAndrew Jeffery 	return PLDM_SUCCESS;
71048761c62SAndrew Jeffery }
711