1691668feSPatrick Williams /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2b0c1d20aSAndrew Jeffery #include <libpldm/base.h>
3*a7989cd6SPavithra Barithaya #include <libpldm/oem/ibm/host.h>
4b0c1d20aSAndrew Jeffery
59c766792SAndrew Jeffery #include <endian.h>
69a8e4975SManojkiran Eda #include <stdint.h>
79c766792SAndrew Jeffery #include <string.h>
89c766792SAndrew Jeffery
99d2a1c6aSAndrew Jeffery LIBPLDM_ABI_STABLE
encode_get_alert_status_req(uint8_t instance_id,uint8_t version_id,struct pldm_msg * msg,size_t payload_length)109c766792SAndrew Jeffery int encode_get_alert_status_req(uint8_t instance_id, uint8_t version_id,
119c766792SAndrew Jeffery struct pldm_msg *msg, size_t payload_length)
129c766792SAndrew Jeffery {
139c766792SAndrew Jeffery if (msg == NULL) {
149c766792SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH;
159c766792SAndrew Jeffery }
169c766792SAndrew Jeffery
179c766792SAndrew Jeffery if (payload_length != PLDM_GET_ALERT_STATUS_REQ_BYTES) {
189c766792SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH;
199c766792SAndrew Jeffery }
209c766792SAndrew Jeffery
219c766792SAndrew Jeffery struct pldm_header_info header = { 0 };
229c766792SAndrew Jeffery header.msg_type = PLDM_REQUEST;
239c766792SAndrew Jeffery header.instance = instance_id;
249c766792SAndrew Jeffery header.pldm_type = PLDM_OEM;
259c766792SAndrew Jeffery header.command = PLDM_HOST_GET_ALERT_STATUS;
269c766792SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
279c766792SAndrew Jeffery if (rc != PLDM_SUCCESS) {
289c766792SAndrew Jeffery return rc;
299c766792SAndrew Jeffery }
309c766792SAndrew Jeffery
319c766792SAndrew Jeffery msg->payload[0] = version_id;
329c766792SAndrew Jeffery
339c766792SAndrew Jeffery return PLDM_SUCCESS;
349c766792SAndrew Jeffery }
359c766792SAndrew Jeffery
369d2a1c6aSAndrew Jeffery LIBPLDM_ABI_STABLE
decode_get_alert_status_resp(const struct pldm_msg * msg,size_t payload_length,uint8_t * completion_code,uint32_t * rack_entry,uint32_t * pri_cec_node)379c766792SAndrew Jeffery int decode_get_alert_status_resp(const struct pldm_msg *msg,
389c766792SAndrew Jeffery size_t payload_length,
399c766792SAndrew Jeffery uint8_t *completion_code, uint32_t *rack_entry,
409c766792SAndrew Jeffery uint32_t *pri_cec_node)
419c766792SAndrew Jeffery {
429c766792SAndrew Jeffery if (msg == NULL || completion_code == NULL || rack_entry == NULL ||
439c766792SAndrew Jeffery pri_cec_node == NULL) {
449c766792SAndrew Jeffery return PLDM_ERROR_INVALID_DATA;
459c766792SAndrew Jeffery }
469c766792SAndrew Jeffery
479c766792SAndrew Jeffery *completion_code = msg->payload[0];
489c766792SAndrew Jeffery if (PLDM_SUCCESS != *completion_code) {
499c766792SAndrew Jeffery return PLDM_SUCCESS;
509c766792SAndrew Jeffery }
519c766792SAndrew Jeffery
529c766792SAndrew Jeffery if (payload_length != PLDM_GET_ALERT_STATUS_RESP_BYTES) {
539c766792SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH;
549c766792SAndrew Jeffery }
559c766792SAndrew Jeffery
569c766792SAndrew Jeffery struct pldm_get_alert_status_resp *response =
579c766792SAndrew Jeffery (struct pldm_get_alert_status_resp *)msg->payload;
589c766792SAndrew Jeffery
599c766792SAndrew Jeffery *rack_entry = le32toh(response->rack_entry);
609c766792SAndrew Jeffery *pri_cec_node = le32toh(response->pri_cec_node);
619c766792SAndrew Jeffery
629c766792SAndrew Jeffery return PLDM_SUCCESS;
639c766792SAndrew Jeffery }
649c766792SAndrew Jeffery
659d2a1c6aSAndrew Jeffery LIBPLDM_ABI_STABLE
decode_get_alert_status_req(const struct pldm_msg * msg,size_t payload_length,uint8_t * version_id)669c766792SAndrew Jeffery int decode_get_alert_status_req(const struct pldm_msg *msg,
679c766792SAndrew Jeffery size_t payload_length, uint8_t *version_id)
689c766792SAndrew Jeffery {
699c766792SAndrew Jeffery if (msg == NULL || version_id == NULL) {
709c766792SAndrew Jeffery return PLDM_ERROR_INVALID_DATA;
719c766792SAndrew Jeffery }
729c766792SAndrew Jeffery
739c766792SAndrew Jeffery if (payload_length != PLDM_GET_ALERT_STATUS_REQ_BYTES) {
749c766792SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH;
759c766792SAndrew Jeffery }
769c766792SAndrew Jeffery
779c766792SAndrew Jeffery *version_id = msg->payload[0];
789c766792SAndrew Jeffery
799c766792SAndrew Jeffery return PLDM_SUCCESS;
809c766792SAndrew Jeffery }
819c766792SAndrew Jeffery
829d2a1c6aSAndrew Jeffery LIBPLDM_ABI_STABLE
encode_get_alert_status_resp(uint8_t instance_id,uint8_t completion_code,uint32_t rack_entry,uint32_t pri_cec_node,struct pldm_msg * msg,size_t payload_length)839c766792SAndrew Jeffery int encode_get_alert_status_resp(uint8_t instance_id, uint8_t completion_code,
849c766792SAndrew Jeffery uint32_t rack_entry, uint32_t pri_cec_node,
859c766792SAndrew Jeffery struct pldm_msg *msg, size_t payload_length)
869c766792SAndrew Jeffery {
879c766792SAndrew Jeffery if (msg == NULL) {
889c766792SAndrew Jeffery return PLDM_ERROR_INVALID_LENGTH;
899c766792SAndrew Jeffery }
909c766792SAndrew Jeffery
919c766792SAndrew Jeffery if (payload_length != PLDM_GET_ALERT_STATUS_RESP_BYTES) {
929c766792SAndrew Jeffery return PLDM_ERROR_INVALID_DATA;
939c766792SAndrew Jeffery }
949c766792SAndrew Jeffery
959c766792SAndrew Jeffery struct pldm_header_info header = { 0 };
969c766792SAndrew Jeffery header.msg_type = PLDM_RESPONSE;
979c766792SAndrew Jeffery header.instance = instance_id;
989c766792SAndrew Jeffery header.pldm_type = PLDM_OEM;
999c766792SAndrew Jeffery header.command = PLDM_HOST_GET_ALERT_STATUS;
1009c766792SAndrew Jeffery uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
1019c766792SAndrew Jeffery if (rc != PLDM_SUCCESS) {
1029c766792SAndrew Jeffery return rc;
1039c766792SAndrew Jeffery }
1049c766792SAndrew Jeffery
1059c766792SAndrew Jeffery struct pldm_get_alert_status_resp *response =
1069c766792SAndrew Jeffery (struct pldm_get_alert_status_resp *)msg->payload;
1079c766792SAndrew Jeffery
1089c766792SAndrew Jeffery response->completion_code = completion_code;
1099c766792SAndrew Jeffery response->rack_entry = htole32(rack_entry);
1109c766792SAndrew Jeffery response->pri_cec_node = htole32(pri_cec_node);
1119c766792SAndrew Jeffery
1129c766792SAndrew Jeffery return PLDM_SUCCESS;
1139c766792SAndrew Jeffery }
114