[openfirmware] [commit] r2384 - in dev: . pci
repository service
svn at openfirmware.info
Sat Jul 16 14:20:43 CEST 2011
Author: wmb
Date: Sat Jul 16 14:20:43 2011
New Revision: 2384
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2384
Log:
PCI and PCI bridge drivers - better support for preassigned addresses.
Modified:
dev/pci/pcibridg.fth
dev/pcibus.fth
Modified: dev/pci/pcibridg.fth
==============================================================================
--- dev/pci/pcibridg.fth Sat Jul 16 14:18:36 2011 (r2383)
+++ dev/pci/pcibridg.fth Sat Jul 16 14:20:43 2011 (r2384)
@@ -11,10 +11,6 @@
: my-l! ( l offset -- ) my-space + " config-l!" $call-parent ;
0 value my-bus#
-0 value my-io-base
-0 value my-io-limit
-0 value my-mem-base
-0 value my-mem-limit
defer parent-decode-unit
@@ -153,43 +149,58 @@
2swap drop r> swap - encode-int encode+ ( adr' len' )
;
-: make-ranges-property ( -- )
- 0 0 encode-bytes
- my-io-base my-io-limit h# 8100.0000 +range-entry
- my-mem-base my-mem-limit h# 8200.0000 +range-entry
- " ranges" property
-;
-
\ decode-unit and encode-unit must be static methods, so they can't use
\ $call-parent at run-time
" decode-unit" parent-phandle find-method drop ( xt ) to parent-decode-unit
" encode-unit" parent-phandle find-method drop ( xt ) to encode-unit
+: assign-addresses? ( -- flag )
+\ " addresses-preassigned" my-parent ihandle>phandle get-package-property if
+ " addresses-preassigned" get-inherited-property if
+ \ Property not present
+ true
+ else ( propval$ )
+ \ Property present
+ 2drop false
+ then
+;
: prefetch-ranges-off ( -- )
\ Turn off prefetchable memory forwarding range
h# 0000ffff h# 24 my-l! \ Prefetchable Limit,Base
h# ffffffff h# 28 my-l! \ Prefetchable Base upper 32 bits
h# 0 h# 2c my-l! \ Prefetchable Limit upper 32 bits
;
-: set-bases ( mem-base io-base -- )
- 2dup to my-io-base to my-mem-base
-
- \ Set I/O forwarding base
- lwsplit h# 30 my-w! wbsplit h# 1c my-b! drop ( mem-base )
-
- \ Set non-prefetchable memory forwarding base
- lwsplit h# 20 my-w! drop ( )
+: io-base@ ( -- base )
+ 0 h# 1c my-b@ bwjoin h# 30 my-w@ wljoin
;
-: set-limits ( mem-limit+1 io-limit+1 -- )
- 2dup to my-io-limit to my-mem-limit
-
- \ Set I/O forwarding limit
- 1- lwsplit h# 32 my-w! wbsplit h# 1d my-b! drop ( mem-limit )
+: io-base! ( base -- )
+ lwsplit h# 30 my-w! wbsplit h# 1c my-b! drop
+;
+: io-limit@ ( -- limit+1 )
+ 0 h# 1d my-b@ bwjoin h# 32 my-w@ wljoin 1+
+;
+: io-limit! ( limit+1 -- )
+ 1- lwsplit h# 32 my-w! wbsplit h# 1d my-b! drop
+;
+: mem-base@ ( -- base ) 0 h# 20 my-w@ wljoin ;
+: mem-base! ( base -- ) lwsplit h# 20 my-w! drop ;
+: mem-limit@ ( -- limit+1 ) 0 h# 22 my-w@ wljoin 1+ ;
+: mem-limit! ( limit+1 -- ) 1- lwsplit h# 22 my-w! drop ;
+: pri-bus! ( bus# -- ) h# 18 my-b! ;
+: pri-bus@ ( -- bus# ) h# 18 my-b@ ;
+: sec-bus! ( bus# -- ) h# 19 my-b! ;
+: sec-bus@ ( -- bus# ) h# 19 my-b@ ;
+: bus-limit! ( bus# -- ) h# 1a my-b! ;
+: bus-limit@ ( -- bus# ) h# 1a my-b@ ;
- \ Set non-prefetchable memory forwarding range
- 1- lwsplit h# 22 my-w! drop ( )
+: make-ranges-property ( -- )
+ 0 0 encode-bytes
+ io-base@ io-limit@ h# 8100.0000 +range-entry
+ mem-base@ mem-limit@ h# 8200.0000 +range-entry
+ " ranges" property
;
+
\ Paranoia, perhaps justified
: disable-children ( -- )
my-bus# d# 16 lshift 4 + ( template )
@@ -198,19 +209,7 @@
7 value my-bridge-modes
-: setup-bridge ( -- )
- " pci" device-name
-
- " pci" encode-string " device_type" property
-
- 0 0 my-space encode-phys 0 encode-int encode+ 0 encode-int encode+
- " reg" property
-
- 2 encode-int " #size-cells" property
- 3 encode-int " #address-cells" property
-
- start-interrupt-map
-
+: set-bridge-registers ( -- )
\ Turn off memory and I/O response and bus mastership while setting up
0 4 my-w!
@@ -218,19 +217,19 @@
h# 3e my-b@ dup h# 40 or h# 3e my-b!
h# 40 invert and h# 3e my-b!
- my-space d# 16 rshift h# ff and h# 18 my-b! \ Primary bus#
- 1 " allocate-bus#" $call-parent rot dup h# 19 my-b! \ Secondary bus#
+ my-space d# 16 rshift h# ff and pri-bus! \ Primary bus#
+ 1 " allocate-bus#" $call-parent rot dup sec-bus! \ Secondary bus#
to my-bus#
( next-mem next-io )
\ Set the subordinate bus number to ff in order to pass through any
\ type 1 cycle with a bus number higher then the secondary bus#
- h# ff h# 1a my-b! ( next-mem next-io )
- disable-children
- 2dup set-bases ( next-mem next-io )
+ h# ff bus-limit! ( next-mem next-io )
+ disable-children ( next-mem next-io )
+ over mem-base! dup io-base! ( next-mem next-io )
\ Initially set the limits to encompassing the rest of the address space
- 2drop mem-space-top io-space-top set-limits
+ 2drop mem-space-top mem-limit! io-space-top io-limit!
\ Clear status bits
h# ffff h# 1e my-w! ( )
@@ -242,6 +241,33 @@
\ rebind the (global) value bridge-modes.
" bridge-modes" $find if execute else 2drop my-bridge-modes then
4 my-w@ or 4 my-w! ( )
+;
+: reduce-bridge-limits ( -- )
+ \ Reduce the subordinate bus# to the maximum bus number of any of
+ \ our children, and the memory and IO forwarding limits to the
+ \ limits of the address space actually allocated.
+ 0 " allocate-bus#" $call-parent rot bus-limit! ( final-mem final-io )
+ io-limit! mem-limit!
+;
+: setup-bridge ( -- )
+ " pci" device-name
+
+ " pci" encode-string " device_type" property
+
+ 0 0 my-space encode-phys 0 encode-int encode+ 0 encode-int encode+
+ " reg" property
+
+ 2 encode-int " #size-cells" property
+ 3 encode-int " #address-cells" property
+
+ start-interrupt-map
+
+ assign-addresses? if
+ set-bridge-registers
+ else
+ sec-bus@ to my-bus#
+ 0 0 " addresses-preassigned" property
+ then
\ [ifdef] firepower
\ \ The IBM bridge is somewhat funny
@@ -254,20 +280,17 @@
" 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f" prober-xt execute
- \ Reduce the subordinate bus# to the maximum bus number of any of
- \ our children, and the memory and IO forwarding limits to the
- \ limits of the address space actually allocated.
- 0 " allocate-bus#" $call-parent rot h# 1a my-b! ( final-mem final-io )
- set-limits
+ assign-addresses? if reduce-bridge-limits then
make-ranges-property
finish-interrupt-map
- my-bus# encode-int h# 1a my-b@ encode-int encode+
+ my-bus# encode-int bus-limit@ encode-int encode+
" bus-range" property
;
setup-bridge
+
\ LICENSE_BEGIN
\ Copyright (c) 2006 FirmWorks
\
Modified: dev/pcibus.fth
==============================================================================
--- dev/pcibus.fth Sat Jul 16 14:18:36 2011 (r2383)
+++ dev/pcibus.fth Sat Jul 16 14:20:43 2011 (r2384)
@@ -55,6 +55,18 @@
headers \ These headers are for debugging convenience
0 value current-bus#
+: have-property? ( propname$ -- flag )
+ get-my-property if false else 2drop true then
+;
+: assign-addresses? ( -- flag ) " addresses-preassigned" have-property? 0= ;
+: parent-assign-addresses? ( -- flag )
+ " addresses-preassigned" get-inherited-property if ( )
+ true
+ else ( propval$ )
+ 2drop false
+ then
+;
+
\ These cannot be package values because some words that use them are called
\ directly from different contexts - both from the root of the PCI domain
\ and also from child nodes and subordinate PCI-PCI bridge nodes. They need
@@ -744,7 +756,7 @@
: find-fcode? ( -- false | adr len true )
next-mem to save-mem
- temp-assign-addresses
+ parent-assign-addresses? if temp-assign-addresses then
expansion-rom ( offset )
\ \ Map the expansion ROM at a high physical address that does not
@@ -770,12 +782,14 @@
\ Turn on address decode enable in Expansion ROM Base Address Register
r@ my-l@ 1 or r@ my-l! ( r: size virt offset ) ( virt )
- 2 4 my-w! \ Turn on memory enable ( virt )
+ 4 my-w@ 2 or 4 my-w! \ Turn on memory enable ( virt )
- locate-fcode ( false | adr len true )
+ locate-fcode ( r: size virt offset ) ( false | adr len true )
\ Turn off memory enable
- 0 4 my-w! ( r: size virt offset ) ( false | adr len true )
+ parent-assign-addresses? if ( r: size virt offset ) ( false | adr len true )
+ 4 my-w@ 2 invert and 4 my-w!
+ then ( r: size virt offset ) ( false | adr len true )
\ Turn off address decode enable in Expansion ROM Base Address Register
r@ my-l@ 1 invert and r> my-l! ( r: size virt ) ( false | adr len true )
@@ -944,7 +958,7 @@
make-child-properties ( )
card-bus? if make-common-properties exit then ( )
- clear-addresses ( )
+ parent-assign-addresses? if clear-addresses then ( )
\ Interpret FCode if present; if not, invent "name" and "reg" properties
find-fcode? if ( adr len )
@@ -954,9 +968,11 @@
then ( )
bridge? 0= if
- clear-addresses ( )
- b my-b@ 6 <> if
- 0 4 my-w! \ Disables all card response
+ parent-assign-addresses? if
+ clear-addresses ( )
+ b my-b@ 6 <> if
+ 0 4 my-w! \ Disables all card response
+ then
then
then
restore-fcodes
@@ -1289,11 +1305,11 @@
update-pointers \ Re-init the temporary allocation pointers,
\ thus erasing any probe-state mappings
- assign-all-addresses
+ assign-addresses? if assign-all-addresses then
\ XXX TODO set-latency-timers set-fast-back-to-backs
;
: master-probe ( adr len -- )
- true to probe-state?
+ assign-addresses? to probe-state?
prober
\ Make permanent any address assignments that occurred during the
More information about the openfirmware
mailing list