<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>