1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-07-01 22:21:16 +02:00

tree/: Change chip restore data type from uint8_t to void ptr

Chip restore callbacks currently are used by
- spi25_statusreg.c unlock functions to restore status register 1.
- s25f.c to restore config register 3.

Both of these cases only need to save a single uint8_t value to restore
the original chip state, however storing a void pointer will allow more
flexible chip restore behaviour. In particular, it will allow
flashrom_wp_cfg objects to be saved and restored, enabling
writeprotect-based unlocking.

BUG=b:237485865,b:247421511
BRANCH=none
TEST=Tested on grunt DUT (prog: sb600spi, flash: W25Q128.W):
     `flashrom --wp-range 0x0,0x1000000 \
      flashrom --wp-status     # Result: range=0x0,0x1000000 \
      flashrom -w random.bin   # Result: success \
      flashrom -v random.bin   # Result: success \
      flashrom --wp-status     # Result: range=0x0,0x1000000`

Change-Id: I311b468a4b0349f4da9584c12b36af6ec2394527
Signed-off-by: Nikolai Artemiev <nartemiev@google.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/70349
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
This commit is contained in:
Nikolai Artemiev
2022-12-05 12:49:14 +11:00
committed by Edward O'Callaghan
parent 7cab790a46
commit 673cb357d4
4 changed files with 32 additions and 10 deletions

View File

@ -17,6 +17,8 @@
* GNU General Public License for more details.
*/
#include <stdlib.h>
#include "flash.h"
#include "chipdrivers.h"
#include "programmer.h"
@ -263,8 +265,11 @@ int spi_read_register(const struct flashctx *flash, enum flash_reg reg, uint8_t
return 0;
}
static int spi_restore_status(struct flashctx *flash, uint8_t status)
static int spi_restore_status(struct flashctx *flash, void *data)
{
uint8_t status = *(uint8_t *)data;
free(data);
msg_cdbg("restoring chip status (0x%02x)\n", status);
return spi_write_register(flash, STATUS1, status);
}
@ -304,7 +309,13 @@ static int spi_disable_blockprotect_generic(struct flashctx *flash, uint8_t bp_m
}
/* Restore status register content upon exit in finalize_flash_access(). */
register_chip_restore(spi_restore_status, flash, status);
uint8_t *data = calloc(sizeof(uint8_t), 1);
if (!data) {
msg_cerr("Out of memory!\n");
return 1;
}
*data = status;
register_chip_restore(spi_restore_status, flash, data);
msg_cdbg("Some block protection in effect, disabling... ");
if ((status & lock_mask) != 0) {