#ifndef BIOS_H
#define BIOS_H

#ifdef __cplusplus
extern "C" {
#endif

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

#include "base.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] 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_data - Contains current value of attribute
 *  @param[out] attribute_length - Pointer to length of attribute
 *  @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,
						uint8_t *attribute_data,
						size_t *attribute_length);

/** @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 */
