summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/slof/fs/pci-config-bridge.fs
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/SLOF/slof/fs/pci-config-bridge.fs')
-rw-r--r--qemu/roms/SLOF/slof/fs/pci-config-bridge.fs111
1 files changed, 111 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/slof/fs/pci-config-bridge.fs b/qemu/roms/SLOF/slof/fs/pci-config-bridge.fs
new file mode 100644
index 000000000..689325318
--- /dev/null
+++ b/qemu/roms/SLOF/slof/fs/pci-config-bridge.fs
@@ -0,0 +1,111 @@
+\ *****************************************************************************
+\ * Copyright (c) 2004, 2011 IBM Corporation
+\ * All rights reserved.
+\ * This program and the accompanying materials
+\ * are made available under the terms of the BSD License
+\ * which accompanies this distribution, and is available at
+\ * http://www.opensource.org/licenses/bsd-license.php
+\ *
+\ * Contributors:
+\ * IBM Corporation - initial implementation
+\ ****************************************************************************/
+
+\ Generic config space access function - xt is execution token of rtas-config-xx
+: config-xt ( config-addr xt -- data )
+ puid >r \ Safe puid
+ my-puid TO puid \ Set my-puid
+ swap dup ffff00 AND 0= IF \ Has bus-device-function been specified?
+ my-space OR \ No: use my-space instead
+ THEN
+ swap execute \ Execute the rtas-config-xx function
+ r> TO puid \ Restore previous puid
+;
+
+\ define the config reads
+: config-b@ ( config-addr -- data ) ['] rtas-config-b@ config-xt ;
+: config-w@ ( config-addr -- data ) ['] rtas-config-w@ config-xt ;
+: config-l@ ( config-addr -- data ) ['] rtas-config-l@ config-xt ;
+
+\ define the config writes
+: config-b! ( data config-addr -- ) ['] rtas-config-b! config-xt ;
+: config-w! ( data config-addr -- ) ['] rtas-config-w! config-xt ;
+: config-l! ( data config-addr -- ) ['] rtas-config-l! config-xt ;
+
+\ for Debug purposes: dumps the whole config space
+: config-dump puid >r my-puid TO puid my-space pci-dump r> TO puid ;
+
+\ needed to find the right path in the device tree
+: decode-unit ( addr len -- phys.lo ... phys.hi )
+ 2 hex-decode-unit \ decode string
+ B lshift swap \ shift the devicenumber to the right spot
+ 8 lshift or \ add the functionnumber
+ my-bus 10 lshift or \ add the busnumber
+ 0 0 rot \ make phys.lo = 0 = phys.mid
+;
+
+\ needed to have the right unit address in the device tree listing
+\ phys.lo=phys.mid=0 , phys.hi=config-address
+: encode-unit ( phys.lo ... phys.hi -- unit-str unit-len )
+ nip nip \ forget the both zeros
+ dup 8 rshift 7 and swap \ calc Functionnumber
+ B rshift 1F and \ calc Devicenumber
+ over IF \ IF Function!=0
+ 2 hex-encode-unit \ | create string with DevNum,FnNum
+ ELSE \ ELSE
+ nip 1 hex-encode-unit \ | create string with only DevNum
+ THEN \ FI
+;
+
+: map-in ( phys.lo phys.mid phys.hi size -- virt )
+ \ ." map-in called: " .s cr
+ \ Ignore the size, phys.lo and phys.mid, get BAR from config space
+ drop nip nip ( phys.hi )
+ \ Sanity check whether config address is in expected range:
+ dup FF AND dup 10 28 WITHIN NOT swap 30 <> AND IF
+ cr ." phys.hi = " . cr
+ ABORT" map-in with illegal config space address"
+ THEN
+ 00FFFFFF AND \ Need only bus-dev-fn+register bits
+ dup config-l@ ( phys.hi' bar.lo )
+ dup 7 AND 4 = IF \ Is it a 64-bit BAR?
+ swap 4 + config-l@ lxjoin \ Add upper part of 64-bit BAR
+ ELSE
+ nip
+ THEN
+ F NOT AND \ Clear indicator bits
+ \ TODO: Use translate-address here!
+;
+
+: map-out ( virt size -- )
+ \ ." map-out called: " .s cr
+ 2drop
+;
+
+: dma-alloc ( ... size -- virt )
+ \ ." dma-alloc called: " .s cr
+ alloc-mem
+;
+
+: dma-free ( virt size -- )
+ \ ." dma-free called: " .s cr
+ free-mem
+;
+
+: dma-map-in ( ... virt size cacheable? -- devaddr )
+ \ ." dma-map-in called: " .s cr
+ 2drop
+;
+
+: dma-map-out ( virt devaddr size -- )
+ \ ." dma-map-out called: " .s cr
+ 2drop drop
+;
+
+: dma-sync ( virt devaddr size -- )
+ \ XXX should we add at least a memory barrier here?
+ \ ." dma-sync called: " .s cr
+ 2drop drop
+;
+
+: open true ;
+: close ;