[OpenBIOS] r584 - cpu/x86/pc/olpc dev/olpc/cafenand

svn at openbios.org svn at openbios.org
Wed Aug 29 01:18:26 CEST 2007


Author: wmb
Date: 2007-08-29 01:18:26 +0200 (Wed, 29 Aug 2007)
New Revision: 584

Modified:
   cpu/x86/pc/olpc/copynand.fth
   cpu/x86/pc/olpc/nandstat.fth
   dev/olpc/cafenand/badblock.fth
   dev/olpc/cafenand/cafenand.fth
Log:
copy-nand - Check carefully for bad blocks when copying on the OS image,
adding any newly-discovered ones to the bad block table.


Modified: cpu/x86/pc/olpc/copynand.fth
===================================================================
--- cpu/x86/pc/olpc/copynand.fth	2007-08-28 18:45:58 UTC (rev 583)
+++ cpu/x86/pc/olpc/copynand.fth	2007-08-28 23:18:26 UTC (rev 584)
@@ -135,32 +135,32 @@
 
 defer show-erasing  ( #blocks -- )
 : (show-erasing)  ( #blocks -- )  ." Erasing " . ." blocks" cr  ;
-' (show-erasing) is show-erasing
+' (show-erasing) to show-erasing
 
 defer show-erased  ( block# -- )
 : (show-erased)  ( block# -- )  (cr .  ;
-' (show-erased) is show-erased
+' (show-erased) to show-erased
 
 defer show-bad  ( block# -- )
-' drop is show-bad
+' drop to show-bad
 
-defer show-bbt  ( block# -- )
-' drop is show-bbt
+defer show-bbt-block  ( block# -- )
+' drop to show-bbt-block
 
 defer show-clean  ( block# -- )
-' drop is show-clean
+' drop to show-clean
 
 defer show-cleaning  ( -- )
 : (show-cleaning)  ( -- )  cr ." Cleanmarkers" cr  ;
-' (show-cleaning) is show-cleaning
+' (show-cleaning) to show-cleaning
 
 defer show-writing  ( #blocks -- )
 : (show-writing)  ." Writing " . ." blocks" cr  ;
-' (show-writing) is show-writing
+' (show-writing) to show-writing
 
 defer show-written
 : (show-written)  ( block# -- )  (cr .  ;
-' (show-written) is show-written
+' (show-written) to show-written
 
 : copy-nand  ( "devspec" -- )
    open-nand
@@ -171,7 +171,7 @@
    ['] noop to show-progress
 
    #nand-pages nand-pages/block / show-erasing
-   ['] show-bad  ['] show-erased  ['] show-bbt " (wipe)" $call-nand
+   ['] show-bad  ['] show-erased  ['] show-bbt-block " (wipe)" $call-nand
 
    #image-eblocks show-writing
 
@@ -307,7 +307,6 @@
 : dump-nand  ( "devspec" -- )  true  to dump-oob?  (dump-nand)  ;
 : save-nand  ( "devspec" -- )  false to dump-oob?  (dump-nand)  ;
 
-
 : fastcopy-nand  ( "devspec" -- )
    open-nand
 

Modified: cpu/x86/pc/olpc/nandstat.fth
===================================================================
--- cpu/x86/pc/olpc/nandstat.fth	2007-08-28 18:45:58 UTC (rev 583)
+++ cpu/x86/pc/olpc/nandstat.fth	2007-08-28 23:18:26 UTC (rev 584)
@@ -44,10 +44,10 @@
    drop
 ;
 
-: gshow-erased  ( eblock# -- )  erased-color  show-state  ;
-: gshow-bad     ( eblock# -- )  bad-color     show-state  ;
-: gshow-bbt     ( eblock# -- )  bbt-color     show-state  ;
-: gshow-clean   ( eblock# -- )  clean-color   show-state  ;
+: gshow-erased    ( eblock# -- )  erased-color  show-state  ;
+: gshow-bad       ( eblock# -- )  bad-color     show-state  ;
+: gshow-bbt-block ( eblock# -- )  bbt-color     show-state  ;
+: gshow-clean     ( eblock# -- )  clean-color   show-state  ;
 
 : gshow-cleaning ( -- )  ." Cleanmarkers"  cr  cursor-on  ;
 
@@ -69,14 +69,14 @@
 : gshow-written  ( eblock# -- )  written-color  show-state  ;
 
 : gshow
-   ['] gshow-erasing to show-erasing
-   ['] gshow-erased to show-erased
-   ['] gshow-bad to show-bad
-   ['] gshow-bbt to show-bbt
-   ['] gshow-clean to show-clean
-   ['] gshow-cleaning to show-cleaning
-   ['] gshow-writing to show-writing
-   ['] gshow-written to show-written
+   ['] gshow-erasing   to show-erasing
+   ['] gshow-erased    to show-erased
+   ['] gshow-bad       to show-bad
+   ['] gshow-bbt-block to show-bbt-block
+   ['] gshow-clean     to show-clean
+   ['] gshow-cleaning  to show-cleaning
+   ['] gshow-writing   to show-writing
+   ['] gshow-written   to show-written
 ;
 
 gshow

Modified: dev/olpc/cafenand/badblock.fth
===================================================================
--- dev/olpc/cafenand/badblock.fth	2007-08-28 18:45:58 UTC (rev 583)
+++ dev/olpc/cafenand/badblock.fth	2007-08-28 23:18:26 UTC (rev 584)
@@ -142,7 +142,9 @@
          /page +                            ( signature$ page# adr' )
       loop                                  ( signature$ page# adr' )
       drop                                  ( signature$ page# )
-      /page bb-offset +  write-bytes        ( )
+      /page bb-offset +  write-bytes  if    ( )
+         ." Failed to write bad block table" cr
+      then
    else                                     ( signature$ page# )
       3drop                                 ( )
    then
@@ -386,21 +388,51 @@
 
 : start-scan  ( -- )  pages/eblock negate  to scan-page#  ;
 
-\ Must erase all (wipe) first
+: try-copy-block  ( adr page# -- okay? )
+   pages/eblock  bounds  ?do        ( adr )
+      dup i write-page  if          ( adr )
+         drop false  unloop exit    ( false )
+      then                          ( adr )
+      /page +                       ( adr' )
+   loop                             ( adr )
+   drop true                        ( true )
+;
+: block-okay?  ( adr page# -- okay? )
+   pages/eblock  bounds  ?do        ( adr )
+      i get-page  if                ( adr )
+         drop false  unloop exit    ( false )
+      then                          ( adr buf-adr )
+      over /page comp  if           ( adr )
+         drop false unloop exit
+      then
+      /page +                       ( adr' )
+   loop                             ( adr )
+   drop true                        ( true )
+;
+: copy&check  ( adr page# -- okay? )
+   2dup try-copy-block  0=  if  2drop false exit  then  ( adr page# )
+   block-okay?
+;
+
 : copy-block  ( adr -- page# error? )
-   next-page#                             ( adr page# )
-   tuck  pages/eblock  bounds  ?do        ( page# adr )
-      dup i write-page  if                ( page# adr )
-         drop true  unloop exit           ( page# true )
-      then                                ( page# adr )
-      /page +                             ( page# adr' )
-   loop                                   ( page# adr )
-   drop false                             ( page# false )
+   begin  (next-page#)  0=  while                    ( adr page# )
+      2dup copy&check  if  nip false exit  then      ( adr page# )
+      \ Error; retry once
+      dup erase-block                                ( adr page# )
+      2dup copy&check  if  nip false exit  then     ( adr page# )
+      mark-bad  save-bbt                             ( adr )
+   repeat                                            ( adr )
+   drop                                              ( )
+   usable-page-limit pages/eblock -  true            ( page# error? )
 ;
 
 : put-cleanmarker  ( page# -- )
-   " "(85 19 03 20 08 00 00 00)"   ( page# adr len )
-   rot  /page /ecc +  write-bytes              ( )
+   >r
+   " "(85 19 03 20 08 00 00 00)"     ( adr len r: page# )
+   r@ /page /ecc +  write-bytes  if  ( r: page# )
+      r@ mark-bad save-bbt           ( r: page# )
+   then                              ( r: page# )
+   r> drop
 ;
 : put-cleanmarkers  ( show-xt -- )
    begin  (next-page#) 0=  while  ( show-xt page# )

Modified: dev/olpc/cafenand/cafenand.fth
===================================================================
--- dev/olpc/cafenand/cafenand.fth	2007-08-28 18:45:58 UTC (rev 583)
+++ dev/olpc/cafenand/cafenand.fth	2007-08-28 23:18:26 UTC (rev 584)
@@ -149,13 +149,12 @@
    swap r> move                        ( )
 ;
 
-: pio-write-raw  ( adr len page# offset -- )
+: pio-write-raw  ( adr len page# offset -- error? )
    write-enable
    dma-off  set-page  dup datalen         ( adr len )
    chip h# 2000 +  swap  move             ( )
    write-cmd h# 0000.0110 cmd  wait-cmd   ( ) \ No Auto ECC
    wait-write-done                        ( error? )
-   drop
 ;
 
 : pio-write-page  ( adr page# -- error? )
@@ -210,21 +209,27 @@
    syndrome-buf
 ;
 
-: read-page  ( adr page# -- error? )
-   0 set-page                          ( adr )
-   /page /ecc +  h# 18 cl!             ( adr )
-   dma-buf-pa h# 44 cl!                ( adr )
-   0 h# 48 cl!                         ( adr )
-   /page h# a000.0000 or  h# 40 cl!    ( adr )
-   read-cmd h# 0800.0130 cmd  wait-dma ( adr )
+\ Reads page into DMA buffer
+: get-page  ( page# -- true | adr false )
+   0 set-page                          ( )
+   /page /ecc +  h# 18 cl!             ( )
+   dma-buf-pa h# 44 cl!                ( )
+   0 h# 48 cl!                         ( )
+   /page h# a000.0000 or  h# 40 cl!    ( )
+   read-cmd h# 0800.0130 cmd  wait-dma ( )
 
-   h# 3c cl@  h# 40000 and  if         ( adr )      \ ECC error
-      dma-buf-va syndrome correct-ecc  ( adr uncorrectable? )
-   else                                ( adr )
-      false                            ( adr error? )
-   then                                ( adr error? )
+   h# 3c cl@  h# 40000 and  if         ( )      \ ECC error
+      dma-buf-va syndrome correct-ecc  ( uncorrectable? )
+   else                                ( )
+      false                            ( error? )
+   then                                ( error? )
+   dup  0=  if  dma-buf-va swap  then  ( true | adr false )
+;
 
-   dma-buf-va rot /page do-lmove       ( error? )
+: read-page  ( adr page# -- error? )
+   get-page  if  drop true exit  then  ( adr dma-buf-adr )
+   swap /page do-lmove                 ( )
+   false
 ;
 
 [ifdef] notdef
@@ -267,7 +272,7 @@
 ;
 
 : write-page   ( adr page# -- error? )  dma-write-page  ;
-: write-bytes  ( adr len page# offset -- )  pio-write-raw  ;
+: write-bytes  ( adr len page# offset -- error? )  pio-write-raw  ;
 
 3 value #erase-adr-bytes  \ Chip dependent
 : erase-block  ( page# -- )




More information about the OpenBIOS mailing list