<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/25106">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[WIP]drivers/spi: Add status register lockdown<br><br>Implement status register lockdown for Winbond devices.<br><br>Change-Id: If99fc7d61692e3926cd1a92e40c9d64f8fa5463d<br>Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com><br>---<br>M src/drivers/spi/spi_flash.c<br>M src/drivers/spi/winbond.c<br>M src/include/spi_flash.h<br>3 files changed, 39 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/06/25106/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/spi/spi_flash.c b/src/drivers/spi/spi_flash.c</span><br><span>index 769ef48..86a3a9f 100644</span><br><span>--- a/src/drivers/spi/spi_flash.c</span><br><span>+++ b/src/drivers/spi/spi_flash.c</span><br><span>@@ -474,6 +474,21 @@</span><br><span>       return flash->ops->set_write_protection(flash, region);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int spi_flash_lock(const struct spi_flash *flash)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!flash)</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 (flash->ops->lock_status_register) {</span><br><span style="color: hsl(120, 100%, 40%);">+         printk(BIOS_WARNING, "SPI: Locking status register is not "</span><br><span style="color: hsl(120, 100%, 40%);">+                "implemented for this vendor.\n");</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%);">+   return flash->ops->lock_status_register(flash);</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> static uint32_t volatile_group_count CAR_GLOBAL;</span><br><span> </span><br><span> int spi_flash_volatile_group_begin(const struct spi_flash *flash)</span><br><span>diff --git a/src/drivers/spi/winbond.c b/src/drivers/spi/winbond.c</span><br><span>index 2992dc3..bea0c05 100644</span><br><span>--- a/src/drivers/spi/winbond.c</span><br><span>+++ b/src/drivers/spi/winbond.c</span><br><span>@@ -18,6 +18,7 @@</span><br><span> #define CMD_W25_RDSR          0x05    /* Read Status Register */</span><br><span> #define CMD_W25_WRSR              0x01    /* Write Status Register */</span><br><span> #define CMD_W25_RDSR2            0x35    /* Read Status2 Register */</span><br><span style="color: hsl(120, 100%, 40%);">+#define  STS_W25_SRL               0x01    /* Status Register Lock */</span><br><span> #define CMD_W25_WRSR2             0x31    /* Write Status2 Register */</span><br><span> #define CMD_W25_RDSR3           0x15    /* Read Status3 Register */</span><br><span> #define CMD_W25_WRSR3            0x11    /* Write Status3 Register */</span><br><span>@@ -474,6 +475,14 @@</span><br><span>  return winbond_set_b_protect_protection(flash, region);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int winbond_lock_status_register(const struct spi_flash *flash)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   u8 reg = STS_W25_SRL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return spi_flash_cmd(&flash->spi, CMD_W25_WRSR2, &reg,</span><br><span style="color: hsl(120, 100%, 40%);">+                             sizeof(reg));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static const struct spi_flash_ops spi_flash_ops = {</span><br><span>    .write = winbond_write,</span><br><span>      .erase = spi_flash_cmd_erase,</span><br><span>@@ -485,6 +494,7 @@</span><br><span> #endif</span><br><span>        .get_write_protection = winbond_get_write_protection,</span><br><span>        .set_write_protection = winbond_set_write_protection,</span><br><span style="color: hsl(120, 100%, 40%);">+ .lock_status_register = winbond_lock_status_register,</span><br><span> };</span><br><span> </span><br><span> int spi_flash_probe_winbond(const struct spi_slave *spi, u8 *idcode,</span><br><span>diff --git a/src/include/spi_flash.h b/src/include/spi_flash.h</span><br><span>index d1dfa92..ae86c42 100644</span><br><span>--- a/src/include/spi_flash.h</span><br><span>+++ b/src/include/spi_flash.h</span><br><span>@@ -44,6 +44,7 @@</span><br><span>                                     const struct region *region);</span><br><span>    int (*set_write_protection)(const struct spi_flash *flash,</span><br><span>                               const struct region *region);</span><br><span style="color: hsl(120, 100%, 40%);">+     int (*lock_status_register)(const struct spi_flash *flash);</span><br><span> };</span><br><span> </span><br><span> struct spi_flash {</span><br><span>@@ -133,6 +134,19 @@</span><br><span>                             const struct region *region);</span><br><span> </span><br><span> /*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Active software status register lockdown.</span><br><span style="color: hsl(120, 100%, 40%);">+ * After the execution of this command, the flash regions marked as read-only,</span><br><span style="color: hsl(120, 100%, 40%);">+ * can't be written to, until the next power cycle.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param flash : A SPI flash device</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Returns:</span><br><span style="color: hsl(120, 100%, 40%);">+ *  -1   on error</span><br><span style="color: hsl(120, 100%, 40%);">+ *   0   on success</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int spi_flash_lock(const struct spi_flash *flash);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span>  * Some SPI controllers require exclusive access to SPI flash when volatile</span><br><span>  * operations like erase or write are being performed. In such cases,</span><br><span>  * volatile_group_begin will gain exclusive access to SPI flash if not already</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/25106">change 25106</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/25106"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: If99fc7d61692e3926cd1a92e40c9d64f8fa5463d </div>
<div style="display:none"> Gerrit-Change-Number: 25106 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>