<p>Duncan Laurie has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/20425">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ec/google/chromeec: Sync header with Chromium EC codebase<br><br>Update this header from the upstream source so new host<br>commands can be used in coreboot.<br><br>BUG=b:30624430<br>TEST=build google/* and intel* boards<br><br>Change-Id: I56c9f891262d8984b6a9a69d96752c2dd6bb2371<br>Signed-off-by: Duncan Laurie <dlaurie@chromium.org><br>---<br>M src/ec/google/chromeec/ec_commands.h<br>1 file changed, 1,218 insertions(+), 566 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/25/20425/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/ec/google/chromeec/ec_commands.h b/src/ec/google/chromeec/ec_commands.h<br>index ec404f0..3e093f6 100644<br>--- a/src/ec/google/chromeec/ec_commands.h<br>+++ b/src/ec/google/chromeec/ec_commands.h<br>@@ -31,6 +31,19 @@<br> #ifndef __CROS_EC_EC_COMMANDS_H<br> #define __CROS_EC_EC_COMMANDS_H<br> <br>+#ifndef __ACPI__<br>+#include <stdint.h><br>+#endif<br>+<br>+/*<br>+ * Include common.h for CONFIG_HOSTCMD_ALIGNED, if it's defined. This<br>+ * generates more efficient code for accessing request/response structures on<br>+ * ARM Cortex-M if the structures are guaranteed 32-bit aligned.<br>+ */<br>+#ifdef CHROMIUM_EC<br>+#include "common.h"<br>+#endif<br>+<br> /*<br> * Current version of this protocol<br> *<br>@@ -219,7 +232,7 @@<br> * - Wait for EC_LPC_CMDR_DATA bit to set<br> * - Read value from EC_LPC_ADDR_ACPI_DATA<br> */<br>-#define EC_CMD_ACPI_READ 0x80<br>+#define EC_CMD_ACPI_READ 0x0080<br> <br> /*<br> * ACPI Write Embedded Controller<br>@@ -234,7 +247,7 @@<br> * - Wait for EC_LPC_CMDR_PENDING bit to clear<br> * - Write value to EC_LPC_ADDR_ACPI_DATA<br> */<br>-#define EC_CMD_ACPI_WRITE 0x81<br>+#define EC_CMD_ACPI_WRITE 0x0081<br> <br> /*<br> * ACPI Burst Enable Embedded Controller<br>@@ -243,7 +256,7 @@<br> * commands back-to-back. While in this mode, writes to mapped multi-byte<br> * data are locked out to ensure data consistency.<br> */<br>-#define EC_CMD_ACPI_BURST_ENABLE 0x82<br>+#define EC_CMD_ACPI_BURST_ENABLE 0x0082<br> <br> /*<br> * ACPI Burst Disable Embedded Controller<br>@@ -251,7 +264,7 @@<br> * This disables burst mode on the EC and stops preventing EC writes to mapped<br> * multi-byte data.<br> */<br>-#define EC_CMD_ACPI_BURST_DISABLE 0x83<br>+#define EC_CMD_ACPI_BURST_DISABLE 0x0083<br> <br> /*<br> * ACPI Query Embedded Controller<br>@@ -260,7 +273,7 @@<br> * sets the result code to the 1-based index of the bit (event 0x00000001 = 1,<br> * event 0x80000000 = 32), or 0 if no event was pending.<br> */<br>-#define EC_CMD_ACPI_QUERY_EVENT 0x84<br>+#define EC_CMD_ACPI_QUERY_EVENT 0x0084<br> <br> /* Valid addresses in ACPI memory space, for read/write commands */<br> <br>@@ -327,12 +340,13 @@<br> #define EC_ACPI_MEM_CHARGING_LIMIT_STEP_MA 64<br> /* Value to disable DPTF battery charging limit */<br> #define EC_ACPI_MEM_CHARGING_LIMIT_DISABLED 0xff<br>+<br> /*<br> * Report device orientation<br>- * bit 0 device is tablet mode<br>+ * bit 0 device is tablet mode<br> */<br>-#define EC_ACPI_MEM_DEVICE_ORIENTATION 0x09<br>-#define EC_ACPI_MEM_DEVICE_TABLET_MODE 0x01<br>+#define EC_ACPI_MEM_DEVICE_ORIENTATION 0x09<br>+#define EC_ACPI_MEM_DEVICE_TABLET_MODE 0x01<br> <br> /*<br> * ACPI addresses 0x20 - 0xff map to EC_MEMMAP offset 0x00 - 0xdf. This data<br>@@ -352,8 +366,6 @@<br> */<br> #ifndef __ACPI__<br> <br>-#include <stdint.h><br>-<br> /*<br> * Define __packed if someone hasn't beat us to it. Linux kernel style<br> * checking prefers __packed over __attribute__((packed)).<br>@@ -361,6 +373,92 @@<br> #ifndef __packed<br> #define __packed __attribute__((packed))<br> #endif<br>+<br>+#ifndef __aligned<br>+#define __aligned(x) __attribute__((aligned(x)))<br>+#endif<br>+<br>+/*<br>+ * Attributes for EC request and response packets. Just defining __packed<br>+ * results in inefficient assembly code on ARM, if the structure is actually<br>+ * 32-bit aligned, as it should be for all buffers.<br>+ *<br>+ * Be very careful when adding these to existing structures. They will round<br>+ * up the structure size to the specified boundary.<br>+ *<br>+ * Also be very careful to make that if a structure is included in some other<br>+ * parent structure that the alignment will still be true given the packing of<br>+ * the parent structure. This is particularly important if the sub-structure<br>+ * will be passed as a pointer to another function, since that function will<br>+ * not know about the misaligment caused by the parent structure's packing.<br>+ *<br>+ * Also be very careful using __packed - particularly when nesting non-packed<br>+ * structures inside packed ones. In fact, DO NOT use __packed directly;<br>+ * always use one of these attributes.<br>+ *<br>+ * Once everything is annotated properly, the following search strings should<br>+ * not return ANY matches in this file other than right here:<br>+ *<br>+ * "__packed" - generates inefficient code; all sub-structs must also be packed<br>+ *<br>+ * "struct [^_]" - all structs should be annotated, except for structs that are<br>+ * members of other structs/unions (and their original declarations should be<br>+ * annotated).<br>+ */<br>+#ifdef CONFIG_HOSTCMD_ALIGNED<br>+<br>+/*<br>+ * Packed structures where offset and size are always aligned to 1, 2, or 4<br>+ * byte boundary.<br>+ */<br>+#define __ec_align1 __packed<br>+#define __ec_align2 __packed __aligned(2)<br>+#define __ec_align4 __packed __aligned(4)<br>+<br>+/*<br>+ * Packed structure which must be under-aligned, because its size is not a<br>+ * 4-byte multiple. This is sub-optimal because it forces byte-wise access<br>+ * of all multi-byte fields in it, even though they are themselves aligned.<br>+ *<br>+ * In theory, we could duplicate the structure with __aligned(4) for accessing<br>+ * its members, but use the __packed version for sizeof().<br>+ */<br>+#define __ec_align_size1 __packed<br>+<br>+/*<br>+ * Packed structure which must be under-aligned, because its offset inside a<br>+ * parent structure is not a 4-byte multiple.<br>+ */<br>+#define __ec_align_offset1 __packed<br>+#define __ec_align_offset2 __packed __aligned(2)<br>+<br>+/*<br>+ * Structures which are complicated enough that I'm skipping them on the first<br>+ * pass. They are effectively unchanged from their previous definitions.<br>+ *<br>+ * TODO(rspangler): Figure out what to do with these. It's likely necessary<br>+ * to work out the size and offset of each member and add explicit padding to<br>+ * maintain those.<br>+ */<br>+#define __ec_todo_packed __packed<br>+#define __ec_todo_unpacked<br>+<br>+#else /* !CONFIG_HOSTCMD_ALIGNED */<br>+<br>+/*<br>+ * Packed structures make no assumption about alignment, so they do inefficient<br>+ * byte-wise reads.<br>+ */<br>+#define __ec_align1 __packed<br>+#define __ec_align2 __packed<br>+#define __ec_align4 __packed<br>+#define __ec_align_size1 __packed<br>+#define __ec_align_offset1 __packed<br>+#define __ec_align_offset2 __packed<br>+#define __ec_todo_packed __packed<br>+#define __ec_todo_unpacked<br>+<br>+#endif /* !CONFIG_HOSTCMD_ALIGNED */<br> <br> /* LPC command status byte masks */<br> /* EC has written a byte in the data register and host hasn't read it yet */<br>@@ -387,7 +485,9 @@<br> #define EC_LPC_STATUS_BUSY_MASK \<br> (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING)<br> <br>-/* Host command response codes */<br>+/* Host command response codes (16-bit). Note that response codes should be<br>+ * stored in a uint16_t rather than directly in a value of this type.<br>+ */<br> enum ec_status {<br> EC_RES_SUCCESS = 0,<br> EC_RES_INVALID_COMMAND = 1,<br>@@ -404,8 +504,8 @@<br> EC_RES_INVALID_HEADER = 12, /* Header contains invalid data */<br> EC_RES_REQUEST_TRUNCATED = 13, /* Didn't get the entire request */<br> EC_RES_RESPONSE_TOO_BIG = 14, /* Response was too big to handle */<br>- EC_RES_BUS_ERROR = 15, /* Communications bus error */<br>- EC_RES_BUSY = 16 /* Up but too busy. Should retry */<br>+ EC_RES_BUS_ERROR = 15, /* Communications bus error */<br>+ EC_RES_BUSY = 16 /* Up but too busy. Should retry */<br> };<br> <br> /*<br>@@ -425,7 +525,8 @@<br> EC_HOST_EVENT_BATTERY_CRITICAL = 7,<br> EC_HOST_EVENT_BATTERY = 8,<br> EC_HOST_EVENT_THERMAL_THRESHOLD = 9,<br>- EC_HOST_EVENT_THERMAL_OVERLOAD = 10,<br>+ /* Event generated by a device attached to the EC */<br>+ EC_HOST_EVENT_DEVICE = 10,<br> EC_HOST_EVENT_THERMAL = 11,<br> EC_HOST_EVENT_USB_CHARGER = 12,<br> EC_HOST_EVENT_KEY_PRESSED = 13,<br>@@ -499,7 +600,7 @@<br> #define EC_HOST_EVENT_MASK(event_code) (1UL << ((event_code) - 1))<br> <br> /* Arguments at EC_LPC_ADDR_HOST_ARGS */<br>-struct ec_lpc_host_args {<br>+struct __ec_align4 ec_lpc_host_args {<br> uint8_t flags;<br> uint8_t command_version;<br> uint8_t data_size;<br>@@ -508,7 +609,7 @@<br> * all params/response data bytes.<br> */<br> uint8_t checksum;<br>-} __packed;<br>+};<br> <br> /* Flags for ec_lpc_host_args.flags */<br> /*<br>@@ -518,7 +619,7 @@<br> * If EC gets a command and this flag is not set, this is an old-style command.<br> * Command version is 0 and params from host are at EC_LPC_ADDR_OLD_PARAM with<br> * unknown length. EC must respond with an old-style response (that is,<br>- * withouth setting EC_HOST_ARGS_FLAG_TO_HOST).<br>+ * without setting EC_HOST_ARGS_FLAG_TO_HOST).<br> */<br> #define EC_HOST_ARGS_FLAG_FROM_HOST 0x01<br> /*<br>@@ -661,8 +762,8 @@<br> #define EC_HOST_REQUEST_VERSION 3<br> <br> /* Version 3 request from host */<br>-struct ec_host_request {<br>- /* Struct version (=3)<br>+struct __ec_align4 ec_host_request {<br>+ /* Structure version (=3)<br> *<br> * EC will return EC_RES_INVALID_HEADER if it receives a header with a<br> * version it doesn't know how to parse.<br>@@ -686,13 +787,13 @@<br> <br> /* Length of data which follows this header */<br> uint16_t data_len;<br>-} __packed;<br>+};<br> <br> #define EC_HOST_RESPONSE_VERSION 3<br> <br> /* Version 3 response from EC */<br>-struct ec_host_response {<br>- /* Struct version (=3) */<br>+struct __ec_align4 ec_host_response {<br>+ /* Structure version (=3) */<br> uint8_t struct_version;<br> <br> /*<br>@@ -709,18 +810,21 @@<br> <br> /* Unused bytes in current protocol version; set to 0 */<br> uint16_t reserved;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /*<br> * Notes on commands:<br> *<br> * Each command is an 16-bit command value. Commands which take params or<br>- * return response data specify structs for that data. If no struct is<br>+ * return response data specify structures for that data. If no structure is<br> * specified, the command does not input or output data, respectively.<br> * Parameter/response length is implicit in the structs. Some underlying<br> * communication protocols (I2C, SPI) may add length or checksum headers, but<br> * those are implementation-dependent and not defined here.<br>+ *<br>+ * All commands MUST be #defined to be 4-digit UPPER CASE hex values<br>+ * (e.g., 0x00AB, not 0xab) for CONFIG_HOSTCMD_SECTION_SORTED to work.<br> */<br> <br> /*****************************************************************************/<br>@@ -730,28 +834,28 @@<br> * Get protocol version, used to deal with non-backward compatible protocol<br> * changes.<br> */<br>-#define EC_CMD_PROTO_VERSION 0x00<br>+#define EC_CMD_PROTO_VERSION 0x0000<br> <br>-struct ec_response_proto_version {<br>+struct __ec_align4 ec_response_proto_version {<br> uint32_t version;<br>-} __packed;<br>+};<br> <br> /*<br> * Hello. This is a simple command to test the EC is responsive to<br> * commands.<br> */<br>-#define EC_CMD_HELLO 0x01<br>+#define EC_CMD_HELLO 0x0001<br> <br>-struct ec_params_hello {<br>+struct __ec_align4 ec_params_hello {<br> uint32_t in_data; /* Pass anything here */<br>-} __packed;<br>+};<br> <br>-struct ec_response_hello {<br>+struct __ec_align4 ec_response_hello {<br> uint32_t out_data; /* Output will be in_data + 0x01020304 */<br>-} __packed;<br>+};<br> <br> /* Get version number */<br>-#define EC_CMD_GET_VERSION 0x02<br>+#define EC_CMD_GET_VERSION 0x0002<br> <br> enum ec_current_image {<br> EC_IMAGE_UNKNOWN = 0,<br>@@ -759,49 +863,49 @@<br> EC_IMAGE_RW<br> };<br> <br>-struct ec_response_get_version {<br>+struct __ec_align4 ec_response_get_version {<br> /* Null-terminated version strings for RO, RW */<br> char version_string_ro[32];<br> char version_string_rw[32];<br> char reserved[32]; /* Was previously RW-B string */<br> uint32_t current_image; /* One of ec_current_image */<br>-} __packed;<br>+};<br> <br> /* Read test */<br>-#define EC_CMD_READ_TEST 0x03<br>+#define EC_CMD_READ_TEST 0x0003<br> <br>-struct ec_params_read_test {<br>+struct __ec_align4 ec_params_read_test {<br> uint32_t offset; /* Starting value for read buffer */<br> uint32_t size; /* Size to read in bytes */<br>-} __packed;<br>+};<br> <br>-struct ec_response_read_test {<br>+struct __ec_align4 ec_response_read_test {<br> uint32_t data[32];<br>-} __packed;<br>+};<br> <br> /*<br> * Get build information<br> *<br> * Response is null-terminated string.<br> */<br>-#define EC_CMD_GET_BUILD_INFO 0x04<br>+#define EC_CMD_GET_BUILD_INFO 0x0004<br> <br> /* Get chip info */<br>-#define EC_CMD_GET_CHIP_INFO 0x05<br>+#define EC_CMD_GET_CHIP_INFO 0x0005<br> <br>-struct ec_response_get_chip_info {<br>+struct __ec_align4 ec_response_get_chip_info {<br> /* Null-terminated strings */<br> char vendor[32];<br> char name[32];<br> char revision[32]; /* Mask version */<br>-} __packed;<br>+};<br> <br> /* Get board HW version */<br>-#define EC_CMD_GET_BOARD_VERSION 0x06<br>+#define EC_CMD_GET_BOARD_VERSION 0x0006<br> <br>-struct ec_response_board_version {<br>+struct __ec_align2 ec_response_board_version {<br> uint16_t board_version; /* A monotonously incrementing number. */<br>-} __packed;<br>+};<br> <br> /*<br> * Read memory-mapped data.<br>@@ -811,73 +915,73 @@<br> *<br> * Response is params.size bytes of data.<br> */<br>-#define EC_CMD_READ_MEMMAP 0x07<br>+#define EC_CMD_READ_MEMMAP 0x0007<br> <br>-struct ec_params_read_memmap {<br>+struct __ec_align1 ec_params_read_memmap {<br> uint8_t offset; /* Offset in memmap (EC_MEMMAP_*) */<br> uint8_t size; /* Size to read in bytes */<br>-} __packed;<br>+};<br> <br> /* Read versions supported for a command */<br>-#define EC_CMD_GET_CMD_VERSIONS 0x08<br>+#define EC_CMD_GET_CMD_VERSIONS 0x0008<br> <br>-struct ec_params_get_cmd_versions {<br>+struct __ec_align1 ec_params_get_cmd_versions {<br> uint8_t cmd; /* Command to check */<br>-} __packed;<br>+};<br> <br>-struct ec_params_get_cmd_versions_v1 {<br>+struct __ec_align2 ec_params_get_cmd_versions_v1 {<br> uint16_t cmd; /* Command to check */<br>-} __packed;<br>+};<br> <br>-struct ec_response_get_cmd_versions {<br>+struct __ec_align4 ec_response_get_cmd_versions {<br> /*<br> * Mask of supported versions; use EC_VER_MASK() to compare with a<br> * desired version.<br> */<br> uint32_t version_mask;<br>-} __packed;<br>+};<br> <br> /*<br>- * Check EC communcations status (busy). This is needed on i2c/spi but not<br>+ * Check EC communications status (busy). This is needed on i2c/spi but not<br> * on lpc since it has its own out-of-band busy indicator.<br> *<br> * lpc must read the status from the command register. Attempting this on<br> * lpc will overwrite the args/parameter space and corrupt its data.<br> */<br>-#define EC_CMD_GET_COMMS_STATUS 0x09<br>+#define EC_CMD_GET_COMMS_STATUS 0x0009<br> <br> /* Avoid using ec_status which is for return values */<br> enum ec_comms_status {<br> EC_COMMS_STATUS_PROCESSING = 1 << 0, /* Processing cmd */<br> };<br> <br>-struct ec_response_get_comms_status {<br>+struct __ec_align4 ec_response_get_comms_status {<br> uint32_t flags; /* Mask of enum ec_comms_status */<br>-} __packed;<br>+};<br> <br> /* Fake a variety of responses, purely for testing purposes. */<br>-#define EC_CMD_TEST_PROTOCOL 0x0a<br>+#define EC_CMD_TEST_PROTOCOL 0x000A<br> <br> /* Tell the EC what to send back to us. */<br>-struct ec_params_test_protocol {<br>+struct __ec_align4 ec_params_test_protocol {<br> uint32_t ec_result;<br> uint32_t ret_len;<br> uint8_t buf[32];<br>-} __packed;<br>+};<br> <br> /* Here it comes... */<br>-struct ec_response_test_protocol {<br>+struct __ec_align4 ec_response_test_protocol {<br> uint8_t buf[32];<br>-} __packed;<br>+};<br> <br>-/* Get prococol information */<br>-#define EC_CMD_GET_PROTOCOL_INFO 0x0b<br>+/* Get protocol information */<br>+#define EC_CMD_GET_PROTOCOL_INFO 0x000B<br> <br> /* Flags for ec_response_get_protocol_info.flags */<br> /* EC_RES_IN_PROGRESS may be returned if a command is slow */<br> #define EC_PROTOCOL_INFO_IN_PROGRESS_SUPPORTED (1 << 0)<br> <br>-struct ec_response_get_protocol_info {<br>+struct __ec_align4 ec_response_get_protocol_info {<br> /* Fields which exist if at least protocol version 3 supported */<br> <br> /* Bitmask of protocol versions supported (1 << n means version n)*/<br>@@ -891,7 +995,7 @@<br> <br> /* Flags; see EC_PROTOCOL_INFO_* */<br> uint32_t flags;<br>-} __packed;<br>+};<br> <br> <br> /*****************************************************************************/<br>@@ -904,22 +1008,22 @@<br> meaning for an individual command. */<br> #define EC_GSV_PARAM_MASK 0x00ffffff<br> <br>-struct ec_params_get_set_value {<br>+struct __ec_align4 ec_params_get_set_value {<br> uint32_t flags;<br> uint32_t value;<br>-} __packed;<br>+};<br> <br>-struct ec_response_get_set_value {<br>+struct __ec_align4 ec_response_get_set_value {<br> uint32_t flags;<br> uint32_t value;<br>-} __packed;<br>+};<br> <br> /* More than one command can use these structs to get/set parameters. */<br>-#define EC_CMD_GSV_PAUSE_IN_S5 0x0c<br>+#define EC_CMD_GSV_PAUSE_IN_S5 0x000C<br> <br> /*****************************************************************************/<br> /* List the features supported by the firmware */<br>-#define EC_CMD_GET_FEATURES 0x0d<br>+#define EC_CMD_GET_FEATURES 0x000D<br> <br> /* Supported features */<br> enum ec_feature_code {<br>@@ -982,7 +1086,7 @@<br> * (Common Smart Battery System Interface Specification)<br> */<br> EC_FEATURE_SMART_BATTERY = 18,<br>- /* EC can dectect when the host hangs. */<br>+ /* EC can detect when the host hangs. */<br> EC_FEATURE_HANG_DETECT = 19,<br> /* Report power information, for pit only */<br> EC_FEATURE_PMU = 20,<br>@@ -996,22 +1100,35 @@<br> EC_FEATURE_MOTION_SENSE_FIFO = 24,<br> /* Support temporary secure vstore */<br> EC_FEATURE_VSTORE = 25,<br>+ /* EC decides on USB-C SS mux state, muxes configured by host */<br>+ EC_FEATURE_USBC_SS_MUX_VIRTUAL = 26,<br>+ /* EC has RTC feature that can be controlled by host commands */<br>+ EC_FEATURE_RTC = 27,<br>+ /* The MCU exposes a Fingerprint sensor */<br>+ EC_FEATURE_FINGERPRINT = 28,<br>+ /* The MCU exposes a Touchpad */<br>+ EC_FEATURE_TOUCHPAD = 29,<br>+ /* The MCU has RWSIG task enabled */<br>+ EC_FEATURE_RWSIG = 30,<br>+ /* EC has device events support */<br>+ EC_FEATURE_DEVICE_EVENT = 31,<br> };<br> <br> #define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32))<br> #define EC_FEATURE_MASK_1(event_code) (1UL << (event_code - 32))<br>-struct ec_response_get_features {<br>+struct __ec_align4 ec_response_get_features {<br> uint32_t flags[2];<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Flash commands */<br> <br> /* Get flash info */<br>-#define EC_CMD_FLASH_INFO 0x10<br>+#define EC_CMD_FLASH_INFO 0x0010<br>+#define EC_VER_FLASH_INFO 2<br> <br> /* Version 0 returns these fields */<br>-struct ec_response_flash_info {<br>+struct __ec_align4 ec_response_flash_info {<br> /* Usable flash size, in bytes */<br> uint32_t flash_size;<br> /*<br>@@ -1029,7 +1146,7 @@<br> * multiple of this.<br> */<br> uint32_t protect_block_size;<br>-} __packed;<br>+};<br> <br> /* Flags for version 1+ flash info command */<br> /* EC flash erases bits to 0 instead of 1 */<br>@@ -1040,9 +1157,16 @@<br> * fields following.<br> *<br> * gcc anonymous structs don't seem to get along with the __packed directive;<br>- * if they did we'd define the version 0 struct as a sub-struct of this one.<br>+ * if they did we'd define the version 0 structure as a sub-structure of this<br>+ * one.<br>+ *<br>+ * Version 2 supports flash banks of different sizes:<br>+ * The caller specified the number of banks it has preallocated<br>+ * (num_banks_desc)<br>+ * The EC returns the number of banks describing the flash memory.<br>+ * It adds banks descriptions up to num_banks_desc.<br> */<br>-struct ec_response_flash_info_1 {<br>+struct __ec_align4 ec_response_flash_info_1 {<br> /* Version 0 fields; see above for description */<br> uint32_t flash_size;<br> uint32_t write_block_size;<br>@@ -1060,40 +1184,112 @@<br> <br> /* Flags; see EC_FLASH_INFO_* */<br> uint32_t flags;<br>-} __packed;<br>+};<br>+<br>+struct __ec_align4 ec_params_flash_info_2 {<br>+ /* Number of banks to describe */<br>+ uint16_t num_banks_desc;<br>+ /* Reserved; set 0; ignore on read */<br>+ uint8_t reserved[2];<br>+};<br>+<br>+struct ec_flash_bank {<br>+ /* Number of sector is in this bank. */<br>+ uint16_t count;<br>+ /* Size in power of 2 of each sector (8 --> 256 bytes) */<br>+ uint8_t size_exp;<br>+ /* Minimal write size for the sectors in this bank */<br>+ uint8_t write_size_exp;<br>+ /* Erase size for the sectors in this bank */<br>+ uint8_t erase_size_exp;<br>+ /* Size for write protection, usually identical to erase size. */<br>+ uint8_t protect_size_exp;<br>+ /* Reserved; set 0; ignore on read */<br>+ uint8_t reserved[2];<br>+};<br>+<br>+struct __ec_align4 ec_response_flash_info_2 {<br>+ /* Total flash in the EC. */<br>+ uint32_t flash_size;<br>+ /* Flags; see EC_FLASH_INFO_* */<br>+ uint32_t flags;<br>+ /* Maximum size to use to send data to write to the EC. */<br>+ uint32_t write_ideal_size;<br>+ /* Number of banks present in the EC. */<br>+ uint16_t num_banks_total;<br>+ /* Number of banks described in banks array. */<br>+ uint16_t num_banks_desc;<br>+ struct ec_flash_bank banks[0];<br>+};<br> <br> /*<br> * Read flash<br> *<br> * Response is params.size bytes of data.<br> */<br>-#define EC_CMD_FLASH_READ 0x11<br>+#define EC_CMD_FLASH_READ 0x0011<br> <br>-struct ec_params_flash_read {<br>+struct __ec_align4 ec_params_flash_read {<br> uint32_t offset; /* Byte offset to read */<br> uint32_t size; /* Size to read in bytes */<br>-} __packed;<br>+};<br> <br> /* Write flash */<br>-#define EC_CMD_FLASH_WRITE 0x12<br>+#define EC_CMD_FLASH_WRITE 0x0012<br> #define EC_VER_FLASH_WRITE 1<br> <br> /* Version 0 of the flash command supported only 64 bytes of data */<br> #define EC_FLASH_WRITE_VER0_SIZE 64<br> <br>-struct ec_params_flash_write {<br>+struct __ec_align4 ec_params_flash_write {<br> uint32_t offset; /* Byte offset to write */<br> uint32_t size; /* Size to write in bytes */<br> /* Followed by data to write */<br>-} __packed;<br>+};<br> <br> /* Erase flash */<br>-#define EC_CMD_FLASH_ERASE 0x13<br>+#define EC_CMD_FLASH_ERASE 0x0013<br> <br>-struct ec_params_flash_erase {<br>+/* v0 */<br>+struct __ec_align4 ec_params_flash_erase {<br> uint32_t offset; /* Byte offset to erase */<br> uint32_t size; /* Size to erase in bytes */<br>-} __packed;<br>+};<br>+<br>+<br>+#define EC_VER_FLASH_WRITE 1<br>+/* v1 add async erase:<br>+ * subcommands can returns:<br>+ * EC_RES_SUCCESS : erased (see ERASE_SECTOR_ASYNC case below).<br>+ * EC_RES_INVALID_PARAM : offset/size are not aligned on a erase boundary.<br>+ * EC_RES_ERROR : other errors.<br>+ * EC_RES_BUSY : an existing erase operation is in progress.<br>+ * EC_RES_ACCESS_DENIED: Trying to erase running image.<br>+ *<br>+ * When ERASE_SECTOR_ASYNC returns EC_RES_SUCCESS, the operation is just<br>+ * properly queued. The user must call ERASE_GET_RESULT subcommand to get<br>+ * the proper result.<br>+ * When ERASE_GET_RESULT returns EC_RES_BUSY, the caller must wait and send<br>+ * ERASE_GET_RESULT again to get the result of ERASE_SECTOR_ASYNC.<br>+ * ERASE_GET_RESULT command may timeout on EC where flash access is not<br>+ * permitted while erasing. (For instance, STM32F4).<br>+ */<br>+enum ec_flash_erase_cmd {<br>+ FLASH_ERASE_SECTOR, /* Erase and wait for result */<br>+ FLASH_ERASE_SECTOR_ASYNC, /* Erase and return immediately. */<br>+ FLASH_ERASE_GET_RESULT, /* Ask for last erase result */<br>+};<br>+<br>+struct __ec_align4 ec_params_flash_erase_v1 {<br>+ /* One of ec_flash_erase_cmd. */<br>+ uint8_t cmd;<br>+ /* Pad byte; currently always contains 0 */<br>+ uint8_t reserved;<br>+ /* No flags defined yet; set to 0 */<br>+ uint16_t flag;<br>+ /* Same as v0 parameters. */<br>+ struct ec_params_flash_erase params;<br>+};<br> <br> /*<br> * Get/set flash protection.<br>@@ -1105,7 +1301,7 @@<br> *<br> * If mask=0, simply returns the current flags state.<br> */<br>-#define EC_CMD_FLASH_PROTECT 0x15<br>+#define EC_CMD_FLASH_PROTECT 0x0015<br> #define EC_VER_FLASH_PROTECT 1 /* Command version 1 */<br> <br> /* Flags for flash protection */<br>@@ -1130,13 +1326,21 @@<br> #define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5)<br> /* Entire flash code protected when the EC boots */<br> #define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6)<br>+/* RW flash code protected when the EC boots */<br>+#define EC_FLASH_PROTECT_RW_AT_BOOT (1 << 7)<br>+/* RW flash code protected now. */<br>+#define EC_FLASH_PROTECT_RW_NOW (1 << 8)<br>+/* Rollback information flash region protected when the EC boots */<br>+#define EC_FLASH_PROTECT_ROLLBACK_AT_BOOT (1 << 9)<br>+/* Rollback information flash region protected now */<br>+#define EC_FLASH_PROTECT_ROLLBACK_NOW (1 << 10)<br> <br>-struct ec_params_flash_protect {<br>+struct __ec_align4 ec_params_flash_protect {<br> uint32_t mask; /* Bits in flags to apply */<br> uint32_t flags; /* New flags to apply */<br>-} __packed;<br>+};<br> <br>-struct ec_response_flash_protect {<br>+struct __ec_align4 ec_response_flash_protect {<br> /* Current value of flash protect flags */<br> uint32_t flags;<br> /*<br>@@ -1147,7 +1351,7 @@<br> uint32_t valid_flags;<br> /* Flags which can be changed given the current protection state */<br> uint32_t writable_flags;<br>-} __packed;<br>+};<br> <br> /*<br> * Note: commands 0x14 - 0x19 version 0 were old commands to get/set flash<br>@@ -1155,7 +1359,7 @@<br> */<br> <br> /* Get the region offset/size */<br>-#define EC_CMD_FLASH_REGION_INFO 0x16<br>+#define EC_CMD_FLASH_REGION_INFO 0x0016<br> #define EC_VER_FLASH_REGION_INFO 1<br> <br> enum ec_flash_region {<br>@@ -1172,17 +1376,17 @@<br> EC_FLASH_REGION_COUNT,<br> };<br> <br>-struct ec_params_flash_region_info {<br>+struct __ec_align4 ec_params_flash_region_info {<br> uint32_t region; /* enum ec_flash_region */<br>-} __packed;<br>+};<br> <br>-struct ec_response_flash_region_info {<br>+struct __ec_align4 ec_response_flash_region_info {<br> uint32_t offset;<br> uint32_t size;<br>-} __packed;<br>+};<br> <br> /* Read/write VbNvContext */<br>-#define EC_CMD_VBNV_CONTEXT 0x17<br>+#define EC_CMD_VBNV_CONTEXT 0x0017<br> #define EC_VER_VBNV_CONTEXT 1<br> #define EC_VBNV_BLOCK_SIZE 16<br> <br>@@ -1191,71 +1395,89 @@<br> EC_VBNV_CONTEXT_OP_WRITE,<br> };<br> <br>-struct ec_params_vbnvcontext {<br>+struct __ec_align4 ec_params_vbnvcontext {<br> uint32_t op;<br> uint8_t block[EC_VBNV_BLOCK_SIZE];<br>-} __packed;<br>+};<br> <br>-struct ec_response_vbnvcontext {<br>+struct __ec_align4 ec_response_vbnvcontext {<br> uint8_t block[EC_VBNV_BLOCK_SIZE];<br>-} __packed;<br>+};<br>+<br>+<br>+/* Get SPI flash information */<br>+#define EC_CMD_FLASH_SPI_INFO 0x0018<br>+<br>+struct __ec_align1 ec_response_flash_spi_info {<br>+ /* JEDEC info from command 0x9F (manufacturer, memory type, size) */<br>+ uint8_t jedec[3];<br>+<br>+ /* Pad byte; currently always contains 0 */<br>+ uint8_t reserved0;<br>+<br>+ /* Manufacturer / device ID from command 0x90 */<br>+ uint8_t mfr_dev_id[2];<br>+<br>+ /* Status registers from command 0x05 and 0x35 */<br>+ uint8_t sr1, sr2;<br>+};<br> <br> /*****************************************************************************/<br> /* PWM commands */<br> <br> /* Get fan target RPM */<br>-#define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x20<br>+#define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x0020<br> <br>-struct ec_response_pwm_get_fan_rpm {<br>+struct __ec_align4 ec_response_pwm_get_fan_rpm {<br> uint32_t rpm;<br>-} __packed;<br>+};<br> <br> /* Set target fan RPM */<br>-#define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x21<br>+#define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x0021<br> <br> /* Version 0 of input params */<br>-struct ec_params_pwm_set_fan_target_rpm_v0 {<br>+struct __ec_align4 ec_params_pwm_set_fan_target_rpm_v0 {<br> uint32_t rpm;<br>-} __packed;<br>+};<br> <br> /* Version 1 of input params */<br>-struct ec_params_pwm_set_fan_target_rpm_v1 {<br>+struct __ec_align_size1 ec_params_pwm_set_fan_target_rpm_v1 {<br> uint32_t rpm;<br> uint8_t fan_idx;<br>-} __packed;<br>+};<br> <br> /* Get keyboard backlight */<br> /* OBSOLETE - Use EC_CMD_PWM_SET_DUTY */<br>-#define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x22<br>+#define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x0022<br> <br>-struct ec_response_pwm_get_keyboard_backlight {<br>+struct __ec_align1 ec_response_pwm_get_keyboard_backlight {<br> uint8_t percent;<br> uint8_t enabled;<br>-} __packed;<br>+};<br> <br> /* Set keyboard backlight */<br> /* OBSOLETE - Use EC_CMD_PWM_SET_DUTY */<br>-#define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x23<br>+#define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x0023<br> <br>-struct ec_params_pwm_set_keyboard_backlight {<br>+struct __ec_align1 ec_params_pwm_set_keyboard_backlight {<br> uint8_t percent;<br>-} __packed;<br>+};<br> <br> /* Set target fan PWM duty cycle */<br>-#define EC_CMD_PWM_SET_FAN_DUTY 0x24<br>+#define EC_CMD_PWM_SET_FAN_DUTY 0x0024<br> <br> /* Version 0 of input params */<br>-struct ec_params_pwm_set_fan_duty_v0 {<br>+struct __ec_align4 ec_params_pwm_set_fan_duty_v0 {<br> uint32_t percent;<br>-} __packed;<br>+};<br> <br> /* Version 1 of input params */<br>-struct ec_params_pwm_set_fan_duty_v1 {<br>+struct __ec_align_size1 ec_params_pwm_set_fan_duty_v1 {<br> uint32_t percent;<br> uint8_t fan_idx;<br>-} __packed;<br>+};<br> <br>-#define EC_CMD_PWM_SET_DUTY 0x25<br>+#define EC_CMD_PWM_SET_DUTY 0x0025<br> /* 16 bit duty cycle, 0xffff = 100% */<br> #define EC_PWM_MAX_DUTY 0xffff<br> <br>@@ -1269,22 +1491,22 @@<br> EC_PWM_TYPE_COUNT,<br> };<br> <br>-struct ec_params_pwm_set_duty {<br>+struct __ec_align4 ec_params_pwm_set_duty {<br> uint16_t duty; /* Duty cycle, EC_PWM_MAX_DUTY = 100% */<br> uint8_t pwm_type; /* ec_pwm_type */<br> uint8_t index; /* Type-specific index, or 0 if unique */<br>-} __packed;<br>+};<br> <br>-#define EC_CMD_PWM_GET_DUTY 0x26<br>+#define EC_CMD_PWM_GET_DUTY 0x0026<br> <br>-struct ec_params_pwm_get_duty {<br>+struct __ec_align1 ec_params_pwm_get_duty {<br> uint8_t pwm_type; /* ec_pwm_type */<br> uint8_t index; /* Type-specific index, or 0 if unique */<br>-} __packed;<br>+};<br> <br>-struct ec_response_pwm_get_duty {<br>+struct __ec_align2 ec_response_pwm_get_duty {<br> uint16_t duty; /* Duty cycle, EC_PWM_MAX_DUTY = 100% */<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /*<br>@@ -1293,9 +1515,9 @@<br> * into a subcommand. We'll make separate structs for subcommands with<br> * different input args, so that we know how much to expect.<br> */<br>-#define EC_CMD_LIGHTBAR_CMD 0x28<br>+#define EC_CMD_LIGHTBAR_CMD 0x0028<br> <br>-struct rgb_s {<br>+struct __ec_todo_unpacked rgb_s {<br> uint8_t r, g, b;<br> };<br> <br>@@ -1303,7 +1525,7 @@<br> /* List of tweakable parameters. NOTE: It's __packed so it can be sent in a<br> * host command, but the alignment is the same regardless. Keep it that way.<br> */<br>-struct lightbar_params_v0 {<br>+struct __ec_todo_packed lightbar_params_v0 {<br> /* Timing */<br> int32_t google_ramp_up;<br> int32_t google_ramp_down;<br>@@ -1335,9 +1557,9 @@<br> <br> /* Color palette */<br> struct rgb_s color[8]; /* 0-3 are Google colors */<br>-} __packed;<br>+};<br> <br>-struct lightbar_params_v1 {<br>+struct __ec_todo_packed lightbar_params_v1 {<br> /* Timing */<br> int32_t google_ramp_up;<br> int32_t google_ramp_down;<br>@@ -1384,7 +1606,7 @@<br> <br> /* Color palette */<br> struct rgb_s color[8]; /* 0-3 are Google colors */<br>-} __packed;<br>+};<br> <br> /* Lightbar command params v2<br> * crbug.com/467716<br>@@ -1395,7 +1617,7 @@<br> * NOTE: Each of these groups must be less than 120 bytes.<br> */<br> <br>-struct lightbar_params_v2_timing {<br>+struct __ec_todo_packed lightbar_params_v2_timing {<br> /* Timing */<br> int32_t google_ramp_up;<br> int32_t google_ramp_down;<br>@@ -1411,9 +1633,9 @@<br> int32_t tap_tick_delay;<br> int32_t tap_gate_delay;<br> int32_t tap_display_time;<br>-} __packed;<br>+};<br> <br>-struct lightbar_params_v2_tap {<br>+struct __ec_todo_packed lightbar_params_v2_tap {<br> /* Tap-for-battery params */<br> uint8_t tap_pct_red;<br> uint8_t tap_pct_green;<br>@@ -1421,28 +1643,28 @@<br> uint8_t tap_seg_max_on;<br> uint8_t tap_seg_osc;<br> uint8_t tap_idx[3];<br>-} __packed;<br>+};<br> <br>-struct lightbar_params_v2_oscillation {<br>+struct __ec_todo_packed lightbar_params_v2_oscillation {<br> /* Oscillation */<br> uint8_t osc_min[2]; /* AC=0/1 */<br> uint8_t osc_max[2]; /* AC=0/1 */<br> uint8_t w_ofs[2]; /* AC=0/1 */<br>-} __packed;<br>+};<br> <br>-struct lightbar_params_v2_brightness {<br>+struct __ec_todo_packed lightbar_params_v2_brightness {<br> /* Brightness limits based on the backlight and AC. */<br> uint8_t bright_bl_off_fixed[2]; /* AC=0/1 */<br> uint8_t bright_bl_on_min[2]; /* AC=0/1 */<br> uint8_t bright_bl_on_max[2]; /* AC=0/1 */<br>-} __packed;<br>+};<br> <br>-struct lightbar_params_v2_thresholds {<br>+struct __ec_todo_packed lightbar_params_v2_thresholds {<br> /* Battery level thresholds */<br> uint8_t battery_threshold[LB_BATTERY_LEVELS - 1];<br>-} __packed;<br>+};<br> <br>-struct lightbar_params_v2_colors {<br>+struct __ec_todo_packed lightbar_params_v2_colors {<br> /* Map [AC][battery_level] to color index */<br> uint8_t s0_idx[2][LB_BATTERY_LEVELS]; /* AP is running */<br> uint8_t s3_idx[2][LB_BATTERY_LEVELS]; /* AP is sleeping */<br>@@ -1452,19 +1674,19 @@<br> <br> /* Color palette */<br> struct rgb_s color[8]; /* 0-3 are Google colors */<br>-} __packed;<br>+};<br> <br> /* Lightbyte program. */<br> #define EC_LB_PROG_LEN 192<br>-struct lightbar_program {<br>+struct __ec_todo_unpacked lightbar_program {<br> uint8_t size;<br> uint8_t data[EC_LB_PROG_LEN];<br> };<br> <br>-struct ec_params_lightbar {<br>+struct __ec_todo_packed ec_params_lightbar {<br> uint8_t cmd; /* Command (see enum lightbar_command) */<br> union {<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /* no args */<br> } dump, off, on, init, get_seq, get_params_v0, get_params_v1,<br> version, get_brightness, get_demo, suspend, resume,<br>@@ -1472,23 +1694,23 @@<br> get_params_v2_osc, get_params_v2_bright,<br> get_params_v2_thlds, get_params_v2_colors;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t num;<br> } set_brightness, seq, demo;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t ctrl, reg, value;<br> } reg;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t led, red, green, blue;<br> } set_rgb;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t led;<br> } get_rgb;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t enable;<br> } manual_suspend_ctrl;<br> <br>@@ -1504,19 +1726,19 @@<br> <br> struct lightbar_program set_program;<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_response_lightbar {<br>+struct __ec_todo_packed ec_response_lightbar {<br> union {<br>- struct {<br>- struct {<br>+ struct __ec_todo_unpacked {<br>+ struct __ec_todo_unpacked {<br> uint8_t reg;<br> uint8_t ic0;<br> uint8_t ic1;<br> } vals[23];<br> } dump;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t num;<br> } get_seq, get_brightness, get_demo;<br> <br>@@ -1531,16 +1753,16 @@<br> struct lightbar_params_v2_thresholds get_params_v2_thlds;<br> struct lightbar_params_v2_colors get_params_v2_colors;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint32_t num;<br> uint32_t flags;<br> } version;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t red, green, blue;<br> } get_rgb;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> /* no return params */<br> } off, on, init, set_brightness, seq, reg, set_rgb,<br> demo, set_params_v0, set_params_v1,<br>@@ -1549,7 +1771,7 @@<br> set_v2par_osc, set_v2par_bright, set_v2par_thlds,<br> set_v2par_colors;<br> };<br>-} __packed;<br>+};<br> <br> /* Lightbar commands */<br> enum lightbar_command {<br>@@ -1593,7 +1815,7 @@<br> /*****************************************************************************/<br> /* LED control commands */<br> <br>-#define EC_CMD_LED_CONTROL 0x29<br>+#define EC_CMD_LED_CONTROL 0x0029<br> <br> enum ec_led_id {<br> /* LED to indicate battery state of charge */<br>@@ -1605,6 +1827,14 @@<br> EC_LED_ID_POWER_LED,<br> /* LED on power adapter or its plug */<br> EC_LED_ID_ADAPTER_LED,<br>+ /* LED to indicate left side */<br>+ EC_LED_ID_LEFT_LED,<br>+ /* LED to indicate right side */<br>+ EC_LED_ID_RIGHT_LED,<br>+ /* LED to indicate recovery mode with HW_REINIT */<br>+ EC_LED_ID_RECOVERY_HW_REINIT_LED,<br>+ /* LED to indicate sysrq debug mode. */<br>+ EC_LED_ID_SYSRQ_DEBUG_LED,<br> <br> EC_LED_ID_COUNT<br> };<br>@@ -1624,14 +1854,14 @@<br> EC_LED_COLOR_COUNT<br> };<br> <br>-struct ec_params_led_control {<br>+struct __ec_align1 ec_params_led_control {<br> uint8_t led_id; /* Which LED to control */<br> uint8_t flags; /* Control flags */<br> <br> uint8_t brightness[EC_LED_COLOR_COUNT];<br>-} __packed;<br>+};<br> <br>-struct ec_response_led_control {<br>+struct __ec_align1 ec_response_led_control {<br> /*<br> * Available brightness value range.<br> *<br>@@ -1640,7 +1870,7 @@<br> * Other values means the LED is control by PWM.<br> */<br> uint8_t brightness_range[EC_LED_COLOR_COUNT];<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Verified boot commands */<br>@@ -1651,9 +1881,9 @@<br> */<br> <br> /* Verified boot hash command */<br>-#define EC_CMD_VBOOT_HASH 0x2a<br>+#define EC_CMD_VBOOT_HASH 0x002A<br> <br>-struct ec_params_vboot_hash {<br>+struct __ec_align4 ec_params_vboot_hash {<br> uint8_t cmd; /* enum ec_vboot_hash_cmd */<br> uint8_t hash_type; /* enum ec_vboot_hash_type */<br> uint8_t nonce_size; /* Nonce size; may be 0 */<br>@@ -1661,9 +1891,9 @@<br> uint32_t offset; /* Offset in flash to hash */<br> uint32_t size; /* Number of bytes to hash */<br> uint8_t nonce_data[64]; /* Nonce data; ignored if nonce_size=0 */<br>-} __packed;<br>+};<br> <br>-struct ec_response_vboot_hash {<br>+struct __ec_align4 ec_response_vboot_hash {<br> uint8_t status; /* enum ec_vboot_hash_status */<br> uint8_t hash_type; /* enum ec_vboot_hash_type */<br> uint8_t digest_size; /* Size of hash digest in bytes */<br>@@ -1671,7 +1901,7 @@<br> uint32_t offset; /* Offset in flash which was hashed */<br> uint32_t size; /* Number of bytes hashed */<br> uint8_t hash_digest[64]; /* Hash digest data */<br>-} __packed;<br>+};<br> <br> enum ec_vboot_hash_cmd {<br> EC_VBOOT_HASH_GET = 0, /* Get current hash status */<br>@@ -1703,7 +1933,7 @@<br> * Motion sense commands. We'll make separate structs for sub-commands with<br> * different input args, so that we know how much to expect.<br> */<br>-#define EC_CMD_MOTION_SENSE_CMD 0x2b<br>+#define EC_CMD_MOTION_SENSE_CMD 0x002B<br> <br> /* Motion sense commands */<br> enum motionsense_command {<br>@@ -1805,6 +2035,19 @@<br> */<br> MOTIONSENSE_CMD_LID_ANGLE = 14,<br> <br>+ /*<br>+ * Allow the FIFO to trigger interrupt via MKBP events.<br>+ * By default the FIFO does not send interrupt to process the FIFO<br>+ * until the AP is ready or it is coming from a wakeup sensor.<br>+ */<br>+ MOTIONSENSE_CMD_FIFO_INT_ENABLE = 15,<br>+<br>+ /*<br>+ * Spoof the readings of the sensors. The spoofed readings can be set<br>+ * to arbitrary values, or will lock to the last read actual values.<br>+ */<br>+ MOTIONSENSE_CMD_SPOOF = 16,<br>+<br> /* Number of motionsense sub-commands. */<br> MOTIONSENSE_NUM_CMDS<br> };<br>@@ -1817,6 +2060,7 @@<br> MOTIONSENSE_TYPE_PROX = 3,<br> MOTIONSENSE_TYPE_LIGHT = 4,<br> MOTIONSENSE_TYPE_ACTIVITY = 5,<br>+ MOTIONSENSE_TYPE_BARO = 6,<br> MOTIONSENSE_TYPE_MAX,<br> };<br> <br>@@ -1838,9 +2082,11 @@<br> MOTIONSENSE_CHIP_KX022 = 6,<br> MOTIONSENSE_CHIP_L3GD20H = 7,<br> MOTIONSENSE_CHIP_BMA255 = 8,<br>+ MOTIONSENSE_CHIP_BMP280 = 9,<br>+ MOTIONSENSE_CHIP_OPT3001 = 10,<br> };<br> <br>-struct ec_response_motion_sensor_data {<br>+struct __ec_todo_packed ec_response_motion_sensor_data {<br> /* Flags for each sensor. */<br> uint8_t flags;<br> /* sensor number the data comes from */<br>@@ -1848,35 +2094,36 @@<br> /* Each sensor is up to 3-axis. */<br> union {<br> int16_t data[3];<br>- struct {<br>- uint16_t rsvd;<br>+ struct __ec_todo_packed {<br>+ uint16_t reserved;<br> uint32_t timestamp;<br>- } __packed;<br>- struct {<br>+ };<br>+ struct __ec_todo_unpacked {<br> uint8_t activity; /* motionsensor_activity */<br> uint8_t state;<br> int16_t add_info[2];<br> };<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_response_motion_sense_fifo_info {<br>+/* Note: used in ec_response_get_next_data */<br>+struct __ec_todo_packed ec_response_motion_sense_fifo_info {<br> /* Size of the fifo */<br> uint16_t size;<br> /* Amount of space used in the fifo */<br> uint16_t count;<br>- /* TImestamp recorded in us */<br>+ /* Timestamp recorded in us */<br> uint32_t timestamp;<br> /* Total amount of vector lost */<br> uint16_t total_lost;<br> /* Lost events since the last fifo_info, per sensors */<br> uint16_t lost[0];<br>-} __packed;<br>+};<br> <br>-struct ec_response_motion_sense_fifo_data {<br>+struct __ec_todo_packed ec_response_motion_sense_fifo_data {<br> uint32_t number_data;<br> struct ec_response_motion_sensor_data data[0];<br>-} __packed;<br>+};<br> <br> /* List supported activity recognition */<br> enum motionsensor_activity {<br>@@ -1885,7 +2132,7 @@<br> MOTIONSENSE_ACTIVITY_DOUBLE_TAP = 2,<br> };<br> <br>-struct ec_motion_sense_activity {<br>+struct __ec_todo_unpacked ec_motion_sense_activity {<br> uint8_t sensor_num;<br> uint8_t activity; /* one of enum motionsensor_activity */<br> uint8_t enable; /* 1: enable, 0: disable */<br>@@ -1900,12 +2147,13 @@<br> #define MOTIONSENSE_SENSOR_FLAG_PRESENT (1<<0)<br> <br> /*<br>- * Flush entry for synchronisation.<br>+ * Flush entry for synchronization.<br> * data contains time stamp<br> */<br> #define MOTIONSENSE_SENSOR_FLAG_FLUSH (1<<0)<br> #define MOTIONSENSE_SENSOR_FLAG_TIMESTAMP (1<<1)<br> #define MOTIONSENSE_SENSOR_FLAG_WAKEUP (1<<2)<br>+#define MOTIONSENSE_SENSOR_FLAG_TABLET_MODE (1<<3)<br> <br> /*<br> * Send this value for the data element to only perform a read. If you<br>@@ -1922,11 +2170,25 @@<br> <br> #define LID_ANGLE_UNRELIABLE 500<br> <br>-struct ec_params_motion_sense {<br>+enum motionsense_spoof_mode {<br>+ /* Disable spoof mode. */<br>+ MOTIONSENSE_SPOOF_MODE_DISABLE = 0,<br>+<br>+ /* Enable spoof mode, but use provided component values. */<br>+ MOTIONSENSE_SPOOF_MODE_CUSTOM,<br>+<br>+ /* Enable spoof mode, but use the current sensor values. */<br>+ MOTIONSENSE_SPOOF_MODE_LOCK_CURRENT,<br>+<br>+ /* Query the current spoof mode status for the sensor. */<br>+ MOTIONSENSE_SPOOF_MODE_QUERY,<br>+};<br>+<br>+struct __ec_todo_packed ec_params_motion_sense {<br> uint8_t cmd;<br> union {<br> /* Used for MOTIONSENSE_CMD_DUMP */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /*<br> * Maximal number of sensor the host is expecting.<br> * 0 means the host is only interested in the number<br>@@ -1938,7 +2200,7 @@<br> /*<br> * Used for MOTIONSENSE_CMD_KB_WAKE_ANGLE.<br> */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /* Data to set or EC_MOTION_SENSE_NO_VALUE to read.<br> * kb_wake_angle: angle to wakup AP.<br> */<br>@@ -1947,15 +2209,16 @@<br> <br> /* Used for MOTIONSENSE_CMD_INFO, MOTIONSENSE_CMD_DATA<br> * and MOTIONSENSE_CMD_PERFORM_CALIB. */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t sensor_num;<br>- } info, data, fifo_flush, perform_calib, list_activities;<br>+ } info, info_3, data, fifo_flush, perform_calib,<br>+ list_activities;<br> <br> /*<br> * Used for MOTIONSENSE_CMD_EC_RATE, MOTIONSENSE_CMD_SENSOR_ODR<br> * and MOTIONSENSE_CMD_SENSOR_RANGE.<br> */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t sensor_num;<br> <br> /* Rounding flag, true for round-up, false for down. */<br>@@ -1968,7 +2231,7 @@<br> } ec_rate, sensor_odr, sensor_range;<br> <br> /* Used for MOTIONSENSE_CMD_SENSOR_OFFSET */<br>- struct {<br>+ struct __ec_todo_packed {<br> uint8_t sensor_num;<br> <br> /*<br>@@ -1994,14 +2257,14 @@<br> * Compass: 1/16 uT<br> */<br> int16_t offset[3];<br>- } __packed sensor_offset;<br>+ } sensor_offset;<br> <br> /* Used for MOTIONSENSE_CMD_FIFO_INFO */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> } fifo_info;<br> <br> /* Used for MOTIONSENSE_CMD_FIFO_READ */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /*<br> * Number of expected vector to return.<br> * EC may return less or 0 if none available.<br>@@ -2012,15 +2275,38 @@<br> struct ec_motion_sense_activity set_activity;<br> <br> /* Used for MOTIONSENSE_CMD_LID_ANGLE */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> } lid_angle;<br>- };<br>-} __packed;<br> <br>-struct ec_response_motion_sense {<br>+ /* Used for MOTIONSENSE_CMD_FIFO_INT_ENABLE */<br>+ struct __ec_todo_unpacked {<br>+ /*<br>+ * 1: enable, 0 disable fifo,<br>+ * EC_MOTION_SENSE_NO_VALUE return value.<br>+ */<br>+ int8_t enable;<br>+ } fifo_int_enable;<br>+<br>+ /* Used for MOTIONSENSE_CMD_SPOOF */<br>+ struct __ec_todo_packed {<br>+ uint8_t sensor_id;<br>+<br>+ /* See enum motionsense_spoof_mode. */<br>+ uint8_t spoof_enable;<br>+<br>+ /* Ignored, used for alignment. */<br>+ uint8_t reserved;<br>+<br>+ /* Individual component values to spoof. */<br>+ int16_t components[3];<br>+ } spoof;<br>+ };<br>+};<br>+<br>+struct __ec_todo_packed ec_response_motion_sense {<br> union {<br> /* Used for MOTIONSENSE_CMD_DUMP */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /* Flags representing the motion sensor module. */<br> uint8_t module_flags;<br> <br>@@ -2035,7 +2321,7 @@<br> } dump;<br> <br> /* Used for MOTIONSENSE_CMD_INFO. */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /* Should be element of enum motionsensor_type. */<br> uint8_t type;<br> <br>@@ -2046,21 +2332,45 @@<br> uint8_t chip;<br> } info;<br> <br>+ /* Used for MOTIONSENSE_CMD_INFO version 3 */<br>+ struct __ec_todo_unpacked {<br>+ /* Should be element of enum motionsensor_type. */<br>+ uint8_t type;<br>+<br>+ /* Should be element of enum motionsensor_location. */<br>+ uint8_t location;<br>+<br>+ /* Should be element of enum motionsensor_chip. */<br>+ uint8_t chip;<br>+<br>+ /* Minimum sensor sampling frequency */<br>+ uint32_t min_frequency;<br>+<br>+ /* Maximum sensor sampling frequency */<br>+ uint32_t max_frequency;<br>+<br>+ /* Max number of sensor events that could be in fifo */<br>+ uint32_t fifo_max_event_count;<br>+ } info_3;<br>+<br> /* Used for MOTIONSENSE_CMD_DATA */<br> struct ec_response_motion_sensor_data data;<br> <br> /*<br> * Used for MOTIONSENSE_CMD_EC_RATE, MOTIONSENSE_CMD_SENSOR_ODR,<br>- * MOTIONSENSE_CMD_SENSOR_RANGE, and<br>- * MOTIONSENSE_CMD_KB_WAKE_ANGLE.<br>+ * MOTIONSENSE_CMD_SENSOR_RANGE,<br>+ * MOTIONSENSE_CMD_KB_WAKE_ANGLE,<br>+ * MOTIONSENSE_CMD_FIFO_INT_ENABLE and<br>+ * MOTIONSENSE_CMD_SPOOF.<br> */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /* Current value of the parameter queried. */<br> int32_t ret;<br>- } ec_rate, sensor_odr, sensor_range, kb_wake_angle;<br>+ } ec_rate, sensor_odr, sensor_range, kb_wake_angle,<br>+ fifo_int_enable, spoof;<br> <br> /* Used for MOTIONSENSE_CMD_SENSOR_OFFSET */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> int16_t temp;<br> int16_t offset[3];<br> } sensor_offset, perform_calib;<br>@@ -2069,18 +2379,17 @@<br> <br> struct ec_response_motion_sense_fifo_data fifo_read;<br> <br>- struct {<br>+ struct __ec_todo_packed {<br> uint16_t reserved;<br> uint32_t enabled;<br> uint32_t disabled;<br>- } __packed list_activities;<br>+ } list_activities;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> } set_activity;<br> <br>-<br> /* Used for MOTIONSENSE_CMD_LID_ANGLE */<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /*<br> * Angle between 0 and 360 degree if available,<br> * LID_ANGLE_UNRELIABLE otherwise.<br>@@ -2088,28 +2397,42 @@<br> uint16_t value;<br> } lid_angle;<br> };<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Force lid open command */<br> <br> /* Make lid event always open */<br>-#define EC_CMD_FORCE_LID_OPEN 0x2c<br>+#define EC_CMD_FORCE_LID_OPEN 0x002C<br> <br>-struct ec_params_force_lid_open {<br>+struct __ec_align1 ec_params_force_lid_open {<br> uint8_t enabled;<br>-} __packed;<br>+};<br>+<br>+/*****************************************************************************/<br>+/* Configure the behavior of the power button */<br>+#define EC_CMD_CONFIG_POWER_BUTTON 0x002D<br>+<br>+enum ec_config_power_button_flags {<br>+ /* Enable/Disable power button pulses for x86 devices */<br>+ EC_POWER_BUTTON_ENABLE_PULSE = (1 << 0),<br>+};<br>+<br>+struct __ec_align1 ec_params_config_power_button {<br>+ /* See enum ec_config_power_button_flags */<br>+ uint8_t flags;<br>+};<br> <br> /*****************************************************************************/<br> /* USB charging control commands */<br> <br> /* Set USB port charging mode */<br>-#define EC_CMD_USB_CHARGE_SET_MODE 0x30<br>+#define EC_CMD_USB_CHARGE_SET_MODE 0x0030<br> <br>-struct ec_params_usb_charge_set_mode {<br>+struct __ec_align1 ec_params_usb_charge_set_mode {<br> uint8_t usb_port_id;<br> uint8_t mode;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Persistent storage for host */<br>@@ -2118,55 +2441,58 @@<br> #define EC_PSTORE_SIZE_MAX 64<br> <br> /* Get persistent storage info */<br>-#define EC_CMD_PSTORE_INFO 0x40<br>+#define EC_CMD_PSTORE_INFO 0x0040<br> <br>-struct ec_response_pstore_info {<br>+struct __ec_align4 ec_response_pstore_info {<br> /* Persistent storage size, in bytes */<br> uint32_t pstore_size;<br> /* Access size; read/write offset and size must be a multiple of this */<br> uint32_t access_size;<br>-} __packed;<br>+};<br> <br> /*<br> * Read persistent storage<br> *<br> * Response is params.size bytes of data.<br> */<br>-#define EC_CMD_PSTORE_READ 0x41<br>+#define EC_CMD_PSTORE_READ 0x0041<br> <br>-struct ec_params_pstore_read {<br>+struct __ec_align4 ec_params_pstore_read {<br> uint32_t offset; /* Byte offset to read */<br> uint32_t size; /* Size to read in bytes */<br>-} __packed;<br>+};<br> <br> /* Write persistent storage */<br>-#define EC_CMD_PSTORE_WRITE 0x42<br>+#define EC_CMD_PSTORE_WRITE 0x0042<br> <br>-struct ec_params_pstore_write {<br>+struct __ec_align4 ec_params_pstore_write {<br> uint32_t offset; /* Byte offset to write */<br> uint32_t size; /* Size to write in bytes */<br> uint8_t data[EC_PSTORE_SIZE_MAX];<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Real-time clock */<br> <br> /* RTC params and response structures */<br>-struct ec_params_rtc {<br>+struct __ec_align4 ec_params_rtc {<br> uint32_t time;<br>-} __packed;<br>+};<br> <br>-struct ec_response_rtc {<br>+struct __ec_align4 ec_response_rtc {<br> uint32_t time;<br>-} __packed;<br>+};<br> <br> /* These use ec_response_rtc */<br>-#define EC_CMD_RTC_GET_VALUE 0x44<br>-#define EC_CMD_RTC_GET_ALARM 0x45<br>+#define EC_CMD_RTC_GET_VALUE 0x0044<br>+#define EC_CMD_RTC_GET_ALARM 0x0045<br> <br> /* These all use ec_params_rtc */<br>-#define EC_CMD_RTC_SET_VALUE 0x46<br>-#define EC_CMD_RTC_SET_ALARM 0x47<br>+#define EC_CMD_RTC_SET_VALUE 0x0046<br>+#define EC_CMD_RTC_SET_ALARM 0x0047<br>+<br>+/* Pass as time param to SET_ALARM to clear the current alarm */<br>+#define EC_RTC_ALARM_CLEAR 0<br> <br> /*****************************************************************************/<br> /* Port80 log access */<br>@@ -2175,40 +2501,40 @@<br> #define EC_PORT80_SIZE_MAX 32<br> <br> /* Get last port80 code from previous boot */<br>-#define EC_CMD_PORT80_LAST_BOOT 0x48<br>-#define EC_CMD_PORT80_READ 0x48<br>+#define EC_CMD_PORT80_LAST_BOOT 0x0048<br>+#define EC_CMD_PORT80_READ 0x0048<br> <br> enum ec_port80_subcmd {<br> EC_PORT80_GET_INFO = 0,<br> EC_PORT80_READ_BUFFER,<br> };<br> <br>-struct ec_params_port80_read {<br>+struct __ec_todo_packed ec_params_port80_read {<br> uint16_t subcmd;<br> union {<br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint32_t offset;<br> uint32_t num_entries;<br> } read_buffer;<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_response_port80_read {<br>+struct __ec_todo_packed ec_response_port80_read {<br> union {<br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint32_t writes;<br> uint32_t history_size;<br> uint32_t last_boot;<br> } get_info;<br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint16_t codes[EC_PORT80_SIZE_MAX];<br> } data;<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_response_port80_last_boot {<br>+struct __ec_align2 ec_response_port80_last_boot {<br> uint16_t code;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Temporary secure storage for host verified boot use */<br>@@ -2220,39 +2546,38 @@<br> #define EC_VSTORE_SLOT_MAX 32<br> <br> /* Get persistent storage info */<br>-#define EC_CMD_VSTORE_INFO 0x49<br>-<br>-struct ec_response_vstore_info {<br>+#define EC_CMD_VSTORE_INFO 0x0049<br>+struct __ec_align_size1 ec_response_vstore_info {<br> /* Indicates which slots are locked */<br> uint32_t slot_locked;<br> /* Total number of slots available */<br> uint8_t slot_count;<br>-} __packed;<br>+};<br> <br> /*<br> * Read temporary secure storage<br> *<br> * Response is EC_VSTORE_SLOT_SIZE bytes of data.<br> */<br>-#define EC_CMD_VSTORE_READ 0x4a<br>+#define EC_CMD_VSTORE_READ 0x004A<br> <br>-struct ec_params_vstore_read {<br>+struct __ec_align1 ec_params_vstore_read {<br> uint8_t slot; /* Slot to read from */<br>-} __packed;<br>+};<br> <br>-struct ec_response_vstore_read {<br>+struct __ec_align1 ec_response_vstore_read {<br> uint8_t data[EC_VSTORE_SLOT_SIZE];<br>-} __packed;<br>+};<br> <br> /*<br> * Write temporary secure storage and lock it.<br> */<br>-#define EC_CMD_VSTORE_WRITE 0x4b<br>+#define EC_CMD_VSTORE_WRITE 0x004B<br> <br>-struct ec_params_vstore_write {<br>+struct __ec_align1 ec_params_vstore_write {<br> uint8_t slot; /* Slot to write to */<br> uint8_t data[EC_VSTORE_SLOT_SIZE];<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Thermal engine commands. Note that there are two implementations. We'll<br>@@ -2261,29 +2586,29 @@<br> * Version 1 separates the CPU thermal limits from the fan control.<br> */<br> <br>-#define EC_CMD_THERMAL_SET_THRESHOLD 0x50<br>-#define EC_CMD_THERMAL_GET_THRESHOLD 0x51<br>+#define EC_CMD_THERMAL_SET_THRESHOLD 0x0050<br>+#define EC_CMD_THERMAL_GET_THRESHOLD 0x0051<br> <br> /* The version 0 structs are opaque. You have to know what they are for<br> * the get/set commands to make any sense.<br> */<br> <br> /* Version 0 - set */<br>-struct ec_params_thermal_set_threshold {<br>+struct __ec_align2 ec_params_thermal_set_threshold {<br> uint8_t sensor_type;<br> uint8_t threshold_id;<br> uint16_t value;<br>-} __packed;<br>+};<br> <br> /* Version 0 - get */<br>-struct ec_params_thermal_get_threshold {<br>+struct __ec_align1 ec_params_thermal_get_threshold {<br> uint8_t sensor_type;<br> uint8_t threshold_id;<br>-} __packed;<br>+};<br> <br>-struct ec_response_thermal_get_threshold {<br>+struct __ec_align2 ec_response_thermal_get_threshold {<br> uint16_t value;<br>-} __packed;<br>+};<br> <br> <br> /* The version 1 structs are visible. */<br>@@ -2295,42 +2620,46 @@<br> EC_TEMP_THRESH_COUNT<br> };<br> <br>-/* Thermal configuration for one temperature sensor. Temps are in degrees K.<br>+/*<br>+ * Thermal configuration for one temperature sensor. Temps are in degrees K.<br> * Zero values will be silently ignored by the thermal task.<br>+ *<br>+ * Note that this structure is a sub-structure of<br>+ * ec_params_thermal_set_threshold_v1, but maintains its alignment there.<br> */<br>-struct ec_thermal_config {<br>+struct __ec_align4 ec_thermal_config {<br> uint32_t temp_host[EC_TEMP_THRESH_COUNT]; /* levels of hotness */<br> uint32_t temp_fan_off; /* no active cooling needed */<br> uint32_t temp_fan_max; /* max active cooling needed */<br>-} __packed;<br>+};<br> <br> /* Version 1 - get config for one sensor. */<br>-struct ec_params_thermal_get_threshold_v1 {<br>+struct __ec_align4 ec_params_thermal_get_threshold_v1 {<br> uint32_t sensor_num;<br>-} __packed;<br>+};<br> /* This returns a struct ec_thermal_config */<br> <br> /* Version 1 - set config for one sensor.<br> * Use read-modify-write for best results! */<br>-struct ec_params_thermal_set_threshold_v1 {<br>+struct __ec_align4 ec_params_thermal_set_threshold_v1 {<br> uint32_t sensor_num;<br> struct ec_thermal_config cfg;<br>-} __packed;<br>+};<br> /* This returns no data */<br> <br> /****************************************************************************/<br> <br> /* Toggle automatic fan control */<br>-#define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52<br>+#define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x0052<br> <br> /* Version 1 of input params */<br>-struct ec_params_auto_fan_ctrl_v1 {<br>+struct __ec_align1 ec_params_auto_fan_ctrl_v1 {<br> uint8_t fan_idx;<br>-} __packed;<br>+};<br> <br> /* Get/Set TMP006 calibration data */<br>-#define EC_CMD_TMP006_GET_CALIBRATION 0x53<br>-#define EC_CMD_TMP006_SET_CALIBRATION 0x54<br>+#define EC_CMD_TMP006_GET_CALIBRATION 0x0053<br>+#define EC_CMD_TMP006_SET_CALIBRATION 0x0054<br> <br> /*<br> * The original TMP006 calibration only needed four params, but now we need<br>@@ -2342,52 +2671,52 @@<br> */<br> <br> /* This is the same struct for both v0 and v1. */<br>-struct ec_params_tmp006_get_calibration {<br>+struct __ec_align1 ec_params_tmp006_get_calibration {<br> uint8_t index;<br>-} __packed;<br>+};<br> <br> /* Version 0 */<br>-struct ec_response_tmp006_get_calibration_v0 {<br>+struct __ec_align4 ec_response_tmp006_get_calibration_v0 {<br> float s0;<br> float b0;<br> float b1;<br> float b2;<br>-} __packed;<br>+};<br> <br>-struct ec_params_tmp006_set_calibration_v0 {<br>+struct __ec_align4 ec_params_tmp006_set_calibration_v0 {<br> uint8_t index;<br> uint8_t reserved[3];<br> float s0;<br> float b0;<br> float b1;<br> float b2;<br>-} __packed;<br>+};<br> <br> /* Version 1 */<br>-struct ec_response_tmp006_get_calibration_v1 {<br>+struct __ec_align4 ec_response_tmp006_get_calibration_v1 {<br> uint8_t algorithm;<br> uint8_t num_params;<br> uint8_t reserved[2];<br> float val[0];<br>-} __packed;<br>+};<br> <br>-struct ec_params_tmp006_set_calibration_v1 {<br>+struct __ec_align4 ec_params_tmp006_set_calibration_v1 {<br> uint8_t index;<br> uint8_t algorithm;<br> uint8_t num_params;<br> uint8_t reserved;<br> float val[0];<br>-} __packed;<br>+};<br> <br> <br> /* Read raw TMP006 data */<br>-#define EC_CMD_TMP006_GET_RAW 0x55<br>+#define EC_CMD_TMP006_GET_RAW 0x0055<br> <br>-struct ec_params_tmp006_get_raw {<br>+struct __ec_align1 ec_params_tmp006_get_raw {<br> uint8_t index;<br>-} __packed;<br>+};<br> <br>-struct ec_response_tmp006_get_raw {<br>+struct __ec_align4 ec_response_tmp006_get_raw {<br> int32_t t; /* In 1/100 K */<br> int32_t v; /* In nV */<br> };<br>@@ -2400,30 +2729,81 @@<br> *<br> * Returns raw data for keyboard cols; see ec_response_mkbp_info.cols for<br> * expected response size.<br>+ *<br>+ * NOTE: This has been superseded by EC_CMD_MKBP_GET_NEXT_EVENT. If you wish<br>+ * to obtain the instantaneous state, use EC_CMD_MKBP_INFO with the type<br>+ * EC_MKBP_INFO_CURRENT and event EC_MKBP_EVENT_KEY_MATRIX.<br> */<br>-#define EC_CMD_MKBP_STATE 0x60<br>+#define EC_CMD_MKBP_STATE 0x0060<br> <br>-/* Provide information about the matrix : number of rows and columns */<br>-#define EC_CMD_MKBP_INFO 0x61<br>+/*<br>+ * Provide information about various MKBP things. See enum ec_mkbp_info_type.<br>+ */<br>+#define EC_CMD_MKBP_INFO 0x0061<br> <br>-struct ec_response_mkbp_info {<br>+struct __ec_align_size1 ec_response_mkbp_info {<br> uint32_t rows;<br> uint32_t cols;<br>- uint8_t switches;<br>-} __packed;<br>+ /* Formerly "switches", which was 0. */<br>+ uint8_t reserved;<br>+};<br>+<br>+struct __ec_align1 ec_params_mkbp_info {<br>+ uint8_t info_type;<br>+ uint8_t event_type;<br>+};<br>+<br>+enum ec_mkbp_info_type {<br>+ /*<br>+ * Info about the keyboard matrix: number of rows and columns.<br>+ *<br>+ * Returns struct ec_response_mkbp_info.<br>+ */<br>+ EC_MKBP_INFO_KBD = 0,<br>+<br>+ /*<br>+ * For buttons and switches, info about which specifically are<br>+ * supported. event_type must be set to one of the values in enum<br>+ * ec_mkbp_event.<br>+ *<br>+ * For EC_MKBP_EVENT_BUTTON and EC_MKBP_EVENT_SWITCH, returns a 4 byte<br>+ * bitmask indicating which buttons or switches are present. See the<br>+ * bit inidices below.<br>+ */<br>+ EC_MKBP_INFO_SUPPORTED = 1,<br>+<br>+ /*<br>+ * Instantaneous state of buttons and switches.<br>+ *<br>+ * event_type must be set to one of the values in enum ec_mkbp_event.<br>+ *<br>+ * For EC_MKBP_EVENT_KEY_MATRIX, returns uint8_t key_matrix[13]<br>+ * indicating the current state of the keyboard matrix.<br>+ *<br>+ * For EC_MKBP_EVENT_HOST_EVENT, return uint32_t host_event, the raw<br>+ * event state.<br>+ *<br>+ * For EC_MKBP_EVENT_BUTTON, returns uint32_t buttons, indicating the<br>+ * state of supported buttons.<br>+ *<br>+ * For EC_MKBP_EVENT_SWITCH, returns uint32_t switches, indicating the<br>+ * state of supported switches.<br>+ */<br>+ EC_MKBP_INFO_CURRENT = 2,<br>+};<br> <br> /* Simulate key press */<br>-#define EC_CMD_MKBP_SIMULATE_KEY 0x62<br>+#define EC_CMD_MKBP_SIMULATE_KEY 0x0062<br> <br>-struct ec_params_mkbp_simulate_key {<br>+struct __ec_align1 ec_params_mkbp_simulate_key {<br> uint8_t col;<br> uint8_t row;<br> uint8_t pressed;<br>-} __packed;<br>+};<br> <br> /* Configure keyboard scanning */<br>-#define EC_CMD_MKBP_SET_CONFIG 0x64<br>-#define EC_CMD_MKBP_GET_CONFIG 0x65<br>+#define EC_CMD_MKBP_SET_CONFIG 0x0064<br>+#define EC_CMD_MKBP_GET_CONFIG 0x0065<br> <br> /* flags */<br> enum mkbp_config_flags {<br>@@ -2440,8 +2820,13 @@<br> EC_MKBP_VALID_FIFO_MAX_DEPTH = 1 << 7,<br> };<br> <br>-/* Configuration for our key scanning algorithm */<br>-struct ec_mkbp_config {<br>+/*<br>+ * Configuration for our key scanning algorithm.<br>+ *<br>+ * Note that this is used as a sub-structure of<br>+ * ec_{params/response}_mkbp_get_config.<br>+ */<br>+struct __ec_align_size1 ec_mkbp_config {<br> uint32_t valid_mask; /* valid fields */<br> uint8_t flags; /* some flags (enum mkbp_config_flags) */<br> uint8_t valid_flags; /* which flags are valid */<br>@@ -2460,18 +2845,18 @@<br> uint16_t debounce_up_us; /* time for debounce on key up */<br> /* maximum depth to allow for fifo (0 = no keyscan output) */<br> uint8_t fifo_max_depth;<br>-} __packed;<br>+};<br> <br>-struct ec_params_mkbp_set_config {<br>+struct __ec_align_size1 ec_params_mkbp_set_config {<br> struct ec_mkbp_config config;<br>-} __packed;<br>+};<br> <br>-struct ec_response_mkbp_get_config {<br>+struct __ec_align_size1 ec_response_mkbp_get_config {<br> struct ec_mkbp_config config;<br>-} __packed;<br>+};<br> <br> /* Run the key scan emulation */<br>-#define EC_CMD_KEYSCAN_SEQ_CTRL 0x66<br>+#define EC_CMD_KEYSCAN_SEQ_CTRL 0x0066<br> <br> enum ec_keyscan_seq_cmd {<br> EC_KEYSCAN_SEQ_STATUS = 0, /* Get status information */<br>@@ -2489,20 +2874,20 @@<br> EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0,<br> };<br> <br>-struct ec_collect_item {<br>+struct __ec_align1 ec_collect_item {<br> uint8_t flags; /* some flags (enum ec_collect_flags) */<br> };<br> <br>-struct ec_params_keyscan_seq_ctrl {<br>+struct __ec_todo_packed ec_params_keyscan_seq_ctrl {<br> uint8_t cmd; /* Command to send (enum ec_keyscan_seq_cmd) */<br> union {<br>- struct {<br>+ struct __ec_align1 {<br> uint8_t active; /* still active */<br> uint8_t num_items; /* number of items */<br> /* Current item being presented */<br> uint8_t cur_item;<br> } status;<br>- struct {<br>+ struct __ec_todo_unpacked {<br> /*<br> * Absolute time for this scan, measured from the<br> * start of the sequence.<br>@@ -2510,29 +2895,29 @@<br> uint32_t time_us;<br> uint8_t scan[0]; /* keyscan data */<br> } add;<br>- struct {<br>+ struct __ec_align1 {<br> uint8_t start_item; /* First item to return */<br> uint8_t num_items; /* Number of items to return */<br> } collect;<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_result_keyscan_seq_ctrl {<br>+struct __ec_todo_packed ec_result_keyscan_seq_ctrl {<br> union {<br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t num_items; /* Number of items */<br> /* Data for each item */<br> struct ec_collect_item item[0];<br> } collect;<br> };<br>-} __packed;<br>+};<br> <br> /*<br> * Get the next pending MKBP event.<br> *<br> * Returns EC_RES_UNAVAILABLE if there is no event pending.<br> */<br>-#define EC_CMD_GET_NEXT_EVENT 0x67<br>+#define EC_CMD_GET_NEXT_EVENT 0x0067<br> <br> enum ec_mkbp_event {<br> /* Keyboard matrix changed. The event data is the new matrix state. */<br>@@ -2544,50 +2929,89 @@<br> /* New Sensor FIFO data. The event data is fifo_info structure. */<br> EC_MKBP_EVENT_SENSOR_FIFO = 2,<br> <br>+ /* The state of the non-matrixed buttons have changed. */<br>+ EC_MKBP_EVENT_BUTTON = 3,<br>+<br>+ /* The state of the switches have changed. */<br>+ EC_MKBP_EVENT_SWITCH = 4,<br>+<br>+ /* New Fingerprint sensor event, the event data is fp_events bitmap. */<br>+ EC_MKBP_EVENT_FINGERPRINT = 5,<br>+<br>+ /*<br>+ * Sysrq event: send emulated sysrq. The event data is sysrq,<br>+ * corresponding to the key to be pressed.<br>+ */<br>+ EC_MKBP_EVENT_SYSRQ = 6,<br>+<br> /* Number of MKBP events */<br> EC_MKBP_EVENT_COUNT,<br> };<br> <br>-union ec_response_get_next_data {<br>- uint8_t key_matrix[13];<br>+union __ec_align_offset1 ec_response_get_next_data {<br>+ uint8_t key_matrix[13];<br> <br> /* Unaligned */<br>- uint32_t host_event;<br>+ uint32_t host_event;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> /* For aligning the fifo_info */<br>- uint8_t rsvd[3];<br>+ uint8_t reserved[3];<br> struct ec_response_motion_sense_fifo_info info;<br>- } sensor_fifo;<br>-} __packed;<br>+ } sensor_fifo;<br> <br>-struct ec_response_get_next_event {<br>+ uint32_t buttons;<br>+<br>+ uint32_t switches;<br>+<br>+ uint32_t fp_events;<br>+<br>+ uint32_t sysrq;<br>+};<br>+<br>+struct __ec_align1 ec_response_get_next_event {<br> uint8_t event_type;<br> /* Followed by event data if any */<br> union ec_response_get_next_data data;<br>-} __packed;<br>+};<br>+<br>+/* Bit indices for buttons and switches.*/<br>+/* Buttons */<br>+#define EC_MKBP_POWER_BUTTON 0<br>+#define EC_MKBP_VOL_UP 1<br>+#define EC_MKBP_VOL_DOWN 2<br>+<br>+/* Switches */<br>+#define EC_MKBP_LID_OPEN 0<br>+#define EC_MKBP_TABLET_MODE 1<br> <br> /* Run keyboard factory test scanning */<br>-#define EC_CMD_KEYBOARD_FACTORY_TEST 0x68<br>+#define EC_CMD_KEYBOARD_FACTORY_TEST 0x0068<br> <br>-struct ec_response_keyboard_factory_test {<br>+struct __ec_align2 ec_response_keyboard_factory_test {<br> uint16_t shorted; /* Keyboard pins are shorted */<br>-} __packed;<br>+};<br>+<br>+/* Fingerprint events in 'fp_events' for EC_MKBP_EVENT_FINGERPRINT */<br>+#define EC_MKBP_FP_RAW_EVENT(fp_events) ((fp_events) & 0x00FFFFFF)<br>+#define EC_MKBP_FP_FINGER_DOWN (1 << 29)<br>+#define EC_MKBP_FP_FINGER_UP (1 << 30)<br>+#define EC_MKBP_FP_IMAGE_READY (1 << 31)<br> <br> /*****************************************************************************/<br> /* Temperature sensor commands */<br> <br> /* Read temperature sensor info */<br>-#define EC_CMD_TEMP_SENSOR_GET_INFO 0x70<br>+#define EC_CMD_TEMP_SENSOR_GET_INFO 0x0070<br> <br>-struct ec_params_temp_sensor_get_info {<br>+struct __ec_align1 ec_params_temp_sensor_get_info {<br> uint8_t id;<br>-} __packed;<br>+};<br> <br>-struct ec_response_temp_sensor_get_info {<br>+struct __ec_align1 ec_response_temp_sensor_get_info {<br> char sensor_name[32];<br> uint8_t sensor_type;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> <br>@@ -2604,48 +3028,48 @@<br> * Host event mask params and response structures, shared by all of the host<br> * event commands below.<br> */<br>-struct ec_params_host_event_mask {<br>+struct __ec_align4 ec_params_host_event_mask {<br> uint32_t mask;<br>-} __packed;<br>+};<br> <br>-struct ec_response_host_event_mask {<br>+struct __ec_align4 ec_response_host_event_mask {<br> uint32_t mask;<br>-} __packed;<br>+};<br> <br> /* These all use ec_response_host_event_mask */<br>-#define EC_CMD_HOST_EVENT_GET_B 0x87<br>-#define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x88<br>-#define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x89<br>-#define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x8d<br>+#define EC_CMD_HOST_EVENT_GET_B 0x0087<br>+#define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x0088<br>+#define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x0089<br>+#define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x008D<br> <br> /* These all use ec_params_host_event_mask */<br>-#define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x8a<br>-#define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x8b<br>-#define EC_CMD_HOST_EVENT_CLEAR 0x8c<br>-#define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x8e<br>-#define EC_CMD_HOST_EVENT_CLEAR_B 0x8f<br>+#define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x008A<br>+#define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x008B<br>+#define EC_CMD_HOST_EVENT_CLEAR 0x008C<br>+#define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x008E<br>+#define EC_CMD_HOST_EVENT_CLEAR_B 0x008F<br> <br> /*****************************************************************************/<br> /* Switch commands */<br> <br> /* Enable/disable LCD backlight */<br>-#define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x90<br>+#define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x0090<br> <br>-struct ec_params_switch_enable_backlight {<br>+struct __ec_align1 ec_params_switch_enable_backlight {<br> uint8_t enabled;<br>-} __packed;<br>+};<br> <br> /* Enable/disable WLAN/Bluetooth */<br>-#define EC_CMD_SWITCH_ENABLE_WIRELESS 0x91<br>+#define EC_CMD_SWITCH_ENABLE_WIRELESS 0x0091<br> #define EC_VER_SWITCH_ENABLE_WIRELESS 1<br> <br> /* Version 0 params; no response */<br>-struct ec_params_switch_enable_wireless_v0 {<br>+struct __ec_align1 ec_params_switch_enable_wireless_v0 {<br> uint8_t enabled;<br>-} __packed;<br>+};<br> <br> /* Version 1 params */<br>-struct ec_params_switch_enable_wireless_v1 {<br>+struct __ec_align1 ec_params_switch_enable_wireless_v1 {<br> /* Flags to enable now */<br> uint8_t now_flags;<br> <br>@@ -2661,64 +3085,65 @@<br> <br> /* Which flags to copy from suspend_flags */<br> uint8_t suspend_mask;<br>-} __packed;<br>+};<br> <br> /* Version 1 response */<br>-struct ec_response_switch_enable_wireless_v1 {<br>+struct __ec_align1 ec_response_switch_enable_wireless_v1 {<br> /* Flags to enable now */<br> uint8_t now_flags;<br> <br> /* Flags to leave enabled in S3 */<br> uint8_t suspend_flags;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* GPIO commands. Only available on EC if write protect has been disabled. */<br> <br> /* Set GPIO output value */<br>-#define EC_CMD_GPIO_SET 0x92<br>+#define EC_CMD_GPIO_SET 0x0092<br> <br>-struct ec_params_gpio_set {<br>+struct __ec_align1 ec_params_gpio_set {<br> char name[32];<br> uint8_t val;<br>-} __packed;<br>+};<br> <br> /* Get GPIO value */<br>-#define EC_CMD_GPIO_GET 0x93<br>+#define EC_CMD_GPIO_GET 0x0093<br> <br> /* Version 0 of input params and response */<br>-struct ec_params_gpio_get {<br>+struct __ec_align1 ec_params_gpio_get {<br> char name[32];<br>-} __packed;<br>-struct ec_response_gpio_get {<br>+};<br>+<br>+struct __ec_align1 ec_response_gpio_get {<br> uint8_t val;<br>-} __packed;<br>+};<br> <br> /* Version 1 of input params and response */<br>-struct ec_params_gpio_get_v1 {<br>+struct __ec_align1 ec_params_gpio_get_v1 {<br> uint8_t subcmd;<br> union {<br>- struct {<br>+ struct __ec_align1 {<br> char name[32];<br> } get_value_by_name;<br>- struct {<br>+ struct __ec_align1 {<br> uint8_t index;<br> } get_info;<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_response_gpio_get_v1 {<br>+struct __ec_todo_packed ec_response_gpio_get_v1 {<br> union {<br>- struct {<br>+ struct __ec_align1 {<br> uint8_t val;<br> } get_value_by_name, get_count;<br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint8_t val;<br> char name[32];<br> uint32_t flags;<br> } get_info;<br> };<br>-} __packed;<br>+};<br> <br> enum gpio_get_subcmd {<br> EC_GPIO_GET_BY_NAME = 0,<br>@@ -2730,33 +3155,36 @@<br> /* I2C commands. Only available when flash write protect is unlocked. */<br> <br> /*<br>- * TODO(crosbug.com/p/23570): These commands are deprecated, and will be<br>- * removed soon. Use EC_CMD_I2C_PASSTHRU instead.<br>+ * CAUTION: These commands are deprecated, and are not supported anymore in EC<br>+ * builds >= 8398.0.0 (see crosbug.com/p/23570).<br>+ *<br>+ * Use EC_CMD_I2C_PASSTHRU instead.<br> */<br> <br> /* Read I2C bus */<br>-#define EC_CMD_I2C_READ 0x94<br>+#define EC_CMD_I2C_READ 0x0094<br> <br>-struct ec_params_i2c_read {<br>+struct __ec_align_size1 ec_params_i2c_read {<br> uint16_t addr; /* 8-bit address (7-bit shifted << 1) */<br> uint8_t read_size; /* Either 8 or 16. */<br> uint8_t port;<br> uint8_t offset;<br>-} __packed;<br>-struct ec_response_i2c_read {<br>+};<br>+<br>+struct __ec_align2 ec_response_i2c_read {<br> uint16_t data;<br>-} __packed;<br>+};<br> <br> /* Write I2C bus */<br>-#define EC_CMD_I2C_WRITE 0x95<br>+#define EC_CMD_I2C_WRITE 0x0095<br> <br>-struct ec_params_i2c_write {<br>+struct __ec_align_size1 ec_params_i2c_write {<br> uint16_t data;<br> uint16_t addr; /* 8-bit address (7-bit shifted << 1) */<br> uint8_t write_size; /* Either 8 or 16. */<br> uint8_t port;<br> uint8_t offset;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Charge state commands. Only available when flash write protect unlocked. */<br>@@ -2764,7 +3192,7 @@<br> /* Force charge state machine to stop charging the battery or force it to<br> * discharge the battery.<br> */<br>-#define EC_CMD_CHARGE_CONTROL 0x96<br>+#define EC_CMD_CHARGE_CONTROL 0x0096<br> #define EC_VER_CHARGE_CONTROL 1<br> <br> enum ec_charge_control_mode {<br>@@ -2773,15 +3201,15 @@<br> CHARGE_CONTROL_DISCHARGE,<br> };<br> <br>-struct ec_params_charge_control {<br>+struct __ec_align4 ec_params_charge_control {<br> uint32_t mode; /* enum charge_control_mode */<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Console commands. Only available when flash write protect is unlocked. */<br> <br> /* Snapshot console output buffer for use by EC_CMD_CONSOLE_READ. */<br>-#define EC_CMD_CONSOLE_SNAPSHOT 0x97<br>+#define EC_CMD_CONSOLE_SNAPSHOT 0x0097<br> <br> /*<br> * Read data from the saved snapshot. If the subcmd parameter is<br>@@ -2795,16 +3223,16 @@<br> * Response is null-terminated string. Empty string, if there is no more<br> * remaining output.<br> */<br>-#define EC_CMD_CONSOLE_READ 0x98<br>+#define EC_CMD_CONSOLE_READ 0x0098<br> <br> enum ec_console_read_subcmd {<br> CONSOLE_READ_NEXT = 0,<br> CONSOLE_READ_RECENT<br> };<br> <br>-struct ec_params_console_read_v1 {<br>+struct __ec_align1 ec_params_console_read_v1 {<br> uint8_t subcmd; /* enum ec_console_read_subcmd */<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> <br>@@ -2815,13 +3243,13 @@<br> * EC_RES_SUCCESS if the command was successful.<br> * EC_RES_ERROR if the cut off command failed.<br> */<br>-#define EC_CMD_BATTERY_CUT_OFF 0x99<br>+#define EC_CMD_BATTERY_CUT_OFF 0x0099<br> <br> #define EC_BATTERY_CUTOFF_FLAG_AT_SHUTDOWN (1 << 0)<br> <br>-struct ec_params_battery_cutoff {<br>+struct __ec_align1 ec_params_battery_cutoff {<br> uint8_t flags;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* USB port mux control. */<br>@@ -2829,11 +3257,11 @@<br> /*<br> * Switch USB mux or return to automatic switching.<br> */<br>-#define EC_CMD_USB_MUX 0x9a<br>+#define EC_CMD_USB_MUX 0x009A<br> <br>-struct ec_params_usb_mux {<br>+struct __ec_align1 ec_params_usb_mux {<br> uint8_t mux;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* LDOs / FETs control. */<br>@@ -2846,25 +3274,25 @@<br> /*<br> * Switch on/off a LDO.<br> */<br>-#define EC_CMD_LDO_SET 0x9b<br>+#define EC_CMD_LDO_SET 0x009B<br> <br>-struct ec_params_ldo_set {<br>+struct __ec_align1 ec_params_ldo_set {<br> uint8_t index;<br> uint8_t state;<br>-} __packed;<br>+};<br> <br> /*<br> * Get LDO state.<br> */<br>-#define EC_CMD_LDO_GET 0x9c<br>+#define EC_CMD_LDO_GET 0x009C<br> <br>-struct ec_params_ldo_get {<br>+struct __ec_align1 ec_params_ldo_get {<br> uint8_t index;<br>-} __packed;<br>+};<br> <br>-struct ec_response_ldo_get {<br>+struct __ec_align1 ec_response_ldo_get {<br> uint8_t state;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Power info. */<br>@@ -2872,20 +3300,20 @@<br> /*<br> * Get power info.<br> */<br>-#define EC_CMD_POWER_INFO 0x9d<br>+#define EC_CMD_POWER_INFO 0x009D<br> <br>-struct ec_response_power_info {<br>+struct __ec_align4 ec_response_power_info {<br> uint32_t usb_dev_type;<br> uint16_t voltage_ac;<br> uint16_t voltage_system;<br> uint16_t current_system;<br> uint16_t usb_current_limit;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* I2C passthru command */<br> <br>-#define EC_CMD_I2C_PASSTHRU 0x9e<br>+#define EC_CMD_I2C_PASSTHRU 0x009E<br> <br> /* Read data; if not present, message is a write */<br> #define EC_I2C_FLAG_READ (1 << 15)<br>@@ -2899,28 +3327,28 @@<br> /* Any error */<br> #define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT)<br> <br>-struct ec_params_i2c_passthru_msg {<br>+struct __ec_align2 ec_params_i2c_passthru_msg {<br> uint16_t addr_flags; /* I2C slave address (7 or 10 bits) and flags */<br> uint16_t len; /* Number of bytes to read or write */<br>-} __packed;<br>+};<br> <br>-struct ec_params_i2c_passthru {<br>+struct __ec_align2 ec_params_i2c_passthru {<br> uint8_t port; /* I2C port number */<br> uint8_t num_msgs; /* Number of messages */<br> struct ec_params_i2c_passthru_msg msg[];<br> /* Data to write for all messages is concatenated here */<br>-} __packed;<br>+};<br> <br>-struct ec_response_i2c_passthru {<br>+struct __ec_align1 ec_response_i2c_passthru {<br> uint8_t i2c_status; /* Status flags (EC_I2C_STATUS_...) */<br> uint8_t num_msgs; /* Number of messages processed */<br> uint8_t data[]; /* Data read by messages concatenated here */<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Power button hang detect */<br> <br>-#define EC_CMD_HANG_DETECT 0x9f<br>+#define EC_CMD_HANG_DETECT 0x009F<br> <br> /* Reasons to start hang detection timer */<br> /* Power button pressed */<br>@@ -2961,7 +3389,7 @@<br> */<br> #define EC_HANG_STOP_NOW (1 << 31)<br> <br>-struct ec_params_hang_detect {<br>+struct __ec_align4 ec_params_hang_detect {<br> /* Flags; see EC_HANG_* */<br> uint32_t flags;<br> <br>@@ -2970,7 +3398,7 @@<br> <br> /* Timeout in msec before generating warm reboot, if enabled */<br> uint16_t warm_reboot_timeout_msec;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* Commands for battery charging */<br>@@ -2979,7 +3407,7 @@<br> * This is the single catch-all host command to exchange data regarding the<br> * charge state machine (v2 and up).<br> */<br>-#define EC_CMD_CHARGE_STATE 0xa0<br>+#define EC_CMD_CHARGE_STATE 0x00A0<br> <br> /* Subcommands for this host command */<br> enum charge_state_command {<br>@@ -3014,27 +3442,27 @@<br> /* Other custom param ranges go here... */<br> };<br> <br>-struct ec_params_charge_state {<br>+struct __ec_todo_packed ec_params_charge_state {<br> uint8_t cmd; /* enum charge_state_command */<br> union {<br>- struct {<br>+ struct __ec_align1 {<br> /* no args */<br> } get_state;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint32_t param; /* enum charge_state_param */<br> } get_param;<br> <br>- struct {<br>+ struct __ec_todo_unpacked {<br> uint32_t param; /* param to set */<br> uint32_t value; /* value to set */<br> } set_param;<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_response_charge_state {<br>+struct __ec_align4 ec_response_charge_state {<br> union {<br>- struct {<br>+ struct __ec_align4 {<br> int ac;<br> int chg_voltage;<br> int chg_current;<br>@@ -3042,35 +3470,35 @@<br> int batt_state_of_charge;<br> } get_state;<br> <br>- struct {<br>+ struct __ec_align4 {<br> uint32_t value;<br> } get_param;<br>- struct {<br>+ struct __ec_align4 {<br> /* no return values */<br> } set_param;<br> };<br>-} __packed;<br>+};<br> <br> <br> /*<br> * Set maximum battery charging current.<br> */<br>-#define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1<br>+#define EC_CMD_CHARGE_CURRENT_LIMIT 0x00A1<br> <br>-struct ec_params_current_limit {<br>+struct __ec_align4 ec_params_current_limit {<br> uint32_t limit; /* in mA */<br>-} __packed;<br>+};<br> <br> /*<br> * Set maximum external voltage / current.<br> */<br>-#define EC_CMD_EXTERNAL_POWER_LIMIT 0xa2<br>+#define EC_CMD_EXTERNAL_POWER_LIMIT 0x00A2<br> <br> /* Command v0 is used only on Spring and is obsolete + unsupported */<br>-struct ec_params_external_power_limit_v1 {<br>+struct __ec_align2 ec_params_external_power_limit_v1 {<br> uint16_t current_lim; /* in mA, or EC_POWER_LIMIT_NONE to clear limit */<br> uint16_t voltage_lim; /* in mV, or EC_POWER_LIMIT_NONE to clear limit */<br>-} __packed;<br>+};<br> <br> #define EC_POWER_LIMIT_NONE 0xffff<br> <br>@@ -3078,9 +3506,9 @@<br> /* Hibernate/Deep Sleep Commands */<br> <br> /* Set the delay before going into hibernation. */<br>-#define EC_CMD_HIBERNATION_DELAY 0xa8<br>+#define EC_CMD_HIBERNATION_DELAY 0x00A8<br> <br>-struct ec_params_hibernation_delay {<br>+struct __ec_align4 ec_params_hibernation_delay {<br> /*<br> * Seconds to wait in G3 before hibernate. Pass in 0 to read the<br> * current settings without changing them.<br>@@ -3088,7 +3516,7 @@<br> uint32_t seconds;<br> };<br> <br>-struct ec_response_hibernation_delay {<br>+struct __ec_align4 ec_response_hibernation_delay {<br> /*<br> * The current time in seconds in which the system has been in the G3<br> * state. This value is reset if the EC transitions out of G3.<br>@@ -3108,42 +3536,84 @@<br> uint32_t hibernate_delay;<br> };<br> <br>+/* Inform the EC when entering a sleep state */<br>+#define EC_CMD_HOST_SLEEP_EVENT 0x00A9<br>+<br>+enum host_sleep_event {<br>+ HOST_SLEEP_EVENT_S3_SUSPEND = 1,<br>+ HOST_SLEEP_EVENT_S3_RESUME = 2,<br>+ HOST_SLEEP_EVENT_S0IX_SUSPEND = 3,<br>+ HOST_SLEEP_EVENT_S0IX_RESUME = 4<br>+};<br>+<br>+struct __ec_align1 ec_params_host_sleep_event {<br>+ uint8_t sleep_event;<br>+};<br>+<br>+/*****************************************************************************/<br>+/* Device events */<br>+#define EC_CMD_DEVICE_EVENT 0x00AA<br>+<br>+enum ec_device_event {<br>+ EC_DEVICE_EVENT_TRACKPAD,<br>+ EC_DEVICE_EVENT_DSP,<br>+ EC_DEVICE_EVENT_WIFI,<br>+};<br>+<br>+enum ec_device_event_param {<br>+ /* Get and clear pending device events */<br>+ EC_DEVICE_EVENT_PARAM_GET_CURRENT_EVENTS,<br>+ /* Get device event mask */<br>+ EC_DEVICE_EVENT_PARAM_GET_ENABLED_EVENTS,<br>+ /* Set device event mask */<br>+ EC_DEVICE_EVENT_PARAM_SET_ENABLED_EVENTS,<br>+};<br>+<br>+#define EC_DEVICE_EVENT_MASK(event_code) (1UL << (event_code % 32))<br>+<br>+struct __ec_align_size1 ec_params_device_event {<br>+ uint32_t event_mask;<br>+ uint8_t param;<br>+};<br>+<br>+struct __ec_align4 ec_response_device_event {<br>+ uint32_t event_mask;<br>+};<br> <br> /*****************************************************************************/<br> /* Smart battery pass-through */<br> <br> /* Get / Set 16-bit smart battery registers */<br>-#define EC_CMD_SB_READ_WORD 0xb0<br>-#define EC_CMD_SB_WRITE_WORD 0xb1<br>+#define EC_CMD_SB_READ_WORD 0x00B0<br>+#define EC_CMD_SB_WRITE_WORD 0x00B1<br> <br> /* Get / Set string smart battery parameters<br> * formatted as SMBUS "block".<br> */<br>-#define EC_CMD_SB_READ_BLOCK 0xb2<br>-#define EC_CMD_SB_WRITE_BLOCK 0xb3<br>+#define EC_CMD_SB_READ_BLOCK 0x00B2<br>+#define EC_CMD_SB_WRITE_BLOCK 0x00B3<br> <br>-struct ec_params_sb_rd {<br>+struct __ec_align1 ec_params_sb_rd {<br> uint8_t reg;<br>-} __packed;<br>+};<br> <br>-struct ec_response_sb_rd_word {<br>+struct __ec_align2 ec_response_sb_rd_word {<br> uint16_t value;<br>-} __packed;<br>+};<br> <br>-struct ec_params_sb_wr_word {<br>+struct __ec_align1 ec_params_sb_wr_word {<br> uint8_t reg;<br> uint16_t value;<br>-} __packed;<br>+};<br> <br>-struct ec_response_sb_rd_block {<br>+struct __ec_align1 ec_response_sb_rd_block {<br> uint8_t data[32];<br>-} __packed;<br>+};<br> <br>-struct ec_params_sb_wr_block {<br>+struct __ec_align1 ec_params_sb_wr_block {<br> uint8_t reg;<br> uint16_t data[32];<br>-} __packed;<br>-<br>+};<br> <br> /*****************************************************************************/<br> /* Battery vendor parameters<br>@@ -3154,28 +3624,28 @@<br> * requested value.<br> */<br> <br>-#define EC_CMD_BATTERY_VENDOR_PARAM 0xb4<br>+#define EC_CMD_BATTERY_VENDOR_PARAM 0x00B4<br> <br> enum ec_battery_vendor_param_mode {<br> BATTERY_VENDOR_PARAM_MODE_GET = 0,<br> BATTERY_VENDOR_PARAM_MODE_SET,<br> };<br> <br>-struct ec_params_battery_vendor_param {<br>+struct __ec_align_size1 ec_params_battery_vendor_param {<br> uint32_t param;<br> uint32_t value;<br> uint8_t mode;<br>-} __packed;<br>+};<br> <br>-struct ec_response_battery_vendor_param {<br>+struct __ec_align4 ec_response_battery_vendor_param {<br> uint32_t value;<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /*<br> * Smart Battery Firmware Update Commands<br> */<br>-#define EC_CMD_SB_FW_UPDATE 0xb5<br>+#define EC_CMD_SB_FW_UPDATE 0x00B5<br> <br> enum ec_sb_fw_update_subcmd {<br> EC_SB_FW_UPDATE_PREPARE = 0x0,<br>@@ -3192,12 +3662,12 @@<br> #define SB_FW_UPDATE_CMD_STATUS_SIZE 2<br> #define SB_FW_UPDATE_CMD_INFO_SIZE 8<br> <br>-struct ec_sb_fw_update_header {<br>+struct __ec_align4 ec_sb_fw_update_header {<br> uint16_t subcmd; /* enum ec_sb_fw_update_subcmd */<br> uint16_t fw_id; /* firmware id */<br>-} __packed;<br>+};<br> <br>-struct ec_params_sb_fw_update {<br>+struct __ec_align4 ec_params_sb_fw_update {<br> struct ec_sb_fw_update_header hdr;<br> union {<br> /* EC_SB_FW_UPDATE_PREPARE = 0x0 */<br>@@ -3206,41 +3676,41 @@<br> /* EC_SB_FW_UPDATE_END = 0x4 */<br> /* EC_SB_FW_UPDATE_STATUS = 0x5 */<br> /* EC_SB_FW_UPDATE_PROTECT = 0x6 */<br>- struct {<br>+ struct __ec_align4 {<br> /* no args */<br> } dummy;<br> <br> /* EC_SB_FW_UPDATE_WRITE = 0x3 */<br>- struct {<br>+ struct __ec_align4 {<br> uint8_t data[SB_FW_UPDATE_CMD_WRITE_BLOCK_SIZE];<br> } write;<br> };<br>-} __packed;<br>+};<br> <br>-struct ec_response_sb_fw_update {<br>+struct __ec_align1 ec_response_sb_fw_update {<br> union {<br> /* EC_SB_FW_UPDATE_INFO = 0x1 */<br>- struct {<br>+ struct __ec_align1 {<br> uint8_t data[SB_FW_UPDATE_CMD_INFO_SIZE];<br> } info;<br> <br> /* EC_SB_FW_UPDATE_STATUS = 0x5 */<br>- struct {<br>+ struct __ec_align1 {<br> uint8_t data[SB_FW_UPDATE_CMD_STATUS_SIZE];<br> } status;<br> };<br>-} __packed;<br>+};<br> <br> /*<br> * Entering Verified Boot Mode Command<br> * Default mode is VBOOT_MODE_NORMAL if EC did not receive this command.<br> * Valid Modes are: normal, developer, and recovery.<br> */<br>-#define EC_CMD_ENTERING_MODE 0xb6<br>+#define EC_CMD_ENTERING_MODE 0x00B6<br> <br>-struct ec_params_entering_mode {<br>+struct __ec_align4 ec_params_entering_mode {<br> int vboot_mode;<br>-} __packed;<br>+};<br> <br> #define VBOOT_MODE_NORMAL 0<br> #define VBOOT_MODE_DEVELOPER 1<br>@@ -3251,21 +3721,21 @@<br> * I2C passthru protection command: Protects I2C tunnels against access on<br> * certain addresses (board-specific).<br> */<br>-#define EC_CMD_I2C_PASSTHRU_PROTECT 0xb7<br>+#define EC_CMD_I2C_PASSTHRU_PROTECT 0x00B7<br> <br> enum ec_i2c_passthru_protect_subcmd {<br> EC_CMD_I2C_PASSTHRU_PROTECT_STATUS = 0x0,<br> EC_CMD_I2C_PASSTHRU_PROTECT_ENABLE = 0x1,<br> };<br> <br>-struct ec_params_i2c_passthru_protect {<br>+struct __ec_align1 ec_params_i2c_passthru_protect {<br> uint8_t subcmd;<br> uint8_t port; /* I2C port number */<br>-} __packed;<br>+};<br> <br>-struct ec_response_i2c_passthru_protect {<br>+struct __ec_align1 ec_response_i2c_passthru_protect {<br> uint8_t status; /* Status flags (0: unlocked, 1: locked) */<br>-} __packed;<br>+};<br> <br> /*****************************************************************************/<br> /* System commands */<br>@@ -3274,7 +3744,7 @@<br> * TODO(crosbug.com/p/23747): This is a confusing name, since it doesn't<br> * necessarily reboot the EC. Rename to "image" or something similar?<br> */<br>-#define EC_CMD_REBOOT_EC 0xd2<br>+#define EC_CMD_REBOOT_EC 0x00D2<br> <br> /* Command */<br> enum ec_reboot_cmd {<br>@@ -3291,10 +3761,10 @@<br> #define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */<br> #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) /* Reboot after AP shutdown */<br> <br>-struct ec_params_reboot_ec {<br>+struct __ec_align1 ec_params_reboot_ec {<br> uint8_t cmd; /* enum ec_reboot_cmd */<br> uint8_t flags; /* See EC_REBOOT_FLAG_* */<br>-} __packed;<br>+};<br> <br> /*<br> * Get information on last EC panic.<br>@@ -3302,7 +3772,7 @@<br> * Returns variable-length platform-dependent panic information. See panic.h<br> * for details.<br> */<br>-#define EC_CMD_GET_PANIC_INFO 0xd3<br>+#define EC_CMD_GET_PANIC_INFO 0x00D3<br> <br> /*****************************************************************************/<br> /*<br>@@ -3321,7 +3791,7 @@<br> *<br> * Use EC_CMD_REBOOT_EC to reboot the EC more politely.<br> */<br>-#define EC_CMD_REBOOT 0xd1 /* Think "die" */<br>+#define EC_CMD_REBOOT 0x00D1 /* Think "die" */<br> <br> /*<br> * Resend last response (not supported on LPC).<br>@@ -3330,7 +3800,7 @@<br> * there was no previous command, or the previous command's response was too<br> * big to save.<br> */<br>-#define EC_CMD_RESEND_RESPONSE 0xdb<br>+#define EC_CMD_RESEND_RESPONSE 0x00DB<br> <br> /*<br> * This header byte on a command indicate version 0. Any header byte less<br>@@ -3342,7 +3812,7 @@<br> *<br> * The old EC interface must not use commands 0xdc or higher.<br> */<br>-#define EC_CMD_VERSION0 0xdc<br>+#define EC_CMD_VERSION0 0x00DC<br> <br> /*****************************************************************************/<br> /*<br>@@ -3352,7 +3822,7 @@<br> */<br> <br> /* EC to PD MCU exchange status command */<br>-#define EC_CMD_PD_EXCHANGE_STATUS 0x100<br>+#define EC_CMD_PD_EXCHANGE_STATUS 0x0100<br> #define EC_VER_PD_EXCHANGE_STATUS 2<br> <br> enum pd_charge_state {<br>@@ -3365,11 +3835,11 @@<br> /* Status of EC being sent to PD */<br> #define EC_STATUS_HIBERNATING (1 << 0)<br> <br>-struct ec_params_pd_status {<br>+struct __ec_align1 ec_params_pd_status {<br> uint8_t status; /* EC status */<br> int8_t batt_soc; /* battery state of charge */<br> uint8_t charge_state; /* charging state (from enum pd_charge_state) */<br>-} __packed;<br>+};<br> <br> /* Status of PD being sent back to EC */<br> #define PD_STATUS_HOST_EVENT (1 << 0) /* Forward host event to AP */<br>@@ -3382,26 +3852,26 @@<br> #define PD_STATUS_EC_INT_ACTIVE (PD_STATUS_TCPC_ALERT_0 | \<br> PD_STATUS_TCPC_ALERT_1 | \<br> PD_STATUS_HOST_EVENT)<br>-struct ec_response_pd_status {<br>+struct __ec_align_size1 ec_response_pd_status {<br> uint32_t curr_lim_ma; /* input current limit */<br> uint16_t status; /* PD MCU status */<br> int8_t active_charge_port; /* active charging port */<br>-} __packed;<br>+};<br> <br> /* AP to PD MCU host event status command, cleared on read */<br>-#define EC_CMD_PD_HOST_EVENT_STATUS 0x104<br>+#define EC_CMD_PD_HOST_EVENT_STATUS 0x0104<br> <br> /* PD MCU host event status bits */<br> #define PD_EVENT_UPDATE_DEVICE (1 << 0)<br> #define PD_EVENT_POWER_CHANGE (1 << 1)<br> #define PD_EVENT_IDENTITY_RECEIVED (1 << 2)<br> #define PD_EVENT_DATA_SWAP (1 << 3)<br>-struct ec_response_host_event_status {<br>+struct __ec_align4 ec_response_host_event_status {<br> uint32_t status; /* PD MCU host event status */<br>-} __packed;<br>+};<br> <br> /* Set USB type-C port role and muxes */<br>-#define EC_CMD_USB_PD_CONTROL 0x101<br>+#define EC_CMD_USB_PD_CONTROL 0x0101<br> <br> enum usb_pd_control_role {<br> USB_PD_CTRL_ROLE_NO_CHANGE = 0,<br>@@ -3430,12 +3900,12 @@<br> USB_PD_CTRL_SWAP_COUNT<br> };<br> <br>-struct ec_params_usb_pd_control {<br>+struct __ec_align1 ec_params_usb_pd_control {<br> uint8_t port;<br> uint8_t role;<br> uint8_t mux;<br> uint8_t swap;<br>-} __packed;<br>+};<br> <br> #define PD_CTRL_RESP_ENABLED_COMMS (1 << 0) /* Communication enabled */<br> #define PD_CTRL_RESP_ENABLED_CONNECTED (1 << 1) /* Device connected */<br>@@ -3449,32 +3919,32 @@<br> #define PD_CTRL_RESP_ROLE_USB_COMM (1 << 5) /* Partner USB comm capable */<br> #define PD_CTRL_RESP_ROLE_EXT_POWERED (1 << 6) /* Partner externally powerd */<br> <br>-struct ec_response_usb_pd_control {<br>+struct __ec_align1 ec_response_usb_pd_control {<br> uint8_t enabled;<br> uint8_t role;<br> uint8_t polarity;<br> uint8_t state;<br>-} __packed;<br>+};<br> <br>-struct ec_response_usb_pd_control_v1 {<br>+struct __ec_align1 ec_response_usb_pd_control_v1 {<br> uint8_t enabled;<br> uint8_t role;<br> uint8_t polarity;<br> char state[32];<br>-} __packed;<br>+};<br> <br>-#define EC_CMD_USB_PD_PORTS 0x102<br>+#define EC_CMD_USB_PD_PORTS 0x0102<br> <br>-struct ec_response_usb_pd_ports {<br>+struct __ec_align1 ec_response_usb_pd_ports {<br> uint8_t num_ports;<br>-} __packed;<br>+};<br> <br>-#define EC_CMD_USB_PD_POWER_INFO 0x103<br>+#define EC_CMD_USB_PD_POWER_INFO 0x0103<br> <br> #define PD_POWER_CHARGING_PORT 0xff<br>-struct ec_params_usb_pd_power_info {<br>+struct __ec_align1 ec_params_usb_pd_power_info {<br> uint8_t port;<br>-} __packed;<br>+};<br> <br> enum usb_chg_type {<br> USB_CHG_TYPE_NONE,<br>@@ -3495,24 +3965,24 @@<br> USB_PD_PORT_POWER_SINK_NOT_CHARGING,<br> };<br> <br>-struct usb_chg_measures {<br>+struct __ec_align2 usb_chg_measures {<br> uint16_t voltage_max;<br> uint16_t voltage_now;<br> uint16_t current_max;<br> uint16_t current_lim;<br>-} __packed;<br>+};<br> <br>-struct ec_response_usb_pd_power_info {<br>+struct __ec_align4 ec_response_usb_pd_power_info {<br> uint8_t role;<br> uint8_t type;<br> uint8_t dualrole;<br> uint8_t reserved1;<br> struct usb_chg_measures meas;<br> uint32_t max_power;<br>-} __packed;<br>+};<br> <br> /* Write USB-PD device FW */<br>-#define EC_CMD_USB_PD_FW_UPDATE 0x110<br>+#define EC_CMD_USB_PD_FW_UPDATE 0x0110<br> <br> enum usb_pd_fw_update_cmds {<br> USB_PD_FW_REBOOT,<br>@@ -3521,42 +3991,44 @@<br> USB_PD_FW_ERASE_SIG,<br> };<br> <br>-struct ec_params_usb_pd_fw_update {<br>+struct __ec_align4 ec_params_usb_pd_fw_update {<br> uint16_t dev_id;<br> uint8_t cmd;<br> uint8_t port;<br> uint32_t size; /* Size to write in bytes */<br> /* Followed by data to write */<br>-} __packed;<br>+};<br> <br> /* Write USB-PD Accessory RW_HASH table entry */<br>-#define EC_CMD_USB_PD_RW_HASH_ENTRY 0x111<br>+#define EC_CMD_USB_PD_RW_HASH_ENTRY 0x0111<br> /* RW hash is first 20 bytes of SHA-256 of RW section */<br> #define PD_RW_HASH_SIZE 20<br>-struct ec_params_usb_pd_rw_hash_entry {<br>+struct __ec_align1 ec_params_usb_pd_rw_hash_entry {<br> uint16_t dev_id;<br> uint8_t dev_rw_hash[PD_RW_HASH_SIZE];<br>- uint8_t reserved; /* For alignment of current_image */<br>+ uint8_t reserved; /* For alignment of current_image<br>+ * TODO(rspangler) but it's not aligned!<br>+ * Should have been reserved[2]. */<br> uint32_t current_image; /* One of ec_current_image */<br>-} __packed;<br>+};<br> <br> /* Read USB-PD Accessory info */<br>-#define EC_CMD_USB_PD_DEV_INFO 0x112<br>+#define EC_CMD_USB_PD_DEV_INFO 0x0112<br> <br>-struct ec_params_usb_pd_info_request {<br>+struct __ec_align1 ec_params_usb_pd_info_request {<br> uint8_t port;<br>-} __packed;<br>+};<br> <br> /* Read USB-PD Device discovery info */<br>-#define EC_CMD_USB_PD_DISCOVERY 0x113<br>-struct ec_params_usb_pd_discovery_entry {<br>+#define EC_CMD_USB_PD_DISCOVERY 0x0113<br>+struct __ec_align_size1 ec_params_usb_pd_discovery_entry {<br> uint16_t vid; /* USB-IF VID */<br> uint16_t pid; /* USB-IF PID */<br> uint8_t ptype; /* product type (hub,periph,cable,ama) */<br>-} __packed;<br>+};<br> <br> /* Override default charge behavior */<br>-#define EC_CMD_PD_CHARGE_PORT_OVERRIDE 0x114<br>+#define EC_CMD_PD_CHARGE_PORT_OVERRIDE 0x0114<br> <br> /* Negative port parameters have special meaning */<br> enum usb_pd_override_ports {<br>@@ -3565,20 +4037,20 @@<br> /* [0, CONFIG_USB_PD_PORT_COUNT): Port# */<br> };<br> <br>-struct ec_params_charge_port_override {<br>+struct __ec_align2 ec_params_charge_port_override {<br> int16_t override_port; /* Override port# */<br>-} __packed;<br>+};<br> <br> /* Read (and delete) one entry of PD event log */<br>-#define EC_CMD_PD_GET_LOG_ENTRY 0x115<br>+#define EC_CMD_PD_GET_LOG_ENTRY 0x0115<br> <br>-struct ec_response_pd_log {<br>+struct __ec_align4 ec_response_pd_log {<br> uint32_t timestamp; /* relative timestamp in milliseconds */<br> uint8_t type; /* event type : see PD_EVENT_xx below */<br> uint8_t size_port; /* [7:5] port number [4:0] payload size in bytes */<br> uint16_t data; /* type-defined data payload */<br> uint8_t payload[0]; /* optional additional data payload: 0..16 bytes */<br>-} __packed;<br>+};<br> <br> <br> /* The timestamp is the microsecond counter shifted to get about a ms. */<br>@@ -3641,37 +4113,37 @@<br> /*<br> * PD_EVENT_VIDEO_CODEC payload is "struct mcdp_info".<br> */<br>-struct mcdp_version {<br>+struct __ec_align4 mcdp_version {<br> uint8_t major;<br> uint8_t minor;<br> uint16_t build;<br>-} __packed;<br>+};<br> <br>-struct mcdp_info {<br>+struct __ec_align4 mcdp_info {<br> uint8_t family[2];<br> uint8_t chipid[2];<br> struct mcdp_version irom;<br> struct mcdp_version fw;<br>-} __packed;<br>+};<br> <br> /* struct mcdp_info field decoding */<br> #define MCDP_CHIPID(chipid) ((chipid[0] << 8) | chipid[1])<br> #define MCDP_FAMILY(family) ((family[0] << 8) | family[1])<br> <br> /* Get/Set USB-PD Alternate mode info */<br>-#define EC_CMD_USB_PD_GET_AMODE 0x116<br>-struct ec_params_usb_pd_get_mode_request {<br>+#define EC_CMD_USB_PD_GET_AMODE 0x0116<br>+struct __ec_align_size1 ec_params_usb_pd_get_mode_request {<br> uint16_t svid_idx; /* SVID index to get */<br> uint8_t port; /* port */<br>-} __packed;<br>+};<br> <br>-struct ec_params_usb_pd_get_mode_response {<br>+struct __ec_align4 ec_params_usb_pd_get_mode_response {<br> uint16_t svid; /* SVID */<br> uint16_t opos; /* Object Position */<br> uint32_t vdo[6]; /* Mode VDOs */<br>-} __packed;<br>+};<br> <br>-#define EC_CMD_USB_PD_SET_AMODE 0x117<br>+#define EC_CMD_USB_PD_SET_AMODE 0x0117<br> <br> enum pd_mode_cmd {<br> PD_EXIT_MODE = 0,<br>@@ -3680,24 +4152,24 @@<br> PD_MODE_CMD_COUNT,<br> };<br> <br>-struct ec_params_usb_pd_set_mode_request {<br>+struct __ec_align4 ec_params_usb_pd_set_mode_request {<br> uint32_t cmd; /* enum pd_mode_cmd */<br> uint16_t svid; /* SVID to set */<br> uint8_t opos; /* Object Position */<br> uint8_t port; /* port */<br>-} __packed;<br>+};<br> <br> /* Ask the PD MCU to record a log of a requested type */<br>-#define EC_CMD_PD_WRITE_LOG_ENTRY 0x118<br>+#define EC_CMD_PD_WRITE_LOG_ENTRY 0x0118<br> <br>-struct ec_params_pd_write_log_entry {<br>+struct __ec_align1 ec_params_pd_write_log_entry {<br> uint8_t type; /* event type : see PD_EVENT_xx above */<br> uint8_t port; /* port#, or 0 for events unrelated to a given port */<br>-} __packed;<br>+};<br> <br> <br> /* Control USB-PD chip */<br>-#define EC_CMD_PD_CONTROL 0x119<br>+#define EC_CMD_PD_CONTROL 0x0119<br> <br> enum ec_pd_control_cmd {<br> PD_SUSPEND = 0, /* Suspend the PD chip (EC: stop talking to PD) */<br>@@ -3706,19 +4178,178 @@<br> PD_CONTROL_DISABLE /* Disable further calls to this command */<br> };<br> <br>-struct ec_params_pd_control {<br>+struct __ec_align1 ec_params_pd_control {<br> uint8_t chip; /* chip id (should be 0) */<br> uint8_t subcmd;<br>-} __packed;<br>+};<br> <br>-#endif /* !__ACPI__ */<br>+/* Get info about USB-C SS muxes */<br>+#define EC_CMD_USB_PD_MUX_INFO 0x011A<br>+<br>+struct __ec_align1 ec_params_usb_pd_mux_info {<br>+ uint8_t port; /* USB-C port number */<br>+};<br>+<br>+/* Flags representing mux state */<br>+#define USB_PD_MUX_USB_ENABLED (1 << 0)<br>+#define USB_PD_MUX_DP_ENABLED (1 << 1)<br>+#define USB_PD_MUX_POLARITY_INVERTED (1 << 2)<br>+#define USB_PD_MUX_HPD_IRQ (1 << 3)<br>+<br>+struct __ec_align1 ec_response_usb_pd_mux_info {<br>+ uint8_t flags; /* USB_PD_MUX_*-encoded USB mux state */<br>+};<br>+<br>+#define EC_CMD_PD_CHIP_INFO 0x011B<br>+<br>+struct __ec_align1 ec_params_pd_chip_info {<br>+ uint8_t port; /* USB-C port number */<br>+ uint8_t renew; /* Force renewal */<br>+};<br>+<br>+struct __ec_align2 ec_response_pd_chip_info {<br>+ uint16_t vendor_id;<br>+ uint16_t product_id;<br>+ uint16_t device_id;<br>+ union {<br>+ uint8_t fw_version_string[8];<br>+ uint64_t fw_version_number;<br>+ };<br>+};<br>+<br>+/* Run RW signature verification and get status */<br>+#define EC_CMD_RWSIG_CHECK_STATUS 0x011C<br>+<br>+struct __ec_align4 ec_response_rwsig_check_status {<br>+ uint32_t status;<br>+};<br>+<br>+/* For controlling RWSIG task */<br>+#define EC_CMD_RWSIG_ACTION 0x011D<br>+<br>+enum rwsig_action {<br>+ RWSIG_ACTION_ABORT = 0, /* Abort RWSIG and prevent jumping */<br>+ RWSIG_ACTION_CONTINUE = 1, /* Jump to RW immediately */<br>+};<br>+<br>+struct __ec_align4 ec_params_rwsig_action {<br>+ uint32_t action;<br>+};<br>+<br>+/*****************************************************************************/<br>+/* The command range 0x200-0x2FF is reserved for Rotor. */<br> <br> /*****************************************************************************/<br> /*<br>- * Blob commands are just opaque chunks of data, sent with proto v3.<br>- * params is struct ec_host_request, response is struct ec_host_response.<br>+ * Reserve a range of host commands for the CR51 firmware.<br> */<br>-#define EC_CMD_BLOB 0x200<br>+#define EC_CMD_CR51_BASE 0x0300<br>+#define EC_CMD_CR51_LAST 0x03FF<br>+<br>+/*****************************************************************************/<br>+/* Fingerprint MCU commands: range 0x0400-0x040x */<br>+<br>+/* Fingerprint SPI sensor passthru command: prototyping ONLY */<br>+#define EC_CMD_FP_PASSTHRU 0x0400<br>+<br>+#define EC_FP_FLAG_NOT_COMPLETE 0x1<br>+<br>+struct __ec_align2 ec_params_fp_passthru {<br>+ uint16_t len; /* Number of bytes to write then read */<br>+ uint16_t flags; /* EC_FP_FLAG_xxx */<br>+ uint8_t data[]; /* Data to send */<br>+};<br>+<br>+/* Fingerprint sensor configuration command: prototyping ONLY */<br>+#define EC_CMD_FP_SENSOR_CONFIG 0x0401<br>+<br>+#define EC_FP_SENSOR_CONFIG_MAX_REGS 16<br>+<br>+struct __ec_align2 ec_params_fp_sensor_config {<br>+ uint8_t count; /* Number of setup registers */<br>+ /*<br>+ * the value to send to each of the 'count' setup registers<br>+ * is stored in the 'data' array for 'len' bytes just after<br>+ * the previous one.<br>+ */<br>+ uint8_t len[EC_FP_SENSOR_CONFIG_MAX_REGS];<br>+ uint8_t data[];<br>+};<br>+<br>+/* Configure the Fingerprint MCU behavior */<br>+#define EC_CMD_FP_MODE 0x0402<br>+<br>+/* Put the sensor in its lowest power mode */<br>+#define FP_MODE_DEEPSLEEP (1<<0)<br>+/* Wait to see a finger on the sensor */<br>+#define FP_MODE_FINGER_DOWN (1<<1)<br>+/* Poll until the finger has left the sensor */<br>+#define FP_MODE_FINGER_UP (1<<2)<br>+/* Capture the current finger image */<br>+#define FP_MODE_CAPTURE (1<<3)<br>+/* special value: don't change anything just read back current mode */<br>+#define FP_MODE_DONT_CHANGE (1<<31)<br>+<br>+struct __ec_align4 ec_params_fp_mode {<br>+ uint32_t mode; /* as defined by FP_MODE_ constants */<br>+ /* TBD */<br>+};<br>+<br>+struct __ec_align4 ec_response_fp_mode {<br>+ uint32_t mode; /* as defined by FP_MODE_ constants */<br>+ /* TBD */<br>+};<br>+<br>+/* Retrieve Fingerprint sensor information */<br>+#define EC_CMD_FP_INFO 0x0403<br>+<br>+struct __ec_align2 ec_response_fp_info {<br>+ /* Sensor identification */<br>+ uint32_t vendor_id;<br>+ uint32_t product_id;<br>+ uint32_t model_id;<br>+ uint32_t version;<br>+ /* Image frame characteristics */<br>+ uint32_t frame_size;<br>+ uint32_t pixel_format; /* using V4L2_PIX_FMT_ */<br>+ uint16_t width;<br>+ uint16_t height;<br>+ uint16_t bpp;<br>+};<br>+<br>+/* Get the last captured finger frame: TODO: will be AES-encrypted */<br>+#define EC_CMD_FP_FRAME 0x0404<br>+<br>+struct __ec_align4 ec_params_fp_frame {<br>+ uint32_t offset;<br>+ uint32_t size;<br>+};<br>+<br>+/*****************************************************************************/<br>+/* Touchpad MCU commands: range 0x0500-0x05FF */<br>+<br>+/* Perform touchpad self test */<br>+#define EC_CMD_TP_SELF_TEST 0x0500<br>+<br>+/* Get number of frame types, and the size of each type */<br>+#define EC_CMD_TP_FRAME_INFO 0x0501<br>+<br>+struct __ec_align4 ec_response_tp_frame_info {<br>+ uint32_t n_frames;<br>+ uint32_t frame_sizes[0];<br>+};<br>+<br>+/* Create a snapshot of current frame readings */<br>+#define EC_CMD_TP_FRAME_SNAPSHOT 0x0502<br>+<br>+/* Read the frame */<br>+#define EC_CMD_TP_FRAME_GET 0x0503<br>+<br>+struct __ec_align4 ec_params_tp_frame_get {<br>+ uint32_t frame_index;<br>+ uint32_t offset;<br>+ uint32_t size;<br>+};<br> <br> /*****************************************************************************/<br> /*<br>@@ -3728,14 +4359,33 @@<br> * CAUTION: Don't go nuts with this. Shipping products should document ALL<br> * their EC commands for easier development, testing, debugging, and support.<br> *<br>+ * All commands MUST be #defined to be 4-digit UPPER CASE hex values<br>+ * (e.g., 0x00AB, not 0xab) for CONFIG_HOSTCMD_SECTION_SORTED to work.<br>+ *<br> * In your experimental code, you may want to do something like this:<br> *<br>- * #define EC_CMD_MAGIC_FOO (EC_CMD_BOARD_SPECIFIC_BASE + 0x000)<br>- * #define EC_CMD_MAGIC_BAR (EC_CMD_BOARD_SPECIFIC_BASE + 0x001)<br>- * #define EC_CMD_MAGIC_HEY (EC_CMD_BOARD_SPECIFIC_BASE + 0x002)<br>+ * #define EC_CMD_MAGIC_FOO 0x0000<br>+ * #define EC_CMD_MAGIC_BAR 0x0001<br>+ * #define EC_CMD_MAGIC_HEY 0x0002<br>+ *<br>+ * DECLARE_PRIVATE_HOST_COMMAND(EC_CMD_MAGIC_FOO, magic_foo_handler,<br>+ * EC_VER_MASK(0);<br>+ *<br>+ * DECLARE_PRIVATE_HOST_COMMAND(EC_CMD_MAGIC_BAR, magic_bar_handler,<br>+ * EC_VER_MASK(0);<br>+ *<br>+ * DECLARE_PRIVATE_HOST_COMMAND(EC_CMD_MAGIC_HEY, magic_hey_handler,<br>+ * EC_VER_MASK(0);<br> */<br> #define EC_CMD_BOARD_SPECIFIC_BASE 0x3E00<br> #define EC_CMD_BOARD_SPECIFIC_LAST 0x3FFF<br>+<br>+/*<br>+ * Given the private host command offset, calculate the true private host<br>+ * command value.<br>+ */<br>+#define EC_PRIVATE_HOST_COMMAND_VALUE(command) \<br>+ (EC_CMD_BOARD_SPECIFIC_BASE + (command))<br> <br> /*****************************************************************************/<br> /*<br>@@ -3775,4 +4425,6 @@<br> #define EC_LPC_ADDR_OLD_PARAM EC_HOST_CMD_REGION1<br> #define EC_OLD_PARAM_SIZE EC_HOST_CMD_REGION_SIZE<br> <br>+#endif /* !__ACPI__ */<br>+<br> #endif /* __CROS_EC_EC_COMMANDS_H */<br></pre><p>To view, visit <a href="https://review.coreboot.org/20425">change 20425</a>. To unsubscribe, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/20425"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I56c9f891262d8984b6a9a69d96752c2dd6bb2371 </div>
<div style="display:none"> Gerrit-Change-Number: 20425 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Duncan Laurie <dlaurie@chromium.org> </div>