Files
openbios/forth/util/pci.fs
Stefan Reinauer 5c9eb9b45b initial import of openbios--main--1.0--patch-26
git-svn-id: svn://coreboot.org/openbios/openbios-devel@1 f158a5a8-5612-0410-a976-696ce0be7e32
2006-04-26 15:08:19 +00:00

128 lines
2.3 KiB
Forth

\ tag: PCI helper functions
\
\ Copyright (C) 2003-2004 Stefan Reinauer
\ Copyright (C) 2003 Samuel Rydh
\
\ See the file "COPYING" for further information about
\ the copyright and warranty status of this work.
\
\ simple set of words for pci access, these are not
\ compliant to the PCI bus binding of OpenFirmware.
\ only forth
\ vocabulary pci
\ also pci definitions
hex
: busdevfn ( bus dev fn -- busdevfn )
7 and swap
1f and 3 << or ( dev fn -- devfn )
swap 8 << or ( bus devfn -- busdevfn )
;
: config-command ( busdevfn reg -- reg addr )
dup -rot
3 invert and
swap 8 << or
80000000 or
;
: pci-c@ ( busdevfn reg -- x )
config-command
cf8 iol!
3 and cfc +
ioc@
;
: pci-w@ ( busdevfn reg -- x )
config-command
cf8 iol!
2 and cfc + iow@
;
: pci-l@ ( busdevfn reg -- x )
config-command
cf8 iol!
drop
cfc iol@
;
: pci-c! ( busdevfn reg val -- )
-rot config-command
cf8 iol!
3 and cfc + ioc!
;
: pci-w! ( busdevfn reg val -- )
-rot config-command
cf8 iol!
2 and cfc + iow!
;
: pci-l! ( busdevfn reg val -- )
-rot config-command
cf8 iol!
drop
cfc iol!
;
: dump-pci-device ( bus dev fn -- )
2 pick (.) type 3a emit over
(.) type 2e emit dup (.) type 20 emit 5b emit \ 0:18.0 [
busdevfn >r
r@ 0 pci-w@ u. 2f emit r@ 2 pci-w@ u. 5d emit \ 1022/1100]
r>
\ now we iterate
10 0 do
cr i todigit emit 30 emit 3a emit 20 emit
10 0 do
dup i j 4 << or pci-c@
dup 4 >> todigit emit f and todigit emit
20 emit
loop
loop
drop
cr cr
;
\ : test-pci
\ 0 2 0 dump-pci-device
\ ;
\ only forth
\ -------------------------------------------------------------------------
\ PCI encode/decode unit
\ -------------------------------------------------------------------------
\ we only implement DD and DD,F
: encode-unit-pci ( phys.lo phy.mid phys.hi -- str len )
nip nip ff00 and 8 >> dup 3 >>
swap 7 and
( ddddd fff )
?dup if
pocket tohexstr
" ," pocket tmpstrcat
else
0 0 pocket tmpstrcpy
then
>r
rot pocket tohexstr r> tmpstrcat drop
;
: decode-unit-pci-bus ( str len bus -- phys.lo phys.mid phys.hi )
-rot ascii , left-split
( addr-R len-R addr-L len-L )
parse-hex b << f800 and
-rot parse-hex 8 << 700 and
or
( bus phys.hi )
swap ff and 10 << or
0 0 rot
;