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