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_command_spi_info(struct host_cmd_handler_args *args) { struct ec_response_flash_spi_info *r = args->response; flash_get_jedec_id(r->jedec); r->reserved0 = 0; flash_get_mfr_dev_id(r->mfr_dev_id); r->sr1 = flash_get_status1(); r->sr2 = flash_get_status2(); args->response_size = sizeof(*r); return EC_RES_SUCCESS; }
int flash_write_prot_reg(unsigned int offset, unsigned int bytes) { int rv; uint8_t sr1 = flash_get_status1(); uint8_t sr2 = flash_get_status2(); /* Invalid values */ if (offset + bytes > CONFIG_FLASH_SIZE) return EC_ERROR_INVAL; /* Compute desired protect range */ rv = protect_to_reg(offset, bytes, &sr1, &sr2); if (rv) return rv; return flash_set_status_for_prot(sr1, sr2); }