diff options
Diffstat (limited to 'slof/fs/node.fs')
-rw-r--r-- | slof/fs/node.fs | 227 |
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> |