Daniel Gröber (dxld) would like Daniel Gröber to review this change.

View Change

spi/winbond: Use spi_flash_bpbits in winbond_bpbits_to_region

Change-Id: I2a1a77fb73047df733498c0fa8b8de1153c3b09e
Signed-off-by: Daniel Gröber <dxld@darkboxed.org>
---
M src/drivers/spi/winbond.c
1 file changed, 30 insertions(+), 17 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/13/42113/1
diff --git a/src/drivers/spi/winbond.c b/src/drivers/spi/winbond.c
index e4151de..ccc7ae9 100644
--- a/src/drivers/spi/winbond.c
+++ b/src/drivers/spi/winbond.c
@@ -213,16 +213,15 @@
* SEC (if available) must be zero.
*/
static void winbond_bpbits_to_region(const size_t granularity,
- const u8 bp,
- bool tb,
- const bool cmp,
+ const struct spi_flash_bpbits *bits,
const size_t flash_size,
struct region *out)
{
size_t protected_size =
- MIN(bp ? granularity << (bp - 1) : 0, flash_size);
+ MIN(bits->bp ? granularity << (bits->bp - 1) : 0, flash_size);

- if (cmp) {
+ int tb = bits->tb;
+ if (bits->cmp) {
protected_size = flash_size - protected_size;
tb = !tb;
}
@@ -246,8 +245,7 @@
{
const struct spi_flash_part_id *params;
struct region wp_region;
- union status_reg2 reg2;
- u8 bp, tb;
+ struct spi_flash_bpbits bpbits;
int ret;

params = flash->part;
@@ -258,34 +256,49 @@
const size_t granularity = (1 << params->protection_granularity_shift);

union status_reg1 reg1 = { .u = 0 };
+ union status_reg2 reg2 = { .u = 0 };

ret = spi_flash_cmd(&flash->spi, flash->status_cmd, &reg1.u,
sizeof(reg1.u));
if (ret)
return ret;

+ ret = spi_flash_cmd(&flash->spi, CMD_W25_RDSR2, &reg2.u,
+ sizeof(reg2.u));
+ if (ret)
+ return ret;
+
if (params->bp_bits == 3) {
if (reg1.bp3.sec) {
// FIXME: not supported
return -1;
}

- bp = reg1.bp3.bp;
- tb = reg1.bp3.tb;
+ bpbits = (struct spi_flash_bpbits){
+ .bp = reg1.bp3.bp,
+ .cmp = reg2.cmp,
+ .tb = reg1.bp3.tb,
+ .winbond = {
+ .srp0 = reg1.bp3.srp0,
+ .srp1 = reg2.srp1,
+ },
+ };
} else if (params->bp_bits == 4) {
- bp = reg1.bp4.bp;
- tb = reg1.bp4.tb;
+ bpbits = (struct spi_flash_bpbits){
+ .bp = reg1.bp4.bp,
+ .cmp = reg2.cmp,
+ .tb = reg1.bp4.tb,
+ .winbond = {
+ .srp = reg1.bp4.srp0,
+ .srl = reg2.srp1,
+ },
+ };
} else {
// FIXME: not supported
return -1;
}

- ret = spi_flash_cmd(&flash->spi, CMD_W25_RDSR2, &reg2.u,
- sizeof(reg2.u));
- if (ret)
- return ret;
-
- winbond_bpbits_to_region(granularity, bp, tb, reg2.cmp, flash->size,
+ winbond_bpbits_to_region(granularity, &bpbits, flash->size,
&wp_region);

if (!region_sz(&wp_region)) {

To view, visit change 42113. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I2a1a77fb73047df733498c0fa8b8de1153c3b09e
Gerrit-Change-Number: 42113
Gerrit-PatchSet: 1
Gerrit-Owner: Daniel Gröber (dxld)
Gerrit-Reviewer: Daniel Gröber <dxld@darkboxed.org>
Gerrit-MessageType: newchange