From patchwork Fri Jul 14 12:54:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mario Six X-Patchwork-Id: 788473 X-Patchwork-Delegate: mario.six@gdsys.cc Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3x8CfZ3Tjjz9s78 for ; Fri, 14 Jul 2017 23:08:06 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id E8792C21FC2; Fri, 14 Jul 2017 13:02:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 00852C21F60; Fri, 14 Jul 2017 12:56:24 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 86F3AC21F99; Fri, 14 Jul 2017 12:56:14 +0000 (UTC) Received: from smtprelay04.ispgateway.de (smtprelay04.ispgateway.de [80.67.18.16]) by lists.denx.de (Postfix) with ESMTPS id 1C71EC21F35 for ; Fri, 14 Jul 2017 12:56:08 +0000 (UTC) Received: from [87.191.40.34] (helo=bob3.testumgebung.local) by smtprelay04.ispgateway.de with esmtpa (Exim 4.89) (envelope-from ) id 1dW08c-00062X-Jt; Fri, 14 Jul 2017 14:56:06 +0200 From: Mario Six To: U-Boot Mailing List , Simon Glass , Dirk Eibach , Heiko Schocher , Stefan Roese , Joe Hershberger , Tom Rini Date: Fri, 14 Jul 2017 14:54:59 +0200 Message-Id: <20170714125537.14895-14-mario.six@gdsys.cc> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170714125537.14895-1-mario.six@gdsys.cc> References: <20170714125537.14895-1-mario.six@gdsys.cc> X-Df-Sender: bWFyaW8uc2l4QGdkc3lzLmNj Subject: [U-Boot] [PATCH 13/51] cfi_flash: Clean up code some more X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Fix some more style violations (mostly mis-indented case statements), and reduce the scope of some variables. Signed-off-by: Mario Six Reviewed-by: Simon Glass --- drivers/mtd/cfi_flash.c | 610 ++++++++++++++++++++++++------------------------ 1 file changed, 305 insertions(+), 305 deletions(-) diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index 18be3bee53..2445632580 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -183,10 +183,10 @@ __maybe_weak u64 flash_read64(void *addr) flash_info_t *flash_get_info(ulong base) { int i; - flash_info_t *info; for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) { - info = &flash_info[i]; + flash_info_t *info = &flash_info[i]; + if (info->size && info->start[0] <= base && base <= info->start[0] + info->size - 1) return info; @@ -226,8 +226,6 @@ static inline void flash_unmap(flash_info_t *info, flash_sect_t sect, static void flash_make_cmd(flash_info_t *info, u32 cmd, void *cmdbuf) { int i; - int cword_offset; - int cp_offset; #if defined(__LITTLE_ENDIAN) || defined(CONFIG_SYS_WRITE_SWAPPED_DATA) u32 cmd_le = cpu_to_le32(cmd); #endif @@ -235,7 +233,8 @@ static void flash_make_cmd(flash_info_t *info, u32 cmd, void *cmdbuf) uchar *cp = (uchar *)cmdbuf; for (i = info->portwidth; i > 0; i--) { - cword_offset = (info->portwidth - i) % info->chipwidth; + int cp_offset; + int cword_offset = (info->portwidth - i) % info->chipwidth; #if defined(__LITTLE_ENDIAN) || defined(CONFIG_SYS_WRITE_SWAPPED_DATA) cp_offset = info->portwidth - i; val = *((uchar *)&cmd_le + cword_offset); @@ -1072,96 +1071,94 @@ int flash_erase(flash_info_t *info, int s_first, int s_last) } for (sect = s_first; sect <= s_last; sect++) { +#ifdef CONFIG_SYS_FLASH_CHECK_BLANK_BEFORE_ERASE + int k; + int size; + int erased; + u32 *flash; +#endif + if (ctrlc()) { printf("\n"); return 1; } - if (info->protect[sect] == 0) { /* not protected */ -#ifdef CONFIG_SYS_FLASH_CHECK_BLANK_BEFORE_ERASE - int k; - int size; - int erased; - u32 *flash; + if (info->protect[sect] != 0) + continue; - /* - * Check if whole sector is erased - */ - size = flash_sector_size(info, sect); - erased = 1; - flash = (u32 *)info->start[sect]; - /* divide by 4 for longword access */ - size = size >> 2; - for (k = 0; k < size; k++) { - if (flash_read32(flash++) != 0xffffffff) { - erased = 0; - break; - } - } - if (erased) { - if (flash_verbose) - putc(','); - continue; +#ifdef CONFIG_SYS_FLASH_CHECK_BLANK_BEFORE_ERASE + /* + * Check if whole sector is erased + */ + size = flash_sector_size(info, sect); + erased = 1; + flash = (u32 *)info->start[sect]; + /* divide by 4 for longword access */ + size = size >> 2; + for (k = 0; k < size; k++) { + if (flash_read32(flash++) != 0xffffffff) { + erased = 0; + break; } + } + if (erased) { + if (flash_verbose) + putc(','); + continue; + } #endif - switch (info->vendor) { - case CFI_CMDSET_INTEL_PROG_REGIONS: - case CFI_CMDSET_INTEL_STANDARD: - case CFI_CMDSET_INTEL_EXTENDED: - flash_write_cmd(info, sect, 0, - FLASH_CMD_CLEAR_STATUS); - flash_write_cmd(info, sect, 0, - FLASH_CMD_BLOCK_ERASE); - flash_write_cmd(info, sect, 0, - FLASH_CMD_ERASE_CONFIRM); - break; - case CFI_CMDSET_AMD_STANDARD: - case CFI_CMDSET_AMD_EXTENDED: - flash_unlock_seq(info, sect); - flash_write_cmd(info, sect, - info->addr_unlock1, - AMD_CMD_ERASE_START); - flash_unlock_seq(info, sect); - flash_write_cmd(info, sect, 0, - info->cmd_erase_sector); - break; + switch (info->vendor) { + case CFI_CMDSET_INTEL_PROG_REGIONS: + case CFI_CMDSET_INTEL_STANDARD: + case CFI_CMDSET_INTEL_EXTENDED: + flash_write_cmd(info, sect, 0, FLASH_CMD_CLEAR_STATUS); + flash_write_cmd(info, sect, 0, FLASH_CMD_BLOCK_ERASE); + flash_write_cmd(info, sect, 0, FLASH_CMD_ERASE_CONFIRM); + break; + case CFI_CMDSET_AMD_STANDARD: + case CFI_CMDSET_AMD_EXTENDED: + flash_unlock_seq(info, sect); + flash_write_cmd(info, sect, info->addr_unlock1, + AMD_CMD_ERASE_START); + flash_unlock_seq(info, sect); + flash_write_cmd(info, sect, 0, info->cmd_erase_sector); + break; #ifdef CONFIG_FLASH_CFI_LEGACY - case CFI_CMDSET_AMD_LEGACY: - flash_unlock_seq(info, 0); - flash_write_cmd(info, 0, info->addr_unlock1, - AMD_CMD_ERASE_START); - flash_unlock_seq(info, 0); - flash_write_cmd(info, sect, 0, - AMD_CMD_ERASE_SECTOR); - break; + case CFI_CMDSET_AMD_LEGACY: + flash_unlock_seq(info, 0); + flash_write_cmd(info, 0, info->addr_unlock1, + AMD_CMD_ERASE_START); + flash_unlock_seq(info, 0); + flash_write_cmd(info, sect, 0, + AMD_CMD_ERASE_SECTOR); + break; #endif - default: - debug("Unknown flash vendor %d\n", - info->vendor); - break; - } - - if (use_flash_status_poll(info)) { - cfiword_t cword; - void *dest; + default: + debug("Unknown flash vendor %d\n", + info->vendor); + break; + } - cword.w64 = 0xffffffffffffffffULL; - dest = flash_map(info, sect, 0); - st = flash_status_poll(info, &cword, dest, - info->erase_blk_tout, - "erase"); - flash_unmap(info, sect, 0, dest); - } else { - st = flash_full_status_check(info, sect, - info->erase_blk_tout, - "erase"); - } + if (use_flash_status_poll(info)) { + cfiword_t cword; + void *dest; - if (st) - rcode = 1; - else if (flash_verbose) - putc('.'); + cword.w64 = 0xffffffffffffffffULL; + dest = flash_map(info, sect, 0); + st = flash_status_poll(info, &cword, dest, + info->erase_blk_tout, + "erase"); + flash_unmap(info, sect, 0, dest); + } else { + st = flash_full_status_check(info, sect, + info->erase_blk_tout, + "erase"); } + + if (st) + rcode = 1; + else if (flash_verbose) + putc('.'); } if (flash_verbose) @@ -1335,7 +1332,8 @@ int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt) wp = (addr & ~(info->portwidth - 1)); /* handle unaligned start */ - if ((aln = addr - wp) != 0) { + aln = addr - wp; + if (aln != 0) { cword.w32 = 0; p = (uchar *)wp; for (i = 0; i < aln; ++i) @@ -1366,7 +1364,8 @@ int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt) cword.w32 = 0; for (i = 0; i < info->portwidth; i++) flash_add_byte(info, &cword, *src++); - if ((rc = flash_write_cfiword(info, wp, cword)) != 0) + rc = flash_write_cfiword(info, wp, cword); + if (rc != 0) return rc; wp += info->portwidth; cnt -= info->portwidth; @@ -1377,7 +1376,8 @@ int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt) i = buffered_size - (wp % buffered_size); if (i > cnt) i = cnt; - if ((rc = flash_write_cfibuffer(info, wp, src, i)) != ERR_OK) + rc = flash_write_cfibuffer(info, wp, src, i); + if (rc != ERR_OK) return rc; i -= i & (info->portwidth - 1); wp += i; @@ -1393,7 +1393,8 @@ int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt) cword.w32 = 0; for (i = 0; i < info->portwidth; i++) flash_add_byte(info, &cword, *src++); - if ((rc = flash_write_cfiword(info, wp, cword)) != 0) + rc = flash_write_cfiword(info, wp, cword); + if (rc != 0) return rc; wp += info->portwidth; cnt -= info->portwidth; @@ -1567,9 +1568,9 @@ int flash_real_protect(flash_info_t *info, long sector, int prot) * flash_full_status_check() to work correctly */ flash_write_cmd(info, sector, 0, FLASH_CMD_READ_STATUS); - if ((retcode = - flash_full_status_check(info, sector, info->erase_blk_tout, - prot ? "protect" : "unprotect")) == 0) { + retcode = flash_full_status_check(info, sector, info->erase_blk_tout, + prot ? "protect" : "unprotect"); + if (retcode == 0) { info->protect[sector] = prot; /* @@ -1682,22 +1683,22 @@ static int cmdset_intel_init(flash_info_t *info, struct cfi_qry *qry) static void cmdset_amd_read_jedec_ids(flash_info_t *info) { - ushort bankId = 0; - uchar manuId; + ushort bank_id = 0; + uchar manu_id; flash_write_cmd(info, 0, 0, AMD_CMD_RESET); flash_unlock_seq(info, 0); flash_write_cmd(info, 0, info->addr_unlock1, FLASH_CMD_READ_ID); udelay(1000); /* some flash are slow to respond */ - manuId = flash_read_uchar (info, FLASH_OFFSET_MANUFACTURER_ID); + manu_id = flash_read_uchar (info, FLASH_OFFSET_MANUFACTURER_ID); /* JEDEC JEP106Z specifies ID codes up to bank 7 */ - while (manuId == FLASH_CONTINUATION_CODE && bankId < 0x800) { - bankId += 0x100; - manuId = flash_read_uchar(info, - bankId | FLASH_OFFSET_MANUFACTURER_ID); + while (manu_id == FLASH_CONTINUATION_CODE && bank_id < 0x800) { + bank_id += 0x100; + manu_id = flash_read_uchar(info, + bank_id | FLASH_OFFSET_MANUFACTURER_ID); } - info->manufacturer_id = manuId; + info->manufacturer_id = manu_id; switch (info->chipwidth) { case FLASH_CFI_8BIT: @@ -1870,7 +1871,7 @@ static void __flash_cmd_reset(flash_info_t *info) } void flash_cmd_reset(flash_info_t *info) - __attribute__((weak,alias("__flash_cmd_reset"))); + __attribute__((weak, alias("__flash_cmd_reset"))); static int __flash_detect_cfi(flash_info_t *info, struct cfi_qry *qry) { @@ -2052,8 +2053,6 @@ ulong flash_get_size(phys_addr_t base, int banknum) unsigned long tmp; int size_ratio; uchar num_erase_regions; - int erase_region_size; - int erase_region_count; struct cfi_qry qry; unsigned long max_size; @@ -2067,196 +2066,200 @@ ulong flash_get_size(phys_addr_t base, int banknum) info->start[0] = (ulong)map_physmem(base, info->portwidth, MAP_NOCACHE); - if (flash_detect_cfi(info, &qry)) { - info->vendor = le16_to_cpu(get_unaligned(&qry.p_id)); - info->ext_addr = le16_to_cpu(get_unaligned(&qry.p_adr)); - num_erase_regions = qry.num_erase_regions; + if (!flash_detect_cfi(info, &qry)) + return info->size; - if (info->ext_addr) { - info->cfi_version = (ushort)flash_read_uchar (info, - info->ext_addr + 3) << 8; - info->cfi_version |= (ushort)flash_read_uchar (info, - info->ext_addr + 4); - } + info->vendor = le16_to_cpu(get_unaligned(&qry.p_id)); + info->ext_addr = le16_to_cpu(get_unaligned(&qry.p_adr)); + num_erase_regions = qry.num_erase_regions; + + if (info->ext_addr) { + info->cfi_version = (ushort)flash_read_uchar (info, + info->ext_addr + 3) << 8; + info->cfi_version |= (ushort)flash_read_uchar (info, + info->ext_addr + 4); + } #ifdef DEBUG - flash_printqry(&qry); + flash_printqry(&qry); #endif - switch (info->vendor) { - case CFI_CMDSET_INTEL_PROG_REGIONS: - case CFI_CMDSET_INTEL_STANDARD: - case CFI_CMDSET_INTEL_EXTENDED: - cmdset_intel_init(info, &qry); - break; - case CFI_CMDSET_AMD_STANDARD: - case CFI_CMDSET_AMD_EXTENDED: - cmdset_amd_init(info, &qry); - break; - default: - printf("CFI: Unknown command set 0x%x\n", - info->vendor); - /* - * Unfortunately, this means we don't know how - * to get the chip back to Read mode. Might - * as well try an Intel-style reset... - */ - flash_write_cmd(info, 0, 0, FLASH_CMD_RESET); - return 0; - } + switch (info->vendor) { + case CFI_CMDSET_INTEL_PROG_REGIONS: + case CFI_CMDSET_INTEL_STANDARD: + case CFI_CMDSET_INTEL_EXTENDED: + cmdset_intel_init(info, &qry); + break; + case CFI_CMDSET_AMD_STANDARD: + case CFI_CMDSET_AMD_EXTENDED: + cmdset_amd_init(info, &qry); + break; + default: + printf("CFI: Unknown command set 0x%x\n", + info->vendor); + /* + * Unfortunately, this means we don't know how + * to get the chip back to Read mode. Might + * as well try an Intel-style reset... + */ + flash_write_cmd(info, 0, 0, FLASH_CMD_RESET); + return 0; + } - /* Do manufacturer-specific fixups */ - switch (info->manufacturer_id) { - case 0x0001: /* AMD */ - case 0x0037: /* AMIC */ - flash_fixup_amd(info, &qry); - break; - case 0x001f: - flash_fixup_atmel(info, &qry); - break; - case 0x0020: - flash_fixup_stm(info, &qry); - break; - case 0x00bf: /* SST */ - flash_fixup_sst(info, &qry); - break; - case 0x0089: /* Numonyx */ - flash_fixup_num(info, &qry); + /* Do manufacturer-specific fixups */ + switch (info->manufacturer_id) { + case 0x0001: /* AMD */ + case 0x0037: /* AMIC */ + flash_fixup_amd(info, &qry); + break; + case 0x001f: + flash_fixup_atmel(info, &qry); + break; + case 0x0020: + flash_fixup_stm(info, &qry); + break; + case 0x00bf: /* SST */ + flash_fixup_sst(info, &qry); + break; + case 0x0089: /* Numonyx */ + flash_fixup_num(info, &qry); + break; + } + + debug("manufacturer is %d\n", info->vendor); + debug("manufacturer id is 0x%x\n", info->manufacturer_id); + debug("device id is 0x%x\n", info->device_id); + debug("device id2 is 0x%x\n", info->device_id2); + debug("cfi version is 0x%04x\n", info->cfi_version); + + size_ratio = info->portwidth / info->chipwidth; + /* if the chip is x8/x16 reduce the ratio by half */ + if ((info->interface == FLASH_CFI_X8X16) && + (info->chipwidth == FLASH_CFI_BY8)) { + size_ratio >>= 1; + } + debug("size_ratio %d port %d bits chip %d bits\n", + size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH, + info->chipwidth << CFI_FLASH_SHIFT_WIDTH); + info->size = 1 << qry.dev_size; + /* multiply the size by the number of chips */ + info->size *= size_ratio; + max_size = cfi_flash_bank_size(banknum); + if (max_size && (info->size > max_size)) { + debug("[truncated from %ldMiB]", info->size >> 20); + info->size = max_size; + } + debug("found %d erase regions\n", num_erase_regions); + sect_cnt = 0; + sector = base; + for (i = 0; i < num_erase_regions; i++) { + int erase_region_size; + int erase_region_count; + + if (i > NUM_ERASE_REGIONS) { + printf("%d erase regions found, only %d used\n", + num_erase_regions, NUM_ERASE_REGIONS); break; } - debug("manufacturer is %d\n", info->vendor); - debug("manufacturer id is 0x%x\n", info->manufacturer_id); - debug("device id is 0x%x\n", info->device_id); - debug("device id2 is 0x%x\n", info->device_id2); - debug("cfi version is 0x%04x\n", info->cfi_version); - - size_ratio = info->portwidth / info->chipwidth; - /* if the chip is x8/x16 reduce the ratio by half */ - if ((info->interface == FLASH_CFI_X8X16) && - (info->chipwidth == FLASH_CFI_BY8)) { - size_ratio >>= 1; - } - debug("size_ratio %d port %d bits chip %d bits\n", - size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH, - info->chipwidth << CFI_FLASH_SHIFT_WIDTH); - info->size = 1 << qry.dev_size; - /* multiply the size by the number of chips */ - info->size *= size_ratio; - max_size = cfi_flash_bank_size(banknum); - if (max_size && (info->size > max_size)) { - debug("[truncated from %ldMiB]", info->size >> 20); - info->size = max_size; - } - debug("found %d erase regions\n", num_erase_regions); - sect_cnt = 0; - sector = base; - for (i = 0; i < num_erase_regions; i++) { - if (i > NUM_ERASE_REGIONS) { - printf("%d erase regions found, only %d used\n", - num_erase_regions, NUM_ERASE_REGIONS); + tmp = le32_to_cpu(get_unaligned( + &qry.erase_region_info[i])); + debug("erase region %u: 0x%08lx\n", i, tmp); + + erase_region_count = (tmp & 0xffff) + 1; + tmp >>= 16; + erase_region_size = + (tmp & 0xffff) ? ((tmp & 0xffff) * 256) : 128; + debug("erase_region_count = %d erase_region_size = %d\n", + erase_region_count, erase_region_size); + for (j = 0; j < erase_region_count; j++) { + if (sector - base >= info->size) + break; + if (sect_cnt >= CONFIG_SYS_MAX_FLASH_SECT) { + printf("ERROR: too many flash sectors\n"); break; } + info->start[sect_cnt] = + (ulong)map_physmem(sector, + info->portwidth, + MAP_NOCACHE); + sector += (erase_region_size * size_ratio); - tmp = le32_to_cpu(get_unaligned( - &qry.erase_region_info[i])); - debug("erase region %u: 0x%08lx\n", i, tmp); - - erase_region_count = (tmp & 0xffff) + 1; - tmp >>= 16; - erase_region_size = - (tmp & 0xffff) ? ((tmp & 0xffff) * 256) : 128; - debug("erase_region_count = %d erase_region_size = %d\n", - erase_region_count, erase_region_size); - for (j = 0; j < erase_region_count; j++) { - if (sector - base >= info->size) - break; - if (sect_cnt >= CONFIG_SYS_MAX_FLASH_SECT) { - printf("ERROR: too many flash sectors\n"); - break; - } - info->start[sect_cnt] = - (ulong)map_physmem(sector, - info->portwidth, - MAP_NOCACHE); - sector += (erase_region_size * size_ratio); - + /* + * Only read protection status from + * supported devices (intel...) + */ + switch (info->vendor) { + case CFI_CMDSET_INTEL_PROG_REGIONS: + case CFI_CMDSET_INTEL_EXTENDED: + case CFI_CMDSET_INTEL_STANDARD: /* - * Only read protection status from - * supported devices (intel...) + * Set flash to read-id mode. Otherwise + * reading protected status is not + * guaranteed. */ - switch (info->vendor) { - case CFI_CMDSET_INTEL_PROG_REGIONS: - case CFI_CMDSET_INTEL_EXTENDED: - case CFI_CMDSET_INTEL_STANDARD: - /* - * Set flash to read-id mode. Otherwise - * reading protected status is not - * guaranteed. - */ - flash_write_cmd(info, sect_cnt, 0, - FLASH_CMD_READ_ID); - info->protect[sect_cnt] = - flash_isset(info, sect_cnt, - FLASH_OFFSET_PROTECT, - FLASH_STATUS_PROTECT); - flash_write_cmd(info, sect_cnt, 0, - FLASH_CMD_RESET); - break; - case CFI_CMDSET_AMD_EXTENDED: - case CFI_CMDSET_AMD_STANDARD: - if (!info->legacy_unlock) { - /* default: not protected */ - info->protect[sect_cnt] = 0; - break; - } - - /* Read protection (PPB) from sector */ - flash_write_cmd(info, 0, 0, - info->cmd_reset); - flash_unlock_seq(info, 0); - flash_write_cmd(info, 0, - info->addr_unlock1, - FLASH_CMD_READ_ID); - info->protect[sect_cnt] = - flash_isset( - info, sect_cnt, - FLASH_OFFSET_PROTECT, - FLASH_STATUS_PROTECT); - break; - default: + flash_write_cmd(info, sect_cnt, 0, + FLASH_CMD_READ_ID); + info->protect[sect_cnt] = + flash_isset(info, sect_cnt, + FLASH_OFFSET_PROTECT, + FLASH_STATUS_PROTECT); + flash_write_cmd(info, sect_cnt, 0, + FLASH_CMD_RESET); + break; + case CFI_CMDSET_AMD_EXTENDED: + case CFI_CMDSET_AMD_STANDARD: + if (!info->legacy_unlock) { /* default: not protected */ info->protect[sect_cnt] = 0; + break; } - sect_cnt++; + /* Read protection (PPB) from sector */ + flash_write_cmd(info, 0, 0, + info->cmd_reset); + flash_unlock_seq(info, 0); + flash_write_cmd(info, 0, + info->addr_unlock1, + FLASH_CMD_READ_ID); + info->protect[sect_cnt] = + flash_isset( + info, sect_cnt, + FLASH_OFFSET_PROTECT, + FLASH_STATUS_PROTECT); + break; + default: + /* default: not protected */ + info->protect[sect_cnt] = 0; } - } - info->sector_count = sect_cnt; - info->buffer_size = 1 << le16_to_cpu(qry.max_buf_write_size); - tmp = 1 << qry.block_erase_timeout_typ; - info->erase_blk_tout = tmp * - (1 << qry.block_erase_timeout_max); - tmp = (1 << qry.buf_write_timeout_typ) * - (1 << qry.buf_write_timeout_max); - - /* round up when converting to ms */ - info->buffer_write_tout = (tmp + 999) / 1000; - tmp = (1 << qry.word_write_timeout_typ) * - (1 << qry.word_write_timeout_max); - /* round up when converting to ms */ - info->write_tout = (tmp + 999) / 1000; - info->flash_id = FLASH_MAN_CFI; - if ((info->interface == FLASH_CFI_X8X16) && - (info->chipwidth == FLASH_CFI_BY8)) { - /* XXX - Need to test on x8/x16 in parallel. */ - info->portwidth >>= 1; + sect_cnt++; } + } - flash_write_cmd(info, 0, 0, info->cmd_reset); + info->sector_count = sect_cnt; + info->buffer_size = 1 << le16_to_cpu(qry.max_buf_write_size); + tmp = 1 << qry.block_erase_timeout_typ; + info->erase_blk_tout = tmp * + (1 << qry.block_erase_timeout_max); + tmp = (1 << qry.buf_write_timeout_typ) * + (1 << qry.buf_write_timeout_max); + + /* round up when converting to ms */ + info->buffer_write_tout = (tmp + 999) / 1000; + tmp = (1 << qry.word_write_timeout_typ) * + (1 << qry.word_write_timeout_max); + /* round up when converting to ms */ + info->write_tout = (tmp + 999) / 1000; + info->flash_id = FLASH_MAN_CFI; + if ((info->interface == FLASH_CFI_X8X16) && + (info->chipwidth == FLASH_CFI_BY8)) { + /* XXX - Need to test on x8/x16 in parallel. */ + info->portwidth >>= 1; } + flash_write_cmd(info, 0, 0, info->cmd_reset); + return info->size; } @@ -2375,54 +2378,51 @@ unsigned long flash_init(void) i + 1, flash_info[i].size, flash_info[i].size >> 20); #endif /* CONFIG_SYS_FLASH_QUIET_TEST */ + continue; } #ifdef CONFIG_SYS_FLASH_PROTECTION - else if (strcmp(s, "yes") == 0) { + if (strcmp(s, "yes") != 0) + continue; + + /* + * Only the U-Boot image and it's environment is protected, all + * other sectors are unprotected (unlocked) if flash hardware + * protection is used (CONFIG_SYS_FLASH_PROTECTION) and the + * environment variable "unlock" is set to "yes". + */ + if (flash_info[i].legacy_unlock) { + int k; + /* - * Only the U-Boot image and it's environment - * is protected, all other sectors are - * unprotected (unlocked) if flash hardware - * protection is used (CONFIG_SYS_FLASH_PROTECTION) - * and the environment variable "unlock" is - * set to "yes". + * Disable legacy_unlock temporarily, since + * flash_real_protect would relock all other sectors + * again otherwise. */ - if (flash_info[i].legacy_unlock) { - int k; + flash_info[i].legacy_unlock = 0; - /* - * Disable legacy_unlock temporarily, - * since flash_real_protect would - * relock all other sectors again - * otherwise. - */ - flash_info[i].legacy_unlock = 0; + /* + * Legacy unlocking (e.g. Intel J3) -> unlock only one + * sector. This will unlock all sectors. + */ + flash_real_protect(&flash_info[i], 0, 0); - /* - * Legacy unlocking (e.g. Intel J3) -> - * unlock only one sector. This will - * unlock all sectors. - */ - flash_real_protect(&flash_info[i], 0, 0); + flash_info[i].legacy_unlock = 1; - flash_info[i].legacy_unlock = 1; + /* + * Manually mark other sectors as unlocked (unprotected) + */ + for (k = 1; k < flash_info[i].sector_count; k++) + flash_info[i].protect[k] = 0; - /* - * Manually mark other sectors as - * unlocked (unprotected) - */ - for (k = 1; k < flash_info[i].sector_count; k++) - flash_info[i].protect[k] = 0; - } else { - /* - * No legancy unlocking -> unlock all sectors - */ - flash_protect(FLAG_PROTECT_CLEAR, - flash_info[i].start[0], - flash_info[i].start[0] - + flash_info[i].size - 1, - &flash_info[i]); - } + continue; } + + /* + * No legacy unlocking -> unlock all sectors + */ + flash_protect(FLAG_PROTECT_CLEAR, flash_info[i].start[0], + flash_info[i].start[0] + flash_info[i].size - 1, + &flash_info[i]); #endif /* CONFIG_SYS_FLASH_PROTECTION */ }