\ ***************************************************************************** \ * 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 ;