include config.fs

\ ---------
\ DMA words
\ ---------

: sparc32-dma-free  ( virt size -- )
  2drop
;

: sparc32-dma-map-out  ( virt devaddr size -- )
  (dma-sync)
;

['] sparc32-dma-free to (dma-free)
['] sparc32-dma-map-out to (dma-map-out)


" /" find-device
  2 encode-int " #address-cells" property
  1 encode-int " #size-cells" property

  " sun4m" encode-string " compatible" property
  h# 0a21fe80 encode-int " clock-frequency" property

  : encode-unit encode-unit-sbus ;
  : decode-unit decode-unit-sbus ;

  : dma-sync
    (dma-sync)
  ;

  : dma-alloc
    (dma-alloc)
  ;

  : dma-free
    (dma-free)
  ;

  : dma-map-in
    (dma-map-in)
  ;

  : dma-map-out
    (dma-map-out)
  ;

new-device
  " memory" device-name
  external
  : open true ;
  : close ;
  \ claim ( phys size align -- base )
  \ release ( phys size -- )
finish-device

new-device
  " virtual-memory" device-name
  external
  : open true ;
  : close ;
  \ claim ( phys size align -- base )
  \ release ( phys size -- )
finish-device

new-device
  " iommu" device-name
  2 encode-int " #address-cells" property
  1 encode-int " #size-cells" property
  h# 1000 encode-int " page-size" property
  0 encode-int " cache-coherence?" property
  external
  : open ( cr ." opening iommu" cr) true ;
  : close ;
  : encode-unit encode-unit-sbus ;
  : decode-unit decode-unit-sbus ;
finish-device

" /iommu" find-device
new-device
  " sbus" device-name
  " hierarchical" device-type
  2 encode-int " #address-cells" property
  1 encode-int " #size-cells" property
  h# 01443fd0 encode-int " clock-frequency" property
  h# 1c encode-int " slot-address-bits" property
  h# 3f encode-int " burst-sizes" property
  external
  : open ( cr ." opening SBus" cr) true ;
  : close ;
  : encode-unit encode-unit-sbus ;
  : decode-unit decode-unit-sbus ;
  : map-in map-in-sbus ;
  : map-out map-out-sbus ;
  : dma-alloc " dma-alloc" $call-parent ;
  : dma-free " dma-free" $call-parent ;
  : dma-map-in " dma-map-in" $call-parent ;
  : dma-map-out " dma-map-out" $call-parent ;
  : dma-sync " dma-sync" $call-parent ;
finish-device

[IFDEF] CONFIG_BPP
" /iommu/sbus" find-device
new-device
  " SUNW,bpp" device-name
  h# 4 encode-int h# 0c800000 encode-int encode+ h# 0000001c encode-int encode+ " reg" property
  h# 33 encode-int 0 encode-int encode+ " intr" property
finish-device
[THEN]

" /iommu/sbus" find-device
new-device
  " espdma" device-name
  external
  : encode-unit encode-unit-sbus ;
  : decode-unit decode-unit-sbus ;
  : dma-alloc " dma-alloc" $call-parent ;
  : dma-free " dma-free" $call-parent ;
  : dma-map-in " dma-map-in" $call-parent ;
  : dma-map-out " dma-map-out" $call-parent ;
  : dma-sync " dma-sync" $call-parent ;
finish-device

" /iommu/sbus" find-device
new-device
  " ledma" device-name
  h# 3f encode-int " burst-sizes" property
  external
  : encode-unit encode-unit-sbus ;
  : decode-unit decode-unit-sbus ;
  : dma-alloc " dma-alloc" $call-parent ;
  : dma-free " dma-free" $call-parent ;
  : dma-map-in " dma-map-in" $call-parent ;
  : dma-map-out " dma-map-out" $call-parent ;
  : dma-sync " dma-sync" $call-parent ;
finish-device

" /iommu/sbus/ledma" find-device
new-device
  " le" device-name
  " network" device-type
  h# 7 encode-int " busmaster-regval" property
  h# 26 encode-int 0 encode-int encode+ " intr" property
  : dma-alloc " dma-alloc" $call-parent ;
  : dma-free " dma-free" $call-parent ;
  : dma-map-in " dma-map-in" $call-parent ;
  : dma-map-out " dma-map-out" $call-parent ;
  : dma-sync " dma-sync" $call-parent ;
finish-device

\ obio (on-board IO)
" /" find-device
new-device
  " obio" device-name
  " hierarchical" device-type
  2 encode-int " #address-cells" property
  1 encode-int " #size-cells" property
  external
  : open ( cr ." opening obio" cr) true ;
  : close ;
  : encode-unit encode-unit-sbus ;
  : decode-unit decode-unit-sbus ;
finish-device

" /options" find-device
  " disk" encode-string " boot-from" property

" /openprom" find-device
  0 0 " aligned-allocator" property
