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