<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/c/coreboot/+/29946">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[WIP]opencelluar: Add EC interface<br><br>Add the EC driver that uses the OpenCellular Management Protocol.<br>Implement the board_reset() method using introduced methods.<br><br>Change-Id: I67eb4ee8e0ad297a8d1984d55102146688c291fc<br>Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com><br>---<br>A src/ec/opencellular/tiva/Kconfig<br>A src/ec/opencellular/tiva/Makefile.inc<br>A src/ec/opencellular/tiva/ec.c<br>A src/ec/opencellular/tiva/ec.h<br>M src/mainboard/opencellular/elgon/Kconfig<br>M src/mainboard/opencellular/elgon/Makefile.inc<br>A src/mainboard/opencellular/elgon/reset.c<br>7 files changed, 327 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/46/29946/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/ec/opencellular/tiva/Kconfig b/src/ec/opencellular/tiva/Kconfig</span><br><span>new file mode 100644</span><br><span>index 0000000..a56b06a</span><br><span>--- /dev/null</span><br><span>+++ b/src/ec/opencellular/tiva/Kconfig</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+config EC_OPENCELLULAR_TIVA</span><br><span style="color: hsl(120, 100%, 40%);">+   bool</span><br><span style="color: hsl(120, 100%, 40%);">+  depends on CONSOLE_SERIAL</span><br><span style="color: hsl(120, 100%, 40%);">+     help</span><br><span style="color: hsl(120, 100%, 40%);">+    OpenCellular Tiva EC protocol driver over serial.</span><br><span>diff --git a/src/ec/opencellular/tiva/Makefile.inc b/src/ec/opencellular/tiva/Makefile.inc</span><br><span>new file mode 100644</span><br><span>index 0000000..fadaf44</span><br><span>--- /dev/null</span><br><span>+++ b/src/ec/opencellular/tiva/Makefile.inc</span><br><span>@@ -0,0 +1,9 @@</span><br><span style="color: hsl(120, 100%, 40%);">+ifeq ($(CONFIG_EC_OPENCELLULAR_TIVA),y)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bootblock-y += ec.c</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-y += ec.c</span><br><span style="color: hsl(120, 100%, 40%);">+verstage-y += ec.c</span><br><span style="color: hsl(120, 100%, 40%);">+postcar-y += ec.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-y += ec.c</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/ec/opencellular/tiva/ec.c b/src/ec/opencellular/tiva/ec.c</span><br><span>new file mode 100644</span><br><span>index 0000000..d46f284</span><br><span>--- /dev/null</span><br><span>+++ b/src/ec/opencellular/tiva/ec.c</span><br><span>@@ -0,0 +1,203 @@</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 2018 Facebook, Inc.</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%);">+#include <console/console.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <console/uart.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "ec.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Packet definition as per OpenCellular Management Protocol */</span><br><span style="color: hsl(120, 100%, 40%);">+enum ec_iface {</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_UART = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_ETHERNET = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      EC_SBD = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_USB = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ec_header {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t sof;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t iface;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t seq;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t ts;</span><br><span style="color: hsl(120, 100%, 40%);">+} __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ec_payload {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t subsystem;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t component_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t message_type;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t action_type;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t parameter_info;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t message[48];</span><br><span style="color: hsl(120, 100%, 40%);">+} __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ec_packet {</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ec_header hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ec_payload pld;</span><br><span style="color: hsl(120, 100%, 40%);">+} __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ec_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+        union {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct ec_packet p;</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t raw[sizeof(struct ec_packet)];</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%);">+/* Create a packet to BMS:TIVA from given arguments */</span><br><span style="color: hsl(120, 100%, 40%);">+static size_t ec_create_tx_msg(struct ec_packet *p,</span><br><span style="color: hsl(120, 100%, 40%);">+                        const enum ec_message_type mt,</span><br><span style="color: hsl(120, 100%, 40%);">+                        const enum ec_action_type at,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint8_t parameter_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const enum ec_iface iface,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const uint8_t *data_in,</span><br><span style="color: hsl(120, 100%, 40%);">+                               const uint8_t data_in_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t len = sizeof(*p) - sizeof(p->pld.message) + data_in_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  p->pld.subsystem = EC_BMS;</span><br><span style="color: hsl(120, 100%, 40%);">+ p->pld.component_id = EC_TIVA;</span><br><span style="color: hsl(120, 100%, 40%);">+     p->pld.message_type = mt;</span><br><span style="color: hsl(120, 100%, 40%);">+  p->pld.action_type = at;</span><br><span style="color: hsl(120, 100%, 40%);">+   p->pld.parameter_info = parameter_info;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (data_in)</span><br><span style="color: hsl(120, 100%, 40%);">+          memcpy(&p->pld.message, data_in, data_in_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       p->hdr.iface = iface;</span><br><span style="color: hsl(120, 100%, 40%);">+      p->hdr.len = data_in_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  p->hdr.sof = 0x55;</span><br><span style="color: hsl(120, 100%, 40%);">+ p->hdr.ts = 0; /* Reserved for future use */</span><br><span style="color: hsl(120, 100%, 40%);">+       p->hdr.seq = 0; /* Reserved for future use */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return len;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Returns true on valid header */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool ec_verify_rx_hdr(struct ec_packet *p, const enum ec_iface iface)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (p->hdr.sof != 0x55)</span><br><span style="color: hsl(120, 100%, 40%);">+            return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (p->hdr.len > 48)</span><br><span style="color: hsl(120, 100%, 40%);">+            return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (p->hdr.iface != iface)</span><br><span style="color: hsl(120, 100%, 40%);">+         return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</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%);">+/* Returns true on valid packet */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool ec_verify_rx_msg(struct ec_packet *p, const enum ec_iface iface)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!ec_verify_rx_hdr(p, iface))</span><br><span style="color: hsl(120, 100%, 40%);">+              return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (p->pld.subsystem != EC_BMS)</span><br><span style="color: hsl(120, 100%, 40%);">+            return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (p->pld.component_id != EC_TIVA)</span><br><span style="color: hsl(120, 100%, 40%);">+                return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return true;</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%);">+ * Transmits a packet to EC using one of the UARTs.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The function is blocking until a data has been transmitted.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All pointers can be NULL if not required.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param uart_idx   The UART connected to EC</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param mt        Message type to transmit</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param at          Action type to transmit</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param parameter_info  Parameter info to transmit</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param data_in   Buffer to data to transmit</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param data_in_len     Length of data to transmit</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @return Zero on success, negative on failure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ec_transmit_msg_uart(const uint8_t uart_idx,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const enum ec_message_type mt,</span><br><span style="color: hsl(120, 100%, 40%);">+                        const enum ec_action_type at,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint8_t parameter_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint8_t *data_in,</span><br><span style="color: hsl(120, 100%, 40%);">+                       const uint8_t data_in_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ec_msg msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t len = ec_create_tx_msg(&msg.p, mt, at, parameter_info, EC_UART,</span><br><span style="color: hsl(120, 100%, 40%);">+                    data_in, data_in_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (size_t i = 0; i < len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+           uart_tx_byte(uart_idx, msg.raw[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * Receives a packet from EC using one of the UARTs.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The function is blocking and waits for a SOF byte.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The caller must provide a data buffer of size 48.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If no data buffer is provided the received data (if any) is dropped.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All pointers can be NULL if not required.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param uart_idx   The UART connected to EC</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param mt        Receveived message type</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param at           Receveived action type</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param parameter_info  Receveived parameter info</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param data_out   Buffer to place receveived data</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param data_out_len    Length of received data</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @return Zero on success, negative on failure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ec_receive_msg_uart(const uint8_t uart_idx,</span><br><span style="color: hsl(120, 100%, 40%);">+                 enum ec_message_type *mt,</span><br><span style="color: hsl(120, 100%, 40%);">+                     enum ec_action_type *at,</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t *parameter_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t *data_out,</span><br><span style="color: hsl(120, 100%, 40%);">+                    uint8_t *data_out_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ec_msg msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  do {</span><br><span style="color: hsl(120, 100%, 40%);">+          msg.raw[0] = uart_rx_byte(uart_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+  } while (msg.raw[0] != 0x55);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (size_t i = 0; i < sizeof(struct ec_header); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+              msg.raw[i] = uart_rx_byte(uart_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!ec_verify_rx_hdr(&msg.p, EC_UART))</span><br><span style="color: hsl(120, 100%, 40%);">+           return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  const size_t len = sizeof(msg.p.pld) - sizeof(msg.p.pld.message) +</span><br><span style="color: hsl(120, 100%, 40%);">+                       msg.p.hdr.len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (size_t i = 0; i < len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+           msg.raw[sizeof(struct ec_header) + i] = uart_rx_byte(uart_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!ec_verify_rx_msg(&msg.p, EC_UART))</span><br><span style="color: hsl(120, 100%, 40%);">+           return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (mt)</span><br><span style="color: hsl(120, 100%, 40%);">+               *mt = msg.p.pld.message_type;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (at)</span><br><span style="color: hsl(120, 100%, 40%);">+               *at = msg.p.pld.action_type;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (parameter_info)</span><br><span style="color: hsl(120, 100%, 40%);">+           *parameter_info = msg.p.pld.parameter_info;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (data_out)</span><br><span style="color: hsl(120, 100%, 40%);">+         memcpy(data_out, msg.p.pld.message, msg.p.hdr.len);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (*data_out_len)</span><br><span style="color: hsl(120, 100%, 40%);">+            *data_out_len = msg.p.hdr.len;</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>diff --git a/src/ec/opencellular/tiva/ec.h b/src/ec/opencellular/tiva/ec.h</span><br><span>new file mode 100644</span><br><span>index 0000000..7728f7e</span><br><span>--- /dev/null</span><br><span>+++ b/src/ec/opencellular/tiva/ec.h</span><br><span>@@ -0,0 +1,77 @@</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 2018 Facebook, Inc.</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%);">+#include <types.h></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%);">+ * Command interface as per OpenCellular Management Protocol:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This protocol allows to handle all the configuration,  status and alert</span><br><span style="color: hsl(120, 100%, 40%);">+ * processing through a ‘Request-Response’ mechanism between host and MCU.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ec_subsystem {</span><br><span style="color: hsl(120, 100%, 40%);">+      EC_SYSTEM = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_POWER = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ EC_BMS = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_HCI = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_ETHERNET_SWITCH = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+       EC_OBC = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_GPP = 6,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_SDR = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_RF = 8,</span><br><span style="color: hsl(120, 100%, 40%);">+    EC_SYNC = 9,</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_TEST_MODULE = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_WATCHDOG = 11,</span><br><span style="color: hsl(120, 100%, 40%);">+     EC_ALERT_MANAGER = 12</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%);">+/* We only support subsystem BMS here */</span><br><span style="color: hsl(120, 100%, 40%);">+enum ec_subsystem_bms {</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_ALL = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_TIVA = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ec_message_type {</span><br><span style="color: hsl(120, 100%, 40%);">+    EC_CONFIG = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_STATUS = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_ALERT = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+ EC_COMMAND = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ec_action_type {</span><br><span style="color: hsl(120, 100%, 40%);">+  EC_GET = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_SET = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+   EC_REPLY = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+ EC_ACTIVE = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_CLEAR = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+ EC_RESET = 6,</span><br><span style="color: hsl(120, 100%, 40%);">+ EC_ENABLE = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+        EC_DISABLE = 8,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ec_transmit_msg_uart(const uint8_t uart_idx,</span><br><span style="color: hsl(120, 100%, 40%);">+                        const enum ec_message_type mt,</span><br><span style="color: hsl(120, 100%, 40%);">+                        const enum ec_action_type at,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint8_t parameter_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint8_t *data_in,</span><br><span style="color: hsl(120, 100%, 40%);">+                       const uint8_t data_in_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ec_receive_msg_uart(const uint8_t uart_idx,</span><br><span style="color: hsl(120, 100%, 40%);">+                       enum ec_message_type *mt,</span><br><span style="color: hsl(120, 100%, 40%);">+                     enum ec_action_type *at,</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t *parameter_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t *data_out,</span><br><span style="color: hsl(120, 100%, 40%);">+                    uint8_t *data_out_len);</span><br><span>diff --git a/src/mainboard/opencellular/elgon/Kconfig b/src/mainboard/opencellular/elgon/Kconfig</span><br><span>index 3ba2a60..b9f93ab 100644</span><br><span>--- a/src/mainboard/opencellular/elgon/Kconfig</span><br><span>+++ b/src/mainboard/opencellular/elgon/Kconfig</span><br><span>@@ -25,7 +25,7 @@</span><br><span>     select SPI_FLASH_WINBOND</span><br><span>     select MAINBOARD_HAS_I2C_TPM_GENERIC</span><br><span>         select MAINBOARD_HAS_TPM1</span><br><span style="color: hsl(0, 100%, 40%);">-       select MISSING_BOARD_RESET</span><br><span style="color: hsl(120, 100%, 40%);">+    select EC_OPENCELLULAR_TIVA</span><br><span> </span><br><span> config VBOOT</span><br><span>      select VBOOT_NO_BOARD_SUPPORT</span><br><span>diff --git a/src/mainboard/opencellular/elgon/Makefile.inc b/src/mainboard/opencellular/elgon/Makefile.inc</span><br><span>index 343a52e..3440833 100644</span><br><span>--- a/src/mainboard/opencellular/elgon/Makefile.inc</span><br><span>+++ b/src/mainboard/opencellular/elgon/Makefile.inc</span><br><span>@@ -16,16 +16,20 @@</span><br><span> bootblock-y += bootblock.c</span><br><span> bootblock-y += memlayout.ld</span><br><span> bootblock-y += death.c</span><br><span style="color: hsl(120, 100%, 40%);">+bootblock-y += reset.c</span><br><span> </span><br><span> romstage-y += memlayout.ld</span><br><span> romstage-y += romstage.c</span><br><span> romstage-y += bdk_devicetree.c</span><br><span> romstage-y += death.c</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-y += reset.c</span><br><span> </span><br><span> ramstage-y += mainboard.c</span><br><span> ramstage-y += memlayout.ld</span><br><span> ramstage-y += bdk_devicetree.c</span><br><span> ramstage-y += death.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-y += reset.c</span><br><span> </span><br><span> verstage-y += memlayout.ld</span><br><span> verstage-y += death.c</span><br><span style="color: hsl(120, 100%, 40%);">+verstage-y += reset.c</span><br><span>diff --git a/src/mainboard/opencellular/elgon/reset.c b/src/mainboard/opencellular/elgon/reset.c</span><br><span>new file mode 100644</span><br><span>index 0000000..d73d9af</span><br><span>--- /dev/null</span><br><span>+++ b/src/mainboard/opencellular/elgon/reset.c</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 2018 Facebook, Inc.</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%);">+#include <ec/opencellular/tiva/ec.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <reset.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <soc/gpio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "mainboard.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void do_board_reset(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Route UART0 to EC */</span><br><span style="color: hsl(120, 100%, 40%);">+       gpio_output(ELGON_GPIO_UART_SEL, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ec_transmit_msg_uart(0, EC_COMMAND, EC_RESET, 0, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: Is there a response ? */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/c/coreboot/+/29946">change 29946</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/c/coreboot/+/29946"/><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-Change-Id: I67eb4ee8e0ad297a8d1984d55102146688c291fc </div>
<div style="display:none"> Gerrit-Change-Number: 29946 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>