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