[OpenBIOS] r770 - dev/olpc/cafenand
svn at openbios.org
svn at openbios.org
Sun Jan 6 00:41:28 CET 2008
Author: wmb
Date: 2008-01-06 00:41:28 +0100 (Sun, 06 Jan 2008)
New Revision: 770
Modified:
dev/olpc/cafenand/cafenand.fth
dev/olpc/cafenand/selftest.fth
Log:
OLPC trac 5868 - Preserve extra (non-ECC) out of band data when restoring
tested blocks in the /nandflash selftest.
Modified: dev/olpc/cafenand/cafenand.fth
===================================================================
--- dev/olpc/cafenand/cafenand.fth 2008-01-05 23:37:48 UTC (rev 769)
+++ dev/olpc/cafenand/cafenand.fth 2008-01-05 23:41:28 UTC (rev 770)
@@ -260,14 +260,13 @@
;
[then]
-: dma-write-raw ( adr len page# offset -- )
+: dma-write-raw ( adr len page# offset -- error? )
write-enable ( adr len page# offset )
set-page ( adr len )
dup false dma-setup ( )
write-cmd h# 110 cmd wait-cmd ( )
wait-write-done ( error? )
dma-release ( error? )
- drop
;
: dma-write-page ( adr page# -- error? ) \ Size is fixed
@@ -283,14 +282,15 @@
: write-bytes ( adr len page# offset -- error? ) pio-write-raw ;
3 value #erase-adr-bytes \ Chip dependent
-: erase-block ( page# -- )
+: (erase-block) ( page# -- error? )
write-enable
set-erase-page
h# 20.0060 0 #erase-adr-bytes >cmd h# 1d0 cmd
wait-write-done ( error? )
- drop
;
+: erase-block ( page# -- ) (erase-block) drop ;
+
: read-id ( -- adr ) 8 0 0 h# c420.0090 0 generic-read ;
: send-reset-cmd ( -- )
Modified: dev/olpc/cafenand/selftest.fth
===================================================================
--- dev/olpc/cafenand/selftest.fth 2008-01-05 23:37:48 UTC (rev 769)
+++ dev/olpc/cafenand/selftest.fth 2008-01-05 23:41:28 UTC (rev 770)
@@ -13,6 +13,8 @@
false value fixbbt? \ Flag to determine whether to mark bad eblocks
false value selftest-err? \ Selftest result
+: /oobbuf ( -- n ) /oob pages/eblock * ;
+
: #fixbbt++ ( -- ) #fixbbt 1+ to #fixbbt ;
: .#fixbbt ( -- )
(cr ." # bad blocks "
@@ -32,11 +34,13 @@
then
;
+0 value oobbuf \ Original content of OOB
0 value sbuf \ Original content of block
0 value obuf \ Block data written
0 value ibuf \ Block data read
: alloc-test-bufs ( -- )
sbuf 0= if
+ /oobbuf alloc-mem to oobbuf
erase-size alloc-mem to sbuf
erase-size alloc-mem to obuf
erase-size alloc-mem to ibuf
@@ -44,6 +48,7 @@
;
: free-test-bufs ( -- )
sbuf if
+ oobbuf /oobbuf free-mem 0 to oobbuf
sbuf erase-size free-mem 0 to sbuf
obuf erase-size free-mem 0 to obuf
ibuf erase-size free-mem 0 to ibuf
@@ -54,10 +59,70 @@
dup if ." SAVE" cr then
;
: write-eblock ( adr page# -- error? )
- dup erase-block
- pages/eblock write-blocks pages/eblock <>
- dup if ." RESTORE" cr then
+ dup (erase-block) if 2drop true exit then ( adr page# )
+ over /eblock erased? if ( adr page# )
+ 2drop false
+ else ( adr page# )
+ pages/eblock write-blocks pages/eblock <>
+ dup if ." RESTORE" cr then
+ then
;
+
+: read-raw-eblock ( adr page# -- error? )
+ pages/eblock bounds ?do ( adr )
+ dup /dma-buf i 0 dma-write-raw if ( adr )
+ drop true unloop exit
+ then
+ /dma-buf +
+ loop ( adr )
+ drop false
+;
+
+: save-eblock ( page# -- error? )
+ sbuf over read-eblock dup record-err if ( page# )
+ drop true exit
+ then ( page# )
+ oobbuf swap ( adr page# )
+ pages/eblock bounds ?do ( adr )
+ dup /oob i /page pio-read ( adr )
+ /oob + ( adr' )
+ loop ( adr )
+ drop false
+;
+: berased? ( adr len -- flag )
+ bounds ?do
+ i c@ h# ff <> if false unloop exit then
+ loop
+ true
+;
+: restore-eblock ( page# -- )
+ sbuf over write-eblock dup record-err if ( page# )
+ drop exit ( page# )
+ then ( page# )
+
+ oobbuf /ecc + swap ( adr page# )
+ pages/eblock bounds ?do ( adr )
+ dup /oob /ecc - berased? 0= if ( adr )
+ dup /oob /ecc - i /page /ecc + ( adr adr len page# offset )
+ pio-write-raw record-err ( adr )
+ then ( adr )
+ /oob + ( adr' )
+ loop ( adr )
+ drop ( )
+;
+
+
+
+: write-raw-eblock ( adr page# -- error? )
+ dup (erase-block) if 2drop true exit then ( adr page# )
+ pages/eblock bounds ?do ( adr )
+ dup /dma-buf i 0 dma-write-raw if ( adr )
+ drop true unloop exit
+ then
+ /dma-buf +
+ loop ( adr )
+ drop false
+;
: test-eblock ( page# pattern -- error? )
obuf erase-size 2 pick fill
ibuf erase-size rot invert fill
@@ -98,20 +163,22 @@
0 of 0 endof
1 of usable-page-limit 1- endof
( default ) random-page swap
- endcase ( block# )
- pages/eblock 1- invert and ( block#' )
+ endcase ( page# )
+ pages/eblock 1- invert and ( page#' )
- dup block-bad? if ( block#' )
+ dup block-bad? if ( page#' )
drop ( )
- else ( block#' )
- dup to cur-eblock
- (cr dup .
- sbuf over read-eblock dup record-err 0= if
- dup h# 55 test-eblock record-err
- dup h# aa test-eblock record-err
- dup h# ff test-eblock record-err
- then
- sbuf swap write-eblock record-err
+ else ( page#' )
+ dup to cur-eblock ( page#' )
+ (cr dup . ( page#' )
+ dup save-eblock if ( page# )
+ drop ( )
+ else ( page# )
+ dup h# 55 test-eblock record-err ( page# )
+ dup h# aa test-eblock record-err ( page# )
+ dup h# ff test-eblock record-err ( page# )
+ restore-eblock ( )
+ then ( )
then
loop
@@ -146,18 +213,18 @@
parse-full-args ( #blk blk# )
2dup .full-arg ( #blk blk# )
- pages/eblock * swap 1+ pages/eblock * ( page# #page )
- usable-page-limit rot ?do ( #blk+1 )
- i block-bad? not if
- i to cur-eblock
- (cr i .
- sbuf i read-eblock dup record-err 0= if
- i h# 55 test-eblock record-err
- i h# aa test-eblock record-err
- then
- sbuf i write-eblock record-err
- then
- dup +loop drop
+ pages/eblock * swap 1+ pages/eblock * ( page# stride )
+ usable-page-limit rot ?do ( stride )
+ i block-bad? 0= if ( stride )
+ i to cur-eblock ( stride )
+ (cr i . ( stride )
+ i save-eblock 0= if ( stride )
+ i h# 55 test-eblock record-err ( stride )
+ i h# aa test-eblock record-err ( stride )
+ restore-eblock ( stride )
+ then ( stride )
+ then ( stride )
+ dup +loop drop ( )
.#fixbbt
;
More information about the OpenBIOS
mailing list