int flash_check_prot_reg(unsigned int offset, unsigned int bytes) { unsigned int start; unsigned int len; uint8_t sr1 = 0, sr2 = 0; int rv = EC_SUCCESS; sr1 = flash_get_status1(); sr2 = flash_get_status2(); /* Invalid value */ if (offset + bytes > CONFIG_FLASH_PHYSICAL_SIZE) return EC_ERROR_INVAL; /* Compute current protect range */ rv = 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_set_status_for_prot(int reg1, int reg2) { /* Lock physical flash operations */ flash_lock_mapped_storage(1); /* Disable tri-state */ TRISTATE_FLASH(0); /* Enable write */ flash_write_enable(); NPCX_UMA_DB0 = reg1; NPCX_UMA_DB1 = reg2; /* Write status register 1/2 */ flash_execute_cmd(CMD_WRITE_STATUS_REG, MASK_CMD_WR_2BYTE); /* Enable tri-state */ TRISTATE_FLASH(1); /* Unlock physical flash operations */ flash_lock_mapped_storage(0); reg_to_protect(reg1, reg2, &addr_prot_start, &addr_prot_length); return EC_SUCCESS; }