<p>Richard Spiegel has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/c/coreboot/+/30109">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Work in progress: Early eMMC phase 1<br><br>Global objective: Early ready of eMMC by sending CMD0 and CMD1.<br><br>This phase objective: Create bh720 driver to be used by phase 2.<br><br>BUG=b:118680303<br>TEST=<br><br>Change-Id: Ifd2a307ead37c62abca811654873c43c02ac2a4a<br>Signed-off-by: Richard Spiegel <richard.spiegel@silverbackltd.com><br>---<br>A src/drivers/emmc/README<br>A src/drivers/emmc/bh7720/Kconfig<br>A src/drivers/emmc/bh7720/Makefile.inc<br>A src/drivers/emmc/bh7720/bh720.c<br>A src/include/device/emmc/bh720.h<br>A src/include/device/emmc/emmc.h<br>6 files changed, 281 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/09/30109/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/emmc/README b/src/drivers/emmc/README</span><br><span>new file mode 100644</span><br><span>index 0000000..b95b477</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/emmc/README</span><br><span>@@ -0,0 +1,51 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Documentation for eMMC host drivers</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 Silverback Ltd.</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%);">+This folder has drivers for several eMMC hosts. There's a minimum set of</span><br><span style="color: hsl(120, 100%, 40%);">+commands these drivers must implement, though it can implement more:</span><br><span style="color: hsl(120, 100%, 40%);">+emmc_driver_init -> initializes all required registers of a particular host,</span><br><span style="color: hsl(120, 100%, 40%);">+                 so that commands can be send.</span><br><span style="color: hsl(120, 100%, 40%);">+emmc_send_command -> the host sends a command to the eMMC card, status is</span><br><span style="color: hsl(120, 100%, 40%);">+                    returned.</span><br><span style="color: hsl(120, 100%, 40%);">+emmc_get_ocr -> The OCR value is read.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Commands description:</span><br><span style="color: hsl(120, 100%, 40%);">+int emmc_driver_init(void *params);</span><br><span style="color: hsl(120, 100%, 40%);">+Some parameters are always the same, so they don't need to be send for code</span><br><span style="color: hsl(120, 100%, 40%);">+execution. Only parameters that are board dependent plus the base address</span><br><span style="color: hsl(120, 100%, 40%);">+should be send.</span><br><span style="color: hsl(120, 100%, 40%);">+The input is a void pointer to parameters, which is internally converted to</span><br><span style="color: hsl(120, 100%, 40%);">+a pointer to structure, defined in the chip specific header file. Inside</span><br><span style="color: hsl(120, 100%, 40%);">+this structure, the first 2 elements are common: (uint8_t) total and</span><br><span style="color: hsl(120, 100%, 40%);">+(uint16_t/uint32_t) base_address. The remaining are chip specific,.</span><br><span style="color: hsl(120, 100%, 40%);">+The return can be 0 if success, or a negative number if there's a problem.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t emmc_send_command(uint8_t command, uint32_t argument);</span><br><span style="color: hsl(120, 100%, 40%);">+Using the base address from emmc_driver_init, it sends commands to the eMMC</span><br><span style="color: hsl(120, 100%, 40%);">+and return the host status at the moment the command was issued. This is only</span><br><span style="color: hsl(120, 100%, 40%);">+for 48-bits commands (start, stop, direction,CRC77, command and argument).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t emmc_get_ocr(uint32_t base_address);</span><br><span style="color: hsl(120, 100%, 40%);">+This function can be called before or after PCI enumeration, as it receives</span><br><span style="color: hsl(120, 100%, 40%);">+the base address to use. If the base address is IO, the upper word should</span><br><span style="color: hsl(120, 100%, 40%);">+be 0. It assumes that CMD1 was already issued, and returns the OCR received</span><br><span style="color: hsl(120, 100%, 40%);">+from the eMMC.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Generally speaking, emmc_driver_init must be used at romstage, while the</span><br><span style="color: hsl(120, 100%, 40%);">+other 2 can be romstage or ramstage, though if PCI access is needed by the</span><br><span style="color: hsl(120, 100%, 40%);">+particular chip to execute them, then they must be either romstage or have</span><br><span style="color: hsl(120, 100%, 40%);">+a device declared to be used in ramstage.</span><br><span>diff --git a/src/drivers/emmc/bh7720/Kconfig b/src/drivers/emmc/bh7720/Kconfig</span><br><span>new file mode 100644</span><br><span>index 0000000..27b5c80</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/emmc/bh7720/Kconfig</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+config DRIVERS_EMMC_BH720</span><br><span style="color: hsl(120, 100%, 40%);">+  bool</span><br><span>diff --git a/src/drivers/emmc/bh7720/Makefile.inc b/src/drivers/emmc/bh7720/Makefile.inc</span><br><span>new file mode 100644</span><br><span>index 0000000..e282a67</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/emmc/bh7720/Makefile.inc</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-$(CONFIG_DRIVERS_EMMC_BH720) += bh720.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_DRIVERS_EMMC_BH720) += bh720.c</span><br><span>diff --git a/src/drivers/emmc/bh7720/bh720.c b/src/drivers/emmc/bh7720/bh720.c</span><br><span>new file mode 100644</span><br><span>index 0000000..ebd48d8</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/emmc/bh7720/bh720.c</span><br><span>@@ -0,0 +1,132 @@</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 Silverback Ltd.</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 <rules.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/pci_def.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/emmc/emmc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/emmc/bh720.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t *base_ptr;</span><br><span style="color: hsl(120, 100%, 40%);">+static boolean flag = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void pci_set8(uint32_t dev, uint8_t reg, uint8_t bits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t value;</span><br><span style="color: hsl(120, 100%, 40%);">+        value = pci_read_config8(dev, reg);</span><br><span style="color: hsl(120, 100%, 40%);">+   value |= bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pci_write_config8(dev, reg, value);</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%);">+static void pci_clear8(uint32_t dev, uint8_t reg, uint8_t bits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t value, mask;</span><br><span style="color: hsl(120, 100%, 40%);">+  mask = ~bits;</span><br><span style="color: hsl(120, 100%, 40%);">+ value = pci_read_config8(dev, reg);</span><br><span style="color: hsl(120, 100%, 40%);">+   value &= mask;</span><br><span style="color: hsl(120, 100%, 40%);">+    pci_write_config8(dev, reg, value);</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%);">+static void pci_set32(uint32_t dev, uint8_t reg, uint32_t bits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t value;</span><br><span style="color: hsl(120, 100%, 40%);">+       value = pci_read_config32(dev, reg);</span><br><span style="color: hsl(120, 100%, 40%);">+  value |= bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pci_write_config32(dev, reg, value);</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%);">+static void pci_clear32(uint32_t dev, uint8_t reg, uint32_t bits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t value, mask;</span><br><span style="color: hsl(120, 100%, 40%);">+ mask = ~bits;</span><br><span style="color: hsl(120, 100%, 40%);">+ value = pci_read_config32(dev, reg);</span><br><span style="color: hsl(120, 100%, 40%);">+  value &= mask;</span><br><span style="color: hsl(120, 100%, 40%);">+    pci_write_config32(dev, reg, value);</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%);">+static void program_base(uint32_t dev, uint32_t base)</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%);">+static void program_id(uint32_t dev, uint32_t id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static uint32_t read_base(uint32_t dev, uint32_t id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t bridge_dev;</span><br><span style="color: hsl(120, 100%, 40%);">+  /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Read bridge, check if programmed. If programmed, generate</span><br><span style="color: hsl(120, 100%, 40%);">+   * bridge_dev and read/return base address.</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Program bridge and base address. If (id) program_id.</span><br><span style="color: hsl(120, 100%, 40%);">+        * Set flag to indicate need of desprogramming bridge and BAR0.</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%);">+int emmc_driver_init(void *params)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      bh720_params *param = (bh720_params *)params;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t temp;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t device = param->pci_dev;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t subsys_id = param->subsys_vend_dev_id;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t total = param->total</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t mode = DEFAUT_MODE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ base_ptr = (uint8_t *)param->base_address;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (total > 4)</span><br><span style="color: hsl(120, 100%, 40%);">+             mode = param->mode;</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((total == 0) || (total == 2))</span><br><span style="color: hsl(120, 100%, 40%);">+             return EMMC_STATUS_INVALID_PARAM;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (total == 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             temp = read_base(device, subsys_id);</span><br><span style="color: hsl(120, 100%, 40%);">+          param = (bh720_params *)temp;</span><br><span style="color: hsl(120, 100%, 40%);">+         if(flag) {</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             return EMMC_STATUS_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if ((total > 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (subsys_id && (mode & MODE_VEND_DEV))</span><br><span style="color: hsl(120, 100%, 40%);">+                  program_id(device, subsys_id);</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(__SIMPLE_DEVICE__)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (mode > MODE_VEND_DEV)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return EMMC_STATUS_INVALID_STAGE;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mode & MODE_DIS_SD) {</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mode & MODE_VCCQ_18) {</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mode & MODE_POWER_SAVE) {</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mode & MODE_L1_TIMER) {</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mode & MODE_IDDQ) {</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mode & MODE_TUNNING) {</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mode & MODE_DLL_CLK_PHASE) {</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     return EMMC_STATUS_SUCCESS;</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%);">+uint32_t emmc_send_command(uint8_t command, uint32_t argument)</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%);">+uint32_t emmc_get_ocr(uint32_t base_address)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/src/include/device/emmc/bh720.h b/src/include/device/emmc/bh720.h</span><br><span>new file mode 100644</span><br><span>index 0000000..ca8faf5</span><br><span>--- /dev/null</span><br><span>+++ b/src/include/device/emmc/bh720.h</span><br><span>@@ -0,0 +1,54 @@</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 Silverback Ltd.</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%);">+#ifndef __BH720_H__</span><br><span style="color: hsl(120, 100%, 40%);">+#define __BH720_H__</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%);">+struct bh720_params {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t total;                  /* Note 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+  uintptr_t base_address;         /* memory address */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t pci_dev;               /* PCI_DEV(bus, slot, func) */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t subsys_vend_dev_id;    /* if 0 or total = 3, do not set */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t mode;                   /* optional, note 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+};      /* total 5 parameters, so if all parameters, total = 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_VEND_DEV              BIT(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_DIS_SD             BIT(1)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_VCCQ_18            BIT(2)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_POWER_SAVE         BIT(3)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_L1_TIMER           BIT(4)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_IDDQ               BIT(5)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_TUNNING            BIT(6)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MODE_DLL_CLK_PHASE      BIT(7)</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%);">+ * Note 1: The value of total shold be between 3 and 5, so value of 1 meaning</span><br><span style="color: hsl(120, 100%, 40%);">+ * is:</span><br><span style="color: hsl(120, 100%, 40%);">+ *   A) pci_dev is relative to the bridge the host resides.</span><br><span style="color: hsl(120, 100%, 40%);">+ *   B) If the bridge has not been programmed, then program the BAR with base</span><br><span style="color: hsl(120, 100%, 40%);">+ *      adress.</span><br><span style="color: hsl(120, 100%, 40%);">+ *   C) If bridge is programmed, then read BAR0 into base_address.</span><br><span style="color: hsl(120, 100%, 40%);">+ *   D) If subsys_vend_dev_id is provided and (B) than program subsystem vendor</span><br><span style="color: hsl(120, 100%, 40%);">+ *      and device IDs.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Note 2: MODE_DIS_SD, MODE_VCCQ_18, MODE_POWER_SAVE, MODE_IDDQ, MODE_TUNNING,</span><br><span style="color: hsl(120, 100%, 40%);">+ * MODE_DLL_CLK_PHASE can only be set in ramstage, with a BH720 device defined,</span><br><span style="color: hsl(120, 100%, 40%);">+ * because they access PCI config space above 0xff.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAUT_MODE             MODE_VEND_DEV</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/include/device/emmc/emmc.h b/src/include/device/emmc/emmc.h</span><br><span>new file mode 100644</span><br><span>index 0000000..a2305f6</span><br><span>--- /dev/null</span><br><span>+++ b/src/include/device/emmc/emmc.h</span><br><span>@@ -0,0 +1,40 @@</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 Silverback Ltd.</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%);">+#ifndef __EMMC_H__</span><br><span style="color: hsl(120, 100%, 40%);">+#define __EMMC_H__</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_PARAM_BYTE                     1</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_PARAM_WORD                      2</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_PARAM_DWORD             3</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_PARAM_QWORD             4</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_PARAM_PCI_DEV           5</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_STATUS_SUCCESS                0</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_STATUS_INVALID_PARAM   -1</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_STATUS_NO_BASE_ADDRESS -2 /* drive not initialized */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_STATUS_INVALID_BASE_ADDR   -3 /* invalid base size */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_STATUS_HOST_BUSY               -4 /* bit 31 of OCR 0b */</span><br><span style="color: hsl(120, 100%, 40%);">+#define EMMC_STATUS_INVALID_STAGE    -5 /* PCI reg > 0xff in romstage */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int emmc_driver_init(void *params);</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t emmc_send_command(uint8_t command, uint32_t argument);</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t emmc_get_ocr(uint32_t base_address);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int emmc_go_idle(void);</span><br><span style="color: hsl(120, 100%, 40%);">+int emmc_go_ready(uint32_t argument); /* CMD1 argument depends on board/host */</span><br><span style="color: hsl(120, 100%, 40%);">+int emmc_check_ready{uint32_t *ocr, uint32_t base_address);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/c/coreboot/+/30109">change 30109</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/+/30109"/><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: Ifd2a307ead37c62abca811654873c43c02ac2a4a </div>
<div style="display:none"> Gerrit-Change-Number: 30109 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Richard Spiegel <richard.spiegel@silverbackltd.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>