1 /* 2 * (C) Copyright 2002-2004 3 * Brad Kemp, Seranoa Networks, Brad.Kemp@seranoa.com 4 * 5 * Copyright (C) 2003 Arabella Software Ltd. 6 * Yuli Barcohen <yuli@arabellasw.com> 7 * 8 * Copyright (C) 2004 9 * Ed Okerson 10 * 11 * Copyright (C) 2006 12 * Tolunay Orkun <listmember@orkun.us> 13 * 14 * See file CREDITS for list of people who contributed to this 15 * project. 16 * 17 * This program is free software; you can redistribute it and/or 18 * modify it under the terms of the GNU General Public License as 19 * published by the Free Software Foundation; either version 2 of 20 * the License, or (at your option) any later version. 21 * 22 * This program is distributed in the hope that it will be useful, 23 * but WITHOUT ANY WARRANTY; without even the implied warranty of 24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 * GNU General Public License for more details. 26 * 27 * You should have received a copy of the GNU General Public License 28 * along with this program; if not, write to the Free Software 29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 30 * MA 02111-1307 USA 31 * 32 */ 33 34 /* The DEBUG define must be before common to enable debugging */ 35 /* #define DEBUG */ 36 37 #include <common.h> 38 #include <asm/processor.h> 39 #include <asm/io.h> 40 #include <asm/byteorder.h> 41 #include <environment.h> 42 #ifdef CFG_FLASH_CFI_DRIVER 43 44 /* 45 * This file implements a Common Flash Interface (CFI) driver for 46 * U-Boot. 47 * 48 * The width of the port and the width of the chips are determined at 49 * initialization. These widths are used to calculate the address for 50 * access CFI data structures. 51 * 52 * References 53 * JEDEC Standard JESD68 - Common Flash Interface (CFI) 54 * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes 55 * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets 56 * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet 57 * AMD CFI Specification, Release 2.0 December 1, 2001 58 * AMD/Spansion Application Note: Migration from Single-byte to Three-byte 59 * Device IDs, Publication Number 25538 Revision A, November 8, 2001 60 * 61 * Define CFG_WRITE_SWAPPED_DATA, if you have to swap the Bytes between 62 * reading and writing ... (yes there is such a Hardware). 63 */ 64 65 #ifndef CFG_FLASH_BANKS_LIST 66 #define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE } 67 #endif 68 69 #define FLASH_CMD_CFI 0x98 70 #define FLASH_CMD_READ_ID 0x90 71 #define FLASH_CMD_RESET 0xff 72 #define FLASH_CMD_BLOCK_ERASE 0x20 73 #define FLASH_CMD_ERASE_CONFIRM 0xD0 74 #define FLASH_CMD_WRITE 0x40 75 #define FLASH_CMD_PROTECT 0x60 76 #define FLASH_CMD_PROTECT_SET 0x01 77 #define FLASH_CMD_PROTECT_CLEAR 0xD0 78 #define FLASH_CMD_CLEAR_STATUS 0x50 79 #define FLASH_CMD_READ_STATUS 0x70 80 #define FLASH_CMD_WRITE_TO_BUFFER 0xE8 81 #define FLASH_CMD_WRITE_BUFFER_PROG 0xE9 82 #define FLASH_CMD_WRITE_BUFFER_CONFIRM 0xD0 83 84 #define FLASH_STATUS_DONE 0x80 85 #define FLASH_STATUS_ESS 0x40 86 #define FLASH_STATUS_ECLBS 0x20 87 #define FLASH_STATUS_PSLBS 0x10 88 #define FLASH_STATUS_VPENS 0x08 89 #define FLASH_STATUS_PSS 0x04 90 #define FLASH_STATUS_DPS 0x02 91 #define FLASH_STATUS_R 0x01 92 #define FLASH_STATUS_PROTECT 0x01 93 94 #define AMD_CMD_RESET 0xF0 95 #define AMD_CMD_WRITE 0xA0 96 #define AMD_CMD_ERASE_START 0x80 97 #define AMD_CMD_ERASE_SECTOR 0x30 98 #define AMD_CMD_UNLOCK_START 0xAA 99 #define AMD_CMD_UNLOCK_ACK 0x55 100 #define AMD_CMD_WRITE_TO_BUFFER 0x25 101 #define AMD_CMD_WRITE_BUFFER_CONFIRM 0x29 102 103 #define AMD_STATUS_TOGGLE 0x40 104 #define AMD_STATUS_ERROR 0x20 105 106 #define FLASH_OFFSET_MANUFACTURER_ID 0x00 107 #define FLASH_OFFSET_DEVICE_ID 0x01 108 #define FLASH_OFFSET_DEVICE_ID2 0x0E 109 #define FLASH_OFFSET_DEVICE_ID3 0x0F 110 #define FLASH_OFFSET_CFI 0x55 111 #define FLASH_OFFSET_CFI_ALT 0x555 112 #define FLASH_OFFSET_CFI_RESP 0x10 113 #define FLASH_OFFSET_PRIMARY_VENDOR 0x13 114 /* extended query table primary address */ 115 #define FLASH_OFFSET_EXT_QUERY_T_P_ADDR 0x15 116 #define FLASH_OFFSET_WTOUT 0x1F 117 #define FLASH_OFFSET_WBTOUT 0x20 118 #define FLASH_OFFSET_ETOUT 0x21 119 #define FLASH_OFFSET_CETOUT 0x22 120 #define FLASH_OFFSET_WMAX_TOUT 0x23 121 #define FLASH_OFFSET_WBMAX_TOUT 0x24 122 #define FLASH_OFFSET_EMAX_TOUT 0x25 123 #define FLASH_OFFSET_CEMAX_TOUT 0x26 124 #define FLASH_OFFSET_SIZE 0x27 125 #define FLASH_OFFSET_INTERFACE 0x28 126 #define FLASH_OFFSET_BUFFER_SIZE 0x2A 127 #define FLASH_OFFSET_NUM_ERASE_REGIONS 0x2C 128 #define FLASH_OFFSET_ERASE_REGIONS 0x2D 129 #define FLASH_OFFSET_PROTECT 0x02 130 #define FLASH_OFFSET_USER_PROTECTION 0x85 131 #define FLASH_OFFSET_INTEL_PROTECTION 0x81 132 133 #define CFI_CMDSET_NONE 0 134 #define CFI_CMDSET_INTEL_EXTENDED 1 135 #define CFI_CMDSET_AMD_STANDARD 2 136 #define CFI_CMDSET_INTEL_STANDARD 3 137 #define CFI_CMDSET_AMD_EXTENDED 4 138 #define CFI_CMDSET_MITSU_STANDARD 256 139 #define CFI_CMDSET_MITSU_EXTENDED 257 140 #define CFI_CMDSET_SST 258 141 #define CFI_CMDSET_INTEL_PROG_REGIONS 512 142 143 #ifdef CFG_FLASH_CFI_AMD_RESET /* needed for STM_ID_29W320DB on UC100 */ 144 # undef FLASH_CMD_RESET 145 # define FLASH_CMD_RESET AMD_CMD_RESET /* use AMD-Reset instead */ 146 #endif 147 148 typedef union { 149 unsigned char c; 150 unsigned short w; 151 unsigned long l; 152 unsigned long long ll; 153 } cfiword_t; 154 155 #define NUM_ERASE_REGIONS 4 /* max. number of erase regions */ 156 157 static uint flash_offset_cfi[2] = { FLASH_OFFSET_CFI, FLASH_OFFSET_CFI_ALT }; 158 159 /* use CFG_MAX_FLASH_BANKS_DETECT if defined */ 160 #ifdef CFG_MAX_FLASH_BANKS_DETECT 161 static ulong bank_base[CFG_MAX_FLASH_BANKS_DETECT] = CFG_FLASH_BANKS_LIST; 162 flash_info_t flash_info[CFG_MAX_FLASH_BANKS_DETECT]; /* FLASH chips info */ 163 #else 164 static ulong bank_base[CFG_MAX_FLASH_BANKS] = CFG_FLASH_BANKS_LIST; 165 flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* FLASH chips info */ 166 #endif 167 168 /* 169 * Check if chip width is defined. If not, start detecting with 8bit. 170 */ 171 #ifndef CFG_FLASH_CFI_WIDTH 172 #define CFG_FLASH_CFI_WIDTH FLASH_CFI_8BIT 173 #endif 174 175 typedef unsigned long flash_sect_t; 176 177 /* CFI standard query structure */ 178 struct cfi_qry { 179 u8 qry[3]; 180 u16 p_id; 181 u16 p_adr; 182 u16 a_id; 183 u16 a_adr; 184 u8 vcc_min; 185 u8 vcc_max; 186 u8 vpp_min; 187 u8 vpp_max; 188 u8 word_write_timeout_typ; 189 u8 buf_write_timeout_typ; 190 u8 block_erase_timeout_typ; 191 u8 chip_erase_timeout_typ; 192 u8 word_write_timeout_max; 193 u8 buf_write_timeout_max; 194 u8 block_erase_timeout_max; 195 u8 chip_erase_timeout_max; 196 u8 dev_size; 197 u16 interface_desc; 198 u16 max_buf_write_size; 199 u8 num_erase_regions; 200 u32 erase_region_info[NUM_ERASE_REGIONS]; 201 } __attribute__((packed)); 202 203 struct cfi_pri_hdr { 204 u8 pri[3]; 205 u8 major_version; 206 u8 minor_version; 207 } __attribute__((packed)); 208 209 static void flash_write8(u8 value, void *addr) 210 { 211 __raw_writeb(value, addr); 212 } 213 214 static void flash_write16(u16 value, void *addr) 215 { 216 __raw_writew(value, addr); 217 } 218 219 static void flash_write32(u32 value, void *addr) 220 { 221 __raw_writel(value, addr); 222 } 223 224 static void flash_write64(u64 value, void *addr) 225 { 226 /* No architectures currently implement __raw_writeq() */ 227 *(volatile u64 *)addr = value; 228 } 229 230 static u8 flash_read8(void *addr) 231 { 232 return __raw_readb(addr); 233 } 234 235 static u16 flash_read16(void *addr) 236 { 237 return __raw_readw(addr); 238 } 239 240 static u32 flash_read32(void *addr) 241 { 242 return __raw_readl(addr); 243 } 244 245 static u64 __flash_read64(void *addr) 246 { 247 /* No architectures currently implement __raw_readq() */ 248 return *(volatile u64 *)addr; 249 } 250 251 u64 flash_read64(void *addr)__attribute__((weak, alias("__flash_read64"))); 252 253 /*----------------------------------------------------------------------- 254 */ 255 #if defined(CFG_ENV_IS_IN_FLASH) || defined(CFG_ENV_ADDR_REDUND) || (CFG_MONITOR_BASE >= CFG_FLASH_BASE) 256 static flash_info_t *flash_get_info(ulong base) 257 { 258 int i; 259 flash_info_t * info = 0; 260 261 for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) { 262 info = & flash_info[i]; 263 if (info->size && info->start[0] <= base && 264 base <= info->start[0] + info->size - 1) 265 break; 266 } 267 268 return i == CFG_MAX_FLASH_BANKS ? 0 : info; 269 } 270 #endif 271 272 unsigned long flash_sector_size(flash_info_t *info, flash_sect_t sect) 273 { 274 if (sect != (info->sector_count - 1)) 275 return info->start[sect + 1] - info->start[sect]; 276 else 277 return info->start[0] + info->size - info->start[sect]; 278 } 279 280 /*----------------------------------------------------------------------- 281 * create an address based on the offset and the port width 282 */ 283 static inline void * 284 flash_map (flash_info_t * info, flash_sect_t sect, uint offset) 285 { 286 unsigned int byte_offset = offset * info->portwidth; 287 288 return map_physmem(info->start[sect] + byte_offset, 289 flash_sector_size(info, sect) - byte_offset, 290 MAP_NOCACHE); 291 } 292 293 static inline void flash_unmap(flash_info_t *info, flash_sect_t sect, 294 unsigned int offset, void *addr) 295 { 296 unsigned int byte_offset = offset * info->portwidth; 297 298 unmap_physmem(addr, flash_sector_size(info, sect) - byte_offset); 299 } 300 301 /*----------------------------------------------------------------------- 302 * make a proper sized command based on the port and chip widths 303 */ 304 static void flash_make_cmd (flash_info_t * info, ulong cmd, void *cmdbuf) 305 { 306 int i; 307 int cword_offset; 308 int cp_offset; 309 uchar val; 310 uchar *cp = (uchar *) cmdbuf; 311 312 for (i = info->portwidth; i > 0; i--){ 313 cword_offset = (info->portwidth-i)%info->chipwidth; 314 #if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA) 315 cp_offset = info->portwidth - i; 316 val = *((uchar*)&cmd + cword_offset); 317 #else 318 cp_offset = i - 1; 319 val = *((uchar*)&cmd + sizeof(ulong) - cword_offset - 1); 320 #endif 321 cp[cp_offset] = (cword_offset >= sizeof(ulong)) ? 0x00 : val; 322 } 323 } 324 325 #ifdef DEBUG 326 /*----------------------------------------------------------------------- 327 * Debug support 328 */ 329 static void print_longlong (char *str, unsigned long long data) 330 { 331 int i; 332 char *cp; 333 334 cp = (unsigned char *) &data; 335 for (i = 0; i < 8; i++) 336 sprintf (&str[i * 2], "%2.2x", *cp++); 337 } 338 339 static void flash_printqry (struct cfi_qry *qry) 340 { 341 u8 *p = (u8 *)qry; 342 int x, y; 343 344 for (x = 0; x < sizeof(struct cfi_qry); x += 16) { 345 debug("%02x : ", x); 346 for (y = 0; y < 16; y++) 347 debug("%2.2x ", p[x + y]); 348 debug(" "); 349 for (y = 0; y < 16; y++) { 350 unsigned char c = p[x + y]; 351 if (c >= 0x20 && c <= 0x7e) 352 debug("%c", c); 353 else 354 debug("."); 355 } 356 debug("\n"); 357 } 358 } 359 #endif 360 361 362 /*----------------------------------------------------------------------- 363 * read a character at a port width address 364 */ 365 static inline uchar flash_read_uchar (flash_info_t * info, uint offset) 366 { 367 uchar *cp; 368 uchar retval; 369 370 cp = flash_map (info, 0, offset); 371 #if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA) 372 retval = flash_read8(cp); 373 #else 374 retval = flash_read8(cp + info->portwidth - 1); 375 #endif 376 flash_unmap (info, 0, offset, cp); 377 return retval; 378 } 379 380 /*----------------------------------------------------------------------- 381 * read a word at a port width address, assume 16bit bus 382 */ 383 static inline ushort flash_read_word (flash_info_t * info, uint offset) 384 { 385 ushort *addr, retval; 386 387 addr = flash_map (info, 0, offset); 388 retval = flash_read16 (addr); 389 flash_unmap (info, 0, offset, addr); 390 return retval; 391 } 392 393 394 /*----------------------------------------------------------------------- 395 * read a long word by picking the least significant byte of each maximum 396 * port size word. Swap for ppc format. 397 */ 398 static ulong flash_read_long (flash_info_t * info, flash_sect_t sect, 399 uint offset) 400 { 401 uchar *addr; 402 ulong retval; 403 404 #ifdef DEBUG 405 int x; 406 #endif 407 addr = flash_map (info, sect, offset); 408 409 #ifdef DEBUG 410 debug ("long addr is at %p info->portwidth = %d\n", addr, 411 info->portwidth); 412 for (x = 0; x < 4 * info->portwidth; x++) { 413 debug ("addr[%x] = 0x%x\n", x, flash_read8(addr + x)); 414 } 415 #endif 416 #if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA) 417 retval = ((flash_read8(addr) << 16) | 418 (flash_read8(addr + info->portwidth) << 24) | 419 (flash_read8(addr + 2 * info->portwidth)) | 420 (flash_read8(addr + 3 * info->portwidth) << 8)); 421 #else 422 retval = ((flash_read8(addr + 2 * info->portwidth - 1) << 24) | 423 (flash_read8(addr + info->portwidth - 1) << 16) | 424 (flash_read8(addr + 4 * info->portwidth - 1) << 8) | 425 (flash_read8(addr + 3 * info->portwidth - 1))); 426 #endif 427 flash_unmap(info, sect, offset, addr); 428 429 return retval; 430 } 431 432 /* 433 * Write a proper sized command to the correct address 434 */ 435 static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, 436 uint offset, ulong cmd) 437 { 438 439 void *addr; 440 cfiword_t cword; 441 442 addr = flash_map (info, sect, offset); 443 flash_make_cmd (info, cmd, &cword); 444 switch (info->portwidth) { 445 case FLASH_CFI_8BIT: 446 debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr, cmd, 447 cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH); 448 flash_write8(cword.c, addr); 449 break; 450 case FLASH_CFI_16BIT: 451 debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr, 452 cmd, cword.w, 453 info->chipwidth << CFI_FLASH_SHIFT_WIDTH); 454 flash_write16(cword.w, addr); 455 break; 456 case FLASH_CFI_32BIT: 457 debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr, 458 cmd, cword.l, 459 info->chipwidth << CFI_FLASH_SHIFT_WIDTH); 460 flash_write32(cword.l, addr); 461 break; 462 case FLASH_CFI_64BIT: 463 #ifdef DEBUG 464 { 465 char str[20]; 466 467 print_longlong (str, cword.ll); 468 469 debug ("fwrite addr %p cmd %x %s 64 bit x %d bit\n", 470 addr, cmd, str, 471 info->chipwidth << CFI_FLASH_SHIFT_WIDTH); 472 } 473 #endif 474 flash_write64(cword.ll, addr); 475 break; 476 } 477 478 /* Ensure all the instructions are fully finished */ 479 sync(); 480 481 flash_unmap(info, sect, offset, addr); 482 } 483 484 static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect) 485 { 486 flash_write_cmd (info, sect, info->addr_unlock1, AMD_CMD_UNLOCK_START); 487 flash_write_cmd (info, sect, info->addr_unlock2, AMD_CMD_UNLOCK_ACK); 488 } 489 490 /*----------------------------------------------------------------------- 491 */ 492 static int flash_isequal (flash_info_t * info, flash_sect_t sect, 493 uint offset, uchar cmd) 494 { 495 void *addr; 496 cfiword_t cword; 497 int retval; 498 499 addr = flash_map (info, sect, offset); 500 flash_make_cmd (info, cmd, &cword); 501 502 debug ("is= cmd %x(%c) addr %p ", cmd, cmd, addr); 503 switch (info->portwidth) { 504 case FLASH_CFI_8BIT: 505 debug ("is= %x %x\n", flash_read8(addr), cword.c); 506 retval = (flash_read8(addr) == cword.c); 507 break; 508 case FLASH_CFI_16BIT: 509 debug ("is= %4.4x %4.4x\n", flash_read16(addr), cword.w); 510 retval = (flash_read16(addr) == cword.w); 511 break; 512 case FLASH_CFI_32BIT: 513 debug ("is= %8.8lx %8.8lx\n", flash_read32(addr), cword.l); 514 retval = (flash_read32(addr) == cword.l); 515 break; 516 case FLASH_CFI_64BIT: 517 #ifdef DEBUG 518 { 519 char str1[20]; 520 char str2[20]; 521 522 print_longlong (str1, flash_read64(addr)); 523 print_longlong (str2, cword.ll); 524 debug ("is= %s %s\n", str1, str2); 525 } 526 #endif 527 retval = (flash_read64(addr) == cword.ll); 528 break; 529 default: 530 retval = 0; 531 break; 532 } 533 flash_unmap(info, sect, offset, addr); 534 535 return retval; 536 } 537 538 /*----------------------------------------------------------------------- 539 */ 540 static int flash_isset (flash_info_t * info, flash_sect_t sect, 541 uint offset, uchar cmd) 542 { 543 void *addr; 544 cfiword_t cword; 545 int retval; 546 547 addr = flash_map (info, sect, offset); 548 flash_make_cmd (info, cmd, &cword); 549 switch (info->portwidth) { 550 case FLASH_CFI_8BIT: 551 retval = ((flash_read8(addr) & cword.c) == cword.c); 552 break; 553 case FLASH_CFI_16BIT: 554 retval = ((flash_read16(addr) & cword.w) == cword.w); 555 break; 556 case FLASH_CFI_32BIT: 557 retval = ((flash_read32(addr) & cword.l) == cword.l); 558 break; 559 case FLASH_CFI_64BIT: 560 retval = ((flash_read64(addr) & cword.ll) == cword.ll); 561 break; 562 default: 563 retval = 0; 564 break; 565 } 566 flash_unmap(info, sect, offset, addr); 567 568 return retval; 569 } 570 571 /*----------------------------------------------------------------------- 572 */ 573 static int flash_toggle (flash_info_t * info, flash_sect_t sect, 574 uint offset, uchar cmd) 575 { 576 void *addr; 577 cfiword_t cword; 578 int retval; 579 580 addr = flash_map (info, sect, offset); 581 flash_make_cmd (info, cmd, &cword); 582 switch (info->portwidth) { 583 case FLASH_CFI_8BIT: 584 retval = ((flash_read8(addr) & cword.c) != 585 (flash_read8(addr) & cword.c)); 586 break; 587 case FLASH_CFI_16BIT: 588 retval = ((flash_read16(addr) & cword.w) != 589 (flash_read16(addr) & cword.w)); 590 break; 591 case FLASH_CFI_32BIT: 592 retval = ((flash_read32(addr) & cword.l) != 593 (flash_read32(addr) & cword.l)); 594 break; 595 case FLASH_CFI_64BIT: 596 retval = ((flash_read64(addr) & cword.ll) != 597 (flash_read64(addr) & cword.ll)); 598 break; 599 default: 600 retval = 0; 601 break; 602 } 603 flash_unmap(info, sect, offset, addr); 604 605 return retval; 606 } 607 608 /* 609 * flash_is_busy - check to see if the flash is busy 610 * 611 * This routine checks the status of the chip and returns true if the 612 * chip is busy. 613 */ 614 static int flash_is_busy (flash_info_t * info, flash_sect_t sect) 615 { 616 int retval; 617 618 switch (info->vendor) { 619 case CFI_CMDSET_INTEL_PROG_REGIONS: 620 case CFI_CMDSET_INTEL_STANDARD: 621 case CFI_CMDSET_INTEL_EXTENDED: 622 retval = !flash_isset (info, sect, 0, FLASH_STATUS_DONE); 623 break; 624 case CFI_CMDSET_AMD_STANDARD: 625 case CFI_CMDSET_AMD_EXTENDED: 626 #ifdef CONFIG_FLASH_CFI_LEGACY 627 case CFI_CMDSET_AMD_LEGACY: 628 #endif 629 retval = flash_toggle (info, sect, 0, AMD_STATUS_TOGGLE); 630 break; 631 default: 632 retval = 0; 633 } 634 debug ("flash_is_busy: %d\n", retval); 635 return retval; 636 } 637 638 /*----------------------------------------------------------------------- 639 * wait for XSR.7 to be set. Time out with an error if it does not. 640 * This routine does not set the flash to read-array mode. 641 */ 642 static int flash_status_check (flash_info_t * info, flash_sect_t sector, 643 ulong tout, char *prompt) 644 { 645 ulong start; 646 647 #if CFG_HZ != 1000 648 tout *= CFG_HZ/1000; 649 #endif 650 651 /* Wait for command completion */ 652 start = get_timer (0); 653 while (flash_is_busy (info, sector)) { 654 if (get_timer (start) > tout) { 655 printf ("Flash %s timeout at address %lx data %lx\n", 656 prompt, info->start[sector], 657 flash_read_long (info, sector, 0)); 658 flash_write_cmd (info, sector, 0, info->cmd_reset); 659 return ERR_TIMOUT; 660 } 661 udelay (1); /* also triggers watchdog */ 662 } 663 return ERR_OK; 664 } 665 666 /*----------------------------------------------------------------------- 667 * Wait for XSR.7 to be set, if it times out print an error, otherwise 668 * do a full status check. 669 * 670 * This routine sets the flash to read-array mode. 671 */ 672 static int flash_full_status_check (flash_info_t * info, flash_sect_t sector, 673 ulong tout, char *prompt) 674 { 675 int retcode; 676 677 retcode = flash_status_check (info, sector, tout, prompt); 678 switch (info->vendor) { 679 case CFI_CMDSET_INTEL_PROG_REGIONS: 680 case CFI_CMDSET_INTEL_EXTENDED: 681 case CFI_CMDSET_INTEL_STANDARD: 682 if ((retcode == ERR_OK) 683 && !flash_isequal (info, sector, 0, FLASH_STATUS_DONE)) { 684 retcode = ERR_INVAL; 685 printf ("Flash %s error at address %lx\n", prompt, 686 info->start[sector]); 687 if (flash_isset (info, sector, 0, FLASH_STATUS_ECLBS | 688 FLASH_STATUS_PSLBS)) { 689 puts ("Command Sequence Error.\n"); 690 } else if (flash_isset (info, sector, 0, 691 FLASH_STATUS_ECLBS)) { 692 puts ("Block Erase Error.\n"); 693 retcode = ERR_NOT_ERASED; 694 } else if (flash_isset (info, sector, 0, 695 FLASH_STATUS_PSLBS)) { 696 puts ("Locking Error\n"); 697 } 698 if (flash_isset (info, sector, 0, FLASH_STATUS_DPS)) { 699 puts ("Block locked.\n"); 700 retcode = ERR_PROTECTED; 701 } 702 if (flash_isset (info, sector, 0, FLASH_STATUS_VPENS)) 703 puts ("Vpp Low Error.\n"); 704 } 705 flash_write_cmd (info, sector, 0, info->cmd_reset); 706 break; 707 default: 708 break; 709 } 710 return retcode; 711 } 712 713 /*----------------------------------------------------------------------- 714 */ 715 static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c) 716 { 717 #if defined(__LITTLE_ENDIAN) && !defined(CFG_WRITE_SWAPPED_DATA) 718 unsigned short w; 719 unsigned int l; 720 unsigned long long ll; 721 #endif 722 723 switch (info->portwidth) { 724 case FLASH_CFI_8BIT: 725 cword->c = c; 726 break; 727 case FLASH_CFI_16BIT: 728 #if defined(__LITTLE_ENDIAN) && !defined(CFG_WRITE_SWAPPED_DATA) 729 w = c; 730 w <<= 8; 731 cword->w = (cword->w >> 8) | w; 732 #else 733 cword->w = (cword->w << 8) | c; 734 #endif 735 break; 736 case FLASH_CFI_32BIT: 737 #if defined(__LITTLE_ENDIAN) && !defined(CFG_WRITE_SWAPPED_DATA) 738 l = c; 739 l <<= 24; 740 cword->l = (cword->l >> 8) | l; 741 #else 742 cword->l = (cword->l << 8) | c; 743 #endif 744 break; 745 case FLASH_CFI_64BIT: 746 #if defined(__LITTLE_ENDIAN) && !defined(CFG_WRITE_SWAPPED_DATA) 747 ll = c; 748 ll <<= 56; 749 cword->ll = (cword->ll >> 8) | ll; 750 #else 751 cword->ll = (cword->ll << 8) | c; 752 #endif 753 break; 754 } 755 } 756 757 /* loop through the sectors from the highest address when the passed 758 * address is greater or equal to the sector address we have a match 759 */ 760 static flash_sect_t find_sector (flash_info_t * info, ulong addr) 761 { 762 flash_sect_t sector; 763 764 for (sector = info->sector_count - 1; sector >= 0; sector--) { 765 if (addr >= info->start[sector]) 766 break; 767 } 768 return sector; 769 } 770 771 /*----------------------------------------------------------------------- 772 */ 773 static int flash_write_cfiword (flash_info_t * info, ulong dest, 774 cfiword_t cword) 775 { 776 void *dstaddr; 777 int flag; 778 779 dstaddr = map_physmem(dest, info->portwidth, MAP_NOCACHE); 780 781 /* Check if Flash is (sufficiently) erased */ 782 switch (info->portwidth) { 783 case FLASH_CFI_8BIT: 784 flag = ((flash_read8(dstaddr) & cword.c) == cword.c); 785 break; 786 case FLASH_CFI_16BIT: 787 flag = ((flash_read16(dstaddr) & cword.w) == cword.w); 788 break; 789 case FLASH_CFI_32BIT: 790 flag = ((flash_read32(dstaddr) & cword.l) == cword.l); 791 break; 792 case FLASH_CFI_64BIT: 793 flag = ((flash_read64(dstaddr) & cword.ll) == cword.ll); 794 break; 795 default: 796 flag = 0; 797 break; 798 } 799 if (!flag) { 800 unmap_physmem(dstaddr, info->portwidth); 801 return ERR_NOT_ERASED; 802 } 803 804 /* Disable interrupts which might cause a timeout here */ 805 flag = disable_interrupts (); 806 807 switch (info->vendor) { 808 case CFI_CMDSET_INTEL_PROG_REGIONS: 809 case CFI_CMDSET_INTEL_EXTENDED: 810 case CFI_CMDSET_INTEL_STANDARD: 811 flash_write_cmd (info, 0, 0, FLASH_CMD_CLEAR_STATUS); 812 flash_write_cmd (info, 0, 0, FLASH_CMD_WRITE); 813 break; 814 case CFI_CMDSET_AMD_EXTENDED: 815 case CFI_CMDSET_AMD_STANDARD: 816 #ifdef CONFIG_FLASH_CFI_LEGACY 817 case CFI_CMDSET_AMD_LEGACY: 818 #endif 819 flash_unlock_seq (info, 0); 820 flash_write_cmd (info, 0, info->addr_unlock1, AMD_CMD_WRITE); 821 break; 822 } 823 824 switch (info->portwidth) { 825 case FLASH_CFI_8BIT: 826 flash_write8(cword.c, dstaddr); 827 break; 828 case FLASH_CFI_16BIT: 829 flash_write16(cword.w, dstaddr); 830 break; 831 case FLASH_CFI_32BIT: 832 flash_write32(cword.l, dstaddr); 833 break; 834 case FLASH_CFI_64BIT: 835 flash_write64(cword.ll, dstaddr); 836 break; 837 } 838 839 /* re-enable interrupts if necessary */ 840 if (flag) 841 enable_interrupts (); 842 843 unmap_physmem(dstaddr, info->portwidth); 844 845 return flash_full_status_check (info, find_sector (info, dest), 846 info->write_tout, "write"); 847 } 848 849 #ifdef CFG_FLASH_USE_BUFFER_WRITE 850 851 static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp, 852 int len) 853 { 854 flash_sect_t sector; 855 int cnt; 856 int retcode; 857 void *src = cp; 858 void *dst = map_physmem(dest, len, MAP_NOCACHE); 859 void *dst2 = dst; 860 int flag = 0; 861 uint offset = 0; 862 unsigned int shift; 863 uchar write_cmd; 864 865 switch (info->portwidth) { 866 case FLASH_CFI_8BIT: 867 shift = 0; 868 break; 869 case FLASH_CFI_16BIT: 870 shift = 1; 871 break; 872 case FLASH_CFI_32BIT: 873 shift = 2; 874 break; 875 case FLASH_CFI_64BIT: 876 shift = 3; 877 break; 878 default: 879 retcode = ERR_INVAL; 880 goto out_unmap; 881 } 882 883 cnt = len >> shift; 884 885 while ((cnt-- > 0) && (flag == 0)) { 886 switch (info->portwidth) { 887 case FLASH_CFI_8BIT: 888 flag = ((flash_read8(dst2) & flash_read8(src)) == 889 flash_read8(src)); 890 src += 1, dst2 += 1; 891 break; 892 case FLASH_CFI_16BIT: 893 flag = ((flash_read16(dst2) & flash_read16(src)) == 894 flash_read16(src)); 895 src += 2, dst2 += 2; 896 break; 897 case FLASH_CFI_32BIT: 898 flag = ((flash_read32(dst2) & flash_read32(src)) == 899 flash_read32(src)); 900 src += 4, dst2 += 4; 901 break; 902 case FLASH_CFI_64BIT: 903 flag = ((flash_read64(dst2) & flash_read64(src)) == 904 flash_read64(src)); 905 src += 8, dst2 += 8; 906 break; 907 } 908 } 909 if (!flag) { 910 retcode = ERR_NOT_ERASED; 911 goto out_unmap; 912 } 913 914 src = cp; 915 sector = find_sector (info, dest); 916 917 switch (info->vendor) { 918 case CFI_CMDSET_INTEL_PROG_REGIONS: 919 case CFI_CMDSET_INTEL_STANDARD: 920 case CFI_CMDSET_INTEL_EXTENDED: 921 write_cmd = (info->vendor == CFI_CMDSET_INTEL_PROG_REGIONS) ? 922 FLASH_CMD_WRITE_BUFFER_PROG : FLASH_CMD_WRITE_TO_BUFFER; 923 flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS); 924 flash_write_cmd (info, sector, 0, FLASH_CMD_READ_STATUS); 925 flash_write_cmd (info, sector, 0, write_cmd); 926 retcode = flash_status_check (info, sector, 927 info->buffer_write_tout, 928 "write to buffer"); 929 if (retcode == ERR_OK) { 930 /* reduce the number of loops by the width of 931 * the port */ 932 cnt = len >> shift; 933 flash_write_cmd (info, sector, 0, cnt - 1); 934 while (cnt-- > 0) { 935 switch (info->portwidth) { 936 case FLASH_CFI_8BIT: 937 flash_write8(flash_read8(src), dst); 938 src += 1, dst += 1; 939 break; 940 case FLASH_CFI_16BIT: 941 flash_write16(flash_read16(src), dst); 942 src += 2, dst += 2; 943 break; 944 case FLASH_CFI_32BIT: 945 flash_write32(flash_read32(src), dst); 946 src += 4, dst += 4; 947 break; 948 case FLASH_CFI_64BIT: 949 flash_write64(flash_read64(src), dst); 950 src += 8, dst += 8; 951 break; 952 default: 953 retcode = ERR_INVAL; 954 goto out_unmap; 955 } 956 } 957 flash_write_cmd (info, sector, 0, 958 FLASH_CMD_WRITE_BUFFER_CONFIRM); 959 retcode = flash_full_status_check ( 960 info, sector, info->buffer_write_tout, 961 "buffer write"); 962 } 963 964 break; 965 966 case CFI_CMDSET_AMD_STANDARD: 967 case CFI_CMDSET_AMD_EXTENDED: 968 flash_unlock_seq(info,0); 969 970 #ifdef CONFIG_FLASH_SPANSION_S29WS_N 971 offset = ((unsigned long)dst - info->start[sector]) >> shift; 972 #endif 973 flash_write_cmd(info, sector, offset, AMD_CMD_WRITE_TO_BUFFER); 974 cnt = len >> shift; 975 flash_write_cmd(info, sector, offset, (uchar)cnt - 1); 976 977 switch (info->portwidth) { 978 case FLASH_CFI_8BIT: 979 while (cnt-- > 0) { 980 flash_write8(flash_read8(src), dst); 981 src += 1, dst += 1; 982 } 983 break; 984 case FLASH_CFI_16BIT: 985 while (cnt-- > 0) { 986 flash_write16(flash_read16(src), dst); 987 src += 2, dst += 2; 988 } 989 break; 990 case FLASH_CFI_32BIT: 991 while (cnt-- > 0) { 992 flash_write32(flash_read32(src), dst); 993 src += 4, dst += 4; 994 } 995 break; 996 case FLASH_CFI_64BIT: 997 while (cnt-- > 0) { 998 flash_write64(flash_read64(src), dst); 999 src += 8, dst += 8; 1000 } 1001 break; 1002 default: 1003 retcode = ERR_INVAL; 1004 goto out_unmap; 1005 } 1006 1007 flash_write_cmd (info, sector, 0, AMD_CMD_WRITE_BUFFER_CONFIRM); 1008 retcode = flash_full_status_check (info, sector, 1009 info->buffer_write_tout, 1010 "buffer write"); 1011 break; 1012 1013 default: 1014 debug ("Unknown Command Set\n"); 1015 retcode = ERR_INVAL; 1016 break; 1017 } 1018 1019 out_unmap: 1020 unmap_physmem(dst, len); 1021 return retcode; 1022 } 1023 #endif /* CFG_FLASH_USE_BUFFER_WRITE */ 1024 1025 1026 /*----------------------------------------------------------------------- 1027 */ 1028 int flash_erase (flash_info_t * info, int s_first, int s_last) 1029 { 1030 int rcode = 0; 1031 int prot; 1032 flash_sect_t sect; 1033 1034 if (info->flash_id != FLASH_MAN_CFI) { 1035 puts ("Can't erase unknown flash type - aborted\n"); 1036 return 1; 1037 } 1038 if ((s_first < 0) || (s_first > s_last)) { 1039 puts ("- no sectors to erase\n"); 1040 return 1; 1041 } 1042 1043 prot = 0; 1044 for (sect = s_first; sect <= s_last; ++sect) { 1045 if (info->protect[sect]) { 1046 prot++; 1047 } 1048 } 1049 if (prot) { 1050 printf ("- Warning: %d protected sectors will not be erased!\n", 1051 prot); 1052 } else { 1053 putc ('\n'); 1054 } 1055 1056 1057 for (sect = s_first; sect <= s_last; sect++) { 1058 if (info->protect[sect] == 0) { /* not protected */ 1059 switch (info->vendor) { 1060 case CFI_CMDSET_INTEL_PROG_REGIONS: 1061 case CFI_CMDSET_INTEL_STANDARD: 1062 case CFI_CMDSET_INTEL_EXTENDED: 1063 flash_write_cmd (info, sect, 0, 1064 FLASH_CMD_CLEAR_STATUS); 1065 flash_write_cmd (info, sect, 0, 1066 FLASH_CMD_BLOCK_ERASE); 1067 flash_write_cmd (info, sect, 0, 1068 FLASH_CMD_ERASE_CONFIRM); 1069 break; 1070 case CFI_CMDSET_AMD_STANDARD: 1071 case CFI_CMDSET_AMD_EXTENDED: 1072 flash_unlock_seq (info, sect); 1073 flash_write_cmd (info, sect, 1074 info->addr_unlock1, 1075 AMD_CMD_ERASE_START); 1076 flash_unlock_seq (info, sect); 1077 flash_write_cmd (info, sect, 0, 1078 AMD_CMD_ERASE_SECTOR); 1079 break; 1080 #ifdef CONFIG_FLASH_CFI_LEGACY 1081 case CFI_CMDSET_AMD_LEGACY: 1082 flash_unlock_seq (info, 0); 1083 flash_write_cmd (info, 0, info->addr_unlock1, 1084 AMD_CMD_ERASE_START); 1085 flash_unlock_seq (info, 0); 1086 flash_write_cmd (info, sect, 0, 1087 AMD_CMD_ERASE_SECTOR); 1088 break; 1089 #endif 1090 default: 1091 debug ("Unkown flash vendor %d\n", 1092 info->vendor); 1093 break; 1094 } 1095 1096 if (flash_full_status_check 1097 (info, sect, info->erase_blk_tout, "erase")) { 1098 rcode = 1; 1099 } else 1100 putc ('.'); 1101 } 1102 } 1103 puts (" done\n"); 1104 return rcode; 1105 } 1106 1107 /*----------------------------------------------------------------------- 1108 */ 1109 void flash_print_info (flash_info_t * info) 1110 { 1111 int i; 1112 1113 if (info->flash_id != FLASH_MAN_CFI) { 1114 puts ("missing or unknown FLASH type\n"); 1115 return; 1116 } 1117 1118 printf ("%s FLASH (%d x %d)", 1119 info->name, 1120 (info->portwidth << 3), (info->chipwidth << 3)); 1121 if (info->size < 1024*1024) 1122 printf (" Size: %ld kB in %d Sectors\n", 1123 info->size >> 10, info->sector_count); 1124 else 1125 printf (" Size: %ld MB in %d Sectors\n", 1126 info->size >> 20, info->sector_count); 1127 printf (" "); 1128 switch (info->vendor) { 1129 case CFI_CMDSET_INTEL_PROG_REGIONS: 1130 printf ("Intel Prog Regions"); 1131 break; 1132 case CFI_CMDSET_INTEL_STANDARD: 1133 printf ("Intel Standard"); 1134 break; 1135 case CFI_CMDSET_INTEL_EXTENDED: 1136 printf ("Intel Extended"); 1137 break; 1138 case CFI_CMDSET_AMD_STANDARD: 1139 printf ("AMD Standard"); 1140 break; 1141 case CFI_CMDSET_AMD_EXTENDED: 1142 printf ("AMD Extended"); 1143 break; 1144 #ifdef CONFIG_FLASH_CFI_LEGACY 1145 case CFI_CMDSET_AMD_LEGACY: 1146 printf ("AMD Legacy"); 1147 break; 1148 #endif 1149 default: 1150 printf ("Unknown (%d)", info->vendor); 1151 break; 1152 } 1153 printf (" command set, Manufacturer ID: 0x%02X, Device ID: 0x%02X", 1154 info->manufacturer_id, info->device_id); 1155 if (info->device_id == 0x7E) { 1156 printf("%04X", info->device_id2); 1157 } 1158 printf ("\n Erase timeout: %ld ms, write timeout: %ld ms\n", 1159 info->erase_blk_tout, 1160 info->write_tout); 1161 if (info->buffer_size > 1) { 1162 printf (" Buffer write timeout: %ld ms, " 1163 "buffer size: %d bytes\n", 1164 info->buffer_write_tout, 1165 info->buffer_size); 1166 } 1167 1168 puts ("\n Sector Start Addresses:"); 1169 for (i = 0; i < info->sector_count; ++i) { 1170 if ((i % 5) == 0) 1171 printf ("\n"); 1172 #ifdef CFG_FLASH_EMPTY_INFO 1173 int k; 1174 int size; 1175 int erased; 1176 volatile unsigned long *flash; 1177 1178 /* 1179 * Check if whole sector is erased 1180 */ 1181 size = flash_sector_size(info, i); 1182 erased = 1; 1183 flash = (volatile unsigned long *) info->start[i]; 1184 size = size >> 2; /* divide by 4 for longword access */ 1185 for (k = 0; k < size; k++) { 1186 if (*flash++ != 0xffffffff) { 1187 erased = 0; 1188 break; 1189 } 1190 } 1191 1192 /* print empty and read-only info */ 1193 printf (" %08lX %c %s ", 1194 info->start[i], 1195 erased ? 'E' : ' ', 1196 info->protect[i] ? "RO" : " "); 1197 #else /* ! CFG_FLASH_EMPTY_INFO */ 1198 printf (" %08lX %s ", 1199 info->start[i], 1200 info->protect[i] ? "RO" : " "); 1201 #endif 1202 } 1203 putc ('\n'); 1204 return; 1205 } 1206 1207 /*----------------------------------------------------------------------- 1208 * This is used in a few places in write_buf() to show programming 1209 * progress. Making it a function is nasty because it needs to do side 1210 * effect updates to digit and dots. Repeated code is nasty too, so 1211 * we define it once here. 1212 */ 1213 #ifdef CONFIG_FLASH_SHOW_PROGRESS 1214 #define FLASH_SHOW_PROGRESS(scale, dots, digit, dots_sub) \ 1215 dots -= dots_sub; \ 1216 if ((scale > 0) && (dots <= 0)) { \ 1217 if ((digit % 5) == 0) \ 1218 printf ("%d", digit / 5); \ 1219 else \ 1220 putc ('.'); \ 1221 digit--; \ 1222 dots += scale; \ 1223 } 1224 #else 1225 #define FLASH_SHOW_PROGRESS(scale, dots, digit, dots_sub) 1226 #endif 1227 1228 /*----------------------------------------------------------------------- 1229 * Copy memory to flash, returns: 1230 * 0 - OK 1231 * 1 - write timeout 1232 * 2 - Flash not erased 1233 */ 1234 int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt) 1235 { 1236 ulong wp; 1237 uchar *p; 1238 int aln; 1239 cfiword_t cword; 1240 int i, rc; 1241 #ifdef CFG_FLASH_USE_BUFFER_WRITE 1242 int buffered_size; 1243 #endif 1244 #ifdef CONFIG_FLASH_SHOW_PROGRESS 1245 int digit = CONFIG_FLASH_SHOW_PROGRESS; 1246 int scale = 0; 1247 int dots = 0; 1248 1249 /* 1250 * Suppress if there are fewer than CONFIG_FLASH_SHOW_PROGRESS writes. 1251 */ 1252 if (cnt >= CONFIG_FLASH_SHOW_PROGRESS) { 1253 scale = (int)((cnt + CONFIG_FLASH_SHOW_PROGRESS - 1) / 1254 CONFIG_FLASH_SHOW_PROGRESS); 1255 } 1256 #endif 1257 1258 /* get lower aligned address */ 1259 wp = (addr & ~(info->portwidth - 1)); 1260 1261 /* handle unaligned start */ 1262 if ((aln = addr - wp) != 0) { 1263 cword.l = 0; 1264 p = map_physmem(wp, info->portwidth, MAP_NOCACHE); 1265 for (i = 0; i < aln; ++i) 1266 flash_add_byte (info, &cword, flash_read8(p + i)); 1267 1268 for (; (i < info->portwidth) && (cnt > 0); i++) { 1269 flash_add_byte (info, &cword, *src++); 1270 cnt--; 1271 } 1272 for (; (cnt == 0) && (i < info->portwidth); ++i) 1273 flash_add_byte (info, &cword, flash_read8(p + i)); 1274 1275 rc = flash_write_cfiword (info, wp, cword); 1276 unmap_physmem(p, info->portwidth); 1277 if (rc != 0) 1278 return rc; 1279 1280 wp += i; 1281 FLASH_SHOW_PROGRESS(scale, dots, digit, i); 1282 } 1283 1284 /* handle the aligned part */ 1285 #ifdef CFG_FLASH_USE_BUFFER_WRITE 1286 buffered_size = (info->portwidth / info->chipwidth); 1287 buffered_size *= info->buffer_size; 1288 while (cnt >= info->portwidth) { 1289 /* prohibit buffer write when buffer_size is 1 */ 1290 if (info->buffer_size == 1) { 1291 cword.l = 0; 1292 for (i = 0; i < info->portwidth; i++) 1293 flash_add_byte (info, &cword, *src++); 1294 if ((rc = flash_write_cfiword (info, wp, cword)) != 0) 1295 return rc; 1296 wp += info->portwidth; 1297 cnt -= info->portwidth; 1298 continue; 1299 } 1300 1301 /* write buffer until next buffered_size aligned boundary */ 1302 i = buffered_size - (wp % buffered_size); 1303 if (i > cnt) 1304 i = cnt; 1305 if ((rc = flash_write_cfibuffer (info, wp, src, i)) != ERR_OK) 1306 return rc; 1307 i -= i & (info->portwidth - 1); 1308 wp += i; 1309 src += i; 1310 cnt -= i; 1311 FLASH_SHOW_PROGRESS(scale, dots, digit, i); 1312 } 1313 #else 1314 while (cnt >= info->portwidth) { 1315 cword.l = 0; 1316 for (i = 0; i < info->portwidth; i++) { 1317 flash_add_byte (info, &cword, *src++); 1318 } 1319 if ((rc = flash_write_cfiword (info, wp, cword)) != 0) 1320 return rc; 1321 wp += info->portwidth; 1322 cnt -= info->portwidth; 1323 FLASH_SHOW_PROGRESS(scale, dots, digit, info->portwidth); 1324 } 1325 #endif /* CFG_FLASH_USE_BUFFER_WRITE */ 1326 1327 if (cnt == 0) { 1328 return (0); 1329 } 1330 1331 /* 1332 * handle unaligned tail bytes 1333 */ 1334 cword.l = 0; 1335 p = map_physmem(wp, info->portwidth, MAP_NOCACHE); 1336 for (i = 0; (i < info->portwidth) && (cnt > 0); ++i) { 1337 flash_add_byte (info, &cword, *src++); 1338 --cnt; 1339 } 1340 for (; i < info->portwidth; ++i) 1341 flash_add_byte (info, &cword, flash_read8(p + i)); 1342 unmap_physmem(p, info->portwidth); 1343 1344 return flash_write_cfiword (info, wp, cword); 1345 } 1346 1347 /*----------------------------------------------------------------------- 1348 */ 1349 #ifdef CFG_FLASH_PROTECTION 1350 1351 int flash_real_protect (flash_info_t * info, long sector, int prot) 1352 { 1353 int retcode = 0; 1354 1355 flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS); 1356 flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT); 1357 if (prot) 1358 flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_SET); 1359 else 1360 flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_CLEAR); 1361 1362 if ((retcode = 1363 flash_full_status_check (info, sector, info->erase_blk_tout, 1364 prot ? "protect" : "unprotect")) == 0) { 1365 1366 info->protect[sector] = prot; 1367 1368 /* 1369 * On some of Intel's flash chips (marked via legacy_unlock) 1370 * unprotect unprotects all locking. 1371 */ 1372 if ((prot == 0) && (info->legacy_unlock)) { 1373 flash_sect_t i; 1374 1375 for (i = 0; i < info->sector_count; i++) { 1376 if (info->protect[i]) 1377 flash_real_protect (info, i, 1); 1378 } 1379 } 1380 } 1381 return retcode; 1382 } 1383 1384 /*----------------------------------------------------------------------- 1385 * flash_read_user_serial - read the OneTimeProgramming cells 1386 */ 1387 void flash_read_user_serial (flash_info_t * info, void *buffer, int offset, 1388 int len) 1389 { 1390 uchar *src; 1391 uchar *dst; 1392 1393 dst = buffer; 1394 src = flash_map (info, 0, FLASH_OFFSET_USER_PROTECTION); 1395 flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID); 1396 memcpy (dst, src + offset, len); 1397 flash_write_cmd (info, 0, 0, info->cmd_reset); 1398 flash_unmap(info, 0, FLASH_OFFSET_USER_PROTECTION, src); 1399 } 1400 1401 /* 1402 * flash_read_factory_serial - read the device Id from the protection area 1403 */ 1404 void flash_read_factory_serial (flash_info_t * info, void *buffer, int offset, 1405 int len) 1406 { 1407 uchar *src; 1408 1409 src = flash_map (info, 0, FLASH_OFFSET_INTEL_PROTECTION); 1410 flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID); 1411 memcpy (buffer, src + offset, len); 1412 flash_write_cmd (info, 0, 0, info->cmd_reset); 1413 flash_unmap(info, 0, FLASH_OFFSET_INTEL_PROTECTION, src); 1414 } 1415 1416 #endif /* CFG_FLASH_PROTECTION */ 1417 1418 /*----------------------------------------------------------------------- 1419 * Reverse the order of the erase regions in the CFI QRY structure. 1420 * This is needed for chips that are either a) correctly detected as 1421 * top-boot, or b) buggy. 1422 */ 1423 static void cfi_reverse_geometry(struct cfi_qry *qry) 1424 { 1425 unsigned int i, j; 1426 u32 tmp; 1427 1428 for (i = 0, j = qry->num_erase_regions - 1; i < j; i++, j--) { 1429 tmp = qry->erase_region_info[i]; 1430 qry->erase_region_info[i] = qry->erase_region_info[j]; 1431 qry->erase_region_info[j] = tmp; 1432 } 1433 } 1434 1435 /*----------------------------------------------------------------------- 1436 * read jedec ids from device and set corresponding fields in info struct 1437 * 1438 * Note: assume cfi->vendor, cfi->portwidth and cfi->chipwidth are correct 1439 * 1440 */ 1441 static void cmdset_intel_read_jedec_ids(flash_info_t *info) 1442 { 1443 flash_write_cmd(info, 0, 0, FLASH_CMD_RESET); 1444 flash_write_cmd(info, 0, 0, FLASH_CMD_READ_ID); 1445 udelay(1000); /* some flash are slow to respond */ 1446 info->manufacturer_id = flash_read_uchar (info, 1447 FLASH_OFFSET_MANUFACTURER_ID); 1448 info->device_id = flash_read_uchar (info, 1449 FLASH_OFFSET_DEVICE_ID); 1450 flash_write_cmd(info, 0, 0, FLASH_CMD_RESET); 1451 } 1452 1453 static int cmdset_intel_init(flash_info_t *info, struct cfi_qry *qry) 1454 { 1455 info->cmd_reset = FLASH_CMD_RESET; 1456 1457 cmdset_intel_read_jedec_ids(info); 1458 flash_write_cmd(info, 0, info->cfi_offset, FLASH_CMD_CFI); 1459 1460 #ifdef CFG_FLASH_PROTECTION 1461 /* read legacy lock/unlock bit from intel flash */ 1462 if (info->ext_addr) { 1463 info->legacy_unlock = flash_read_uchar (info, 1464 info->ext_addr + 5) & 0x08; 1465 } 1466 #endif 1467 1468 return 0; 1469 } 1470 1471 static void cmdset_amd_read_jedec_ids(flash_info_t *info) 1472 { 1473 flash_write_cmd(info, 0, 0, AMD_CMD_RESET); 1474 flash_unlock_seq(info, 0); 1475 flash_write_cmd(info, 0, info->addr_unlock1, FLASH_CMD_READ_ID); 1476 udelay(1000); /* some flash are slow to respond */ 1477 1478 info->manufacturer_id = flash_read_uchar (info, 1479 FLASH_OFFSET_MANUFACTURER_ID); 1480 1481 switch (info->chipwidth){ 1482 case FLASH_CFI_8BIT: 1483 info->device_id = flash_read_uchar (info, 1484 FLASH_OFFSET_DEVICE_ID); 1485 if (info->device_id == 0x7E) { 1486 /* AMD 3-byte (expanded) device ids */ 1487 info->device_id2 = flash_read_uchar (info, 1488 FLASH_OFFSET_DEVICE_ID2); 1489 info->device_id2 <<= 8; 1490 info->device_id2 |= flash_read_uchar (info, 1491 FLASH_OFFSET_DEVICE_ID3); 1492 } 1493 break; 1494 case FLASH_CFI_16BIT: 1495 info->device_id = flash_read_word (info, 1496 FLASH_OFFSET_DEVICE_ID); 1497 break; 1498 default: 1499 break; 1500 } 1501 flash_write_cmd(info, 0, 0, AMD_CMD_RESET); 1502 } 1503 1504 static int cmdset_amd_init(flash_info_t *info, struct cfi_qry *qry) 1505 { 1506 info->cmd_reset = AMD_CMD_RESET; 1507 1508 cmdset_amd_read_jedec_ids(info); 1509 flash_write_cmd(info, 0, info->cfi_offset, FLASH_CMD_CFI); 1510 1511 return 0; 1512 } 1513 1514 #ifdef CONFIG_FLASH_CFI_LEGACY 1515 static void flash_read_jedec_ids (flash_info_t * info) 1516 { 1517 info->manufacturer_id = 0; 1518 info->device_id = 0; 1519 info->device_id2 = 0; 1520 1521 switch (info->vendor) { 1522 case CFI_CMDSET_INTEL_PROG_REGIONS: 1523 case CFI_CMDSET_INTEL_STANDARD: 1524 case CFI_CMDSET_INTEL_EXTENDED: 1525 cmdset_intel_read_jedec_ids(info); 1526 break; 1527 case CFI_CMDSET_AMD_STANDARD: 1528 case CFI_CMDSET_AMD_EXTENDED: 1529 cmdset_amd_read_jedec_ids(info); 1530 break; 1531 default: 1532 break; 1533 } 1534 } 1535 1536 /*----------------------------------------------------------------------- 1537 * Call board code to request info about non-CFI flash. 1538 * board_flash_get_legacy needs to fill in at least: 1539 * info->portwidth, info->chipwidth and info->interface for Jedec probing. 1540 */ 1541 static int flash_detect_legacy(ulong base, int banknum) 1542 { 1543 flash_info_t *info = &flash_info[banknum]; 1544 1545 if (board_flash_get_legacy(base, banknum, info)) { 1546 /* board code may have filled info completely. If not, we 1547 use JEDEC ID probing. */ 1548 if (!info->vendor) { 1549 int modes[] = { 1550 CFI_CMDSET_AMD_STANDARD, 1551 CFI_CMDSET_INTEL_STANDARD 1552 }; 1553 int i; 1554 1555 for (i = 0; i < sizeof(modes) / sizeof(modes[0]); i++) { 1556 info->vendor = modes[i]; 1557 info->start[0] = base; 1558 if (info->portwidth == FLASH_CFI_8BIT 1559 && info->interface == FLASH_CFI_X8X16) { 1560 info->addr_unlock1 = 0x2AAA; 1561 info->addr_unlock2 = 0x5555; 1562 } else { 1563 info->addr_unlock1 = 0x5555; 1564 info->addr_unlock2 = 0x2AAA; 1565 } 1566 flash_read_jedec_ids(info); 1567 debug("JEDEC PROBE: ID %x %x %x\n", 1568 info->manufacturer_id, 1569 info->device_id, 1570 info->device_id2); 1571 if (jedec_flash_match(info, base)) 1572 break; 1573 } 1574 } 1575 1576 switch(info->vendor) { 1577 case CFI_CMDSET_INTEL_PROG_REGIONS: 1578 case CFI_CMDSET_INTEL_STANDARD: 1579 case CFI_CMDSET_INTEL_EXTENDED: 1580 info->cmd_reset = FLASH_CMD_RESET; 1581 break; 1582 case CFI_CMDSET_AMD_STANDARD: 1583 case CFI_CMDSET_AMD_EXTENDED: 1584 case CFI_CMDSET_AMD_LEGACY: 1585 info->cmd_reset = AMD_CMD_RESET; 1586 break; 1587 } 1588 info->flash_id = FLASH_MAN_CFI; 1589 return 1; 1590 } 1591 return 0; /* use CFI */ 1592 } 1593 #else 1594 static inline int flash_detect_legacy(ulong base, int banknum) 1595 { 1596 return 0; /* use CFI */ 1597 } 1598 #endif 1599 1600 /*----------------------------------------------------------------------- 1601 * detect if flash is compatible with the Common Flash Interface (CFI) 1602 * http://www.jedec.org/download/search/jesd68.pdf 1603 */ 1604 static void flash_read_cfi (flash_info_t *info, void *buf, 1605 unsigned int start, size_t len) 1606 { 1607 u8 *p = buf; 1608 unsigned int i; 1609 1610 for (i = 0; i < len; i++) 1611 p[i] = flash_read_uchar(info, start + i); 1612 } 1613 1614 static int __flash_detect_cfi (flash_info_t * info, struct cfi_qry *qry) 1615 { 1616 int cfi_offset; 1617 1618 /* We do not yet know what kind of commandset to use, so we issue 1619 the reset command in both Intel and AMD variants, in the hope 1620 that AMD flash roms ignore the Intel command. */ 1621 flash_write_cmd (info, 0, 0, AMD_CMD_RESET); 1622 flash_write_cmd (info, 0, 0, FLASH_CMD_RESET); 1623 1624 for (cfi_offset=0; 1625 cfi_offset < sizeof(flash_offset_cfi) / sizeof(uint); 1626 cfi_offset++) { 1627 flash_write_cmd (info, 0, flash_offset_cfi[cfi_offset], 1628 FLASH_CMD_CFI); 1629 if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q') 1630 && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R') 1631 && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) { 1632 flash_read_cfi(info, qry, FLASH_OFFSET_CFI_RESP, 1633 sizeof(struct cfi_qry)); 1634 info->interface = le16_to_cpu(qry->interface_desc); 1635 1636 info->cfi_offset = flash_offset_cfi[cfi_offset]; 1637 debug ("device interface is %d\n", 1638 info->interface); 1639 debug ("found port %d chip %d ", 1640 info->portwidth, info->chipwidth); 1641 debug ("port %d bits chip %d bits\n", 1642 info->portwidth << CFI_FLASH_SHIFT_WIDTH, 1643 info->chipwidth << CFI_FLASH_SHIFT_WIDTH); 1644 1645 /* calculate command offsets as in the Linux driver */ 1646 info->addr_unlock1 = 0x555; 1647 info->addr_unlock2 = 0x2aa; 1648 1649 /* 1650 * modify the unlock address if we are 1651 * in compatibility mode 1652 */ 1653 if ( /* x8/x16 in x8 mode */ 1654 ((info->chipwidth == FLASH_CFI_BY8) && 1655 (info->interface == FLASH_CFI_X8X16)) || 1656 /* x16/x32 in x16 mode */ 1657 ((info->chipwidth == FLASH_CFI_BY16) && 1658 (info->interface == FLASH_CFI_X16X32))) 1659 { 1660 info->addr_unlock1 = 0xaaa; 1661 info->addr_unlock2 = 0x555; 1662 } 1663 1664 info->name = "CFI conformant"; 1665 return 1; 1666 } 1667 } 1668 1669 return 0; 1670 } 1671 1672 static int flash_detect_cfi (flash_info_t * info, struct cfi_qry *qry) 1673 { 1674 debug ("flash detect cfi\n"); 1675 1676 for (info->portwidth = CFG_FLASH_CFI_WIDTH; 1677 info->portwidth <= FLASH_CFI_64BIT; info->portwidth <<= 1) { 1678 for (info->chipwidth = FLASH_CFI_BY8; 1679 info->chipwidth <= info->portwidth; 1680 info->chipwidth <<= 1) 1681 if (__flash_detect_cfi(info, qry)) 1682 return 1; 1683 } 1684 debug ("not found\n"); 1685 return 0; 1686 } 1687 1688 /* 1689 * Manufacturer-specific quirks. Add workarounds for geometry 1690 * reversal, etc. here. 1691 */ 1692 static void flash_fixup_amd(flash_info_t *info, struct cfi_qry *qry) 1693 { 1694 /* check if flash geometry needs reversal */ 1695 if (qry->num_erase_regions > 1) { 1696 /* reverse geometry if top boot part */ 1697 if (info->cfi_version < 0x3131) { 1698 /* CFI < 1.1, try to guess from device id */ 1699 if ((info->device_id & 0x80) != 0) 1700 cfi_reverse_geometry(qry); 1701 } else if (flash_read_uchar(info, info->ext_addr + 0xf) == 3) { 1702 /* CFI >= 1.1, deduct from top/bottom flag */ 1703 /* note: ext_addr is valid since cfi_version > 0 */ 1704 cfi_reverse_geometry(qry); 1705 } 1706 } 1707 } 1708 1709 static void flash_fixup_atmel(flash_info_t *info, struct cfi_qry *qry) 1710 { 1711 int reverse_geometry = 0; 1712 1713 /* Check the "top boot" bit in the PRI */ 1714 if (info->ext_addr && !(flash_read_uchar(info, info->ext_addr + 6) & 1)) 1715 reverse_geometry = 1; 1716 1717 /* AT49BV6416(T) list the erase regions in the wrong order. 1718 * However, the device ID is identical with the non-broken 1719 * AT49BV642D since u-boot only reads the low byte (they 1720 * differ in the high byte.) So leave out this fixup for now. 1721 */ 1722 #if 0 1723 if (info->device_id == 0xd6 || info->device_id == 0xd2) 1724 reverse_geometry = !reverse_geometry; 1725 #endif 1726 1727 if (reverse_geometry) 1728 cfi_reverse_geometry(qry); 1729 } 1730 1731 /* 1732 * The following code cannot be run from FLASH! 1733 * 1734 */ 1735 ulong flash_get_size (ulong base, int banknum) 1736 { 1737 flash_info_t *info = &flash_info[banknum]; 1738 int i, j; 1739 flash_sect_t sect_cnt; 1740 unsigned long sector; 1741 unsigned long tmp; 1742 int size_ratio; 1743 uchar num_erase_regions; 1744 int erase_region_size; 1745 int erase_region_count; 1746 struct cfi_qry qry; 1747 1748 info->ext_addr = 0; 1749 info->cfi_version = 0; 1750 #ifdef CFG_FLASH_PROTECTION 1751 info->legacy_unlock = 0; 1752 #endif 1753 1754 info->start[0] = base; 1755 1756 if (flash_detect_cfi (info, &qry)) { 1757 info->vendor = le16_to_cpu(qry.p_id); 1758 info->ext_addr = le16_to_cpu(qry.p_adr); 1759 num_erase_regions = qry.num_erase_regions; 1760 1761 if (info->ext_addr) { 1762 info->cfi_version = (ushort) flash_read_uchar (info, 1763 info->ext_addr + 3) << 8; 1764 info->cfi_version |= (ushort) flash_read_uchar (info, 1765 info->ext_addr + 4); 1766 } 1767 1768 #ifdef DEBUG 1769 flash_printqry (&qry); 1770 #endif 1771 1772 switch (info->vendor) { 1773 case CFI_CMDSET_INTEL_PROG_REGIONS: 1774 case CFI_CMDSET_INTEL_STANDARD: 1775 case CFI_CMDSET_INTEL_EXTENDED: 1776 cmdset_intel_init(info, &qry); 1777 break; 1778 case CFI_CMDSET_AMD_STANDARD: 1779 case CFI_CMDSET_AMD_EXTENDED: 1780 cmdset_amd_init(info, &qry); 1781 break; 1782 default: 1783 printf("CFI: Unknown command set 0x%x\n", 1784 info->vendor); 1785 /* 1786 * Unfortunately, this means we don't know how 1787 * to get the chip back to Read mode. Might 1788 * as well try an Intel-style reset... 1789 */ 1790 flash_write_cmd(info, 0, 0, FLASH_CMD_RESET); 1791 return 0; 1792 } 1793 1794 /* Do manufacturer-specific fixups */ 1795 switch (info->manufacturer_id) { 1796 case 0x0001: 1797 flash_fixup_amd(info, &qry); 1798 break; 1799 case 0x001f: 1800 flash_fixup_atmel(info, &qry); 1801 break; 1802 } 1803 1804 debug ("manufacturer is %d\n", info->vendor); 1805 debug ("manufacturer id is 0x%x\n", info->manufacturer_id); 1806 debug ("device id is 0x%x\n", info->device_id); 1807 debug ("device id2 is 0x%x\n", info->device_id2); 1808 debug ("cfi version is 0x%04x\n", info->cfi_version); 1809 1810 size_ratio = info->portwidth / info->chipwidth; 1811 /* if the chip is x8/x16 reduce the ratio by half */ 1812 if ((info->interface == FLASH_CFI_X8X16) 1813 && (info->chipwidth == FLASH_CFI_BY8)) { 1814 size_ratio >>= 1; 1815 } 1816 debug ("size_ratio %d port %d bits chip %d bits\n", 1817 size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH, 1818 info->chipwidth << CFI_FLASH_SHIFT_WIDTH); 1819 debug ("found %d erase regions\n", num_erase_regions); 1820 sect_cnt = 0; 1821 sector = base; 1822 for (i = 0; i < num_erase_regions; i++) { 1823 if (i > NUM_ERASE_REGIONS) { 1824 printf ("%d erase regions found, only %d used\n", 1825 num_erase_regions, NUM_ERASE_REGIONS); 1826 break; 1827 } 1828 1829 tmp = le32_to_cpu(qry.erase_region_info[i]); 1830 debug("erase region %u: 0x%08lx\n", i, tmp); 1831 1832 erase_region_count = (tmp & 0xffff) + 1; 1833 tmp >>= 16; 1834 erase_region_size = 1835 (tmp & 0xffff) ? ((tmp & 0xffff) * 256) : 128; 1836 debug ("erase_region_count = %d erase_region_size = %d\n", 1837 erase_region_count, erase_region_size); 1838 for (j = 0; j < erase_region_count; j++) { 1839 if (sect_cnt >= CFG_MAX_FLASH_SECT) { 1840 printf("ERROR: too many flash sectors\n"); 1841 break; 1842 } 1843 info->start[sect_cnt] = sector; 1844 sector += (erase_region_size * size_ratio); 1845 1846 /* 1847 * Only read protection status from 1848 * supported devices (intel...) 1849 */ 1850 switch (info->vendor) { 1851 case CFI_CMDSET_INTEL_PROG_REGIONS: 1852 case CFI_CMDSET_INTEL_EXTENDED: 1853 case CFI_CMDSET_INTEL_STANDARD: 1854 info->protect[sect_cnt] = 1855 flash_isset (info, sect_cnt, 1856 FLASH_OFFSET_PROTECT, 1857 FLASH_STATUS_PROTECT); 1858 break; 1859 default: 1860 /* default: not protected */ 1861 info->protect[sect_cnt] = 0; 1862 } 1863 1864 sect_cnt++; 1865 } 1866 } 1867 1868 info->sector_count = sect_cnt; 1869 info->size = 1 << qry.dev_size; 1870 /* multiply the size by the number of chips */ 1871 info->size *= size_ratio; 1872 info->buffer_size = 1 << le16_to_cpu(qry.max_buf_write_size); 1873 tmp = 1 << qry.block_erase_timeout_typ; 1874 info->erase_blk_tout = tmp * 1875 (1 << qry.block_erase_timeout_max); 1876 tmp = (1 << qry.buf_write_timeout_typ) * 1877 (1 << qry.buf_write_timeout_max); 1878 1879 /* round up when converting to ms */ 1880 info->buffer_write_tout = (tmp + 999) / 1000; 1881 tmp = (1 << qry.word_write_timeout_typ) * 1882 (1 << qry.word_write_timeout_max); 1883 /* round up when converting to ms */ 1884 info->write_tout = (tmp + 999) / 1000; 1885 info->flash_id = FLASH_MAN_CFI; 1886 if ((info->interface == FLASH_CFI_X8X16) && 1887 (info->chipwidth == FLASH_CFI_BY8)) { 1888 /* XXX - Need to test on x8/x16 in parallel. */ 1889 info->portwidth >>= 1; 1890 } 1891 } 1892 1893 flash_write_cmd (info, 0, 0, info->cmd_reset); 1894 return (info->size); 1895 } 1896 1897 /*----------------------------------------------------------------------- 1898 */ 1899 unsigned long flash_init (void) 1900 { 1901 unsigned long size = 0; 1902 int i; 1903 #if defined(CFG_FLASH_AUTOPROTECT_LIST) 1904 struct apl_s { 1905 ulong start; 1906 ulong size; 1907 } apl[] = CFG_FLASH_AUTOPROTECT_LIST; 1908 #endif 1909 1910 #ifdef CFG_FLASH_PROTECTION 1911 char *s = getenv("unlock"); 1912 #endif 1913 1914 /* Init: no FLASHes known */ 1915 for (i = 0; i < CFG_MAX_FLASH_BANKS; ++i) { 1916 flash_info[i].flash_id = FLASH_UNKNOWN; 1917 1918 if (!flash_detect_legacy (bank_base[i], i)) 1919 flash_get_size (bank_base[i], i); 1920 size += flash_info[i].size; 1921 if (flash_info[i].flash_id == FLASH_UNKNOWN) { 1922 #ifndef CFG_FLASH_QUIET_TEST 1923 printf ("## Unknown FLASH on Bank %d " 1924 "- Size = 0x%08lx = %ld MB\n", 1925 i+1, flash_info[i].size, 1926 flash_info[i].size << 20); 1927 #endif /* CFG_FLASH_QUIET_TEST */ 1928 } 1929 #ifdef CFG_FLASH_PROTECTION 1930 else if ((s != NULL) && (strcmp(s, "yes") == 0)) { 1931 /* 1932 * Only the U-Boot image and it's environment 1933 * is protected, all other sectors are 1934 * unprotected (unlocked) if flash hardware 1935 * protection is used (CFG_FLASH_PROTECTION) 1936 * and the environment variable "unlock" is 1937 * set to "yes". 1938 */ 1939 if (flash_info[i].legacy_unlock) { 1940 int k; 1941 1942 /* 1943 * Disable legacy_unlock temporarily, 1944 * since flash_real_protect would 1945 * relock all other sectors again 1946 * otherwise. 1947 */ 1948 flash_info[i].legacy_unlock = 0; 1949 1950 /* 1951 * Legacy unlocking (e.g. Intel J3) -> 1952 * unlock only one sector. This will 1953 * unlock all sectors. 1954 */ 1955 flash_real_protect (&flash_info[i], 0, 0); 1956 1957 flash_info[i].legacy_unlock = 1; 1958 1959 /* 1960 * Manually mark other sectors as 1961 * unlocked (unprotected) 1962 */ 1963 for (k = 1; k < flash_info[i].sector_count; k++) 1964 flash_info[i].protect[k] = 0; 1965 } else { 1966 /* 1967 * No legancy unlocking -> unlock all sectors 1968 */ 1969 flash_protect (FLAG_PROTECT_CLEAR, 1970 flash_info[i].start[0], 1971 flash_info[i].start[0] 1972 + flash_info[i].size - 1, 1973 &flash_info[i]); 1974 } 1975 } 1976 #endif /* CFG_FLASH_PROTECTION */ 1977 } 1978 1979 /* Monitor protection ON by default */ 1980 #if (CFG_MONITOR_BASE >= CFG_FLASH_BASE) 1981 flash_protect (FLAG_PROTECT_SET, 1982 CFG_MONITOR_BASE, 1983 CFG_MONITOR_BASE + monitor_flash_len - 1, 1984 flash_get_info(CFG_MONITOR_BASE)); 1985 #endif 1986 1987 /* Environment protection ON by default */ 1988 #ifdef CFG_ENV_IS_IN_FLASH 1989 flash_protect (FLAG_PROTECT_SET, 1990 CFG_ENV_ADDR, 1991 CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1, 1992 flash_get_info(CFG_ENV_ADDR)); 1993 #endif 1994 1995 /* Redundant environment protection ON by default */ 1996 #ifdef CFG_ENV_ADDR_REDUND 1997 flash_protect (FLAG_PROTECT_SET, 1998 CFG_ENV_ADDR_REDUND, 1999 CFG_ENV_ADDR_REDUND + CFG_ENV_SIZE_REDUND - 1, 2000 flash_get_info(CFG_ENV_ADDR_REDUND)); 2001 #endif 2002 2003 #if defined(CFG_FLASH_AUTOPROTECT_LIST) 2004 for (i = 0; i < (sizeof(apl) / sizeof(struct apl_s)); i++) { 2005 debug("autoprotecting from %08x to %08x\n", 2006 apl[i].start, apl[i].start + apl[i].size - 1); 2007 flash_protect (FLAG_PROTECT_SET, 2008 apl[i].start, 2009 apl[i].start + apl[i].size - 1, 2010 flash_get_info(apl[i].start)); 2011 } 2012 #endif 2013 return (size); 2014 } 2015 2016 #endif /* CFG_FLASH_CFI */ 2017