[openfirmware] r1701 - cpu/x86/pc/olpc/via

svn at openfirmware.info svn at openfirmware.info
Tue Jan 26 04:35:02 CET 2010


Author: wmb
Date: 2010-01-26 04:35:01 +0100 (Tue, 26 Jan 2010)
New Revision: 1701

Added:
   cpu/x86/pc/olpc/via/blockfifo.fth
Log:
Checked in blockfifo.fth


Added: cpu/x86/pc/olpc/via/blockfifo.fth
===================================================================
--- cpu/x86/pc/olpc/via/blockfifo.fth	                        (rev 0)
+++ cpu/x86/pc/olpc/via/blockfifo.fth	2010-01-26 03:35:01 UTC (rev 1701)
@@ -0,0 +1,148 @@
+\ See license at end of file
+purpose: Non-blocking writes to fsdisk for NANDblaster
+
+support-package: block-fifo
+d# 10000 constant #queue
+h# 4000 value /chunk
+0 instance value chunks
+0 instance value block#s
+0 instance value this-#blocks
+0 instance value read-index
+0 instance value write-index
+0 instance value max-depth
+false instance value synchronous?
+
+: #queued  ( -- n )
+   write-index read-index -
+   dup 0<  if  #queue +  then
+;
+: update-max  ( -- )
+   #queued  max-depth  max  to max-depth
+;
+
+: blocks/chunk  ( -- n )  /chunk 9 rshift  ;
+
+: >chunk  ( i -- adr )  /chunk * chunks +  ;
+: +index  ( i -- i' )  1+  dup #queue =  if  drop 0  then  ;
+
+: full?  ( -- flag )
+   write-index read-index =  this-#blocks 0<>  and
+;
+: empty?  ( -- flag )
+   write-index read-index =  this-#blocks 0=  and
+;
+
+: ?write-error  ( -- )
+   if                                          ( )
+      ." disk-fifo: Write error at block "     ( )
+      block#s read-index na+ @ . cr            ( )
+      abort                                    ( )
+   then                                        ( )
+;
+
+: ?start-write  ( -- )
+   empty?  if  exit  then        ( )
+
+   \ Start a new write
+   read-index >chunk             ( adr )
+   block#s read-index na+ @      ( adr block# )
+   blocks/chunk                  ( adr block# #blocks )
+   " write-blocks-start" $call-parent  ?write-error  ( )
+   blocks/chunk to this-#blocks  ( )
+;
+
+: open  ( -- flag )
+\  #queue /chunk * alloc-mem to chunks
+   h# 200.0000 to chunks  \ 32 M
+   #queue /n* alloc-mem to block#s
+   0 to read-index
+   0 to write-index
+   0 to this-#blocks
+   true
+;
+
+: size  ( -- d.size )  " size" $call-parent  ;
+
+: poll  ( -- )
+   this-#blocks  if                               ( )
+      " write-blocks-end?" $call-parent  0=  if   ( )
+         exit   \ Write still in progress         ( -- )
+      then                                        ( error? )
+      ?write-error                                ( )
+      read-index +index to read-index             ( )
+      0 to this-#blocks                           ( )
+   then                                           ( )
+
+   ?start-write
+;
+
+: wait-available  ( -- )
+   full?  if
+      ." WARNING: disk-fifo queue full" cr
+      begin  poll  full? 0=  until
+   then
+;
+
+: write-blocks  ( adr block# #blocks -- actual )
+   synchronous?  if
+      " write-blocks" $call-parent
+      exit
+   then
+
+   dup  blocks/chunk <>  if           ( adr block# #blocks )
+      ." disk-fifo: bad write length " dup .  cr
+      2drop
+      0 exit
+   then                               ( adr block# #blocks )
+   drop                               ( adr block# )
+   wait-available                     ( adr block# )
+   block#s write-index na+ !          ( adr )
+   write-index >chunk  /chunk move    ( ) 
+   write-index +index to write-index  ( )
+   update-max                         ( )
+   poll                               ( )
+   blocks/chunk                       ( actual )
+;
+
+: drain-queue  ( -- )
+   synchronous?  0=  if
+      ." Max queue depth was " max-depth .d  ." , current is " #queued .d cr
+      true to synchronous?
+   then
+   begin  empty?  0=  while  poll  repeat
+;
+   
+: close  ( -- )
+   drain-queue
+   block#s  #queue /l*  free-mem
+;
+
+: read-blocks  ( adr block# #blocks -- actual )
+   drain-queue
+   " read-blocks" $call-parent
+;
+end-support-package
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2010 FirmWorks
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END




More information about the openfirmware mailing list