@@ -113,14 +113,26 @@ here 100 allot CONSTANT pci-device-vec
pci-next-mem64 @ 0<> and
;
+: pci-next-mem-align-1mb ( -- pci-next-mem )
+ pci-next-mem @
+ 100000 #aligned \ align to 1MB boundary
+ dup pci-next-mem !
+;
+
+: pci-next-mem-extend-1mb ( -- pci-next-mem )
+ pci-next-mem @
+ 100000 + \ add space for hot-plugging
+ 100000 #aligned \ align to 1MB boundary
+ dup pci-next-mem !
+;
+
\ Update pci-next-mem to be 1MB aligned and set the mem-base and mem-base-upper register
\ and set the Limit register to the maximum available address space
\ needed for scanning possible devices behind the bridge
: pci-bridge-set-mem-base ( addr -- )
- pci-next-mem @ 100000 #aligned \ read the current Value and align to 1MB boundary
- dup pci-next-mem ! \ and write it back
- over pci-bridge-has-mem64 \ check if 64bit support
+ dup pci-bridge-has-mem64 \ check if 64bit support
IF \ IF 64 bit support
+ pci-next-mem-align-1mb
pci-next-mem64 @ 100000000 #aligned \ | read the current Value of 64-bit and align to 4GB boundary
dup 100000000 + pci-next-mem64 x! \ | and write back with 1GB for bridge
2 pick swap \ |
@@ -132,6 +144,7 @@ here 100 allot CONSTANT pci-device-vec
pci-max-mem @ 1- FFFF0000 and or \ | and Insert mmem Limit (set it to max)
swap 24 + rtas-config-l! \ | and write it into the bridge
ELSE
+ pci-next-mem-align-1mb
10 rshift \ | keep upper 16 bits
pci-max-mem @ 1- FFFF0000 and or \ | and Insert mmem Limit (set it to max)
swap 24 + rtas-config-l! \ | and write it into the bridge
@@ -142,12 +155,10 @@ here 100 allot CONSTANT pci-device-vec
\ The Limit Value is one less then the upper boundary
\ If the limit is less than the base the mem is disabled
: pci-bridge-set-mem-limit ( addr -- )
- pci-next-mem @ 100000 + \ add space for hot-plugging
- 100000 #aligned \ align to 1MB boundary
- dup pci-next-mem ! \ and write it back
- 1- \ make limit one less than boundary
- over pci-bridge-has-mem64 \ check if 64bit support
+ dup pci-bridge-has-mem64 \ check if 64bit support
IF \ IF 64 bit support
+ pci-next-mem-extend-1mb
+ 1- \ | make limit one less than boundary
pci-next-mem64 @ 100000000 #aligned \ | Reat current value of 64-bar and align at 4GB
dup pci-next-mem64 x! \ | and write it back
1- \ | make limite one less than boundary
@@ -159,6 +170,9 @@ here 100 allot CONSTANT pci-device-vec
0000FFFF and \ | fetch original Value
or swap 24 + rtas-config-l! \ | and write it into the bridge
ELSE
+ \ Update current variable (add space for hot-plugging and align it)
+ pci-next-mem-extend-1mb
+ 1- \ | make limit one less than boundary
FFFF0000 and \ | keep upper 16 bits
over 24 + rtas-config-l@
0000FFFF and \ | fetch original Value
This should cause no behavioral change. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> --- slof/fs/pci-scan.fs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-)