aboutsummaryrefslogtreecommitdiff
path: root/slof/fs/node.fs
diff options
context:
space:
mode:
Diffstat (limited to 'slof/fs/node.fs')
-rw-r--r--slof/fs/node.fs227
1 files changed, 0 insertions, 227 deletions
diff --git a/slof/fs/node.fs b/slof/fs/node.fs
index 4ae52b0..b632d65 100644
--- a/slof/fs/node.fs
+++ b/slof/fs/node.fs
@@ -432,232 +432,5 @@ VARIABLE interpose-node
find-package IF open-package ELSE 2drop false THEN ;
-\ Pseudocode in C Syntax
-\ if((addr>=child)&&(addr<=child+size)
-\ return (addr - child) + parent
-\ else return false
-\
-: translate-range ( child parent size addr -- taddr true | addr false )
- swap 3 pick + over \ calculate child+size address
- ( child parent size addr child+size )
- > IF \ verify if addr is below child+size address
- ( child parent addr )
- 2 pick over \ fetch child and addr for compare
- ( child parend addr child addr )
- <= IF \ verify if addr is above child address
- ( child parent addr )
- 2 pick - + nip true \ pick child, calculate addr-child + parent, drop child and return true
- ( taddr true )
- ELSE
- 2drop false \ drop child parent size and return false
- ( addr false )
- THEN
- ELSE
- ( child parent addr )
- nip nip false \ drop child parent size and return false
- ( addr false )
- THEN
-;
-
-\ helper function based on decode-int to decode an integer property
-\ from a prop-encoded-array
-\ my-property cannot be used since this depends on a current instance
-: get-property-decoded ( addr len -- n )
- get-node get-property
- IF cr cr cr ." get-property-decoded: no such property" EXIT THEN decode-int nip nip
-;
-
-0 VALUE pci-phys-hi
-1C000000 CONSTANT pci-stop-mapping-code
-\ Explanation to pci-stop-mapping-code:
-\ Bits 26..28 are unsused in phys.hi in the IEEE 1275 PCI binding
-\ and set to 0. Use value where these bits are set in pci-phys-hi to communicate that
-\ translation sould stop.
-
-\ Helper function to extract one element of the child parent size tuple coded
-\ into the ranges properties array, element being exactly one of child, parent
-\ and size
-: extract-range-element ( ranges-addr ranges-len #cells -- element ranges-addr' ranges-len' )
- \ -rot decode-int 3 roll 1 > IF 20 lshift -rot decode-int 3 roll + THEN -rot
- CASE
- 1 OF decode-int -rot ENDOF
- 2 OF decode-int 20 lshift -rot decode-int 3 roll + -rot ENDOF
- 3 OF
- BEGIN
- dup 0= IF
- false ( ranges-addr ranges-len false )
- ELSE
- decode-int
- pci-phys-hi \ for PCI phys.hi lies on the stack below addr
- space-code-mask and
- <> \ compare phys.hi
- THEN
- WHILE
- \ discard phys.mid, phys.lo, parent, and size values. Then go to next PCI ranges tuple
- 18 dup -rot - -rot + swap
- REPEAT
-
- dup 0= IF ( ranges-addr ranges-len )
- pci-stop-mapping-code to pci-phys-hi ( ranges-addr ranges-len )
- ELSE
- \ ranges size >= 8, since phys.hi
- \ was read in ELSE of WHILE condition
- decode-int 20 lshift -rot decode-int 3 roll + -rot
- THEN
- ENDOF
- ENDCASE
-;
-
-\ Function to convert a whole child parent size sequence into decoded-int format
-: extract-range ( ranges-addr ranges-len -- child parent size ranges-addr' ranges-len' )
- \ child
- s" #address-cells" get-property-decoded
- extract-range-element
- \ exit criterium for PCI: ranges-len is 0 and false on top of stack
- pci-phys-hi pci-stop-mapping-code = IF EXIT THEN ( ranges-addr ranges-len )
-
- \ parent ( child ranges-addr' ranges-len' )
- decode-phys ( child ranges-addr" ranges-len" phys.lo .. phys.hi )
- my-#address-cells 1 > IF 20 lshift + THEN ( child ranges-addr''' ranges-len''' parent )
- -rot ( child parent ranges-addr''' ranges-len''' )
-
- \ size
- s" #size-cells" get-property-decoded ( child parent ranges-addr''' ranges-len''' #size-cells )
- extract-range-element ( child parent size ranges-addr"" ranges-len"" )
-;
-
-\ Function to process a whole array one or more of child parent size sequences
-\ Prerequisite: Empty ranges handing is assumed to already exist.
-: translate-ranges-node ( addr ranges-addr ranges-len -- taddr true|false )
- BEGIN
- dup 0 > \ ranges-len > 0
- WHILE
- extract-range
- pci-phys-hi pci-stop-mapping-code =
- IF ( addr ranges-addr ranges-len )
- nip nip EXIT ( false )
- THEN
- ( addr child parent size ranges-addr' ranges-len' )
- 2rot ( parent size ranges-addr' ranges-len' addr child )
- 5 roll ( size ranges-addr' ranges-len' addr child parent )
- 5 roll ( ranges-addr' ranges-len' addr child parent size )
- 3 roll ( ranges-addr' ranges-len' child parent size addr )
- translate-range ( ranges-addr' ranges-len' taddr true | ranges-addr' ranges-len' addr false )
- IF nip nip true EXIT
- ELSE ( ranges-addr' ranges-len' addr )
- -rot
- ( addr ranges-addr' ranges-len' )
- THEN
- REPEAT
- ( ranges-addr' ranges-len' taddr true | ranges-addr' ranges-len' false )
- \ remove addr ranges-addr' ranges-len' from stack
- nip nip \ leaving the 0 ranges-len' as false
- ( false )
-;
-
-\ Helper function to search the first ranges in current node or one of its parents
-\ and make that node the 'current node'
-\ Prerequisite: root node must have a ranges property
-\ Returns address, length, true if ranges property was found, otherwise false.
-: translate-set-to-next-ranges-node ( -- addr-ranges len-ranges true|false )
- s" ranges" 2dup get-node get-property
- IF
- ( addr len true )
- get-parent dup set-node get-property
- IF
- cr cr cr
- s" no translatable address space due to missing ranges property" type
- cr cr cr
- false
- ELSE
- true
- THEN
- ELSE
- ( addr len addr-ranges len-ranges )
- rot drop rot drop true
- THEN
- ( ranges-addr ranges-len true|false )
-;
-
-: translate-address-end ( phandle-start taddr true|phandle-start false )
- \ get back to the node where translation was started
- dup IF
- rot ( taddr true phandle-start )
- set-node ( taddr true )
- ELSE
- swap ( phandle-start false )
- set-node ( false )
- THEN
-;
-
-\ Function to step up the device tree up to the root node.
-\ Contains empty ranges handling.
-\ Returns the translated address and true, when the address is translatable, otherwise false.
-: translate-ranges ( addr -- taddr true|false )
- BEGIN
- \ set-node semantic required here to continue from nodes found below.
- translate-set-to-next-ranges-node
- not IF false EXIT THEN ( false ) \ address is not translatable
- \ due to missing ranges property in the hierarchy.
- ( phandle-start addr ranges-addr ranges-len )
- dup 0=
- IF
- \ empty ranges property detected, assume 1 : 1 translation
- 2drop true
- ( phandle-start addr true )
- ELSE
- ( phandle-start addr ranges-addr ranges-len )
- translate-ranges-node
- ( phandle-start taddr true|phandle-start false )
- THEN
- dup IF
- ( phandle-start taddr true ) \ found a translation
- drop
- get-parent
- dup 0=
- IF \ arrived at root node, stop translation
- drop true dup
- ( phandle-start taddr true true )
- ELSE
- \ go to parent and continue
- set-node false
- ( phandle-start taddr true phandle-parent false )
- THEN
- ELSE
- true \ address translation failed, exit loop
- ( phandle-start false true )
- THEN
- UNTIL
- ( phandle-start taddr true|phandle-start false )
-;
-
-
-: translate-address-back-to-start-node ( phandle-start taddr true|phandle-start false )
- \ get back to the node where translation was started
- dup IF
- rot ( taddr true phandle-start )
- set-node ( taddr true )
- ELSE
- swap ( phandle-start false )
- set-node ( false )
- THEN
-;
-
-: translate-address ( addr -- taddr true|false )
- get-node swap \ save current node ( phandle-start addr )
- translate-ranges ( phandle-start taddr true|phandle-start false )
- translate-address-back-to-start-node ( taddr true|false )
-;
-
-
-: translate-address-pci ( phys.lo phys.mid phys.hi -- taddr true|false )
- to pci-phys-hi ( phys.lo phys.mid )
- lxjoin ( phys.addr )
- get-node \ save current node ( phys.addr phandle-start )
- swap ( phandle-start phys.addr )
- translate-ranges \ fetches phys.hi for PCI ( phandle-start taddr true|phandle-start false )
- translate-address-back-to-start-node ( taddr true|false )
-;
-
\ device tree translate-address
#include <translate.fs>