[openfirmware] r1266 - dev/ide
svn at openfirmware.info
svn at openfirmware.info
Sat Aug 1 00:52:11 CEST 2009
Author: wmb
Date: 2009-08-01 00:52:11 +0200 (Sat, 01 Aug 2009)
New Revision: 1266
Modified:
dev/ide/dmaide.fth
dev/ide/generic.fth
Log:
IDE driver - added DMA write support.
Modified: dev/ide/dmaide.fth
===================================================================
--- dev/ide/dmaide.fth 2009-07-31 20:05:33 UTC (rev 1265)
+++ dev/ide/dmaide.fth 2009-07-31 22:52:11 UTC (rev 1266)
@@ -38,7 +38,7 @@
;
: dma-wait ( -- )
- begin dma-stat@ dup 1 and 0= swap 2 and or until
+ begin 1 ms dma-stat@ dup 1 and 0= swap 2 and or until
;
\ Sense and clear errors. The bit masked by 04 is read-clear and means
@@ -49,30 +49,36 @@
: dma-interrupt? ( -- flag ) dma-stat@ 4 and ;
-: dma-rblock ( dma-adr #blks -- error? )
- /block@ *
- set-dma ( )
- dma-cmd@ 1 or dma-cmd! dma-wait dma-cmd@ 1 invert and dma-cmd!
- dma-interrupt? if
+: dma-begin ( dma-adr #blks direction -- dma-adr phys #blks )
+ dma-cmd! ( dma-adr #blks )
+ 2dup /block@ * true " dma-map-in" $call-parent swap ( adr phys #blks )
+ 2dup /block@ * set-dma ( adr phys #blks )
+ dma-cmd@ 1 or dma-cmd! ( adr phys #blks )
+;
+: dma-end ( adr phys #blks -- actual# )
+ dma-wait 0 dma-cmd! ( adr phys #blks )
+ dma-interrupt? if ( adr phys #blks )
r-csr@ drop \ Clear interrupt in drive
- dma-stat@ h# f0 and 4 or dma-stat!
- then
- dma-error?
-;
+ dma-stat@ h# f0 and 4 or dma-stat! ( adr phys #blks )
+ then ( adr phys #blks )
-: (drblocks) ( adr #blks -- actual# )
- tuck dma-rblock if drop 0 then
+ dma-error? if 0 else dup then >r ( adr phys #blks r: actual )
+
+ /block@ * " dma-map-out" $call-parent ( r: actual )
+
+ r> ( actual# )
;
: dma-rblocks ( adr #blks -- actual#blks )
- 2dup /block@ * true " dma-map-in" $call-parent swap ( adr phys #blks )
+ 8 dma-begin ( adr phys #blks )
+ dma-read-cmd r-csr! ( adr phys #blks )
+ dma-end ( actual#blks )
+;
- dma-read-cmd r-csr!
- 8 dma-cmd! \ DMA direction for disk read (0 is write)
- ['] rblock behavior >r ['] dma-rblock to rblock
- 2dup (drblocks) ( adr phys #blks actual#blks )
- r> to rblock
- >r /block@ * " dma-map-out" $call-parent r> ( actual#blks )
+: dma-wblocks ( adr #blks -- actual#blks )
+ 0 dma-begin ( adr phys #blks )
+ dma-write-cmd r-csr! ( adr phys #blks )
+ dma-end ( actual#blks )
;
: vendor-id ( -- w ) my-space " config-w@" $call-parent ;
@@ -172,11 +178,13 @@
4 my-w@ 4 or 4 my-w!
['] dma-rblocks to rblocks
+ ['] dma-wblocks to wblocks
;
' (open-dma) to open-dma
: (close-dma) ( -- )
['] pio-rblocks to rblocks
+ ['] pio-wblocks to wblocks
\ Disable bus mastering
4 my-w@ 4 invert and 4 my-w!
Modified: dev/ide/generic.fth
===================================================================
--- dev/ide/generic.fth 2009-07-31 20:05:33 UTC (rev 1265)
+++ dev/ide/generic.fth 2009-07-31 22:52:11 UTC (rev 1266)
@@ -177,7 +177,8 @@
chip-base io-blk-w! false
pio-end-hack
;
-: wblocks ( addr #blks -- actual# | error )
+
+: pio-wblocks ( addr #blks -- actual# | error )
over >r ( addr #blks ) ( R: addr )
h# 30 r-csr!
@@ -194,6 +195,8 @@
until
r> - /block@ /
;
+defer wblocks
+' pio-wblocks to wblocks
\ Read or write "#blks" blocks starting at "block#" into memory at "addr"
\ Input? is true for reading or false for writing.
More information about the openfirmware
mailing list