Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / pci-config-bridge.fs
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 (file)
index 0000000..6893253
--- /dev/null
@@ -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 ;