/*
 * Copyright (c) 2020 Google LLC
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_INCLUDE_MGMT_EC_HOST_CMD_H_
#define ZEPHYR_INCLUDE_MGMT_EC_HOST_CMD_H_

/**
 * @brief EC Host Command Interface
 * @defgroup ec_host_cmd_periph_interface EC Host Command Interface
 * @ingroup io_interfaces
 * @{
 */

#include <stdint.h>

/**
 * @brief Arguments passed into every installed host command handler
 */
struct ec_host_cmd_handler_args {
	/** The incoming data that can be cast to the handlers request type. */
	const void *const input_buf;
	/** The number of valid bytes that can be read from @a input_buf. */
	const uint16_t input_buf_size;
	/** The data written to this buffer will be send to the host. */
	void *const output_buf;
	/** [in/out] Upon entry, this is the maximum number of bytes that can
	 *  be written to the @a output_buf. Upon exit, this should be
	 *  the number of bytes of @a output_buf to send to the host.
	 */
	uint16_t output_buf_size;
	/** The version of the host command that is being requested. This will
	 *  be a value that has been static registered as valid for the handler.
	 */
	const uint8_t version;
};

typedef enum ec_host_cmd_status (*ec_host_cmd_handler_cb)(
	struct ec_host_cmd_handler_args *args);
/**
 * @brief Structure use for statically registering host command handlers
 */
struct ec_host_cmd_handler {
	/** Callback routine to process commands that match @a id. */
	ec_host_cmd_handler_cb handler;
	/** The numberical command id used as the lookup for commands. */
	uint16_t id;
	/** The bitfield of all versions that the @a handler supports, where
	 *  each bit value represents that the @a handler supports that version.
	 *  E.g. BIT(0) corresponse to version 0.
	 */
	uint16_t version_mask;
	/** The minimum @a input_buf_size enforced by the framework before
	 *  passing to the handler.
	 */
	uint16_t min_rqt_size;
	/** The minimum @a output_buf_size enforced by the framework before
	 *  passing to the handler.
	 */
	uint16_t min_rsp_size;
};

/**
 * @def EC_HOST_CMD_HANDLER
 * @brief Statically define and register a host command handler.
 *
 * Helper macro to statically define and register a host command handler that
 * has a compile-time-fixed sizes for its both request and response structures.
 *
 * @param _function Name of handler function.
 * @param _id Id of host command to handle request for.
 * @param _version_mask The bitfield of all versions that the @a _function
 *        supports. E.g. BIT(0) corresponse to version 0.
 * @param _request_type The datatype of the request parameters for @a _function.
 * @param _response_type The datatype of the response parameters for
 *        @a _function.
 */
#define EC_HOST_CMD_HANDLER(_function, _id, _version_mask, _request_type,      \
			    _response_type)                                    \
	const Z_STRUCT_SECTION_ITERABLE(ec_host_cmd_handler, __cmd##_id) = {   \
		.id = _id,                                                     \
		.handler = _function,                                          \
		.version_mask = _version_mask,                                 \
		.min_rqt_size = sizeof(_request_type),                         \
		.min_rsp_size = sizeof(_response_type),                        \
	}

/**
 * @def EC_HOST_CMD_HANDLER_UNBOUND
 * @brief Statically define and register a host command handler without sizes.
 *
 * Helper macro to statically define and register a host command handler whose
 * request or response structure size is not known as compile time.
 *
 * @param _function Name of handler function.
 * @param _id Id of host command to handle request for.
 * @param _version_mask The bitfield of all versions that the @a _function
 *        supports. E.g. BIT(0) corresponse to version 0.
 */
#define EC_HOST_CMD_HANDLER_UNBOUND(_function, _id, _version_mask)             \
	const Z_STRUCT_SECTION_ITERABLE(ec_host_cmd_handler, __cmd##_id) = {   \
		.id = _id,                                                     \
		.handler = _function,                                          \
		.version_mask = _version_mask,                                 \
		.min_rqt_size = 0,                                             \
		.min_rsp_size = 0,                                             \
	}

/**
 * @brief Header for requests from host to embedded controller
 *
 * Represent the over-the-wire header in LE format for host command requests.
 * This represent version 3 of the host command header. The requests are always
 * sent from host to embedded controller.
 */
struct ec_host_cmd_request_header {
	/** Should be 3. The EC will return EC_HOST_CMD_INVALID_HEADER if it
	 *  receives a header with a version it doesn't know how to parse.
	 */
	uint8_t prtcl_ver;
	/** Checksum of response and data; sum of all bytes including checksum.
	 *  Should total to 0.
	 */
	uint8_t checksum;
	/** Id of command that is being sent. */
	uint16_t cmd_id;
	/** Version of the specific @a cmd_id being requested. Valid
	 *  versions start at 0.
	 */
	uint8_t cmd_ver;
	/** Unused byte in current protocol version; set to 0. */
	uint8_t reserved;
	/** Length of data which follows this header. */
	uint16_t data_len;
} __packed;

/**
 * @brief Header for responses from embedded controller to host
 *
 * Represent the over-the-wire header in LE format for host command responses.
 * This represent version 3 of the host command header. Responses are always
 * sent from embedded controller to host.
 */
struct ec_host_cmd_response_header {
	/** Should be 3. */
	uint8_t prtcl_ver;
	/** Checksum of response and data; sum of all bytes including checksum.
	 *  Should total to 0.
	 */
	uint8_t checksum;
	/** A @a ec_host_cmd_status response code for specific command. */
	uint16_t result;
	/** Length of data which follows this header. */
	uint16_t data_len;
	/** Unused bytes in current protocol version; set to 0. */
	uint16_t reserved;
} __packed;

/*
 * Host command response codes (16-bit).
 */
enum ec_host_cmd_status {
	/** Host command was successful. */
	EC_HOST_CMD_SUCCESS = 0,
	/** The specified command id is not recognized or supported. */
	EC_HOST_CMD_INVALID_COMMAND = 1,
	/** Generic Error. */
	EC_HOST_CMD_ERROR = 2,
	/** One of more of the input request parameters is invalid. */
	EC_HOST_CMD_INVALID_PARAM = 3,
	/** Host command is not permitted. */
	EC_HOST_CMD_ACCESS_DENIED = 4,
	/** Response was invalid (e.g. not version 3 of header). */
	EC_HOST_CMD_INVALID_RESPONSE = 5,
	/** Host command id version unsupported. */
	EC_HOST_CMD_INVALID_VERSION = 6,
	/** Checksum did not match */
	EC_HOST_CMD_INVALID_CHECKSUM = 7,
	/** A host command is currently being processed. */
	EC_HOST_CMD_IN_PROGRESS = 8,
	/** Requested information is currently unavailable. */
	EC_HOST_CMD_UNAVAILABLE = 9,
	/** Timeout during processing. */
	EC_HOST_CMD_TIMEOUT = 10,
	/** Data or table overflow. */
	EC_HOST_CMD_OVERFLOW = 11,
	/** Header is invalid or unsupported (e.g. not version 3 of header). */
	EC_HOST_CMD_INVALID_HEADER = 12,
	/** Did not receive all expected request data. */
	EC_HOST_CMD_REQUEST_TRUNCATED = 13,
	/** Response was too big to send within one response packet. */
	EC_HOST_CMD_RESPONSE_TOO_BIG = 14,
	/** Error on underlying communication bus. */
	EC_HOST_CMD_BUS_ERROR = 15,
	/** System busy. Should retry later. */
	EC_HOST_CMD_BUSY = 16,

	EC_HOST_CMD_MAX = UINT16_MAX /* Force enum to be 16 bits */
} __packed;

/**
 * @}
 */

#endif /* ZEPHYR_INCLUDE_MGMT_EC_HOST_CMD_H_ */
