<p>Jonathan Brandmeyer has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/27620">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">chromeec: Sync ec_commands.h with CrOS upstream.<br><br>Update ec_commands.h to be a verbatim copy of upstream, except retain<br>the complete copyright notice found in coreboot's copy.  Upstream refers<br>to a file not present in coreboot.<br><br>Change-Id: Ic3daa09ffd83c089b6874e0ea9aab8aa60016775<br>Signed-off-by: Jonathan Brandmeyer <jbrandmeyer@chromium.org><br>---<br>M src/ec/google/chromeec/ec.c<br>M src/ec/google/chromeec/ec_commands.h<br>2 files changed, 650 insertions(+), 62 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/20/27620/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c</span><br><span>index 094f7ce..734c90c 100644</span><br><span>--- a/src/ec/google/chromeec/ec.c</span><br><span>+++ b/src/ec/google/chromeec/ec.c</span><br><span>@@ -573,14 +573,14 @@</span><br><span>       return google_chromeec_command(&cec_cmd);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int cbi_get_uint32(uint32_t *id, uint32_t type)</span><br><span style="color: hsl(120, 100%, 40%);">+static int cbi_get_uint32(uint32_t *id, uint32_t tag)</span><br><span> {</span><br><span>     struct chromeec_command cmd;</span><br><span>         struct ec_params_get_cbi p;</span><br><span>  uint32_t r = 0;</span><br><span>      int rv;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     p.type = type;</span><br><span style="color: hsl(120, 100%, 40%);">+        p.tag = tag;</span><br><span> </span><br><span>     cmd.cmd_code = EC_CMD_GET_CROS_BOARD_INFO;</span><br><span>   cmd.cmd_version = 0;</span><br><span>diff --git a/src/ec/google/chromeec/ec_commands.h b/src/ec/google/chromeec/ec_commands.h</span><br><span>index 4f46fab..730be09 100644</span><br><span>--- a/src/ec/google/chromeec/ec_commands.h</span><br><span>+++ b/src/ec/google/chromeec/ec_commands.h</span><br><span>@@ -106,13 +106,15 @@</span><br><span> /* Unused 0x28 - 0x2f */</span><br><span> #define EC_MEMMAP_SWITCHES         0x30        /* 8 bits */</span><br><span> /* Unused 0x31 - 0x33 */</span><br><span style="color: hsl(0, 100%, 40%);">-#define EC_MEMMAP_HOST_EVENTS      0x34 /* 32 bits */</span><br><span style="color: hsl(0, 100%, 40%);">-/* Reserve 0x38 - 0x3f for additional host event-related stuff */</span><br><span style="color: hsl(0, 100%, 40%);">-/* Battery values are all 32 bits */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MEMMAP_HOST_EVENTS      0x34 /* 64 bits */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Battery values are all 32 bits, unless otherwise noted. */</span><br><span> #define EC_MEMMAP_BATT_VOLT        0x40 /* Battery Present Voltage */</span><br><span> #define EC_MEMMAP_BATT_RATE        0x44 /* Battery Present Rate */</span><br><span> #define EC_MEMMAP_BATT_CAP         0x48 /* Battery Remaining Capacity */</span><br><span style="color: hsl(0, 100%, 40%);">-#define EC_MEMMAP_BATT_FLAG        0x4c /* Battery State, defined below */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MEMMAP_BATT_FLAG        0x4c /* Battery State, see below (8-bit) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MEMMAP_BATT_COUNT       0x4d /* Battery Count (8-bit) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MEMMAP_BATT_INDEX       0x4e /* Current Battery Data Index (8-bit) */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Unused 0x4f */</span><br><span> #define EC_MEMMAP_BATT_DCAP        0x50 /* Battery Design Capacity */</span><br><span> #define EC_MEMMAP_BATT_DVLT        0x54 /* Battery Design Voltage */</span><br><span> #define EC_MEMMAP_BATT_LFCC        0x58 /* Battery Last Full Charge Capacity */</span><br><span>@@ -187,6 +189,8 @@</span><br><span> #define EC_BATT_FLAG_DISCHARGING  0x04</span><br><span> #define EC_BATT_FLAG_CHARGING     0x08</span><br><span> #define EC_BATT_FLAG_LEVEL_CRITICAL 0x10</span><br><span style="color: hsl(120, 100%, 40%);">+/* Set if some of the static/dynamic data is invalid (or outdated). */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_BATT_FLAG_INVALID_DATA 0x20</span><br><span> </span><br><span> /* Switch flags at EC_MEMMAP_SWITCHES */</span><br><span> #define EC_SWITCH_LID_OPEN               0x01</span><br><span>@@ -349,6 +353,38 @@</span><br><span> #define EC_ACPI_MEM_DEVICE_TABLET_MODE 0x01</span><br><span> </span><br><span> /*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Report device features. Uses the same format as the host command, except:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * bit 0 (EC_FEATURE_LIMITED) changes meaning from "EC code has a limited set</span><br><span style="color: hsl(120, 100%, 40%);">+ * of features", which is of limited interest when the system is already</span><br><span style="color: hsl(120, 100%, 40%);">+ * interpreting ACPI bytecode, to "EC_FEATURES[0-7] is not supported". Since</span><br><span style="color: hsl(120, 100%, 40%);">+ * these are supported, it defaults to 0.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This allows detecting the presence of this field since older versions of</span><br><span style="color: hsl(120, 100%, 40%);">+ * the EC codebase would simply return 0xff to that unknown address. Check</span><br><span style="color: hsl(120, 100%, 40%);">+ * FEATURES0 != 0xff (or FEATURES0[0] == 0) to make sure that the other bits</span><br><span style="color: hsl(120, 100%, 40%);">+ * are valid.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES0 0x0a</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES1 0x0b</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES2 0x0c</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES3 0x0d</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES4 0x0e</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES5 0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES6 0x10</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_DEVICE_FEATURES7 0x11</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_BATTERY_INDEX    0x12</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * USB Port Power. Each bit indicates whether the corresponding USB ports' power</span><br><span style="color: hsl(120, 100%, 40%);">+ * is enabled (1) or disabled (0).</span><br><span style="color: hsl(120, 100%, 40%);">+ *   bit 0 USB port ID 0</span><br><span style="color: hsl(120, 100%, 40%);">+ *   ...</span><br><span style="color: hsl(120, 100%, 40%);">+ *   bit 7 USB port ID 7</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_ACPI_MEM_USB_PORT_POWER 0x13</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span>  * ACPI addresses 0x20 - 0xff map to EC_MEMMAP offset 0x00 - 0xdf.  This data</span><br><span>  * is read-only from the AP.  Added in EC_ACPI_MEM_VERSION 2.</span><br><span>  */</span><br><span>@@ -505,7 +541,11 @@</span><br><span>         EC_RES_REQUEST_TRUNCATED = 13,  /* Didn't get the entire request */</span><br><span>      EC_RES_RESPONSE_TOO_BIG = 14,   /* Response was too big to handle */</span><br><span>         EC_RES_BUS_ERROR = 15,          /* Communications bus error */</span><br><span style="color: hsl(0, 100%, 40%);">-  EC_RES_BUSY = 16                /* Up but too busy.  Should retry */</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_RES_BUSY = 16,               /* Up but too busy.  Should retry */</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_RES_INVALID_HEADER_VERSION = 17,  /* Header version invalid */</span><br><span style="color: hsl(120, 100%, 40%);">+     EC_RES_INVALID_HEADER_CRC = 18,      /* Header CRC invalid */</span><br><span style="color: hsl(120, 100%, 40%);">+ EC_RES_INVALID_DATA_CRC = 19,        /* Data CRC invalid */</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_RES_DUP_UNAVAILABLE = 20,         /* Can't resend response */</span><br><span> };</span><br><span> </span><br><span> /*</span><br><span>@@ -582,12 +622,6 @@</span><br><span>  EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT = 30,</span><br><span> </span><br><span>  /*</span><br><span style="color: hsl(0, 100%, 40%);">-       * Reserve this last bit to indicate that at least one bit in a</span><br><span style="color: hsl(0, 100%, 40%);">-  * secondary host event word is set.  See crbug.com/633646.</span><br><span style="color: hsl(0, 100%, 40%);">-      */</span><br><span style="color: hsl(0, 100%, 40%);">-     EC_HOST_EVENT_EXTENDED = 31,</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /*</span><br><span>    * The high bit of the event mask is not used as a host event code.  If</span><br><span>       * it reads back as set, then the entire event mask should be</span><br><span>         * considered invalid by the host.  This can happen when reading the</span><br><span>@@ -813,6 +847,136 @@</span><br><span> };</span><br><span> </span><br><span> /*****************************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Host command protocol V4.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Packets always start with a request or response header.  They are followed</span><br><span style="color: hsl(120, 100%, 40%);">+ * by data_len bytes of data.  If the data_crc_present flag is set, the data</span><br><span style="color: hsl(120, 100%, 40%);">+ * bytes are followed by a CRC-8 of that data, using using x^8 + x^2 + x + 1</span><br><span style="color: hsl(120, 100%, 40%);">+ * polynomial.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Host algorithm when sending a request q:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 101) tries_left=(some value, e.g. 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ * 102) q.seq_num++</span><br><span style="color: hsl(120, 100%, 40%);">+ * 103) q.seq_dup=0</span><br><span style="color: hsl(120, 100%, 40%);">+ * 104) Calculate q.header_crc.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 105) Send request q to EC.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 106) Wait for response r.  Go to 201 if received or 301 if timeout.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 201) If r.struct_version != 4, go to 301.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 202) If r.header_crc mismatches calculated CRC for r header, go to 301.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 203) If r.data_crc_present and r.data_crc mismatches, go to 301.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 204) If r.seq_num != q.seq_num, go to 301.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 205) If r.seq_dup == q.seq_dup, return success.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 207) If r.seq_dup == 1, go to 301.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 208) Return error.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 301) If --tries_left <= 0, return error.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 302) If q.seq_dup == 1, go to 105.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 303) q.seq_dup = 1</span><br><span style="color: hsl(120, 100%, 40%);">+ * 304) Go to 104.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * EC algorithm when receiving a request q.</span><br><span style="color: hsl(120, 100%, 40%);">+ * EC has response buffer r, error buffer e.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 101) If q.struct_version != 4, set e.result = EC_RES_INVALID_HEADER_VERSION</span><br><span style="color: hsl(120, 100%, 40%);">+ *      and go to 301</span><br><span style="color: hsl(120, 100%, 40%);">+ * 102) If q.header_crc mismatches calculated CRC, set e.result =</span><br><span style="color: hsl(120, 100%, 40%);">+ *      EC_RES_INVALID_HEADER_CRC and go to 301</span><br><span style="color: hsl(120, 100%, 40%);">+ * 103) If q.data_crc_present, calculate data CRC.  If that mismatches the CRC</span><br><span style="color: hsl(120, 100%, 40%);">+ *      byte at the end of the packet, set e.result = EC_RES_INVALID_DATA_CRC</span><br><span style="color: hsl(120, 100%, 40%);">+ *      and go to 301.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 104) If q.seq_dup == 0, go to 201.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 105) If q.seq_num != r.seq_num, go to 201.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 106) If q.seq_dup == r.seq_dup, go to 205, else go to 203.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 201) Process request q into response r.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 202) r.seq_num = q.seq_num</span><br><span style="color: hsl(120, 100%, 40%);">+ * 203) r.seq_dup = q.seq_dup</span><br><span style="color: hsl(120, 100%, 40%);">+ * 204) Calculate r.header_crc</span><br><span style="color: hsl(120, 100%, 40%);">+ * 205) If r.data_len > 0 and data is no longer available, set e.result =</span><br><span style="color: hsl(120, 100%, 40%);">+ *      EC_RES_DUP_UNAVAILABLE and go to 301.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 206) Send response r.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 301) e.seq_num = q.seq_num</span><br><span style="color: hsl(120, 100%, 40%);">+ * 302) e.seq_dup = q.seq_dup</span><br><span style="color: hsl(120, 100%, 40%);">+ * 303) Calculate e.header_crc.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 304) Send error response e.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Version 4 request from host */</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_host_request4 {</span><br><span style="color: hsl(120, 100%, 40%);">+    /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * bits 0-3: struct_version: Structure version (=4)</span><br><span style="color: hsl(120, 100%, 40%);">+    * bit    4: is_response: Is response (=0)</span><br><span style="color: hsl(120, 100%, 40%);">+     * bits 5-6: seq_num: Sequence number</span><br><span style="color: hsl(120, 100%, 40%);">+  * bit    7: seq_dup: Sequence duplicate flag</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t fields0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * bits 0-4: command_version: Command version</span><br><span style="color: hsl(120, 100%, 40%);">+  * bits 5-6: Reserved (set 0, ignore on read)</span><br><span style="color: hsl(120, 100%, 40%);">+  * bit    7: data_crc_present: Is data CRC present after data</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t fields1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Command code (EC_CMD_*) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t command;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Length of data which follows this header (not including data CRC) */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Reserved (set 0, ignore on read) */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t reserved;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* CRC-8 of above fields, using x^8 + x^2 + x + 1 polynomial */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t header_crc;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Version 4 response from EC */</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_host_response4 {</span><br><span style="color: hsl(120, 100%, 40%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * bits 0-3: struct_version: Structure version (=4)</span><br><span style="color: hsl(120, 100%, 40%);">+    * bit    4: is_response: Is response (=1)</span><br><span style="color: hsl(120, 100%, 40%);">+     * bits 5-6: seq_num: Sequence number</span><br><span style="color: hsl(120, 100%, 40%);">+  * bit    7: seq_dup: Sequence duplicate flag</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t fields0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * bits 0-6: Reserved (set 0, ignore on read)</span><br><span style="color: hsl(120, 100%, 40%);">+  * bit    7: data_crc_present: Is data CRC present after data</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t fields1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Result code (EC_RES_*) */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Length of data which follows this header (not including data CRC) */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Reserved (set 0, ignore on read) */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t reserved;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* CRC-8 of above fields, using x^8 + x^2 + x + 1 polynomial */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t header_crc;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Fields in fields0 byte */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_PACKET4_0_STRUCT_VERSION_MASK       0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_PACKET4_0_IS_RESPONSE_MASK             0x10</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_PACKET4_0_SEQ_NUM_SHIFT                5</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_PACKET4_0_SEQ_NUM_MASK            0x60</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_PACKET4_0_SEQ_DUP_MASK         0x80</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Fields in fields1 byte */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_PACKET4_1_COMMAND_VERSION_MASK 0x1f  /* (request only) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_PACKET4_1_DATA_CRC_PRESENT_MASK  0x80</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*****************************************************************************/</span><br><span> /*</span><br><span>  * Notes on commands:</span><br><span>  *</span><br><span>@@ -1114,6 +1278,14 @@</span><br><span>        EC_FEATURE_DEVICE_EVENT = 31,</span><br><span>        /* EC supports the unified wake masks for LPC/eSPI systems */</span><br><span>        EC_FEATURE_UNIFIED_WAKE_MASKS = 32,</span><br><span style="color: hsl(120, 100%, 40%);">+   /* EC supports 64-bit host events */</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_FEATURE_HOST_EVENT64 = 33,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* EC runs code in RAM (not in place, a.k.a. XIP) */</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_FEATURE_EXEC_IN_RAM = 34,</span><br><span style="color: hsl(120, 100%, 40%);">+  /* EC supports CEC commands */</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_FEATURE_CEC = 35,</span><br><span style="color: hsl(120, 100%, 40%);">+  /* EC supports tight sensor timestamping. */</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_FEATURE_MOTION_SENSE_TIGHT_TIMESTAMPS = 36,</span><br><span> };</span><br><span> </span><br><span> #define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32))</span><br><span>@@ -1385,16 +1557,29 @@</span><br><span> enum ec_flash_region {</span><br><span>       /* Region which holds read-only EC image */</span><br><span>  EC_FLASH_REGION_RO = 0,</span><br><span style="color: hsl(0, 100%, 40%);">- /* Region which holds rewritable EC image */</span><br><span style="color: hsl(0, 100%, 40%);">-    EC_FLASH_REGION_RW,</span><br><span style="color: hsl(120, 100%, 40%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Region which holds active RW image. 'Active' is different from</span><br><span style="color: hsl(120, 100%, 40%);">+      * 'running'. Active means 'scheduled-to-run'. Since RO image always</span><br><span style="color: hsl(120, 100%, 40%);">+   * scheduled to run, active/non-active applies only to RW images (for</span><br><span style="color: hsl(120, 100%, 40%);">+  * the same reason 'update' applies only to RW images. It's a state of</span><br><span style="color: hsl(120, 100%, 40%);">+     * an image on a flash. Running image can be RO, RW_A, RW_B but active</span><br><span style="color: hsl(120, 100%, 40%);">+         * image can only be RW_A or RW_B. In recovery mode, an active RW image</span><br><span style="color: hsl(120, 100%, 40%);">+        * doesn't enter 'running' state but it's still active on a flash.</span><br><span style="color: hsl(120, 100%, 40%);">+     */</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_FLASH_REGION_ACTIVE,</span><br><span>      /*</span><br><span>    * Region which should be write-protected in the factory (a superset of</span><br><span>       * EC_FLASH_REGION_RO)</span><br><span>        */</span><br><span>  EC_FLASH_REGION_WP_RO,</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Region which holds updatable (non-active) RW image */</span><br><span style="color: hsl(120, 100%, 40%);">+      EC_FLASH_REGION_UPDATE,</span><br><span>      /* Number of regions */</span><br><span>      EC_FLASH_REGION_COUNT,</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+/* 'RW' is vague if there are multiple RW images; we mean the active one,</span><br><span style="color: hsl(120, 100%, 40%);">+ * so the old constant is deprecated */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_FLASH_REGION_RW EC_FLASH_REGION_ACTIVE</span><br><span> </span><br><span> struct __ec_align4 ec_params_flash_region_info {</span><br><span>  uint32_t region;  /* enum ec_flash_region */</span><br><span>@@ -1716,13 +1901,17 @@</span><br><span> struct __ec_todo_packed ec_params_lightbar {</span><br><span>       uint8_t cmd;                  /* Command (see enum lightbar_command) */</span><br><span>      union {</span><br><span style="color: hsl(0, 100%, 40%);">-         struct __ec_todo_unpacked {</span><br><span style="color: hsl(0, 100%, 40%);">-                     /* no args */</span><br><span style="color: hsl(0, 100%, 40%);">-           } dump, off, on, init, get_seq, get_params_v0, get_params_v1,</span><br><span style="color: hsl(0, 100%, 40%);">-                   version, get_brightness, get_demo, suspend, resume,</span><br><span style="color: hsl(0, 100%, 40%);">-                     get_params_v2_timing, get_params_v2_tap,</span><br><span style="color: hsl(0, 100%, 40%);">-                        get_params_v2_osc, get_params_v2_bright,</span><br><span style="color: hsl(0, 100%, 40%);">-                        get_params_v2_thlds, get_params_v2_colors;</span><br><span style="color: hsl(120, 100%, 40%);">+            /*</span><br><span style="color: hsl(120, 100%, 40%);">+             * The following commands have no args:</span><br><span style="color: hsl(120, 100%, 40%);">+                *</span><br><span style="color: hsl(120, 100%, 40%);">+             * dump, off, on, init, get_seq, get_params_v0, get_params_v1,</span><br><span style="color: hsl(120, 100%, 40%);">+                 * version, get_brightness, get_demo, suspend, resume,</span><br><span style="color: hsl(120, 100%, 40%);">+                 * get_params_v2_timing, get_params_v2_tap, get_params_v2_osc,</span><br><span style="color: hsl(120, 100%, 40%);">+                 * get_params_v2_bright, get_params_v2_thlds,</span><br><span style="color: hsl(120, 100%, 40%);">+          * get_params_v2_colors</span><br><span style="color: hsl(120, 100%, 40%);">+                *</span><br><span style="color: hsl(120, 100%, 40%);">+             * Don't use an empty struct, because C++ hates that.</span><br><span style="color: hsl(120, 100%, 40%);">+              */</span><br><span> </span><br><span>              struct __ec_todo_unpacked {</span><br><span>                  uint8_t num;</span><br><span>@@ -1792,14 +1981,15 @@</span><br><span>                       uint8_t red, green, blue;</span><br><span>            } get_rgb;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          struct __ec_todo_unpacked {</span><br><span style="color: hsl(0, 100%, 40%);">-                     /* no return params */</span><br><span style="color: hsl(0, 100%, 40%);">-          } off, on, init, set_brightness, seq, reg, set_rgb,</span><br><span style="color: hsl(0, 100%, 40%);">-                     demo, set_params_v0, set_params_v1,</span><br><span style="color: hsl(0, 100%, 40%);">-                     set_program, manual_suspend_ctrl, suspend, resume,</span><br><span style="color: hsl(0, 100%, 40%);">-                      set_v2par_timing, set_v2par_tap,</span><br><span style="color: hsl(0, 100%, 40%);">-                        set_v2par_osc, set_v2par_bright, set_v2par_thlds,</span><br><span style="color: hsl(0, 100%, 40%);">-                       set_v2par_colors;</span><br><span style="color: hsl(120, 100%, 40%);">+             /*</span><br><span style="color: hsl(120, 100%, 40%);">+             * The following commands have no response:</span><br><span style="color: hsl(120, 100%, 40%);">+            *</span><br><span style="color: hsl(120, 100%, 40%);">+             * off, on, init, set_brightness, seq, reg, set_rgb, demo,</span><br><span style="color: hsl(120, 100%, 40%);">+             * set_params_v0, set_params_v1, set_program,</span><br><span style="color: hsl(120, 100%, 40%);">+          * manual_suspend_ctrl, suspend, resume, set_v2par_timing,</span><br><span style="color: hsl(120, 100%, 40%);">+             * set_v2par_tap, set_v2par_osc, set_v2par_bright,</span><br><span style="color: hsl(120, 100%, 40%);">+             * set_v2par_thlds, set_v2par_colors</span><br><span style="color: hsl(120, 100%, 40%);">+           */</span><br><span>  };</span><br><span> };</span><br><span> </span><br><span>@@ -1955,8 +2145,13 @@</span><br><span>  * If one of these is specified, the EC will automatically update offset and</span><br><span>  * size to the correct values for the specified image (RO or RW).</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-#define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe</span><br><span style="color: hsl(0, 100%, 40%);">-#define EC_VBOOT_HASH_OFFSET_RW 0xfffffffd</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_VBOOT_HASH_OFFSET_RO          0xfffffffe</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_VBOOT_HASH_OFFSET_ACTIVE 0xfffffffd</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_VBOOT_HASH_OFFSET_UPDATE 0xfffffffc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* 'RW' is vague if there are multiple RW images; we mean the active one,</span><br><span style="color: hsl(120, 100%, 40%);">+ * so the old constant is deprecated */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_VBOOT_HASH_OFFSET_RW EC_VBOOT_HASH_OFFSET_ACTIVE</span><br><span> </span><br><span> /*****************************************************************************/</span><br><span> /*</span><br><span>@@ -2091,6 +2286,7 @@</span><br><span>   MOTIONSENSE_TYPE_LIGHT = 4,</span><br><span>  MOTIONSENSE_TYPE_ACTIVITY = 5,</span><br><span>       MOTIONSENSE_TYPE_BARO = 6,</span><br><span style="color: hsl(120, 100%, 40%);">+    MOTIONSENSE_TYPE_SYNC = 7,</span><br><span>   MOTIONSENSE_TYPE_MAX,</span><br><span> };</span><br><span> </span><br><span>@@ -2098,6 +2294,7 @@</span><br><span> enum motionsensor_location {</span><br><span>      MOTIONSENSE_LOC_BASE = 0,</span><br><span>    MOTIONSENSE_LOC_LID = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+      MOTIONSENSE_LOC_CAMERA = 2,</span><br><span>  MOTIONSENSE_LOC_MAX,</span><br><span> };</span><br><span> </span><br><span>@@ -2114,6 +2311,21 @@</span><br><span>      MOTIONSENSE_CHIP_BMA255 = 8,</span><br><span>         MOTIONSENSE_CHIP_BMP280 = 9,</span><br><span>         MOTIONSENSE_CHIP_OPT3001 = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+        MOTIONSENSE_CHIP_BH1730 = 11,</span><br><span style="color: hsl(120, 100%, 40%);">+ MOTIONSENSE_CHIP_GPIO = 12,</span><br><span style="color: hsl(120, 100%, 40%);">+   MOTIONSENSE_CHIP_LIS2DH = 13,</span><br><span style="color: hsl(120, 100%, 40%);">+ MOTIONSENSE_CHIP_LSM6DSM = 14,</span><br><span style="color: hsl(120, 100%, 40%);">+        MOTIONSENSE_CHIP_LIS2DE = 15,</span><br><span style="color: hsl(120, 100%, 40%);">+ MOTIONSENSE_CHIP_MAX,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* List of orientation positions */</span><br><span style="color: hsl(120, 100%, 40%);">+enum motionsensor_orientation {</span><br><span style="color: hsl(120, 100%, 40%);">+     MOTIONSENSE_ORIENTATION_LANDSCAPE = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+        MOTIONSENSE_ORIENTATION_PORTRAIT = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ MOTIONSENSE_ORIENTATION_UPSIDE_DOWN_PORTRAIT = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+     MOTIONSENSE_ORIENTATION_UPSIDE_DOWN_LANDSCAPE = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+    MOTIONSENSE_ORIENTATION_UNKNOWN = 4,</span><br><span> };</span><br><span> </span><br><span> struct __ec_todo_packed ec_response_motion_sensor_data {</span><br><span>@@ -2142,7 +2354,9 @@</span><br><span>   uint16_t size;</span><br><span>       /* Amount of space used in the fifo */</span><br><span>       uint16_t count;</span><br><span style="color: hsl(0, 100%, 40%);">- /* Timestamp recorded in us */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Timestamp recorded in us.</span><br><span style="color: hsl(120, 100%, 40%);">+   * aka accurate timestamp when host event was triggered.</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span>  uint32_t timestamp;</span><br><span>  /* Total amount of vector lost */</span><br><span>    uint16_t total_lost;</span><br><span>@@ -2160,6 +2374,7 @@</span><br><span>         MOTIONSENSE_ACTIVITY_RESERVED = 0,</span><br><span>   MOTIONSENSE_ACTIVITY_SIG_MOTION = 1,</span><br><span>         MOTIONSENSE_ACTIVITY_DOUBLE_TAP = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+  MOTIONSENSE_ACTIVITY_ORIENTATION = 3,</span><br><span> };</span><br><span> </span><br><span> struct __ec_todo_unpacked ec_motion_sense_activity {</span><br><span>@@ -2290,8 +2505,7 @@</span><br><span>              } sensor_offset;</span><br><span> </span><br><span>                 /* Used for MOTIONSENSE_CMD_FIFO_INFO */</span><br><span style="color: hsl(0, 100%, 40%);">-                struct __ec_todo_unpacked {</span><br><span style="color: hsl(0, 100%, 40%);">-             } fifo_info;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* (no params) */</span><br><span> </span><br><span>                /* Used for MOTIONSENSE_CMD_FIFO_READ */</span><br><span>             struct __ec_todo_unpacked {</span><br><span>@@ -2305,8 +2519,7 @@</span><br><span>          struct ec_motion_sense_activity set_activity;</span><br><span> </span><br><span>            /* Used for MOTIONSENSE_CMD_LID_ANGLE */</span><br><span style="color: hsl(0, 100%, 40%);">-                struct __ec_todo_unpacked {</span><br><span style="color: hsl(0, 100%, 40%);">-             } lid_angle;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* (no params) */</span><br><span> </span><br><span>                /* Used for MOTIONSENSE_CMD_FIFO_INT_ENABLE */</span><br><span>               struct __ec_todo_unpacked {</span><br><span>@@ -2415,8 +2628,7 @@</span><br><span>                  uint32_t disabled;</span><br><span>           } list_activities;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          struct __ec_todo_unpacked {</span><br><span style="color: hsl(0, 100%, 40%);">-             } set_activity;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* No params for set activity */</span><br><span> </span><br><span>                 /* Used for MOTIONSENSE_CMD_LID_ANGLE */</span><br><span>             struct __ec_todo_unpacked {</span><br><span>@@ -2654,11 +2866,27 @@</span><br><span>  * Thermal configuration for one temperature sensor. Temps are in degrees K.</span><br><span>  * Zero values will be silently ignored by the thermal task.</span><br><span>  *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Set 'temp_host' value allows thermal task to trigger some event with 1 degree</span><br><span style="color: hsl(120, 100%, 40%);">+ * hysteresis.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For example,</span><br><span style="color: hsl(120, 100%, 40%);">+ *      temp_host[EC_TEMP_THRESH_HIGH] = 300 K</span><br><span style="color: hsl(120, 100%, 40%);">+ *      temp_host_release[EC_TEMP_THRESH_HIGH] = 0 K</span><br><span style="color: hsl(120, 100%, 40%);">+ * EC will throttle ap when temperature >= 301 K, and release throttling when</span><br><span style="color: hsl(120, 100%, 40%);">+ * temperature <= 299 K.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Set 'temp_host_release' value allows thermal task has a custom hysteresis.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For example,</span><br><span style="color: hsl(120, 100%, 40%);">+ *     temp_host[EC_TEMP_THRESH_HIGH] = 300 K</span><br><span style="color: hsl(120, 100%, 40%);">+ *      temp_host_release[EC_TEMP_THRESH_HIGH] = 295 K</span><br><span style="color: hsl(120, 100%, 40%);">+ * EC will throttle ap when temperature >= 301 K, and release throttling when</span><br><span style="color: hsl(120, 100%, 40%);">+ * temperature <= 294 K.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span>  * Note that this structure is a sub-structure of</span><br><span>  * ec_params_thermal_set_threshold_v1, but maintains its alignment there.</span><br><span>  */</span><br><span> struct __ec_align4 ec_thermal_config {</span><br><span>         uint32_t temp_host[EC_TEMP_THRESH_COUNT]; /* levels of hotness */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t temp_host_release[EC_TEMP_THRESH_COUNT]; /* release levels */</span><br><span>       uint32_t temp_fan_off;          /* no active cooling needed */</span><br><span>       uint32_t temp_fan_max;          /* max active cooling needed */</span><br><span> };</span><br><span>@@ -2831,6 +3059,17 @@</span><br><span>       uint8_t pressed;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_GET_KEYBOARD_ID 0x0063</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_response_keyboard_id {</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t keyboard_id;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum keyboard_id {</span><br><span style="color: hsl(120, 100%, 40%);">+       KEYBOARD_ID_UNSUPPORTED = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  KEYBOARD_ID_UNREADABLE = 0xffffffff,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Configure keyboard scanning */</span><br><span> #define EC_CMD_MKBP_SET_CONFIG 0x0064</span><br><span> #define EC_CMD_MKBP_GET_CONFIG 0x0065</span><br><span>@@ -2974,6 +3213,18 @@</span><br><span>    */</span><br><span>  EC_MKBP_EVENT_SYSRQ = 6,</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * New 64-bit host event.</span><br><span style="color: hsl(120, 100%, 40%);">+      * The event data is 8 bytes of host event flags.</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_MKBP_EVENT_HOST_EVENT64 = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Notify the AP that something happened on CEC */</span><br><span style="color: hsl(120, 100%, 40%);">+    EC_MKBP_EVENT_CEC_EVENT = 8,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Send an incoming CEC message to the AP */</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_MKBP_EVENT_CEC_MESSAGE = 9,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* Number of MKBP events */</span><br><span>  EC_MKBP_EVENT_COUNT,</span><br><span> };</span><br><span>@@ -2983,6 +3234,7 @@</span><br><span> </span><br><span>       /* Unaligned */</span><br><span>      uint32_t host_event;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint64_t host_event64;</span><br><span> </span><br><span>   struct __ec_todo_unpacked {</span><br><span>          /* For aligning the fifo_info */</span><br><span>@@ -2997,6 +3249,36 @@</span><br><span>    uint32_t fp_events;</span><br><span> </span><br><span>      uint32_t sysrq;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* CEC events from enum mkbp_cec_event */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t cec_events;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+union __ec_align_offset1 ec_response_get_next_data_v1 {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t key_matrix[16];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Unaligned */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t host_event;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint64_t host_event64;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      struct __ec_todo_unpacked {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* For aligning the fifo_info */</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t reserved[3];</span><br><span style="color: hsl(120, 100%, 40%);">+          struct ec_response_motion_sense_fifo_info info;</span><br><span style="color: hsl(120, 100%, 40%);">+       } sensor_fifo;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t buttons;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t switches;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t fp_events;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t sysrq;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* CEC events from enum mkbp_cec_event */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t cec_events;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t cec_message[16];</span><br><span> };</span><br><span> </span><br><span> struct __ec_align1 ec_response_get_next_event {</span><br><span>@@ -3005,6 +3287,12 @@</span><br><span>       union ec_response_get_next_data data;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_response_get_next_event_v1 {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t event_type;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Followed by event data if any */</span><br><span style="color: hsl(120, 100%, 40%);">+   union ec_response_get_next_data_v1 data;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Bit indices for buttons and switches.*/</span><br><span> /* Buttons */</span><br><span> #define EC_MKBP_POWER_BUTTON   0</span><br><span>@@ -3025,9 +3313,36 @@</span><br><span> </span><br><span> /* Fingerprint events in 'fp_events' for EC_MKBP_EVENT_FINGERPRINT */</span><br><span> #define EC_MKBP_FP_RAW_EVENT(fp_events) ((fp_events) & 0x00FFFFFF)</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERRCODE(fp_events)   ((fp_events) & 0x0000000F)</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ENROLL_PROGRESS_OFFSET 4</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ENROLL_PROGRESS(fpe) (((fpe) & 0x00000FF0) \</span><br><span style="color: hsl(120, 100%, 40%);">+                                    >> EC_MKBP_FP_ENROLL_PROGRESS_OFFSET)</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_MATCH_IDX_OFFSET 12</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_MATCH_IDX_MASK 0x0000F000</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_MATCH_IDX(fpe) (((fpe) & EC_MKBP_FP_MATCH_IDX_MASK) \</span><br><span style="color: hsl(120, 100%, 40%);">+                                       >> EC_MKBP_FP_MATCH_IDX_OFFSET)</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ENROLL               (1 << 27)</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_MATCH                (1 << 28)</span><br><span> #define EC_MKBP_FP_FINGER_DOWN          (1 << 29)</span><br><span> #define EC_MKBP_FP_FINGER_UP            (1 << 30)</span><br><span> #define EC_MKBP_FP_IMAGE_READY          (1 << 31)</span><br><span style="color: hsl(120, 100%, 40%);">+/* code given by EC_MKBP_FP_ERRCODE() when EC_MKBP_FP_ENROLL is set */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_ENROLL_OK               0</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_ENROLL_LOW_QUALITY      1</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_ENROLL_IMMOBILE         2</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_ENROLL_LOW_COVERAGE     3</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_ENROLL_INTERNAL         5</span><br><span style="color: hsl(120, 100%, 40%);">+/* Can be used to detect if image was usable for enrollment or not. */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_ENROLL_PROBLEM_MASK     1</span><br><span style="color: hsl(120, 100%, 40%);">+/* code given by EC_MKBP_FP_ERRCODE() when EC_MKBP_FP_MATCH is set */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_MATCH_NO                0</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_MATCH_NO_INTERNAL       6</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_MATCH_NO_LOW_QUALITY    2</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_MATCH_NO_LOW_COVERAGE   4</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_MATCH_YES               1</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_MATCH_YES_UPDATED       3</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_MKBP_FP_ERR_MATCH_YES_UPDATE_FAILED 5</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> /*****************************************************************************/</span><br><span> /* Temperature sensor commands */</span><br><span>@@ -3056,7 +3371,7 @@</span><br><span> /* Host event commands */</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Obsolete. New implementation should use EC_CMD_PROGRAM_HOST_EVENT instead */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Obsolete. New implementation should use EC_CMD_HOST_EVENT instead */</span><br><span> /*</span><br><span>  * Host event mask params and response structures, shared by all of the host</span><br><span>  * event commands below.</span><br><span>@@ -3552,15 +3867,24 @@</span><br><span>    CS_PARAM_CUSTOM_PROFILE_MIN = 0x10000,</span><br><span>       CS_PARAM_CUSTOM_PROFILE_MAX = 0x1ffff,</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* Range for CONFIG_CHARGE_STATE_DEBUG params */</span><br><span style="color: hsl(120, 100%, 40%);">+      CS_PARAM_DEBUG_MIN = 0x20000,</span><br><span style="color: hsl(120, 100%, 40%);">+ CS_PARAM_DEBUG_CTL_MODE = 0x20000,</span><br><span style="color: hsl(120, 100%, 40%);">+    CS_PARAM_DEBUG_MANUAL_MODE,</span><br><span style="color: hsl(120, 100%, 40%);">+   CS_PARAM_DEBUG_SEEMS_DEAD,</span><br><span style="color: hsl(120, 100%, 40%);">+    CS_PARAM_DEBUG_SEEMS_DISCONNECTED,</span><br><span style="color: hsl(120, 100%, 40%);">+    CS_PARAM_DEBUG_BATT_REMOVED,</span><br><span style="color: hsl(120, 100%, 40%);">+  CS_PARAM_DEBUG_MANUAL_CURRENT,</span><br><span style="color: hsl(120, 100%, 40%);">+        CS_PARAM_DEBUG_MANUAL_VOLTAGE,</span><br><span style="color: hsl(120, 100%, 40%);">+        CS_PARAM_DEBUG_MAX = 0x2ffff,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* Other custom param ranges go here... */</span><br><span> };</span><br><span> </span><br><span> struct __ec_todo_packed ec_params_charge_state {</span><br><span>     uint8_t cmd;                            /* enum charge_state_command */</span><br><span>      union {</span><br><span style="color: hsl(0, 100%, 40%);">-         struct __ec_align1 {</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* no args */</span><br><span style="color: hsl(0, 100%, 40%);">-           } get_state;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* get_state has no args */</span><br><span> </span><br><span>              struct __ec_todo_unpacked {</span><br><span>                  uint32_t param;         /* enum charge_state_param */</span><br><span>@@ -3586,9 +3910,8 @@</span><br><span>                struct __ec_align4 {</span><br><span>                         uint32_t value;</span><br><span>              } get_param;</span><br><span style="color: hsl(0, 100%, 40%);">-            struct __ec_align4 {</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* no return values */</span><br><span style="color: hsl(0, 100%, 40%);">-          } set_param;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* set_param returns no args */</span><br><span>      };</span><br><span> };</span><br><span> </span><br><span>@@ -3666,7 +3989,9 @@</span><br><span>         HOST_SLEEP_EVENT_S3_SUSPEND   = 1,</span><br><span>   HOST_SLEEP_EVENT_S3_RESUME    = 2,</span><br><span>   HOST_SLEEP_EVENT_S0IX_SUSPEND = 3,</span><br><span style="color: hsl(0, 100%, 40%);">-      HOST_SLEEP_EVENT_S0IX_RESUME  = 4</span><br><span style="color: hsl(120, 100%, 40%);">+     HOST_SLEEP_EVENT_S0IX_RESUME  = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+    /* S3 suspend with additional enabled wake sources */</span><br><span style="color: hsl(120, 100%, 40%);">+ HOST_SLEEP_EVENT_S3_WAKEABLE_SUSPEND = 5,</span><br><span> };</span><br><span> </span><br><span> struct __ec_align1 ec_params_host_sleep_event {</span><br><span>@@ -3799,9 +4124,7 @@</span><br><span>               /* EC_SB_FW_UPDATE_END      = 0x4 */</span><br><span>                 /* EC_SB_FW_UPDATE_STATUS   = 0x5 */</span><br><span>                 /* EC_SB_FW_UPDATE_PROTECT  = 0x6 */</span><br><span style="color: hsl(0, 100%, 40%);">-            struct __ec_align4 {</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* no args */</span><br><span style="color: hsl(0, 100%, 40%);">-           } dummy;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Those have no args */</span><br><span> </span><br><span>                 /* EC_SB_FW_UPDATE_WRITE    = 0x3 */</span><br><span>                 struct __ec_align4 {</span><br><span>@@ -3860,6 +4183,58 @@</span><br><span>        uint8_t status;         /* Status flags (0: unlocked, 1: locked) */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*****************************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ *  HDMI CEC commands</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * These commands are for sending and receiving message via HDMI CEC</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_CEC_MSG_LEN 16</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* CEC message from the AP to be written on the CEC bus */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_CEC_WRITE_MSG 0x00B8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Message to write to the CEC bus */</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_params_cec_write {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t msg[MAX_CEC_MSG_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Set various CEC parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_CEC_SET 0x00BA</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_params_cec_set {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t cmd; /* enum cec_command */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t val;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Read various CEC parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_CEC_GET 0x00BB</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_params_cec_get {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t cmd; /* enum cec_command */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_response_cec_get {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t val;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum cec_command {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* CEC reading, writing and events enable */</span><br><span style="color: hsl(120, 100%, 40%);">+  CEC_CMD_ENABLE,</span><br><span style="color: hsl(120, 100%, 40%);">+       /* CEC logical address  */</span><br><span style="color: hsl(120, 100%, 40%);">+    CEC_CMD_LOGICAL_ADDRESS,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Events from CEC to AP */</span><br><span style="color: hsl(120, 100%, 40%);">+enum mkbp_cec_event {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Outgoing message was acknowledged by a follower */</span><br><span style="color: hsl(120, 100%, 40%);">+ EC_MKBP_CEC_SEND_OK                     = 1 << 0,</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Outgoing message was not acknowledged */</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_MKBP_CEC_SEND_FAILED                 = 1 << 1,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*****************************************************************************/</span><br><span> /* System commands */</span><br><span> </span><br><span>@@ -3873,7 +4248,7 @@</span><br><span> enum ec_reboot_cmd {</span><br><span>        EC_REBOOT_CANCEL = 0,        /* Cancel a pending reboot */</span><br><span>   EC_REBOOT_JUMP_RO = 1,       /* Jump to RO without rebooting */</span><br><span style="color: hsl(0, 100%, 40%);">- EC_REBOOT_JUMP_RW = 2,       /* Jump to RW without rebooting */</span><br><span style="color: hsl(120, 100%, 40%);">+       EC_REBOOT_JUMP_RW = 2,       /* Jump to active RW without rebooting */</span><br><span>       /* (command 3 was jump to RW-B) */</span><br><span>   EC_REBOOT_COLD = 4,          /* Cold-reboot */</span><br><span>       EC_REBOOT_DISABLE_JUMP = 5,  /* Disable jump until next reboot */</span><br><span>@@ -3884,6 +4259,7 @@</span><br><span> /* Flags for ec_params_reboot_ec.reboot_flags */</span><br><span> #define EC_REBOOT_FLAG_RESERVED0      (1 << 0)  /* Was recovery request */</span><br><span> #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1)  /* Reboot after AP shutdown */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_REBOOT_FLAG_SWITCH_RW_SLOT (1 << 2)  /* Switch RW slot */</span><br><span> </span><br><span> struct __ec_align1 ec_params_reboot_ec {</span><br><span>        uint8_t cmd;           /* enum ec_reboot_cmd */</span><br><span>@@ -4003,6 +4379,7 @@</span><br><span>      USB_PD_CTRL_ROLE_TOGGLE_OFF = 2,</span><br><span>     USB_PD_CTRL_ROLE_FORCE_SINK = 3,</span><br><span>     USB_PD_CTRL_ROLE_FORCE_SOURCE = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+    USB_PD_CTRL_ROLE_FREEZE = 5,</span><br><span>         USB_PD_CTRL_ROLE_COUNT</span><br><span> };</span><br><span> </span><br><span>@@ -4084,6 +4461,7 @@</span><br><span>     USB_CHG_TYPE_OTHER,</span><br><span>  USB_CHG_TYPE_VBUS,</span><br><span>   USB_CHG_TYPE_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+ USB_CHG_TYPE_DEDICATED,</span><br><span> };</span><br><span> enum usb_power_roles {</span><br><span>      USB_PD_PORT_POWER_DISCONNECTED,</span><br><span>@@ -4108,6 +4486,17 @@</span><br><span>     uint32_t max_power;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This command will return the number of USB PD charge port + the number</span><br><span style="color: hsl(120, 100%, 40%);">+ * of dedicated port present.</span><br><span style="color: hsl(120, 100%, 40%);">+ * EC_CMD_USB_PD_PORTS does NOT include the dedicated ports</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_CHARGE_PORT_COUNT 0x0105</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_response_charge_port_count {</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t port_count;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Write USB-PD device FW */</span><br><span> #define EC_CMD_USB_PD_FW_UPDATE 0x0110</span><br><span> </span><br><span>@@ -4168,7 +4557,11 @@</span><br><span>     int16_t override_port; /* Override port# */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Read (and delete) one entry of PD event log */</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Read (and delete) one entry of PD event log.</span><br><span style="color: hsl(120, 100%, 40%);">+ * TODO(crbug.com/751742): Make this host command more generic to accommodate</span><br><span style="color: hsl(120, 100%, 40%);">+ * future non-PD logs that use the same internal EC event_log.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> #define EC_CMD_PD_GET_LOG_ENTRY 0x0115</span><br><span> </span><br><span> struct __ec_align4 ec_response_pd_log {</span><br><span>@@ -4302,11 +4695,12 @@</span><br><span>   PD_SUSPEND = 0,      /* Suspend the PD chip (EC: stop talking to PD) */</span><br><span>      PD_RESUME,           /* Resume the PD chip (EC: start talking to PD) */</span><br><span>      PD_RESET,            /* Force reset the PD chip */</span><br><span style="color: hsl(0, 100%, 40%);">-      PD_CONTROL_DISABLE   /* Disable further calls to this command */</span><br><span style="color: hsl(120, 100%, 40%);">+      PD_CONTROL_DISABLE,  /* Disable further calls to this command */</span><br><span style="color: hsl(120, 100%, 40%);">+      PD_CHIP_ON,          /* Power on the PD chip */</span><br><span> };</span><br><span> </span><br><span> struct __ec_align1 ec_params_pd_control {</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t chip;         /* chip id (should be 0) */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t chip;         /* chip id */</span><br><span>  uint8_t subcmd;</span><br><span> };</span><br><span> </span><br><span>@@ -4398,7 +4792,7 @@</span><br><span> #define CBI_GET_RELOAD             (1 << 0)</span><br><span> </span><br><span> struct __ec_align4 ec_params_get_cbi {</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t type;          /* enum cbi_data_tag */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t tag;           /* enum cbi_data_tag */</span><br><span>      uint32_t flag;          /* CBI_GET_* */</span><br><span> };</span><br><span> </span><br><span>@@ -4407,7 +4801,7 @@</span><br><span>  *</span><br><span>  * NO_SYNC: Makes EC update data in RAM but skip writing to EEPROM. It's</span><br><span>  *          useful when writing multiple fields in a row.</span><br><span style="color: hsl(0, 100%, 40%);">- * INIT:    Needs to be set when creating a new CBI from scratch. All fields</span><br><span style="color: hsl(120, 100%, 40%);">+ * INIT:    Need to be set when creating a new CBI from scratch. All fields</span><br><span>  *          will be initialized to zero first.</span><br><span>  */</span><br><span> #define CBI_SET_NO_SYNC               (1 << 0)</span><br><span>@@ -4420,6 +4814,41 @@</span><br><span>      uint8_t data[];         /* For string and raw data */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Information about resets of the AP by the EC and the EC's own uptime.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_GET_UPTIME_INFO 0x0121</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_response_uptime_info {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Number of milliseconds since last EC reset */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t time_since_ec_boot_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Number of times the AP was reset by the EC since the last EC boot.</span><br><span style="color: hsl(120, 100%, 40%);">+  * Note that the AP may be held in reset by the EC during the initial</span><br><span style="color: hsl(120, 100%, 40%);">+  * boot sequence, such that the very first AP boot may count as more</span><br><span style="color: hsl(120, 100%, 40%);">+   * than one here.</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t ap_resets_since_ec_boot;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * The set of flags which describe the EC's most recent reset.  See</span><br><span style="color: hsl(120, 100%, 40%);">+        * include/system.h RESET_FLAG_* for details.</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t ec_reset_flags;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Empty log entries have both the cause and timestamp set to zero. */</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ap_reset_log_entry {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* See include/chipset.h for details */</span><br><span style="color: hsl(120, 100%, 40%);">+               uint16_t reset_cause;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /*</span><br><span style="color: hsl(120, 100%, 40%);">+             * The time of the reset's assertion, in milliseconds since the</span><br><span style="color: hsl(120, 100%, 40%);">+            * last EC reset.  Set to zero if the log entry is empty.</span><br><span style="color: hsl(120, 100%, 40%);">+              */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint32_t reset_time_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+       } recent_ap_reset[4];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> /*****************************************************************************/</span><br><span> /* The command range 0x200-0x2FF is reserved for Rotor. */</span><br><span> </span><br><span>@@ -4471,23 +4900,56 @@</span><br><span> #define FP_MODE_FINGER_UP     (1<<2)</span><br><span> /* Capture the current finger image */</span><br><span> #define FP_MODE_CAPTURE       (1<<3)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Capture types defined in bits [30..28] */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_MODE_CAPTURE_TYPE_SHIFT 28</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_MODE_CAPTURE_TYPE_MASK  0x7</span><br><span style="color: hsl(120, 100%, 40%);">+/* Full blown vendor-defined capture (produces 'frame_size' bytes) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CAPTURE_VENDOR_FORMAT 0</span><br><span style="color: hsl(120, 100%, 40%);">+/* Simple raw image capture (produces width x height x bpp bits) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CAPTURE_SIMPLE_IMAGE  1</span><br><span style="color: hsl(120, 100%, 40%);">+/* Self test pattern (e.g. checkerboard) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CAPTURE_PATTERN0      2</span><br><span style="color: hsl(120, 100%, 40%);">+/* Self test pattern (e.g. inverted checkerboard) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CAPTURE_PATTERN1      3</span><br><span style="color: hsl(120, 100%, 40%);">+/* Capture for Quality test with fixed contrast */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CAPTURE_QUALITY_TEST  4</span><br><span style="color: hsl(120, 100%, 40%);">+/* Capture for pixel reset value test */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CAPTURE_RESET_TEST    5</span><br><span style="color: hsl(120, 100%, 40%);">+/* Extracts the capture type from the sensor 'mode' word */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CAPTURE_TYPE(mode) (((mode) >> FP_MODE_CAPTURE_TYPE_SHIFT) \</span><br><span style="color: hsl(120, 100%, 40%);">+                                  & FP_MODE_CAPTURE_TYPE_MASK)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Finger enrollment session on-going */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_MODE_ENROLL_SESSION (1<<4)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Enroll the current finger image */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_MODE_ENROLL_IMAGE   (1<<5)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Try to match the current finger image */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_MODE_MATCH          (1<<6)</span><br><span> /* special value: don't change anything just read back current mode */</span><br><span style="color: hsl(0, 100%, 40%);">-#define FP_MODE_DONT_CHANGE   (1<<31)</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_MODE_DONT_CHANGE    (1<<31)</span><br><span> </span><br><span> struct __ec_align4 ec_params_fp_mode {</span><br><span>   uint32_t mode; /* as defined by FP_MODE_ constants */</span><br><span style="color: hsl(0, 100%, 40%);">-   /* TBD */</span><br><span> };</span><br><span> </span><br><span> struct __ec_align4 ec_response_fp_mode {</span><br><span>      uint32_t mode; /* as defined by FP_MODE_ constants */</span><br><span style="color: hsl(0, 100%, 40%);">-   /* TBD */</span><br><span> };</span><br><span> </span><br><span> /* Retrieve Fingerprint sensor information */</span><br><span> #define EC_CMD_FP_INFO 0x0403</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct __ec_align2 ec_response_fp_info {</span><br><span style="color: hsl(120, 100%, 40%);">+/* Number of dead pixels detected on the last maintenance */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_ERROR_DEAD_PIXELS(errors) ((errors) & 0x3FF)</span><br><span style="color: hsl(120, 100%, 40%);">+/* No interrupt from the sensor */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_ERROR_NO_IRQ    (1 << 12)</span><br><span style="color: hsl(120, 100%, 40%);">+/* SPI communication error */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_ERROR_SPI_COMM  (1 << 13)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Invalid sensor Hardware ID */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_ERROR_BAD_HWID  (1 << 14)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Sensor initialization failed */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_ERROR_INIT_FAIL (1 << 15)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_response_fp_info_v0 {</span><br><span>         /* Sensor identification */</span><br><span>  uint32_t vendor_id;</span><br><span>  uint32_t product_id;</span><br><span>@@ -4499,16 +4961,76 @@</span><br><span>       uint16_t width;</span><br><span>      uint16_t height;</span><br><span>     uint16_t bpp;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t errors; /* see FP_ERROR_ flags above */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Get the last captured finger frame: TODO: will be AES-encrypted */</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_response_fp_info {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Sensor identification */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t vendor_id;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t product_id;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t model_id;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t version;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Image frame characteristics */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t frame_size;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t pixel_format; /* using V4L2_PIX_FMT_ */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t width;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t height;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t bpp;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t errors; /* see FP_ERROR_ flags above */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Template/finger current information */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t template_size;  /* max template size in bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t template_max;   /* maximum number of fingers/templates */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t template_valid; /* number of valid fingers/templates */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t template_dirty; /* bitmap of templates with MCU side changes */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Get the last captured finger frame or a template content */</span><br><span> #define EC_CMD_FP_FRAME 0x0404</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* constants defining the 'offset' field which also contains the frame index */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_FRAME_INDEX_SHIFT       28</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_FRAME_INDEX_RAW_IMAGE    0</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_FRAME_TEMPLATE_INDEX(offset) ((offset) >> FP_FRAME_INDEX_SHIFT)</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_FRAME_OFFSET_MASK       0x0FFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct __ec_align4 ec_params_fp_frame {</span><br><span style="color: hsl(120, 100%, 40%);">+     /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * The offset contains the template index or FP_FRAME_INDEX_RAW_IMAGE</span><br><span style="color: hsl(120, 100%, 40%);">+  * in the high nibble, and the real offset within the frame in</span><br><span style="color: hsl(120, 100%, 40%);">+         * FP_FRAME_OFFSET_MASK.</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span>  uint32_t offset;</span><br><span>     uint32_t size;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Load a template into the MCU */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_FP_TEMPLATE 0x0405</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Flag in the 'size' field indicating that the full template has been sent */</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_TEMPLATE_COMMIT 0x80000000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_params_fp_template {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t offset;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t size;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t data[];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Clear the current fingerprint user context and set a new one */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_FP_CONTEXT 0x0406</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CONTEXT_USERID_WORDS (32 / sizeof(uint32_t))</span><br><span style="color: hsl(120, 100%, 40%);">+#define FP_CONTEXT_NONCE_WORDS (32 / sizeof(uint32_t))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_params_fp_context {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t userid[FP_CONTEXT_USERID_WORDS];</span><br><span style="color: hsl(120, 100%, 40%);">+     /* TODO(b/73337313) mostly a placeholder, details to be implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t nonce[FP_CONTEXT_NONCE_WORDS];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_response_fp_context {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t nonce[FP_CONTEXT_NONCE_WORDS];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*****************************************************************************/</span><br><span> /* Touchpad MCU commands: range 0x0500-0x05FF */</span><br><span> </span><br><span>@@ -4536,6 +5058,72 @@</span><br><span> };</span><br><span> </span><br><span> /*****************************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+/* EC-EC communication commands: range 0x0600-0x06FF */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_COMM_TEXT_MAX 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Get battery static information, i.e. information that never changes, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * very infrequently.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_BATTERY_GET_STATIC 0x0600</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align_size1 ec_params_battery_static_info {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t index; /* Battery index. */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_response_battery_static_info {</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t design_capacity; /* Battery Design Capacity (mAh) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t design_voltage; /* Battery Design Voltage (mV) */</span><br><span style="color: hsl(120, 100%, 40%);">+    char manufacturer[EC_COMM_TEXT_MAX]; /* Battery Manufacturer String */</span><br><span style="color: hsl(120, 100%, 40%);">+        char model[EC_COMM_TEXT_MAX]; /* Battery Model Number String */</span><br><span style="color: hsl(120, 100%, 40%);">+       char serial[EC_COMM_TEXT_MAX]; /* Battery Serial Number String */</span><br><span style="color: hsl(120, 100%, 40%);">+     char type[EC_COMM_TEXT_MAX]; /* Battery Type String */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* TODO(crbug.com/795991): Consider moving to dynamic structure. */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t cycle_count; /* Battery Cycle Count */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Get battery dynamic information, i.e. information that is likely to change</span><br><span style="color: hsl(120, 100%, 40%);">+ * every time it is read.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_BATTERY_GET_DYNAMIC 0x0601</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align_size1 ec_params_battery_dynamic_info {</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t index; /* Battery index. */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align2 ec_response_battery_dynamic_info {</span><br><span style="color: hsl(120, 100%, 40%);">+      int16_t actual_voltage; /* Battery voltage (mV) */</span><br><span style="color: hsl(120, 100%, 40%);">+    int16_t actual_current; /* Battery current (mA); negative=discharging */</span><br><span style="color: hsl(120, 100%, 40%);">+      int16_t remaining_capacity; /* Remaining capacity (mAh) */</span><br><span style="color: hsl(120, 100%, 40%);">+    int16_t full_capacity; /* Capacity (mAh, might change occasionally) */</span><br><span style="color: hsl(120, 100%, 40%);">+        int16_t flags; /* Flags, see EC_BATT_FLAG_* */</span><br><span style="color: hsl(120, 100%, 40%);">+        int16_t desired_voltage; /* Charging voltage desired by battery (mV) */</span><br><span style="color: hsl(120, 100%, 40%);">+       int16_t desired_current; /* Charging current desired by battery (mA) */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Control charger chip. Used to control charger chip on the slave.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_CHARGER_CONTROL 0x0602</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align_size1 ec_params_charger_control {</span><br><span style="color: hsl(120, 100%, 40%);">+     /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Charger current (mA). Positive to allow base to draw up to</span><br><span style="color: hsl(120, 100%, 40%);">+  * max_current and (possibly) charge battery, negative to request</span><br><span style="color: hsl(120, 100%, 40%);">+      * current from base (OTG).</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+   int16_t max_current;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Voltage (mV) to use in OTG mode, ignored if max_current is >= 0. */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t otg_voltage;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Allow base battery charging (only makes sense if max_current > 0). */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t allow_charging;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*****************************************************************************/</span><br><span> /*</span><br><span>  * Reserve a range of host commands for board-specific, experimental, or</span><br><span>  * special purpose features. These can be (re)used without updating this file.</span><br><span>@@ -4609,6 +5197,6 @@</span><br><span> #define EC_LPC_ADDR_OLD_PARAM   EC_HOST_CMD_REGION1</span><br><span> #define EC_OLD_PARAM_SIZE       EC_HOST_CMD_REGION_SIZE</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#endif  /* !__ACPI__ && !__KERNEL__ */</span><br><span style="color: hsl(120, 100%, 40%);">+#endif  /* !__ACPI__ */</span><br><span> </span><br><span> #endif  /* __CROS_EC_EC_COMMANDS_H */</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27620">change 27620</a>. To unsubscribe, or for help writing mail filters, 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/27620"/><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: Ic3daa09ffd83c089b6874e0ea9aab8aa60016775 </div>
<div style="display:none"> Gerrit-Change-Number: 27620 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Jonathan Brandmeyer <jbrandmeyer@chromium.org> </div>