blob: 69e91932ce0726c3d62a9ce9e5dd976fbf508cad [file] [log] [blame]
/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
#include <libpldm/base.h>
#include <libpldm/oem/ibm/host.h>
#include <endian.h>
#include <stdint.h>
#include <string.h>
LIBPLDM_ABI_STABLE
int encode_get_alert_status_req(uint8_t instance_id, uint8_t version_id,
struct pldm_msg *msg, size_t payload_length)
{
if (msg == NULL) {
return PLDM_ERROR_INVALID_LENGTH;
}
if (payload_length != PLDM_GET_ALERT_STATUS_REQ_BYTES) {
return PLDM_ERROR_INVALID_LENGTH;
}
struct pldm_header_info header = { 0 };
header.msg_type = PLDM_REQUEST;
header.instance = instance_id;
header.pldm_type = PLDM_OEM;
header.command = PLDM_HOST_GET_ALERT_STATUS;
uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
if (rc != PLDM_SUCCESS) {
return rc;
}
msg->payload[0] = version_id;
return PLDM_SUCCESS;
}
LIBPLDM_ABI_STABLE
int 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)
{
if (msg == NULL || completion_code == NULL || rack_entry == NULL ||
pri_cec_node == NULL) {
return PLDM_ERROR_INVALID_DATA;
}
*completion_code = msg->payload[0];
if (PLDM_SUCCESS != *completion_code) {
return PLDM_SUCCESS;
}
if (payload_length != PLDM_GET_ALERT_STATUS_RESP_BYTES) {
return PLDM_ERROR_INVALID_LENGTH;
}
struct pldm_get_alert_status_resp *response =
(struct pldm_get_alert_status_resp *)msg->payload;
*rack_entry = le32toh(response->rack_entry);
*pri_cec_node = le32toh(response->pri_cec_node);
return PLDM_SUCCESS;
}
LIBPLDM_ABI_STABLE
int decode_get_alert_status_req(const struct pldm_msg *msg,
size_t payload_length, uint8_t *version_id)
{
if (msg == NULL || version_id == NULL) {
return PLDM_ERROR_INVALID_DATA;
}
if (payload_length != PLDM_GET_ALERT_STATUS_REQ_BYTES) {
return PLDM_ERROR_INVALID_LENGTH;
}
*version_id = msg->payload[0];
return PLDM_SUCCESS;
}
LIBPLDM_ABI_STABLE
int 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)
{
if (msg == NULL) {
return PLDM_ERROR_INVALID_LENGTH;
}
if (payload_length != PLDM_GET_ALERT_STATUS_RESP_BYTES) {
return PLDM_ERROR_INVALID_DATA;
}
struct pldm_header_info header = { 0 };
header.msg_type = PLDM_RESPONSE;
header.instance = instance_id;
header.pldm_type = PLDM_OEM;
header.command = PLDM_HOST_GET_ALERT_STATUS;
uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
if (rc != PLDM_SUCCESS) {
return rc;
}
struct pldm_get_alert_status_resp *response =
(struct pldm_get_alert_status_resp *)msg->payload;
response->completion_code = completion_code;
response->rack_entry = htole32(rack_entry);
response->pri_cec_node = htole32(pri_cec_node);
return PLDM_SUCCESS;
}