diff --git a/flash.h b/flash.h index 509f2266f..9493fd21c 100644 --- a/flash.h +++ b/flash.h @@ -307,6 +307,9 @@ struct flashchip { /* Complement bit (CMP) */ struct reg_bit_info cmp; + + /* Write Protect Selection (per sector protection when set) */ + struct reg_bit_info wps; } reg_bits; /* Function that takes a set of WP config bits (e.g. BP, SEC, TB, etc) */ diff --git a/writeprotect.c b/writeprotect.c index 589359329..ab6b1761a 100644 --- a/writeprotect.c +++ b/writeprotect.c @@ -73,6 +73,8 @@ static enum flashrom_wp_result read_wp_bits(struct wp_bits *bits, struct flashct if (ret != FLASHROM_WP_OK) return ret; + /* Note: WPS bit isn't read here, because it's not part of any range. */ + for (i = 0; i < ARRAY_SIZE(bits->bp); i++) { if (bit_map->bp[i].reg == INVALID_REG) break; @@ -115,6 +117,8 @@ static enum flashrom_wp_result write_wp_bits(struct flashctx *flash, struct wp_b set_reg_bit(reg_values, write_masks, reg_bits->cmp, bits.cmp); set_reg_bit(reg_values, write_masks, reg_bits->srp, bits.srp); set_reg_bit(reg_values, write_masks, reg_bits->srl, bits.srl); + /* Note: always setting WPS bit to zero until its fully supported. */ + set_reg_bit(reg_values, write_masks, reg_bits->wps, 0); /* Write each register */ for (enum flash_reg reg = STATUS1; reg < MAX_REGISTERS; reg++) { @@ -253,6 +257,8 @@ static enum flashrom_wp_result get_ranges_and_wp_bits(struct flashctx *flash, st *count = 1 << bit_count; *ranges = calloc(*count, sizeof(struct wp_range_and_bits)); + /* TODO: take WPS bit into account. */ + for (size_t range_index = 0; range_index < *count; range_index++) { /* * Extract bits from the range index and assign them to members