Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/27987
Change subject: spi/flash: Add interface to check software write protection ......................................................................
spi/flash: Add interface to check software write protection
* Add a common function to check if the region is write protected by ** SPI controller's "flash protected regions" ** flash status register protection bits
The state of a possible hardware write protection doesn't matter here.
Change-Id: I1a2b75f5c0f183a74d42180dfc0c12d50b9780bb Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/drivers/spi/spi_flash.c M src/include/spi-generic.h M src/include/spi_flash.h 3 files changed, 50 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/87/27987/1
diff --git a/src/drivers/spi/spi_flash.c b/src/drivers/spi/spi_flash.c index 87049460..0e8ebd9 100644 --- a/src/drivers/spi/spi_flash.c +++ b/src/drivers/spi/spi_flash.c @@ -538,6 +538,36 @@ } }
+int spi_flash_ctrlr_is_region_protected(const struct spi_flash *flash, + const struct region *region) +{ + const struct spi_ctrlr *ctrlr; + const struct spi_flash_ops *ops; + struct region flash_region = { 0 }; + + if (!flash) + return -1; + + flash_region.size = flash->size; + + if (!region_is_subregion(&flash_region, region)) + return -1; + + ctrlr = flash->spi.ctrlr; + ops = flash->ops; + + /* Check controller's "Protected Regions" */ + if (ctrlr && ctrlr->is_flash_write_protected) + return ctrlr->is_flash_write_protected(flash, region); + + /* + * Try to directly check the status register lock-bits in flash. + */ + if (ops && ops->get_write_protection) + return ops->get_write_protection(flash, region) > 0; + + return -1; +}
int spi_flash_ctrlr_protect_region(const struct spi_flash *flash, const struct region *region) diff --git a/src/include/spi-generic.h b/src/include/spi-generic.h index e3e7f82..c95b4ae 100644 --- a/src/include/spi-generic.h +++ b/src/include/spi-generic.h @@ -145,6 +145,8 @@ struct spi_flash *flash); int (*flash_protect)(const struct spi_flash *flash, const struct region *region); + int (*is_flash_write_protected)(const struct spi_flash *flash, + const struct region *region); };
/*----------------------------------------------------------------------- diff --git a/src/include/spi_flash.h b/src/include/spi_flash.h index f33b59a..b8bb7bd 100644 --- a/src/include/spi_flash.h +++ b/src/include/spi_flash.h @@ -198,6 +198,24 @@ const struct region *region);
/* + * Check if provided region is write protected. + * It first tries to use its controller, if available. + * If the controller doesn't support flash protections, try to query the lock + * bits in the status register of the flash device (requires flash vendor + * specific support). + * + * @param flash The flash device to operate on + * @param region The region to lock + * @Return < 0 on error, 0 if region isn't fully protected else 1 on success. + * + * Possible errors: + * * Invalid region specified + * * Requested region layout can't be directly applied on flash + * * SPI bus error + */ +int spi_flash_ctrlr_is_region_protected(const struct spi_flash *flash, + const struct region *region); +/* * This function is provided to support spi flash command-response transactions. * Only 2 vectors are supported and the 'func' is called with appropriate * write and read buffers together. This can be used for chipsets that