<p>Philipp Deppenwiese <strong>merged</strong> this change.</p><p><a href="https://review.coreboot.org/25046">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  build bot (Jenkins): Verified
  David Hendricks: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">drivers/vpd: Add VPD support<br><br>VPD reference: https://chromium.googlesource.com/chromiumos/platform/vpd/+/master/README.md<br><br>Copy ChromeOS VPD driver to add support for VPD without CROMEOS.<br>Possible use case:<br>* Storing calibration data<br>* Storing MAC address<br>* Storing serial<br>* Storing boot options<br><br>+ Now it's possible to define the VPD space by choosing<br>  one of the following enums: VPD_ANY, VPD_RW, VPD_RO.<br>+ CHROMEOS selects now VPD as part of it.<br>+ VPD is implemented as driver.<br><br>Change-Id: Id9263bd39bf25d024e93daa57053fefcb1adc53a<br>Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com><br>Reviewed-on: https://review.coreboot.org/25046<br>Reviewed-by: David Hendricks <david.hendricks@gmail.com><br>Tested-by: build bot (Jenkins) <no-reply@coreboot.org><br>---<br>A src/drivers/vpd/Kconfig<br>A src/drivers/vpd/Makefile.inc<br>A src/drivers/vpd/lib_vpd.c<br>R src/drivers/vpd/lib_vpd.h<br>R src/drivers/vpd/vpd.c<br>R src/drivers/vpd/vpd.h<br>R src/drivers/vpd/vpd_tables.h<br>M src/mainboard/google/reef/variants/snappy/mainboard.c<br>M src/vendorcode/google/chromeos/Kconfig<br>M src/vendorcode/google/chromeos/Makefile.inc<br>M src/vendorcode/google/chromeos/sar.c<br>M src/vendorcode/google/chromeos/vpd_calibration.c<br>D src/vendorcode/google/chromeos/vpd_decode.c<br>M src/vendorcode/google/chromeos/vpd_mac.c<br>M src/vendorcode/google/chromeos/vpd_serialno.c<br>M src/vendorcode/google/chromeos/wrdd.c<br>16 files changed, 206 insertions(+), 140 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/vpd/Kconfig b/src/drivers/vpd/Kconfig</span><br><span>new file mode 100644</span><br><span>index 0000000..335b907</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/vpd/Kconfig</span><br><span>@@ -0,0 +1,28 @@</span><br><span style="color: hsl(120, 100%, 40%);">+##</span><br><span style="color: hsl(120, 100%, 40%);">+## This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+##</span><br><span style="color: hsl(120, 100%, 40%);">+## Copyright (C) 2012 The Chromium OS Authors.  All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+##</span><br><span style="color: hsl(120, 100%, 40%);">+## This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+## it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+## the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+##</span><br><span style="color: hsl(120, 100%, 40%);">+## This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+## but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+## GNU General Public License for more details.</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%);">+config VPD</span><br><span style="color: hsl(120, 100%, 40%);">+     bool "Support for Vital Product Data tables"</span><br><span style="color: hsl(120, 100%, 40%);">+        default n</span><br><span style="color: hsl(120, 100%, 40%);">+     help</span><br><span style="color: hsl(120, 100%, 40%);">+    Enable support for flash based vital product data.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if VPD</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+config VPD_DEBUG</span><br><span style="color: hsl(120, 100%, 40%);">+    bool "Enable VPD debug output"</span><br><span style="color: hsl(120, 100%, 40%);">+      default n</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/src/drivers/vpd/Makefile.inc b/src/drivers/vpd/Makefile.inc</span><br><span>new file mode 100644</span><br><span>index 0000000..91c069d</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/vpd/Makefile.inc</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-$(CONFIG_VPD) += lib_vpd.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_VPD) += vpd.c lib_vpd.c</span><br><span>diff --git a/src/drivers/vpd/lib_vpd.c b/src/drivers/vpd/lib_vpd.c</span><br><span>new file mode 100644</span><br><span>index 0000000..0744a71</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/vpd/lib_vpd.c</span><br><span>@@ -0,0 +1,113 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Use of this source code is governed by a BSD-style license that can be</span><br><span style="color: hsl(120, 100%, 40%);">+ * found in the LICENSE file.</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%);">+#include <assert.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "lib_vpd.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Given an encoded string, this functions decodes the length field which varies</span><br><span style="color: hsl(120, 100%, 40%);">+ * from 1 byte to many bytes.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The in points the actual byte going to be decoded. The *length returns</span><br><span style="color: hsl(120, 100%, 40%);">+ * the decoded length field. The number of consumed bytes will be stroed in</span><br><span style="color: hsl(120, 100%, 40%);">+ * decoded_len.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Returns VPD_FAIL if more bit is 1, but actually reaches the end of string.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int decodeLen(const int32_t max_len,</span><br><span style="color: hsl(120, 100%, 40%);">+        const uint8_t *in,</span><br><span style="color: hsl(120, 100%, 40%);">+            int32_t *length,</span><br><span style="color: hsl(120, 100%, 40%);">+              int32_t *decoded_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t more;</span><br><span style="color: hsl(120, 100%, 40%);">+ int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  assert(length);</span><br><span style="color: hsl(120, 100%, 40%);">+       assert(decoded_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        *length = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  do {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (i >= max_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return VPD_FAIL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            more = in[i] & 0x80;</span><br><span style="color: hsl(120, 100%, 40%);">+              *length <<= 7;</span><br><span style="color: hsl(120, 100%, 40%);">+          *length |= in[i] & 0x7f;</span><br><span style="color: hsl(120, 100%, 40%);">+          ++i;</span><br><span style="color: hsl(120, 100%, 40%);">+  } while (more);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     *decoded_len = i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return VPD_OK;</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%);">+/* Given the encoded string, this function invokes callback with extracted</span><br><span style="color: hsl(120, 100%, 40%);">+ * (key, value). The *consumed will be plused the number of bytes consumed in</span><br><span style="color: hsl(120, 100%, 40%);">+ * this function.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The input_buf points to the first byte of the input buffer.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The *consumed starts from 0, which is actually the next byte to be decoded.</span><br><span style="color: hsl(120, 100%, 40%);">+ * It can be non-zero to be used in multiple calls.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * If one entry is successfully decoded, sends it to callback and returns the</span><br><span style="color: hsl(120, 100%, 40%);">+ * result.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int decodeVpdString(const int32_t max_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                    const uint8_t *input_buf,</span><br><span style="color: hsl(120, 100%, 40%);">+             int32_t *consumed,</span><br><span style="color: hsl(120, 100%, 40%);">+                    VpdDecodeCallback callback,</span><br><span style="color: hsl(120, 100%, 40%);">+                   void *callback_arg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int type;</span><br><span style="color: hsl(120, 100%, 40%);">+     int32_t key_len, value_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   int32_t decoded_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  const uint8_t *key, *value;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* type */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (*consumed >= max_len)</span><br><span style="color: hsl(120, 100%, 40%);">+          return VPD_FAIL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    type = input_buf[*consumed];</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case VPD_TYPE_INFO:</span><br><span style="color: hsl(120, 100%, 40%);">+   case VPD_TYPE_STRING:</span><br><span style="color: hsl(120, 100%, 40%);">+         (*consumed)++;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* key */</span><br><span style="color: hsl(120, 100%, 40%);">+             if (VPD_OK != decodeLen(max_len - *consumed,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  &input_buf[*consumed], &key_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      &decoded_len) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                          *consumed + decoded_len >= max_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              return VPD_FAIL;</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%);">+           *consumed += decoded_len;</span><br><span style="color: hsl(120, 100%, 40%);">+             key = &input_buf[*consumed];</span><br><span style="color: hsl(120, 100%, 40%);">+              *consumed += key_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* value */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (VPD_OK != decodeLen(max_len - *consumed,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  &input_buf[*consumed],</span><br><span style="color: hsl(120, 100%, 40%);">+                                    &value_len, &decoded_len) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                                  *consumed + decoded_len > max_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       return VPD_FAIL;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             *consumed += decoded_len;</span><br><span style="color: hsl(120, 100%, 40%);">+             value = &input_buf[*consumed];</span><br><span style="color: hsl(120, 100%, 40%);">+            *consumed += value_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if (type == VPD_TYPE_STRING)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return callback(key, key_len, value, value_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       callback_arg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              return VPD_OK;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return VPD_FAIL;</span><br><span style="color: hsl(120, 100%, 40%);">+      break;</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%);">+   return VPD_OK;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/vendorcode/google/chromeos/lib_vpd.h b/src/drivers/vpd/lib_vpd.h</span><br><span>similarity index 93%</span><br><span>rename from src/vendorcode/google/chromeos/lib_vpd.h</span><br><span>rename to src/drivers/vpd/lib_vpd.h</span><br><span>index e08cb3a..7a7566b 100644</span><br><span>--- a/src/vendorcode/google/chromeos/lib_vpd.h</span><br><span>+++ b/src/drivers/vpd/lib_vpd.h</span><br><span>@@ -11,25 +11,25 @@</span><br><span> #include <inttypes.h></span><br><span> </span><br><span> enum {</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_OK = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_FAIL,</span><br><span style="color: hsl(120, 100%, 40%);">+       VPD_OK = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   VPD_FAIL,</span><br><span> };</span><br><span> </span><br><span> enum {</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_TYPE_TERMINATOR = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_TYPE_STRING,</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_TYPE_INFO                = 0xfe,</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_TYPE_IMPLICIT_TERMINATOR = 0xff,</span><br><span style="color: hsl(120, 100%, 40%);">+ VPD_TYPE_TERMINATOR = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+      VPD_TYPE_STRING,</span><br><span style="color: hsl(120, 100%, 40%);">+      VPD_TYPE_INFO                = 0xfe,</span><br><span style="color: hsl(120, 100%, 40%);">+  VPD_TYPE_IMPLICIT_TERMINATOR = 0xff,</span><br><span> };</span><br><span> </span><br><span> enum {</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_AS_LONG_AS = -1,</span><br><span style="color: hsl(120, 100%, 40%);">+        VPD_AS_LONG_AS = -1,</span><br><span> };</span><br><span> </span><br><span> enum {  /* export_type */</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_EXPORT_KEY_VALUE = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_EXPORT_VALUE,</span><br><span style="color: hsl(0, 100%, 40%);">-  VPD_EXPORT_AS_PARAMETER,</span><br><span style="color: hsl(120, 100%, 40%);">+   VPD_EXPORT_KEY_VALUE = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+     VPD_EXPORT_VALUE,</span><br><span style="color: hsl(120, 100%, 40%);">+     VPD_EXPORT_AS_PARAMETER,</span><br><span> };</span><br><span> </span><br><span> /* Callback for decodeVpdString to invoke. */</span><br><span>@@ -39,15 +39,15 @@</span><br><span> </span><br><span> /* Container data types */</span><br><span> struct StringPair {</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t *key;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t *value;</span><br><span style="color: hsl(0, 100%, 40%);">-  int pad_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  int filter_out;  /* TRUE means not exported. */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct StringPair *next;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t *key;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t *value;</span><br><span style="color: hsl(120, 100%, 40%);">+       int pad_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  int filter_out;  /* TRUE means not exported. */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct StringPair *next;</span><br><span> };</span><br><span> </span><br><span> struct PairContainer {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct StringPair *first;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct StringPair *first;</span><br><span> };</span><br><span> </span><br><span> </span><br><span>diff --git a/src/vendorcode/google/chromeos/cros_vpd.c b/src/drivers/vpd/vpd.c</span><br><span>similarity index 89%</span><br><span>rename from src/vendorcode/google/chromeos/cros_vpd.c</span><br><span>rename to src/drivers/vpd/vpd.c</span><br><span>index d0e2cc1..e620b58 100644</span><br><span>--- a/src/vendorcode/google/chromeos/cros_vpd.c</span><br><span>+++ b/src/drivers/vpd/vpd.c</span><br><span>@@ -5,14 +5,13 @@</span><br><span>  */</span><br><span> </span><br><span> #include <console/console.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #include <cbmem.h></span><br><span> #include <fmap.h></span><br><span> #include <stdlib.h></span><br><span> #include <string.h></span><br><span> #include <timestamp.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include "cros_vpd.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "vpd.h"</span><br><span> #include "lib_vpd.h"</span><br><span> #include "vpd_tables.h"</span><br><span> </span><br><span>@@ -178,7 +177,7 @@</span><br><span>      return VPD_FAIL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const void *cros_vpd_find(const char *key, int *size)</span><br><span style="color: hsl(120, 100%, 40%);">+const void *vpd_find(const char *key, int *size, enum vpd_region region)</span><br><span> {</span><br><span>        struct vpd_gets_arg arg = {0};</span><br><span>       int consumed = 0;</span><br><span>@@ -191,10 +190,18 @@</span><br><span>    arg.key = (const uint8_t *)key;</span><br><span>      arg.key_len = strlen(key);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  while (VPD_OK == decodeVpdString(vpd->ro_size, vpd->blob, &consumed,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   vpd_gets_callback, &arg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (region == VPD_ANY || region == VPD_RO)</span><br><span style="color: hsl(120, 100%, 40%);">+            while (VPD_OK == decodeVpdString(vpd->ro_size, vpd->blob,</span><br><span style="color: hsl(120, 100%, 40%);">+                      &consumed, vpd_gets_callback, &arg)) {</span><br><span>                /* Iterate until found or no more entries. */</span><br><span style="color: hsl(0, 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%);">+   if (!arg.matched && region != VPD_RO)</span><br><span style="color: hsl(120, 100%, 40%);">+         while (VPD_OK == decodeVpdString(vpd->rw_size,</span><br><span style="color: hsl(120, 100%, 40%);">+                    vpd->blob + vpd->ro_size, &consumed,</span><br><span style="color: hsl(120, 100%, 40%);">+                vpd_gets_callback, &arg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Iterate until found or no more entries. */</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span> </span><br><span>        if (!arg.matched)</span><br><span>            return NULL;</span><br><span>@@ -203,12 +210,12 @@</span><br><span>         return arg.value;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-char *cros_vpd_gets(const char *key, char *buffer, int size)</span><br><span style="color: hsl(120, 100%, 40%);">+char *vpd_gets(const char *key, char *buffer, int size, enum vpd_region region)</span><br><span> {</span><br><span>         const void *string_address;</span><br><span>  int string_size;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    string_address = cros_vpd_find(key, &string_size);</span><br><span style="color: hsl(120, 100%, 40%);">+        string_address = vpd_find(key, &string_size, region);</span><br><span> </span><br><span>        if (!string_address)</span><br><span>                 return NULL;</span><br><span>diff --git a/src/vendorcode/google/chromeos/cros_vpd.h b/src/drivers/vpd/vpd.h</span><br><span>similarity index 76%</span><br><span>rename from src/vendorcode/google/chromeos/cros_vpd.h</span><br><span>rename to src/drivers/vpd/vpd.h</span><br><span>index 1fa56a4..6009b8b 100644</span><br><span>--- a/src/vendorcode/google/chromeos/cros_vpd.h</span><br><span>+++ b/src/drivers/vpd/vpd.h</span><br><span>@@ -4,12 +4,14 @@</span><br><span>  * found in the LICENSE file.</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef __CROS_VPD_H__</span><br><span style="color: hsl(0, 100%, 40%);">-#define __CROS_VPD_H__</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __VPD_H__</span><br><span style="color: hsl(120, 100%, 40%);">+#define __VPD_H__</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define CROS_VPD_REGION_NAME "region"</span><br><span style="color: hsl(0, 100%, 40%);">-#define CROS_VPD_WIFI_SAR_NAME "wifi_sar"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+enum vpd_region {</span><br><span style="color: hsl(120, 100%, 40%);">+     VPD_ANY = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  VPD_RO = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   VPD_RW = 2</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> /*</span><br><span>  * Reads VPD string value by key.</span><br><span>  *</span><br><span>@@ -19,7 +21,7 @@</span><br><span>  *</span><br><span>  * Returns NULL if key is not found, otherwise buffer.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-char *cros_vpd_gets(const char *key, char *buffer, int size);</span><br><span style="color: hsl(120, 100%, 40%);">+char *vpd_gets(const char *key, char *buffer, int size, enum vpd_region region);</span><br><span> </span><br><span> /*</span><br><span>  * Find VPD value by key.</span><br><span>@@ -35,6 +37,6 @@</span><br><span>  * Returns NULL if key is not found.</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const void *cros_vpd_find(const char *key, int *size);</span><br><span style="color: hsl(120, 100%, 40%);">+const void *vpd_find(const char *key, int *size, enum vpd_region region);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#endif  /* __CROS_VPD_H__ */</span><br><span style="color: hsl(120, 100%, 40%);">+#endif  /* __VPD_H__ */</span><br><span>diff --git a/src/vendorcode/google/chromeos/vpd_tables.h b/src/drivers/vpd/vpd_tables.h</span><br><span>similarity index 100%</span><br><span>rename from src/vendorcode/google/chromeos/vpd_tables.h</span><br><span>rename to src/drivers/vpd/vpd_tables.h</span><br><span>diff --git a/src/mainboard/google/reef/variants/snappy/mainboard.c b/src/mainboard/google/reef/variants/snappy/mainboard.c</span><br><span>index a625c60..73de67e 100644</span><br><span>--- a/src/mainboard/google/reef/variants/snappy/mainboard.c</span><br><span>+++ b/src/mainboard/google/reef/variants/snappy/mainboard.c</span><br><span>@@ -16,7 +16,7 @@</span><br><span> #include <string.h></span><br><span> #include <baseboard/variants.h></span><br><span> #include <ec/google/chromeec/ec.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <vendorcode/google/chromeos/cros_vpd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <drivers/vpd/vpd.h></span><br><span> #include <soc/cpu.h></span><br><span> #include <soc/intel/apollolake/chip.h></span><br><span> </span><br><span>@@ -59,7 +59,7 @@</span><br><span>        if (!IS_ENABLED(CONFIG_CHROMEOS))</span><br><span>            return board_sku_num;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (!cros_vpd_gets(vpd_skuid, vpd_buffer, ARRAY_SIZE(vpd_buffer)))</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!vpd_gets(vpd_skuid, vpd_buffer, ARRAY_SIZE(vpd_buffer), VPD_ANY))</span><br><span>               return board_sku_num;</span><br><span> </span><br><span>    vpd_len = strlen(vpd_buffer);</span><br><span>diff --git a/src/vendorcode/google/chromeos/Kconfig b/src/vendorcode/google/chromeos/Kconfig</span><br><span>index 4f1fad9..1dd726f 100644</span><br><span>--- a/src/vendorcode/google/chromeos/Kconfig</span><br><span>+++ b/src/vendorcode/google/chromeos/Kconfig</span><br><span>@@ -24,6 +24,7 @@</span><br><span>       select ELOG if BOOT_DEVICE_SUPPORTS_WRITES</span><br><span>   select COLLECT_TIMESTAMPS</span><br><span>    select VBOOT</span><br><span style="color: hsl(120, 100%, 40%);">+  select VPD</span><br><span>   help</span><br><span>           Enable ChromeOS specific features like the GPIO sub table in</span><br><span>         the coreboot table. NOTE: Enabling this option on an unsupported</span><br><span>diff --git a/src/vendorcode/google/chromeos/Makefile.inc b/src/vendorcode/google/chromeos/Makefile.inc</span><br><span>index e833e0d..ecd82b7 100644</span><br><span>--- a/src/vendorcode/google/chromeos/Makefile.inc</span><br><span>+++ b/src/vendorcode/google/chromeos/Makefile.inc</span><br><span>@@ -17,8 +17,7 @@</span><br><span> ramstage-$(CONFIG_HAVE_ACPI_TABLES) += gnvs.c</span><br><span> ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi.c</span><br><span> ramstage-$(CONFIG_CHROMEOS_RAMOOPS) += ramoops.c</span><br><span style="color: hsl(0, 100%, 40%);">-romstage-y += vpd_decode.c</span><br><span style="color: hsl(0, 100%, 40%);">-ramstage-y += vpd_decode.c cros_vpd.c vpd_mac.c vpd_serialno.c vpd_calibration.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-y += vpd_mac.c vpd_serialno.c vpd_calibration.c</span><br><span> ramstage-$(CONFIG_CHROMEOS_DISABLE_PLATFORM_HIERARCHY_ON_RESUME) += tpm2.c</span><br><span> ramstage-$(CONFIG_HAVE_REGULATORY_DOMAIN) += wrdd.c</span><br><span> ramstage-$(CONFIG_USE_SAR) += sar.c</span><br><span>diff --git a/src/vendorcode/google/chromeos/sar.c b/src/vendorcode/google/chromeos/sar.c</span><br><span>index fc72dc1..6799f12 100644</span><br><span>--- a/src/vendorcode/google/chromeos/sar.c</span><br><span>+++ b/src/vendorcode/google/chromeos/sar.c</span><br><span>@@ -19,9 +19,10 @@</span><br><span> #include <types.h></span><br><span> #include <string.h></span><br><span> #include <sar.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include "cros_vpd.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <drivers/vpd/vpd.h></span><br><span> </span><br><span> #define WIFI_SAR_CBFS_FILENAME     "wifi_sar_defaults.hex"</span><br><span style="color: hsl(120, 100%, 40%);">+#define CROS_VPD_WIFI_SAR_NAME       "wifi_sar"</span><br><span> </span><br><span> static int load_sar_file_from_cbfs(void *buf, size_t buffer_size)</span><br><span> {</span><br><span>@@ -55,7 +56,7 @@</span><br><span> int get_wifi_sar_limits(struct wifi_sar_limits *sar_limits)</span><br><span> {</span><br><span>   const char *wifi_sar_limit_key = CROS_VPD_WIFI_SAR_NAME;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* cros_vpd_gets() reads in one less than size characters from the VPD</span><br><span style="color: hsl(120, 100%, 40%);">+        /* vpd_gets() reads in one less than size characters from the VPD</span><br><span>     * with a terminating null byte ('\0') stored as the last character into</span><br><span>      * the buffer, thus the increasing by 1 for buffer_size. */</span><br><span>  const size_t buffer_size = (sizeof(struct wifi_sar_limits) /</span><br><span>@@ -79,8 +80,8 @@</span><br><span>     }</span><br><span> </span><br><span>        /* Try to read the SAR limit entry from VPD */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!cros_vpd_gets(wifi_sar_limit_key, wifi_sar_limit_str,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       buffer_size)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!vpd_gets(wifi_sar_limit_key, wifi_sar_limit_str,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  buffer_size, VPD_ANY)) {</span><br><span>            printk(BIOS_ERR, "Error: Could not locate '%s' in VPD.\n",</span><br><span>                                 wifi_sar_limit_key);</span><br><span> </span><br><span>diff --git a/src/vendorcode/google/chromeos/vpd_calibration.c b/src/vendorcode/google/chromeos/vpd_calibration.c</span><br><span>index 697ff95..7f9910b 100644</span><br><span>--- a/src/vendorcode/google/chromeos/vpd_calibration.c</span><br><span>+++ b/src/vendorcode/google/chromeos/vpd_calibration.c</span><br><span>@@ -19,7 +19,7 @@</span><br><span> #include <string.h></span><br><span> </span><br><span> #include <vendorcode/google/chromeos/chromeos.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <vendorcode/google/chromeos/cros_vpd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <drivers/vpd/vpd.h></span><br><span> </span><br><span> /*</span><br><span>  * This file provides functions looking in the VPD for WiFi calibration data,</span><br><span>@@ -112,7 +112,7 @@</span><br><span>                      strcpy(cache->key_name, templates[i]);</span><br><span>                    cache->key_name[index_location] = j + '0';</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                       payload = cros_vpd_find(cache->key_name, &payload_size);</span><br><span style="color: hsl(120, 100%, 40%);">+                       payload = vpd_find(cache->key_name, &payload_size, VPD_ANY);</span><br><span>                  if (!payload)</span><br><span>                                continue;</span><br><span> </span><br><span>diff --git a/src/vendorcode/google/chromeos/vpd_decode.c b/src/vendorcode/google/chromeos/vpd_decode.c</span><br><span>deleted file mode 100644</span><br><span>index 545fd81..0000000</span><br><span>--- a/src/vendorcode/google/chromeos/vpd_decode.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,89 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.</span><br><span style="color: hsl(0, 100%, 40%);">- * Use of this source code is governed by a BSD-style license that can be</span><br><span style="color: hsl(0, 100%, 40%);">- * found in the LICENSE file.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-#include <assert.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include "lib_vpd.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int decodeLen(</span><br><span style="color: hsl(0, 100%, 40%);">-    const int32_t max_len,</span><br><span style="color: hsl(0, 100%, 40%);">-    const uint8_t *in,</span><br><span style="color: hsl(0, 100%, 40%);">-    int32_t *length,</span><br><span style="color: hsl(0, 100%, 40%);">-    int32_t *decoded_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t more;</span><br><span style="color: hsl(0, 100%, 40%);">-  int i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(length);</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(decoded_len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  *length = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  do {</span><br><span style="color: hsl(0, 100%, 40%);">-    if (i >= max_len) return VPD_FAIL;</span><br><span style="color: hsl(0, 100%, 40%);">-    more = in[i] & 0x80;</span><br><span style="color: hsl(0, 100%, 40%);">-    *length <<= 7;</span><br><span style="color: hsl(0, 100%, 40%);">-    *length |= in[i] & 0x7f;</span><br><span style="color: hsl(0, 100%, 40%);">-    ++i;</span><br><span style="color: hsl(0, 100%, 40%);">-  } while (more);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  *decoded_len = i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return VPD_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Sequentially decodes type, key, and value.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int decodeVpdString(</span><br><span style="color: hsl(0, 100%, 40%);">-    const int32_t max_len,</span><br><span style="color: hsl(0, 100%, 40%);">-    const uint8_t *input_buf,</span><br><span style="color: hsl(0, 100%, 40%);">-    int32_t *consumed,</span><br><span style="color: hsl(0, 100%, 40%);">-    VpdDecodeCallback callback,</span><br><span style="color: hsl(0, 100%, 40%);">-    void *callback_arg) {</span><br><span style="color: hsl(0, 100%, 40%);">-  int type;</span><br><span style="color: hsl(0, 100%, 40%);">-  int32_t key_len, value_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  int32_t decoded_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  const uint8_t *key, *value;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* type */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (*consumed >= max_len)</span><br><span style="color: hsl(0, 100%, 40%);">-    return VPD_FAIL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  type = input_buf[*consumed];</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (type) {</span><br><span style="color: hsl(0, 100%, 40%);">-    case VPD_TYPE_INFO:</span><br><span style="color: hsl(0, 100%, 40%);">-    case VPD_TYPE_STRING:</span><br><span style="color: hsl(0, 100%, 40%);">-      (*consumed)++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* key */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (VPD_OK != decodeLen(max_len - *consumed, &input_buf[*consumed],</span><br><span style="color: hsl(0, 100%, 40%);">-                              &key_len, &decoded_len) ||</span><br><span style="color: hsl(0, 100%, 40%);">-          *consumed + decoded_len >= max_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-        return VPD_FAIL;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      *consumed += decoded_len;</span><br><span style="color: hsl(0, 100%, 40%);">-      key = &input_buf[*consumed];</span><br><span style="color: hsl(0, 100%, 40%);">-      *consumed += key_len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* value */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (VPD_OK != decodeLen(max_len - *consumed, &input_buf[*consumed],</span><br><span style="color: hsl(0, 100%, 40%);">-                              &value_len, &decoded_len) ||</span><br><span style="color: hsl(0, 100%, 40%);">-          *consumed + decoded_len > max_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-        return VPD_FAIL;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-      *consumed += decoded_len;</span><br><span style="color: hsl(0, 100%, 40%);">-      value = &input_buf[*consumed];</span><br><span style="color: hsl(0, 100%, 40%);">-      *consumed += value_len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (type == VPD_TYPE_STRING)</span><br><span style="color: hsl(0, 100%, 40%);">-        return callback(key, key_len, value, value_len, callback_arg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return VPD_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    default:</span><br><span style="color: hsl(0, 100%, 40%);">-      return VPD_FAIL;</span><br><span style="color: hsl(0, 100%, 40%);">-      break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-  return VPD_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/vendorcode/google/chromeos/vpd_mac.c b/src/vendorcode/google/chromeos/vpd_mac.c</span><br><span>index 0619974..e3ef04b 100644</span><br><span>--- a/src/vendorcode/google/chromeos/vpd_mac.c</span><br><span>+++ b/src/vendorcode/google/chromeos/vpd_mac.c</span><br><span>@@ -17,7 +17,7 @@</span><br><span> #include <console/console.h></span><br><span> #include <string.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <vendorcode/google/chromeos/cros_vpd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <drivers/vpd/vpd.h></span><br><span> </span><br><span> /*</span><br><span>  * Decode string representation of the MAC address (a string of 12 hex</span><br><span>@@ -84,8 +84,8 @@</span><br><span>                   * If there are no more MAC addresses of this template</span><br><span>                        * in the VPD - move on.</span><br><span>                      */</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (!cros_vpd_gets(mac_addr_key, mac_addr_str,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     sizeof(mac_addr_str)))</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!vpd_gets(mac_addr_key, mac_addr_str,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        sizeof(mac_addr_str), VPD_ANY))</span><br><span>                           break;</span><br><span> </span><br><span>                   if (!macs) {</span><br><span>diff --git a/src/vendorcode/google/chromeos/vpd_serialno.c b/src/vendorcode/google/chromeos/vpd_serialno.c</span><br><span>index e9a771e..8cae5d6 100644</span><br><span>--- a/src/vendorcode/google/chromeos/vpd_serialno.c</span><br><span>+++ b/src/vendorcode/google/chromeos/vpd_serialno.c</span><br><span>@@ -18,7 +18,7 @@</span><br><span> #include <assert.h></span><br><span> #include <string.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <vendorcode/google/chromeos/cros_vpd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <drivers/vpd/vpd.h></span><br><span> </span><br><span> void lb_table_add_serialno_from_vpd(struct lb_header *header)</span><br><span> {</span><br><span>@@ -27,8 +27,8 @@</span><br><span>      char serialno[32];</span><br><span>   size_t len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!cros_vpd_gets(serialno_key, serialno,</span><br><span style="color: hsl(0, 100%, 40%);">-                              sizeof(serialno))) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!vpd_gets(serialno_key, serialno,</span><br><span style="color: hsl(120, 100%, 40%);">+                         sizeof(serialno), VPD_ANY)) {</span><br><span>                printk(BIOS_ERR, "no serial number in vpd\n");</span><br><span>             return;</span><br><span>      }</span><br><span>diff --git a/src/vendorcode/google/chromeos/wrdd.c b/src/vendorcode/google/chromeos/wrdd.c</span><br><span>index ad80992..093e6cd 100644</span><br><span>--- a/src/vendorcode/google/chromeos/wrdd.c</span><br><span>+++ b/src/vendorcode/google/chromeos/wrdd.c</span><br><span>@@ -18,7 +18,9 @@</span><br><span> #include <types.h></span><br><span> #include <string.h></span><br><span> #include <wrdd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include "cros_vpd.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <drivers/vpd/vpd.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define CROS_VPD_REGION_NAME   "region"</span><br><span> </span><br><span> /*</span><br><span>  * wrdd_domain_value is ISO 3166-2</span><br><span>@@ -59,8 +61,8 @@</span><br><span>       char *separator;</span><br><span> </span><br><span>         /* If not found for any reason fall backto the default value */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!cros_vpd_gets(wrdd_domain_key, wrdd_domain_code,</span><br><span style="color: hsl(0, 100%, 40%);">-           ARRAY_SIZE(wrdd_domain_code))) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!vpd_gets(wrdd_domain_key, wrdd_domain_code,</span><br><span style="color: hsl(120, 100%, 40%);">+              ARRAY_SIZE(wrdd_domain_code), VPD_ANY)) {</span><br><span>            printk(BIOS_DEBUG,</span><br><span>           "Error: Could not locate '%s' in VPD\n", wrdd_domain_key);</span><br><span>                 return WRDD_DEFAULT_REGULATORY_DOMAIN;</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/25046">change 25046</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/25046"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: Id9263bd39bf25d024e93daa57053fefcb1adc53a </div>
<div style="display:none"> Gerrit-Change-Number: 25046 </div>
<div style="display:none"> Gerrit-PatchSet: 15 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>
<div style="display:none"> Gerrit-Reviewer: David Hendricks <david.hendricks@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Marcello Sylvester Bauer <info@marcellobauer.com> </div>
<div style="display:none"> Gerrit-Reviewer: Patrick Georgi <pgeorgi@google.com> </div>
<div style="display:none"> Gerrit-Reviewer: Paul Menzel <paulepanter@users.sourceforge.net> </div>
<div style="display:none"> Gerrit-Reviewer: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org> </div>
<div style="display:none"> Gerrit-CC: Stefan Tauner <stefan.tauner@gmx.at> </div>