writeprotect: add WPS bit and always set it to zero

WPS bit controls use of individual block protection which is mutually
exclusive with protection based on ranges.  Proper support requires
extension of the API as well as implementation, so here we're just
making sure that range-based protection is enabled and our WP
configuration is not ignored by the chip.

Change-Id: I2c26ec65d64a3b6fb1f1a73690bc771415db2744
Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Original-Reviewed-on: https://review.coreboot.org/c/flashrom/+/60231
Original-Reviewed-by: Nikolai Artemiev <nartemiev@google.com>
Original-Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Reviewed-on: https://review.coreboot.org/c/flashrom-stable/+/70981
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/flash.h b/flash.h
index eff4d58..80c129c 100644
--- a/flash.h
+++ b/flash.h
@@ -308,6 +308,9 @@
 
 		/* 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 8f70a7c..2895d46 100644
--- a/writeprotect.c
+++ b/writeprotect.c
@@ -73,6 +73,8 @@
 	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;
@@ -116,6 +118,8 @@
 	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 (reg = STATUS1; reg < MAX_REGISTERS; reg++) {
@@ -256,6 +260,8 @@
 	*count = 1 << bit_count;
 	*ranges = calloc(*count, sizeof(struct wp_range_and_bits));
 
+	/* TODO: take WPS bit into account. */
+
 	size_t range_index;
 	for (range_index = 0; range_index < *count; range_index++) {
 		/*