Author: wmb Date: Wed Mar 10 10:30:01 2010 New Revision: 1769 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1769
Log: OLPC XO-1.5 - hopefully faster fs-update using erase-blocks and other asynchronous techniques.
Modified: cpu/x86/pc/olpc/via/fsupdate.fth
Modified: cpu/x86/pc/olpc/via/fsupdate.fth ============================================================================== --- cpu/x86/pc/olpc/via/fsupdate.fth Wed Mar 10 10:29:14 2010 (r1768) +++ cpu/x86/pc/olpc/via/fsupdate.fth Wed Mar 10 10:30:01 2010 (r1769) @@ -71,6 +71,7 @@ " size" $call-nand #image-eblocks /nand-block um* d< " Image size is larger than output device" ?nand-abort #image-eblocks show-init + 0 #image-eblocks " erase-blocks" $call-nand get-inflater \ Separate the two buffers by enough space for both the compressed \ and uncompressed copies of the data. 4x is overkill, but there @@ -106,16 +107,30 @@ #image-eblocks show-writing ;
+: eat-newline ( ih -- ) + fgetc newline <> ( error? ) + " Missing newline after zdata" ?nand-abort ( ) +; +: skip-zdata ( comprlen -- ) + ?compare-spec-line ( comprlen ) + + secure-fsupdate? if filefd else source-id then ( comprlen ih ) + + >r u>d r@ dftell ( d.comprlen d.pos r: ih ) + d+ r@ dfseek ( r: ih ) + + r> eat-newline +; + : get-zdata ( comprlen -- ) - ?compare-spec-line + ?compare-spec-line ( comprlen )
- secure-fsupdate? if filefd else source-id then ( ih ) + secure-fsupdate? if filefd else source-id then ( comprlen ih )
>r data-buffer /nand-block + over r@ fgets ( comprlen #read r: ih ) <> " Short read of zdata file" ?nand-abort ( r: ih )
- r> fgetc newline <> ( error? ) - " Missing newline after zdata" ?nand-abort ( ) + r> eat-newline
\ The "2+" skips the Zlib header data-buffer /nand-block + 2+ data-buffer true (inflate) ( len ) @@ -169,22 +184,27 @@ " Malformed hash string" ?nand-abort ( eblock# hashname$ hash$ r: comprlen )
?get-crc ( eblock# hashname$ hash$ r: comprlen ) - r> get-zdata ( eblock# hashname$ hash$ ) - ?check-crc ( eblock# hashname$ hash$ )
- check-hash? if ( eblock# hashname$ hash$ ) - check-hash ( eblock# ) - else ( eblock# hashname$ hash$ ) - 2drop 2drop ( eblock# ) - then + 2over " fa43239bcee7b97ca62f007cc68487560a39e19f74f3dde7486db3f98df8e471" $= if ( eblock# hashname$ hash$ r: comprlen) + r> skip-zdata ( eblock# hashname$ hash$ ) + 2drop 2drop ( eblock# ) + else ( eblock# hashname$ hash$ ) + r> get-zdata ( eblock# hashname$ hash$ ) + ?check-crc ( eblock# hashname$ hash$ ) + + check-hash? if ( eblock# hashname$ hash$ ) + check-hash ( eblock# ) + else ( eblock# hashname$ hash$ ) + 2drop 2drop ( eblock# ) + then ( eblock# )
- ( eblock# ) \ Asynchronous writes - data-buffer over nand-pages/block * nand-pages/block " write-blocks-start" $call-nand ( eblock# error? ) - " Write error" ?nand-abort ( eblock# ) + data-buffer over nand-pages/block * nand-pages/block " write-blocks-start" $call-nand ( eblock# error? ) + " Write error" ?nand-abort ( eblock# ) \ data-buffer over nand-pages/block * nand-pages/block " write-blocks" $call-nand ( eblock# #written ) \ nand-pages/block <> " Write error" ?nand-abort ( eblock# ) - swap-buffers ( eblock# ) + swap-buffers ( eblock# ) + then
dup to last-eblock# ( eblock# ) show-written ( )
openfirmware@openfirmware.info