#ifndef BIOS_H
#define BIOS_H

#ifdef __cplusplus
extern "C" {
#endif

#include <asm/byteorder.h>
#include <stddef.h>
#include <stdint.h>

#include "base.h"
#include "utils.h"

/* Response lengths are inclusive of completion code */
#define PLDM_GET_DATE_TIME_RESP_BYTES 8

#define PLDM_GET_BIOS_TABLE_REQ_BYTES 6
#define PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES 6
#define PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES 5
#define PLDM_SET_BIOS_ATTR_CURR_VAL_RESP_BYTES 5
#define PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_REQ_BYTES 7
#define PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_MIN_RESP_BYTES 6

enum pldm_bios_completion_codes {
	PLDM_BIOS_TABLE_UNAVAILABLE = 0x83,
	PLDM_INVALID_BIOS_TABLE_DATA_INTEGRITY_CHECK = 0x84,
	PLDM_INVALID_BIOS_TABLE_TYPE = 0x85,
	PLDM_INVALID_BIOS_ATTR_HANDLE = 0x88,
};
enum pldm_bios_commands {
	PLDM_GET_BIOS_TABLE = 0x01,
	PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE = 0x07,
	PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE = 0x08,
	PLDM_GET_DATE_TIME = 0x0c,
	PLDM_SET_DATE_TIME = 0x0d,
};

enum pldm_bios_table_types {
	PLDM_BIOS_STRING_TABLE,
	PLDM_BIOS_ATTR_TABLE,
	PLDM_BIOS_ATTR_VAL_TABLE,
};

struct pldm_bios_string_table_entry {
	uint16_t string_handle;
	uint16_t string_length;
	char name[1];
} __attribute__((packed));

struct pldm_bios_attr_table_entry {
	uint16_t attr_handle;
	uint8_t attr_type;
	uint16_t string_handle;
	uint8_t metadata[1];
} __attribute__((packed));

struct pldm_bios_enum_attr {
	uint8_t num_possible_values;
	uint16_t indices[1];
} __attribute__((packed));

struct pldm_bios_attr_val_table_entry {
	uint16_t attr_handle;
	uint8_t attr_type;
	uint8_t value[1];
} __attribute__((packed));

enum pldm_bios_attribute_type {
	PLDM_BIOS_ENUMERATION = 0x0,
	PLDM_BIOS_STRING = 0x1,
	PLDM_BIOS_PASSWORD = 0x2,
	PLDM_BIOS_INTEGER = 0x3,
	PLDM_BIOS_ENUMERATION_READ_ONLY = 0x80,
	PLDM_BIOS_STRING_READ_ONLY = 0x81,
	PLDM_BIOS_PASSWORD_READ_ONLY = 0x82,
	PLDM_BIOS_INTEGER_READ_ONLY = 0x83,
};

/** @struct pldm_get_bios_table_req
 *
 *  structure representing GetBIOSTable request packet
 */
struct pldm_get_bios_table_req {
	uint32_t transfer_handle;
	uint8_t transfer_op_flag;
	uint8_t table_type;
} __attribute__((packed));

/** @struct pldm_get_bios_table_resp
 *
 *  structure representing GetBIOSTable response packet
 */
struct pldm_get_bios_table_resp {
	uint8_t completion_code;
	uint32_t next_transfer_handle;
	uint8_t transfer_flag;
	uint8_t table_data[1];
} __attribute__((packed));

/** @struct pldm_get_date_time_resp
 *
 *  Structure representing PLDM get date time response
 */
struct pldm_get_date_time_resp {
	uint8_t completion_code; //!< completion code
	uint8_t seconds;	 //!< Seconds in BCD format
	uint8_t minutes;	 //!< Minutes in BCD format
	uint8_t hours;		 //!< Hours in BCD format
	uint8_t day;		 //!< Day of the month in BCD format
	uint8_t month;		 //!< Month in BCD format
	uint16_t year;		 //!< Year in BCD format
} __attribute__((packed));

/** @struct pldm_set_date_time_req
 *
 *  structure representing SetDateTime request packet
 *
 */
struct pldm_set_date_time_req {
	uint8_t seconds; //!< Seconds in BCD format
	uint8_t minutes; //!< Minutes in BCD format
	uint8_t hours;	 //!< Hours in BCD format
	uint8_t day;	 //!< Day of the month in BCD format
	uint8_t month;	 //!< Month in BCD format
	uint16_t year;	 //!< Year in BCD format
} __attribute__((packed));

/** @struct pldm_only_cc_resp
 *
 *  Structure representing PLDM responses only have completion code
 */
struct pldm_only_cc_resp {
	uint8_t completion_code;
} __attribute__((packed));

/** @struct pldm_get_bios_attribute_current_value_by_handle_req
 *
 *  structure representing GetBIOSAttributeCurrentValueByHandle request packet
 */
struct pldm_get_bios_attribute_current_value_by_handle_req {
	uint32_t transfer_handle;
	uint8_t transfer_op_flag;
	uint16_t attribute_handle;
} __attribute__((packed));

/** @struct pldm_get_bios_attribute_current_value_by_handle_resp
 *
 *  structure representing GetBIOSAttributeCurrentValueByHandle response
 */
struct pldm_get_bios_attribute_current_value_by_handle_resp {
	uint8_t completion_code;
	uint32_t next_transfer_handle;
	uint8_t transfer_flag;
	uint8_t attribute_data[1];
} __attribute__((packed));

/** @struct pldm_set_bios_attribute_current_value_req
 *
 *  structure representing SetBiosAttributeCurrentValue request packet
 *
 */
struct pldm_set_bios_attribute_current_value_req {
	uint32_t transfer_handle;
	uint8_t transfer_flag;
	uint8_t attribute_data[1];
} __attribute__((packed));

/** @struct pldm_set_bios_attribute_current_value_resp
 *
 *  structure representing SetBiosCurrentValue response packet
 *
 */
struct pldm_set_bios_attribute_current_value_resp {
	uint8_t completion_code;
	uint32_t next_transfer_handle;
} __attribute__((packed));

/* Requester */

/* GetDateTime */

/** @brief Create a PLDM request message for GetDateTime
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[out] msg - Message will be written to this
 *  @return pldm_completion_codes
 *  @note  Caller is responsible for memory alloc and dealloc of param
 *         'msg.body.payload'
 */

int encode_get_date_time_req(uint8_t instance_id, struct pldm_msg *msg);

/** @brief Decode a GetDateTime response message
 *
 *  Note:
 *  * If the return value is not PLDM_SUCCESS, it represents a
 * transport layer error.
 *  * If the completion_code value is not PLDM_SUCCESS, it represents a
 * protocol layer error and all the out-parameters are invalid.
 *
 *  @param[in] msg - Response message
 *  @param[in] payload_length - Length of response message payload
 *  @param[out] completion_code - Pointer to response msg's PLDM completion code
 *  @param[out] seconds - Seconds in BCD format
 *  @param[out] minutes - minutes in BCD format
 *  @param[out] hours - hours in BCD format
 *  @param[out] day - day of month in BCD format
 *  @param[out] month - number of month in BCD format
 *  @param[out] year - year in BCD format
 *  @return pldm_completion_codes
 */
int 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);

/* SetBiosAttributeCurrentValue */

/** @brief Create a PLDM request message for SetBiosAttributeCurrentValue
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] transfer_handle - Handle to identify a BIOS table transfer
 *  @param[in] transfer_flag - Flag to indicate what part of the transfer
 * this request represents
 *  @param[in] attribute_data - Contains current value of attribute
 *  @param[in] attribute_length - Length of attribute
 *  @param[out] msg - Message will be written to this
 *  @param[in] payload_length - Length of message payload
 *  @return pldm_completion_codes
 *  @note  Caller is responsible for memory alloc and dealloc of params
 *         'msg.payload'
 */
int 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);

/** @brief Decode a SetBiosAttributeCurrentValue response message
 *
 *  Note:
 *  * If the return value is not PLDM_SUCCESS, it represents a
 * transport layer error.
 *  * If the completion_code value is not PLDM_SUCCESS, it represents a
 * protocol layer error and all the out-parameters are invalid.
 *
 *  @param[in] msg - Response message
 *  @param[in] payload_length - Length of response message payload
 *  @param[out] completion_code - Pointer to response msg's PLDM completion code
 *  @param[out] next_transfer_handle - Pointer to a handle that identify the
 *              next portion of the transfer
 *  @return pldm_completion_codes
 */
int 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);

/* Responder */

/* GetDateTime */

/** @brief Create a PLDM response message for GetDateTime
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] completion_code - PLDM completion code
 *  @param[in] seconds - seconds in BCD format
 *  @param[in] minutes - minutes in BCD format
 *  @param[in] hours - hours in BCD format
 *  @param[in] day - day of the month in BCD format
 *  @param[in] month - number of month in BCD format
 *  @param[in] year - year in BCD format
 *  @param[out] msg - Message will be written to this
 *  @return pldm_completion_codes
 *  @note  Caller is responsible for memory alloc and dealloc of param
 *         'msg.body.payload'
 */

int 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);

/* GetBIOSTable */

/** @brief Create a PLDM response message for GetBIOSTable
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] completion_code - PLDM completion code
 *  @param[in] next_transfer_handle - handle to identify the next portion of the
 * transfer
 *  @param[in] transfer_flag - To indicate what part of the transfer this
 * response represents
 *  @param[in] table_data - BIOS Table type specific data
 *  @param[in] payload_length - Length of payload message
 *  @param[out] msg - Message will be written to this
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Encode  GetBIOSTable request packet
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] transfer_handle - Handle to identify a BIOS table transfer
 *  @param[in] transfer_op_flag - Flag to indicate the start of a multipart
 *                                 transfer
 *  @param[in] table_type - BIOS table type
 *  @param[out] msg - Message will be written to this
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Decode GetBIOSTable request packet
 *
 *  @param[in] msg - Request message
 *  @param[in] payload_length - Length of request message payload
 *  @param[out] transfer_handle - Handle to identify a BIOS table transfer
 *  @param[out] transfer_op_flag - Flag to indicate the start of a multipart
 * transfer
 *  @param[out] table_type - BIOS table type
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Decode GetBIOSTable response packet
 *
 *  @param[in] msg - Response message
 *  @param[in] payload_length - Length of response message payload
 *  @param[in] completion_code - PLDM completion code
 *  @param[in] next_transfer_handle - handle to identify the next portion of the
 *                                    transfer
 *  @param[in] transfer_flag - To indicate what part of the transfer this
 *                             response represents
 *  @param[out] bios_table_offset - Offset where bios table data should be read
 *                                  in pldm msg
 *  @return pldm_completion_codes
 */
int 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);

/* GetBIOSAttributeCurrentValueByHandle */

/** @brief Decode GetBIOSAttributeCurrentValueByHandle request packet
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] transfer_handle - Handle to identify a BIOS attribute transfer
 *  @param[in] transfer_op_flag - Flag to indicate the start of a multipart
 *                                 transfer
 *  @param[in] attribute_handle - Handle to identify the BIOS attribute
 *  @param[out] msg - Message will be written to this
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Decode GetBIOSAttributeCurrentValueByHandle response packet
 *
 *  @param[in] msg - Response message
 *  @param[in] payload_length - Length of response message payload
 *  @param[out] completion_code - PLDM completion code
 *  @param[out] next_transfer_handle - handle to identify the next portion of
 * the transfer
 *  @param[out] transfer_flag - To indicate what part of the transfer this
 *                             response represents
 *  @param[out] attribute_data - contains current value of attribute
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Decode GetBIOSAttributeCurrentValueByHandle request packet
 *
 *  @param[in] msg - Request message
 *  @param[in] payload_length - Length of request message payload
 *  @param[out] transfer_handle - Handle to identify a BIOS table transfer
 *  @param[out] transfer_op_flag - Flag to indicate the start of a multipart
 * transfer
 *  @param[out] attribute_handle - Handle to identify the BIOS attribute
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Create a PLDM response message for
 * GetBIOSAttributeCurrentValueByHandle
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] completion_code - PLDM completion code
 *  @param[in] next_transfer_handle - handle to identify the next portion of the
 * transfer
 *  @param[in] transfer_flag - To indicate what part of the transfer this
 * response represents
 *  @param[in] attribute_data - contains current value of attribute
 *  @param[in] attribute_length - Length of attribute
 *  @param[out] msg - Message will be written to this
 *  @return pldm_completion_codes
 */
int 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);

/* SetBiosAttributeCurrentValue */

/** @brief Decode SetBIOSAttributeCurrentValue request packet
 *
 *  @param[in] msg - Request message
 *  @param[in] payload_length - Length of request message payload
 *  @param[out] transfer_handle - Handle to identify a BIOS table transfer
 *  @param[out] transfer_flag - Flag to indicate what part of the transfer
 *                              this request represents
 *  @param[out] attribute - Struct variable_field, contains a pointer to the
 *                          attribute field in the buffer of \p msg, \p msg must
 *                          be valid when \p attribute is used.
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Create a PLDM response message for SetBiosAttributeCurrentValue
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] completion_code - PLDM completion code
 *  @param[in] next_transfer_handle - handle to identify the next portion of the
 *  @param[out] msg - Message will be written to this
 */
int encode_set_bios_attribute_current_value_resp(uint8_t instance_id,
						 uint8_t completion_code,
						 uint32_t next_transfer_handle,
						 struct pldm_msg *msg);

/** @brief Create a PLDM request message for SetDateTime
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] seconds - Seconds in decimal format. Value range 0~59
 *  @param[in] minutes - minutes in decimal format. Value range 0~59
 *  @param[in] hours - hours in decimal format. Value range 0~23
 *  @param[in] day - day of month in decimal format. Value range 1~31
 *  @param[in] month - number of month in decimal format. Value range 1~12
 *  @param[in] year - year in decimal format. Value range 1970~
 *  @param[out] msg - Message will be written to this
 *  @param[in] payload_length - Length of request message payload
 *  @return pldm_completion_codes
 *  @note  Caller is responsible for memory alloc and dealloc of param
 *         'msg.body.payload'
 */
int 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);

/** @brief Decode a SetDateTime request message
 *
 *  @param[in] msg - Response message
 *  @param[in] payload_length - Length of request message payload
 *  @param[out] seconds - seconds in BCD format
 *  @param[out] minutes - minutes in BCD format
 *  @param[out] hours - hours in BCD format
 *  @param[out] day - day of the month in BCD format
 *  @param[out] month - number of month in BCD format
 *  @param[out] year - year in BCD format
 *  @return pldm_completion_codes
 */
int 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);

/** @brief Create a PLDM response message for SetDateTime
 *
 *  @param[in] instance_id - Message's instance id
 *  @param[in] completion_code - PLDM completion code
 *  @param[out] msg - Message will be written to this
 *  @param[in] payload_length - Length of response message payload
 *  @return pldm_completion_codes
 *  @note  Caller is responsible for memory alloc and dealloc of param
 *         'msg.body.payload'
 */
int encode_set_date_time_resp(uint8_t instance_id, uint8_t completion_code,
			      struct pldm_msg *msg, size_t payload_length);

/** @brief Decode a SetDateTime response message
 *
 *  Note:
 *  * If the return value is not PLDM_SUCCESS, it represents a
 * transport layer error.
 *  * If the completion_code value is not PLDM_SUCCESS, it represents a
 * protocol layer error and all the out-parameters are invalid.
 *
 *  @param[in] msg - Response message
 *  @param[in] payload_length - Length of response message payload
 *  @param[out] completion_code - Pointer to response msg's PLDM completion code
 *  @return pldm_completion_codes
 */
int decode_set_date_time_resp(const struct pldm_msg *msg, size_t payload_length,
			      uint8_t *completion_code);

#ifdef __cplusplus
}
#endif

#endif /* BIOS_H */
