1 /* *********************************************************************
2 * Broadcom Common Firmware Environment (CFE)
4 * Flash "self-write" module File: dev_flashop_engine.S
6 * This module takes care of the case of writing to the flash
7 * memory that CFE is currently reading its code from.
9 * Note: this code is written to be position-independent, even
10 * for non-PIC versions of CFE! It will be copied (with memcpy)
11 * into the heap for execution.
13 * Author: Mitch Lichtenberg (mpl@broadcom.com)
15 *********************************************************************
17 * Copyright 2000,2001,2002,2003
18 * Broadcom Corporation. All rights reserved.
20 * This software is furnished under license and may be used and
21 * copied only in accordance with the following terms and
22 * conditions. Subject to these conditions, you may download,
23 * copy, install, use, modify and distribute modified or unmodified
24 * copies of this software in source and/or binary form. No title
25 * or ownership is transferred hereby.
27 * 1) Any source code used, modified or distributed must reproduce
28 * and retain this copyright notice and list of conditions
29 * as they appear in the source file.
31 * 2) No right is granted to use any trade name, trademark, or
32 * logo of Broadcom Corporation. The "Broadcom Corporation"
33 * name may not be used to endorse or promote products derived
34 * from this software without the prior written permission of
35 * Broadcom Corporation.
37 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
38 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
39 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
40 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
41 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
42 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
43 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
44 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
45 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
46 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
47 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
48 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
49 * THE POSSIBILITY OF SUCH DAMAGE.
50 ********************************************************************* */
53 #include "mipsmacros.h"
55 #include "bsp_config.h"
56 #include "dev_newflash.h"
58 /* *********************************************************************
60 ********************************************************************* */
62 #if defined(__MIPSEB) && defined(_MIPSEB_DATA_INVARIANT_)
66 #define FLASHCMD_8(base,offset,value) \
68 ADD base,((offset)<<1) ; \
72 SUB base,((offset)<<1)
74 #define FLASHCMD_16(base,offset,value) \
76 ADD base,((offset)<<1) ; \
80 SUB base,((offset)<<1)
82 #define FLASHCMD_16B(base,offset,value) \
84 ADD base,((offset)<<1) ; \
88 SUB base,((offset)<<1)
90 #else /* Not 74K, bcm33xx */
92 #define FLASHCMD_8(base,offset,value) \
94 ADD base,((offset)<<1) ; \
98 SUB base,((offset)<<1)
100 #define FLASHCMD_16(base,offset,value) \
102 ADD base,((offset)<<1) ; \
106 SUB base,((offset)<<1)
108 #define FLASHCMD_16B(base,offset,value) \
110 ADD base,((offset)<<1) ; \
114 SUB base,((offset)<<1)
116 #endif /* BCMHND74K */
120 #define FLASHCMD_8(base,offset,value) \
124 #define FLASHCMD_16(base,offset,value) \
126 sh t0,((offset)<<1)(base)
128 #define FLASHCMD_16B(base,offset,value) \
130 sb t0,((offset)<<1)(base)
134 /* *********************************************************************
137 * This routine is written in a PIC method to allow us to do
138 * flash operations without any help from CFE. We need to do
139 * this when we're not relocated and want to muck with the
140 * flash we're running from.
142 * This routine follows some simple instructions in a table,
143 * so you can batch up the operations in one place.
146 * a0 - pointer to instruction list
149 * v0 - 0 if all instructions succeeded
150 * else less than zero, # of failing instructions
151 ********************************************************************* */
163 instloop: LR reg_op,FEINST_OP(a0) /* Load instruction */
164 LR reg_base,FEINST_BASE(a0)
165 LR reg_dest,FEINST_DEST(a0)
166 LR reg_src,FEINST_SRC(a0)
167 LR reg_cnt,FEINST_CNT(a0)
168 li v0,0 /* total of result values */
169 li v1,0 /* result for this function */
172 dli t0,0x9000000000000000 /* uncached - XKPHYS */
173 or reg_base,t0 /* so we can access flash beyond KSEG */
175 or reg_base,K1BASE /* 32-bit, regular KSEG */
178 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
179 bne reg_op,FEOP_RETURN,99f /* Return to main prog */
182 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
183 99: bne reg_op,FEOP_REBOOT,99f /* restart system */
185 li t0,0xBFC00000 /* jump to boot vector */
187 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
188 99: bne reg_op,FEOP_READ8,99f /* Read, 8-bit mode */
190 ADD reg_src,reg_src,reg_base
192 1: lbu t0,0(reg_src) /* Copy user data */
200 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
201 99: bne reg_op,FEOP_READ16,99f /* Read, 16-bit mode */
203 ADD reg_src,reg_src,reg_base
205 li t0,1 /* test bottom bit */
206 and t0,t0,reg_src /* t0 == 1 if odd */
207 beq t0,zero,1f /* no odd byte to worry about */
209 SUB reg_src,reg_src,t0 /* make even value */
210 lh t0,0(reg_src) /* interesting byte is odd */
212 sb t0,0(reg_dest) /* interesting byte in low 8 bits */
214 srl t0,t0,8 /* little endian */
215 sb t0,0(reg_dest) /* interesting byte is high 8 bits */
218 ADD reg_src,2 /* advance one word (we made addr even above) */
219 add reg_dest,1 /* dest always written by bytes */
222 1: beq reg_cnt,zero,nextinst
224 lh t0,0(reg_src) /* Copy user data */
227 sb t0,1(reg_dest) /* Big endian to memory */
228 srl t0,t0,8 /* t0 = 0x1234 -> 0x12 0x34 */
231 sb t0,0(reg_dest) /* little endian */
232 srl t0,t0,8 /* t0 = 0x1234 -> 0x34 0x12 */
241 beq reg_cnt,zero,nextinst /* no straggler */
243 lh t0,0(reg_src) /* interesting byte is odd */
245 srl t0,t0,8 /* little endian */
246 sb t0,0(reg_dest) /* interesting byte in high 8 bits */
248 sb t0,0(reg_dest) /* interesting byte is low 8 bits */
252 /* CFI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
253 #if (FLASH_DRIVERS & FLASH_DRIVER_CFI)
254 99: bne reg_op,FEOP_CFIQUERY8,99f /* CFI Query 8-bit */
256 ADD reg_src,reg_src,reg_base
258 FLASHCMD_8(reg_base,FLASH_CFI_QUERY_ADDR,FLASH_CFI_QUERY_MODE)
260 1: lbu t0,0(reg_src) /* Copy CFI data */
267 FLASHCMD_8(reg_base,FLASH_CFI_QUERY_ADDR,FLASH_CFI_QUERY_EXIT)
270 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
271 99: bne reg_op,FEOP_CFIQUERY16,99f /* CFI Query 16-bit in word mode */
273 ADD reg_src,reg_src,reg_base
275 FLASHCMD_16(reg_base,FLASH_CFI_QUERY_ADDR,FLASH_CFI_QUERY_MODE)
277 1: lh t0,0(reg_src) /* Copy CFI data */
284 FLASHCMD_16(reg_base,FLASH_CFI_QUERY_ADDR,FLASH_CFI_QUERY_EXIT)
287 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
288 99: bne reg_op,FEOP_CFIQUERY16B,99f /* CFI Query 16-bit in byte mode */
290 ADD reg_src,reg_src,reg_base
292 FLASHCMD_16B(reg_base,FLASH_CFI_QUERY_ADDR,FLASH_CFI_QUERY_MODE)
294 1: lb t0,0(reg_src) /* Copy CFI data */
301 FLASHCMD_16B(reg_base,FLASH_CFI_QUERY_ADDR,FLASH_CFI_QUERY_EXIT)
306 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
307 99: bne reg_op,FEOP_MEMCPY,99f /* Generic memcpy */
319 /* AMD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
320 #if (FLASH_DRIVERS & FLASH_DRIVER_AMD)
321 99: bne reg_op,FEOP_AMD_ERASE8,99f /* AMD erase (8-bit) */
323 ADD reg_dest,reg_dest,reg_base
325 /* Do an "unlock write" sequence (cycles 1-2) */
327 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
328 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
330 /* send the erase command (cycle 3) */
332 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_ERASE_3)
334 /* Do an "unlock write" sequence (cycles 4-5) */
336 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
337 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
339 /* Send the "erase sector" qualifier (cycle 6) */
341 FLASHCMD_8(reg_dest,0,AMD_FLASH_ERASE_SEC_6)
343 /* Wait for the erase to complete */
345 1: lb t0,0(reg_dest) # get byte
346 and t0,0xFF # test hi byte
347 bne t0,0xFF,1b # go till bit is set
350 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
351 99: bne reg_op,FEOP_AMD_ERASE16,99f /* AMD erase (16-bit in word mode) */
353 ADD reg_dest,reg_dest,reg_base
355 /* Do an "unlock write" sequence (cycles 1-2) */
357 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
358 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
360 /* send the erase command (cycle 3) */
362 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_ERASE_3)
364 /* Do an "unlock write" sequence (cycles 4-5) */
366 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
367 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
369 /* Send the "erase sector" qualifier (cycle 6) */
371 FLASHCMD_16(reg_dest,0,AMD_FLASH_ERASE_SEC_6)
373 /* Wait for the erase to complete */
375 1: lh t0,0(reg_dest) # get word
376 and t0,0xFF # test byte
377 bne t0,0xFF,1b # go till erased
381 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
382 99: bne reg_op,FEOP_AMD_ERASE16B,99f /* AMD erase (16-bit in byte mode) */
384 ADD reg_dest,reg_dest,reg_base
386 /* Do an "unlock write" sequence (cycles 1-2) */
388 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
389 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
391 /* send the erase command (cycle 3) */
393 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_ERASE_3)
395 /* Do an "unlock write" sequence (cycles 4-5) */
397 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
398 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
400 /* Send the "erase sector" qualifier (cycle 6) */
402 FLASHCMD_16B(reg_dest,0,AMD_FLASH_ERASE_SEC_6)
404 /* Wait for the erase to complete */
406 1: lh t0,0(reg_dest) # get word
407 and t0,0xFF # test byte
408 bne t0,0xFF,1b # go till erased
411 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
412 99: bne reg_op,FEOP_AMD_PGM8,99f /* AMD 8-bit program */
414 ADD reg_dest,reg_dest,reg_base
416 /* Do an "unlock write" sequence (cycles 1-2) */
418 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
419 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
421 /* Send a program command (cycle 3) */
423 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_PROGRAM)
425 /* Write a byte (cycle 4) */
428 sb t0,0(reg_dest) # t0 = byte written to flash
430 /* Wait for write to complete */
432 1: lbu t2,0(reg_dest) # t2 = byte from flash
434 and t1,t2,0x80 # done if bit7 of flash
435 and t0,t0,0x80 # is same as bit7 of data
438 and t1,t2,0x20 # not done if bit5
439 bne t1,0x20,1b # is still set
444 add reg_src,1 # next source byte
445 ADD reg_dest,1 # next dest byte
446 sub reg_cnt,1 # one less count
451 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
452 99: bne reg_op,FEOP_AMD_PGM16,99f /* AMD 16-bit program */
454 ADD reg_dest,reg_dest,reg_base
456 /* Do an "unlock write" sequence (cycles 1-2) */
458 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
459 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
461 /* Send a program command (cycle 3) */
463 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_PROGRAM)
465 /* Write a byte (cycle 4) */
468 sh t0,0(reg_dest) # t0 = byte written to flash
470 /* Wait for write to complete */
472 1: lh t2,0(reg_dest) # t2 = byte from flash
474 and t1,t2,0x80 # done if bit7 of flash
475 and t0,t0,0x80 # is same as bit7 of data
478 and t1,t2,0x20 # not done if bit5
479 bne t1,0x20,1b # is still set
484 add reg_src,2 # next source word
485 ADD reg_dest,2 # next dest word
486 sub reg_cnt,2 # one less count
490 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
491 99: bne reg_op,FEOP_AMD_PGM16B,99f /* AMD 16-bit pgm in 8-bit mode */
493 ADD reg_dest,reg_dest,reg_base
495 /* Do an "unlock write" sequence (cycles 1-2) */
497 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
498 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
500 /* Send a program command (cycle 3) */
502 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_PROGRAM)
504 /* Write a byte (cycle 4) */
507 sb t0,0(reg_dest) # t0 = byte written to flash
509 /* Wait for write to complete */
511 1: lb t2,0(reg_dest) # t2 = byte from flash
513 and t1,t2,0x80 # done if bit7 of flash
514 and t0,t0,0x80 # is same as bit7 of data
517 and t1,t2,0x20 # not done if bit5
518 bne t1,0x20,1b # is still set
523 add reg_src,1 # next source word
524 ADD reg_dest,1 # next dest word
525 sub reg_cnt,1 # one less count
530 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
531 99: bne reg_op,FEOP_AMD_DEVCODE8,99f /* AMD 8-bit - Boot Block Location */
533 ADD reg_src,reg_src,reg_base
535 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
536 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
537 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_AUTOSEL)
539 lbu t0,AMD_FLASH_DEVCODE8(reg_src)
541 li t0,AMD_FLASH_RESET
546 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
547 99: bne reg_op,FEOP_AMD_DEVCODE16,99f /* AMD 8-bit - Boot Block Location */
549 ADD reg_src,reg_src,reg_base
551 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
552 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
553 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_AUTOSEL)
557 srl t0,t0,8 /* ((3-AMD_FLASH_DEVCODE16)*8) */
559 srl t0,t0,16 /* (AMD_FLASH_DEVCODE16*8) */
562 li t0,AMD_FLASH_RESET
566 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
567 99: bne reg_op,FEOP_AMD_DEVCODE16B,99f /* AMD 8-bit - Boot Block Location */
569 ADD reg_src,reg_src,reg_base
571 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
572 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
573 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_AUTOSEL)
578 srl t0,t0,16 /* (AMD_FLASH_DEVCODE16B*8)*/
582 li t0,AMD_FLASH_RESET
586 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
587 99: bne reg_op,FEOP_AMD_MANID8,99f /* AMD 8-bit - Boot Block Location */
589 ADD reg_src,reg_src,reg_base
591 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
592 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
593 FLASHCMD_8(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_AUTOSEL)
595 lbu t0,AMD_FLASH_MANID(reg_src)
597 li t0,AMD_FLASH_RESET
602 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
603 99: bne reg_op,FEOP_AMD_MANID16,99f /* AMD 8-bit - Boot Block Location */
605 ADD reg_src,reg_src,reg_base
607 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
608 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
609 FLASHCMD_16(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_AUTOSEL)
613 srl t0,t0,((3-AMD_FLASH_MANID)*8)
615 srl t0,t0,(AMD_FLASH_MANID*8)
618 li t0,AMD_FLASH_RESET
622 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
623 99: bne reg_op,FEOP_AMD_MANID16B,99f /* AMD 8-bit - Boot Block Location */
625 ADD reg_src,reg_src,reg_base
627 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_MAGIC_1)
628 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_2,AMD_FLASH_MAGIC_2)
629 FLASHCMD_16B(reg_base,AMD_FLASH_MAGIC_ADDR_1,AMD_FLASH_AUTOSEL)
631 lbu t0,AMD_FLASH_MANID(reg_src)
634 li t0,AMD_FLASH_RESET
641 /* INTEL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
642 #if (FLASH_DRIVERS & FLASH_DRIVER_INTEL)
643 99: bne reg_op,FEOP_INTEL_ERASE8,99f /* Intel erase 8-bit */
645 ADD reg_dest,reg_dest,reg_base
647 FLASHCMD_8(reg_dest,0,INTEL_FLASH_ERASE_BLOCK)
648 FLASHCMD_8(reg_dest,0,INTEL_FLASH_ERASE_CONFIRM)
650 1: lbu t0,0(reg_dest) /* loop till bit 7 is set */
654 FLASHCMD_8(reg_dest,0,INTEL_FLASH_READ_MODE)
657 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
658 99: bne reg_op,FEOP_INTEL_ERASE16,99f /* Intel erase 16-bit */
660 ADD reg_dest,reg_dest,reg_base
663 FLASHCMD_8(reg_dest,0,INTEL_FLASH_ERASE_BLOCK)
664 FLASHCMD_8(reg_dest,0,INTEL_FLASH_ERASE_CONFIRM)
666 1: lbu t0,0(reg_dest) /* loop till bit 7 is set */
670 FLASHCMD_8(reg_dest,0,INTEL_FLASH_READ_MODE)
673 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
674 99: bne reg_op,FEOP_INTEL_PGM8,99f /* Intel 8-bit program */
676 ADD reg_dest,reg_dest,reg_base
678 11: FLASHCMD_8(reg_dest,0,INTEL_FLASH_PROGRAM)
683 1: lbu t0,0(reg_dest) /* loop till bit 7 is set */
687 lbu t0,0(reg_dest) /* contains final result */
688 /* If good, bits 1, 3, 4 will not be set */
695 FLASHCMD_8(reg_dest,0,INTEL_FLASH_READ_MODE)
698 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
699 99: bne reg_op,FEOP_INTEL_PGM16,99f /* Intel 16-bit prog */
701 ADD reg_dest,reg_dest,reg_base
703 11: FLASHCMD_16(reg_dest,0,INTEL_FLASH_PROGRAM)
708 1: lh t0,0(reg_dest) /* loop till bit 7 is set */
712 lh t0,0(reg_dest) /* contains final result */
713 /* If good, bits 1, 3, 4 will not be set */
715 FLASHCMD_16(reg_dest,0,INTEL_FLASH_READ_MODE)
724 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
725 #if (FLASH_DRIVERS & FLASH_DRIVER_SST)
726 99: bne reg_op,FEOP_SST_CFIQUERY16,99f /* SST CFI Query 16-bit in word mode */
728 ADD reg_src,reg_src,reg_base
730 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_1,SST_FLASH_MAGIC_1)
731 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_2,SST_FLASH_MAGIC_2)
733 FLASHCMD_16(reg_base,0x5555,FLASH_CFI_QUERY_MODE)
735 1: lh t0,0(reg_src) /* Copy CFI data */
742 FLASHCMD_16(reg_base,FLASH_CFI_QUERY_ADDR,SST_FLASH_RESET)
745 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
746 99: bne reg_op,FEOP_SST_ERASE16,99f /* SST erase (16-bit in word mode) */
748 ADD reg_dest,reg_dest,reg_base
750 /* Do an "unlock write" sequence (cycles 1-2) */
752 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_1,SST_FLASH_MAGIC_1)
753 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_2,SST_FLASH_MAGIC_2)
755 /* send the erase command (cycle 3) */
757 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_1,SST_FLASH_ERASE_3)
759 /* Do an "unlock write" sequence (cycles 4-5) */
761 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_1,SST_FLASH_MAGIC_1)
762 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_2,SST_FLASH_MAGIC_2)
764 /* Send the "erase sector" qualifier (cycle 6) */
766 FLASHCMD_16(reg_dest,0,SST_FLASH_ERASE_SEC_6)
768 /* Wait for the erase to complete */
770 1: lh t0,0(reg_dest) # get word
771 and t0,0xFF # test byte
772 bne t0,0xFF,1b # go till erased
775 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
776 99: bne reg_op,FEOP_SST_PGM16,99f /* SST 16-bit program */
778 ADD reg_dest,reg_dest,reg_base
780 /* Do an "unlock write" sequence (cycles 1-2) */
782 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_1,SST_FLASH_MAGIC_1)
783 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_2,SST_FLASH_MAGIC_2)
785 /* Send a program command (cycle 3) */
787 FLASHCMD_16(reg_base,SST_FLASH_MAGIC_ADDR_1,SST_FLASH_PROGRAM)
789 /* Write a short (cycle 4) */
792 sh t0,0(reg_dest) # t0 = byte written to flash
794 /* Wait for write to complete */
796 1: lh t2,0(reg_dest) # t2 = byte from flash
798 and t1,t2,0x80 # done if bit7 of flash
799 and t0,t0,0x80 # is same as bit7 of data
805 add reg_src,2 # next source word
806 ADD reg_dest,2 # next dest word
807 sub reg_cnt,2 # one less count
812 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
813 99: li v1,-1 /* invalid command */
815 nextinst: SR v1,FEINST_RESULT(a0) /* store result of instruction */
816 ADD v0,v0,v1 /* add to total */
817 ADD a0,FEINST_SIZE /* advance to next instr. */
827 .globl flashop_engine_ptr
828 .globl flashop_engine_len
831 _VECT_ flashop_engine
833 .word flashop_engine_end-flashop_engine
837 /* *********************************************************************
839 ********************************************************************* */