xref: /openbmc/libpldm/src/oem/ibm/host.c (revision 37dd6a3dd78f543e29557233e3a4db2f625b1325)
1 #include "base.h"
2 #include <endian.h>
3 #include <stdint.h>
4 #include <string.h>
5 
6 #include "libpldm/host.h"
7 
8 int encode_get_alert_status_req(uint8_t instance_id, uint8_t version_id,
9 				struct pldm_msg *msg, size_t payload_length)
10 {
11 	if (msg == NULL) {
12 		return PLDM_ERROR_INVALID_LENGTH;
13 	}
14 
15 	if (payload_length != PLDM_GET_ALERT_STATUS_REQ_BYTES) {
16 		return PLDM_ERROR_INVALID_LENGTH;
17 	}
18 
19 	struct pldm_header_info header = { 0 };
20 	header.msg_type = PLDM_REQUEST;
21 	header.instance = instance_id;
22 	header.pldm_type = PLDM_OEM;
23 	header.command = PLDM_HOST_GET_ALERT_STATUS;
24 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
25 	if (rc != PLDM_SUCCESS) {
26 		return rc;
27 	}
28 
29 	msg->payload[0] = version_id;
30 
31 	return PLDM_SUCCESS;
32 }
33 
34 int decode_get_alert_status_resp(const struct pldm_msg *msg,
35 				 size_t payload_length,
36 				 uint8_t *completion_code, uint32_t *rack_entry,
37 				 uint32_t *pri_cec_node)
38 {
39 	if (msg == NULL || completion_code == NULL || rack_entry == NULL ||
40 	    pri_cec_node == NULL) {
41 		return PLDM_ERROR_INVALID_DATA;
42 	}
43 
44 	*completion_code = msg->payload[0];
45 	if (PLDM_SUCCESS != *completion_code) {
46 		return PLDM_SUCCESS;
47 	}
48 
49 	if (payload_length != PLDM_GET_ALERT_STATUS_RESP_BYTES) {
50 		return PLDM_ERROR_INVALID_LENGTH;
51 	}
52 
53 	struct pldm_get_alert_status_resp *response =
54 		(struct pldm_get_alert_status_resp *)msg->payload;
55 
56 	*rack_entry = le32toh(response->rack_entry);
57 	*pri_cec_node = le32toh(response->pri_cec_node);
58 
59 	return PLDM_SUCCESS;
60 }
61 
62 int decode_get_alert_status_req(const struct pldm_msg *msg,
63 				size_t payload_length, uint8_t *version_id)
64 {
65 	if (msg == NULL || version_id == NULL) {
66 		return PLDM_ERROR_INVALID_DATA;
67 	}
68 
69 	if (payload_length != PLDM_GET_ALERT_STATUS_REQ_BYTES) {
70 		return PLDM_ERROR_INVALID_LENGTH;
71 	}
72 
73 	*version_id = msg->payload[0];
74 
75 	return PLDM_SUCCESS;
76 }
77 
78 int encode_get_alert_status_resp(uint8_t instance_id, uint8_t completion_code,
79 				 uint32_t rack_entry, uint32_t pri_cec_node,
80 				 struct pldm_msg *msg, size_t payload_length)
81 {
82 	if (msg == NULL) {
83 		return PLDM_ERROR_INVALID_LENGTH;
84 	}
85 
86 	if (payload_length != PLDM_GET_ALERT_STATUS_RESP_BYTES) {
87 		return PLDM_ERROR_INVALID_DATA;
88 	}
89 
90 	struct pldm_header_info header = { 0 };
91 	header.msg_type = PLDM_RESPONSE;
92 	header.instance = instance_id;
93 	header.pldm_type = PLDM_OEM;
94 	header.command = PLDM_HOST_GET_ALERT_STATUS;
95 	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
96 	if (rc != PLDM_SUCCESS) {
97 		return rc;
98 	}
99 
100 	struct pldm_get_alert_status_resp *response =
101 		(struct pldm_get_alert_status_resp *)msg->payload;
102 
103 	response->completion_code = completion_code;
104 	response->rack_entry = htole32(rack_entry);
105 	response->pri_cec_node = htole32(pri_cec_node);
106 
107 	return PLDM_SUCCESS;
108 }
109