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