drivers/spi/spi_flash: add flash region protection to controller
Provide a spi controller specific protection callback to take advantage of special spi flash controllers that have internal protection registers built into the implementation. It's an optional callback for spi controllers. BUG=b:69614064 Change-Id: Ie50a6ce3bbda32620a25dd26fda1af944940bf28 Signed-off-by: Aaron Durbn <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/22879 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
parent
02103e34d7
commit
10d65b06ae
|
@ -459,3 +459,29 @@ void lb_spi_flash(struct lb_header *header)
|
||||||
flash->erase_cmd = CMD_BLOCK_ERASE;
|
flash->erase_cmd = CMD_BLOCK_ERASE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int spi_flash_ctrlr_protect_region(const struct spi_flash *flash,
|
||||||
|
const struct region *region)
|
||||||
|
{
|
||||||
|
const struct spi_ctrlr *ctrlr;
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (!ctrlr)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (ctrlr->flash_protect)
|
||||||
|
return ctrlr->flash_protect(flash, region);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#ifndef _SPI_GENERIC_H_
|
#ifndef _SPI_GENERIC_H_
|
||||||
#define _SPI_GENERIC_H_
|
#define _SPI_GENERIC_H_
|
||||||
|
|
||||||
|
#include <commonlib/region.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
@ -115,6 +116,7 @@ struct spi_flash;
|
||||||
*
|
*
|
||||||
* flash_probe: Specialized probe function provided by SPI flash
|
* flash_probe: Specialized probe function provided by SPI flash
|
||||||
* controllers.
|
* controllers.
|
||||||
|
* flash_protect: Protect a region of flash using the SPI flash controller.
|
||||||
*/
|
*/
|
||||||
struct spi_ctrlr {
|
struct spi_ctrlr {
|
||||||
int (*claim_bus)(const struct spi_slave *slave);
|
int (*claim_bus)(const struct spi_slave *slave);
|
||||||
|
@ -128,6 +130,8 @@ struct spi_ctrlr {
|
||||||
bool deduct_cmd_len;
|
bool deduct_cmd_len;
|
||||||
int (*flash_probe)(const struct spi_slave *slave,
|
int (*flash_probe)(const struct spi_slave *slave,
|
||||||
struct spi_flash *flash);
|
struct spi_flash *flash);
|
||||||
|
int (*flash_protect)(const struct spi_flash *flash,
|
||||||
|
const struct region *region);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
|
|
|
@ -120,4 +120,9 @@ int chipset_volatile_group_end(const struct spi_flash *flash);
|
||||||
* if CONFIG_BOOT_DEVICE_SPI_FLASH is enabled. */
|
* if CONFIG_BOOT_DEVICE_SPI_FLASH is enabled. */
|
||||||
const struct spi_flash *boot_device_spi_flash(void);
|
const struct spi_flash *boot_device_spi_flash(void);
|
||||||
|
|
||||||
|
/* Protect a region of spi flash using its controller, if available. Returns
|
||||||
|
* < 0 on error, else 0 on success. */
|
||||||
|
int spi_flash_ctrlr_protect_region(const struct spi_flash *flash,
|
||||||
|
const struct region *region);
|
||||||
|
|
||||||
#endif /* _SPI_FLASH_H_ */
|
#endif /* _SPI_FLASH_H_ */
|
||||||
|
|
Loading…
Reference in New Issue