<p>Daisuke Nojiri has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23549">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ec/google: Get OEM ID and SKU ID from EC<br><br>This patch adds EC_CMD_GET_CROS_BOARD_INFO to cros EC. It allows<br>coreboot to fetch OEM ID and SKU ID from EC.<br><br>BUG=b:70294260<br>BRANCH=none<br>TEST=Verify AP log shows expected OEM ID and SKU ID on Fizz.<br><br>Change-Id: Iff69a2dc0e562d87dd287f79c407f23aeb09fb9e<br>Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org><br>---<br>M src/ec/google/chromeec/ec.c<br>M src/ec/google/chromeec/ec.h<br>M src/ec/google/chromeec/ec_commands.h<br>3 files changed, 103 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/49/23549/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 89241da..3f81716 100644</span><br><span>--- a/src/ec/google/chromeec/ec.c</span><br><span>+++ b/src/ec/google/chromeec/ec.c</span><br><span>@@ -558,6 +558,40 @@</span><br><span>    return google_chromeec_command(&cec_cmd);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int cbi_get_uint32(uint32_t *id, uint32_t type)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct chromeec_command cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct ec_params_get_cbi p;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t r;</span><br><span style="color: hsl(120, 100%, 40%);">+   int rv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     p.type = type;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      cmd.cmd_code = EC_CMD_GET_CROS_BOARD_INFO;</span><br><span style="color: hsl(120, 100%, 40%);">+    cmd.cmd_version = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  cmd.cmd_data_in = &p;</span><br><span style="color: hsl(120, 100%, 40%);">+     cmd.cmd_data_out = &r;</span><br><span style="color: hsl(120, 100%, 40%);">+    cmd.cmd_size_in = sizeof(p);</span><br><span style="color: hsl(120, 100%, 40%);">+  cmd.cmd_size_out = sizeof(r);</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd.cmd_dev_index = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      rv = google_chromeec_command(&cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rv < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return rv;</span><br><span style="color: hsl(120, 100%, 40%);">+    *id = r;</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</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%);">+int google_chromeec_get_sku_id2(uint32_t *id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      return cbi_get_uint32(id, CBI_DATA_SKU_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%);">+int google_chromeec_get_oem_id(uint32_t *id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return cbi_get_uint32(id, CBI_DATA_OEM_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifndef __SMM__</span><br><span> u16 google_chromeec_get_board_version(void)</span><br><span> {</span><br><span>diff --git a/src/ec/google/chromeec/ec.h b/src/ec/google/chromeec/ec.h</span><br><span>index 90bb6fa..7192315 100644</span><br><span>--- a/src/ec/google/chromeec/ec.h</span><br><span>+++ b/src/ec/google/chromeec/ec.h</span><br><span>@@ -64,6 +64,15 @@</span><br><span>    success, < 0 otherwise. */</span><br><span> int google_chromeec_reboot(int dev_idx, enum ec_reboot_cmd type, uint8_t flags);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * Get OEM (or SKU) ID from EC</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param id [OUT] oem/sku id</span><br><span style="color: hsl(120, 100%, 40%);">+ * @return 0 on success or negative integer for errors.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int google_chromeec_get_oem_id(uint32_t *id);</span><br><span style="color: hsl(120, 100%, 40%);">+int google_chromeec_get_sku_id2(uint32_t *id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* MEC uses 0x800/0x804 as register/index pair, thus an 8-byte resource. */</span><br><span> #define MEC_EMI_BASE         0x800</span><br><span> #define MEC_EMI_SIZE           8</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 92fb2a8..a8d6b30 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>@@ -4363,6 +4363,66 @@</span><br><span>      uint32_t action;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Run verification on a slot */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_EFS_VERIFY 0x011E</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_params_efs_verify {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t region;         /* enum ec_flash_region */</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%);">+ * Retrieve info from Cros Board Info store. Response is based on the data</span><br><span style="color: hsl(120, 100%, 40%);">+ * type. Integers return a uint32. Strings return a string, using the response</span><br><span style="color: hsl(120, 100%, 40%);">+ * size to determine how big it is.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_GET_CROS_BOARD_INFO  0x011F</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Write info into Cros Board Info on EEPROM. Write fails if the board has</span><br><span style="color: hsl(120, 100%, 40%);">+ * hardware write-protect enabled.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_SET_CROS_BOARD_INFO     0x0120</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum cbi_data_type {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* integer types */</span><br><span style="color: hsl(120, 100%, 40%);">+   CBI_DATA_BOARD_VERSION = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   CBI_DATA_OEM_ID = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+  CBI_DATA_SKU_ID = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+  /* string types */</span><br><span style="color: hsl(120, 100%, 40%);">+    CBI_FIRST_STRING_PARAM = 0x1000,</span><br><span style="color: hsl(120, 100%, 40%);">+      CBI_DATA_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%);">+ * Flags to control read operation</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * RELOAD:  Invalidate cache and read data from EEPROM. Useful to verify</span><br><span style="color: hsl(120, 100%, 40%);">+ *          write was successful without reboot.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define CBI_GET_RELOAD              (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align4 ec_params_get_cbi {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t type;          /* enum cbi_data_type */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t flag;          /* CBI_GET_* */</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%);">+ * Flags to control write behavior.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * NO_SYNC: Makes EC update data in RAM but skip writing to EEPROM. It's</span><br><span style="color: hsl(120, 100%, 40%);">+ *          useful when writing multiple fields in a row.</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 style="color: hsl(120, 100%, 40%);">+ *          will be initialized to zero first.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define CBI_SET_NO_SYNC          (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define CBI_SET_INIT            (1 << 1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct __ec_align1 ec_params_set_cbi {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t type;          /* enum cbi_data_type */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t flag;          /* CBI_SET_* */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t data;          /* For numeric value */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t raw[];          /* For string and raw data */</span><br><span style="color: hsl(120, 100%, 40%);">+};</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></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23549">change 23549</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/23549"/><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: Iff69a2dc0e562d87dd287f79c407f23aeb09fb9e </div>
<div style="display:none"> Gerrit-Change-Number: 23549 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Daisuke Nojiri <dnojiri@chromium.org> </div>