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