summaryrefslogtreecommitdiff
path: root/zephyr/shim/src/flash.c
diff options
context:
space:
mode:
authorTim Lin <tim2.lin@ite.corp-partner.google.com>2021-06-29 15:41:04 +0800
committerCommit Bot <commit-bot@chromium.org>2021-07-01 15:00:53 +0000
commit1e6aad6a6c55d9d04158625766f9ed419fedcfd9 (patch)
treec799e1e7448d56ee25b43e1cd1c76ca9a5d73769 /zephyr/shim/src/flash.c
parentf3e7625cc3f41f69a1fa79c3cf45bfc8a79e83d4 (diff)
downloadchrome-ec-1e6aad6a6c55d9d04158625766f9ed419fedcfd9.tar.gz
zephyr/drivers: npcx: reorganizes the flash driver(1)
Move the flash protection routines flash_get_status1() through flash_write_prot_reg() from shim/flash.c to cros_flash/cros_flash_npcx.c. BUG=b:187192628 BRANCH=none TEST=none Cq-Depend: chromium:2891674 Signed-off-by: Tim Lin <tim2.lin@ite.corp-partner.google.com> Change-Id: Iaca3a32cfb35a77df10b87745bdabc1ed1cd3c40 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2994429 Reviewed-by: Keith Short <keithshort@chromium.org> Reviewed-by: Denis Brockus <dbrockus@chromium.org> Commit-Queue: Keith Short <keithshort@chromium.org> Tested-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'zephyr/shim/src/flash.c')
-rw-r--r--zephyr/shim/src/flash.c194
1 files changed, 0 insertions, 194 deletions
diff --git a/zephyr/shim/src/flash.c b/zephyr/shim/src/flash.c
index 3c8de4f4d4..4fe8e284b1 100644
--- a/zephyr/shim/src/flash.c
+++ b/zephyr/shim/src/flash.c
@@ -20,204 +20,10 @@ LOG_MODULE_REGISTER(shim_flash, LOG_LEVEL_ERR);
#define CROS_FLASH_DEV DT_LABEL(DT_NODELABEL(fiu0))
static const struct device *cros_flash_dev;
-static int all_protected; /* Has all-flash protection been requested? */
-static int addr_prot_start;
-static int addr_prot_length;
static uint8_t flag_prot_inconsistent;
-static uint8_t saved_sr1;
-static uint8_t saved_sr2;
-
-#define CMD_READ_STATUS_REG 0x05
-#define CMD_READ_STATUS_REG2 0x35
K_MUTEX_DEFINE(flash_lock);
-static int flash_get_status1(void)
-{
- uint8_t reg;
-
- if (all_protected)
- return saved_sr1;
-
- /* Lock physical flash operations */
- crec_flash_lock_mapped_storage(1);
-
- cros_flash_get_status_reg(cros_flash_dev, CMD_READ_STATUS_REG, &reg);
-
- /* Unlock physical flash operations */
- crec_flash_lock_mapped_storage(0);
-
- return reg;
-}
-
-static int flash_get_status2(void)
-{
- uint8_t reg;
-
- if (all_protected)
- return saved_sr1;
-
- /* Lock physical flash operations */
- crec_flash_lock_mapped_storage(1);
-
- cros_flash_get_status_reg(cros_flash_dev, CMD_READ_STATUS_REG2, &reg);
-
- /* Unlock physical flash operations */
- crec_flash_lock_mapped_storage(0);
-
- return reg;
-}
-
-static int flash_write_status_reg(uint8_t *data)
-{
- return cros_flash_set_status_reg(cros_flash_dev, data);
-}
-
-static int is_int_flash_protected(void)
-{
- return cros_flash_write_protection_is_set(cros_flash_dev);
-}
-
-static void flash_protect_int_flash(int enable)
-{
- /*
- * Please notice the type of WP_IF bit is R/W1S. Once it's set,
- * only rebooting EC can clear it.
- */
- if (enable)
- cros_flash_write_protection_set(cros_flash_dev, enable);
-}
-
-static void flash_uma_lock(int enable)
-{
- if (enable && !all_protected) {
- /*
- * Store SR1 / SR2 for later use since we're about to lock
- * out all access (including read access) to these regs.
- */
- saved_sr1 = flash_get_status1();
- saved_sr2 = flash_get_status2();
- }
-
- cros_flash_uma_lock(cros_flash_dev, enable);
- all_protected = enable;
-}
-
-static int flash_set_status_for_prot(int reg1, int reg2)
-{
- uint8_t regs[2];
-
- /*
- * Writing SR regs will fail if our UMA lock is enabled. If WP
- * is deasserted then remove the lock and allow the write.
- */
- if (all_protected) {
- if (is_int_flash_protected())
- return EC_ERROR_ACCESS_DENIED;
-
- if (crec_flash_get_protect() & EC_FLASH_PROTECT_GPIO_ASSERTED)
- return EC_ERROR_ACCESS_DENIED;
- flash_uma_lock(0);
- }
-
- /*
- * If WP# is active and ec doesn't protect the status registers of
- * internal spi-flash, protect it now before setting them.
- */
-#ifdef CONFIG_WP_ACTIVE_HIGH
- flash_protect_int_flash(gpio_get_level(GPIO_WP));
-#else
- flash_protect_int_flash(!gpio_get_level(GPIO_WP_L));
-#endif /*_CONFIG_WP_ACTIVE_HIGH_*/
-
- /* Lock physical flash operations */
- crec_flash_lock_mapped_storage(1);
-
- regs[0] = reg1;
- regs[1] = reg2;
- flash_write_status_reg(regs);
-
- /* Unlock physical flash operations */
- crec_flash_lock_mapped_storage(0);
-
- spi_flash_reg_to_protect(reg1, reg2, &addr_prot_start,
- &addr_prot_length);
-
- return EC_SUCCESS;
-}
-
-static int flash_check_prot_range(unsigned int offset, unsigned int bytes)
-{
- /* Invalid value */
- if (offset + bytes > CONFIG_FLASH_SIZE_BYTES)
- return EC_ERROR_INVAL;
-
- /* Check if ranges overlap */
- if (MAX(addr_prot_start, offset) <
- MIN(addr_prot_start + addr_prot_length, offset + bytes))
- return EC_ERROR_ACCESS_DENIED;
-
- return EC_SUCCESS;
-}
-
-static int flash_check_prot_reg(unsigned int offset, unsigned int bytes)
-{
- unsigned int start;
- unsigned int len;
- uint8_t sr1, sr2;
- int rv = EC_SUCCESS;
-
- /*
- * If WP# is active and ec doesn't protect the status registers of
- * internal spi-flash, protect it now.
- */
-#ifdef CONFIG_WP_ACTIVE_HIGH
- flash_protect_int_flash(gpio_get_level(GPIO_WP));
-#else
- flash_protect_int_flash(!gpio_get_level(GPIO_WP_L));
-#endif /* CONFIG_WP_ACTIVE_HIGH */
-
- sr1 = flash_get_status1();
- sr2 = flash_get_status2();
-
- /* Invalid value */
- if (offset + bytes > CONFIG_FLASH_SIZE_BYTES)
- return EC_ERROR_INVAL;
-
- /* Compute current protect range */
- rv = spi_flash_reg_to_protect(sr1, sr2, &start, &len);
- if (rv)
- return rv;
-
- /* Check if ranges overlap */
- if (MAX(start, offset) < MIN(start + len, offset + bytes))
- return EC_ERROR_ACCESS_DENIED;
-
- return EC_SUCCESS;
-}
-
-static int flash_write_prot_reg(unsigned int offset, unsigned int bytes,
- int hw_protect)
-{
- int rv;
- uint8_t sr1 = flash_get_status1();
- uint8_t sr2 = flash_get_status2();
-
- /* Invalid values */
- if (offset + bytes > CONFIG_FLASH_SIZE_BYTES)
- return EC_ERROR_INVAL;
-
- /* Compute desired protect range */
- rv = spi_flash_protect_to_reg(offset, bytes, &sr1, &sr2);
- if (rv)
- return rv;
-
- if (hw_protect)
- sr1 |= SPI_FLASH_SR1_SRP0;
-
- return flash_set_status_for_prot(sr1, sr2);
-}
-
/* TODO(b/174873770): Add calls to Zephyr code here */
#ifdef CONFIG_EXTERNAL_STORAGE
void crec_flash_lock_mapped_storage(int lock)