| /* |
| * Copyright (c) 2020 Google LLC |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_EC_HOST_CMD_H_ |
| #define ZEPHYR_INCLUDE_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_EC_HOST_CMD_H_ */ |