[SLOF] [PATCH] pci: Reserve free space at the end of bridge windows instead of at the beginning
David Gibson
david at gibson.dropbear.id.au
Tue May 16 15:32:52 AEST 2017
On Mon, May 15, 2017 at 01:45:32PM +0200, Thomas Huth wrote:
> This reverts commit e53c2541784fba7951c8aa6ccdbe4412fb03fca6
> ("pci-scan: reserve memory for pci-bridge without devices").
> That commit reserved some free space on PCI bridges at the beginning
> of the bridges' memory windows (by adjusting the pci-next-[mem|mmio|io]
> variables during the pci-bridge-set-[mem|mmio|io]-base functions).
>
> While this was basically a good idea, this way also had two drawbacks:
>
> 1) There also might be free space at the end of the window (since the
> base of the next bridge window has to be aligned, too), so the free
> space on the bridge is non-contiguous.
>
> 2) As soon as there was at least one device on the bridge that uses
> at least some few byte in the I/O space, SLOF reserved at least 8k
> of I/O space on the bridge - which is a *lot* in the scarce I/O space,
> so that for example it was not possible anymore to next 8 PCI bridges
> with devices attached to them (see the buglink below for details).
>
> It's better to reserve the free space at the end of the memory windows
> instead (in the pci-bridge-set-[mem|mmio|io]-limit functions), and
> with regards to the scarce I/O space, we should also reserve less
> I/O memory on each bridge, so we use a limit of 2k (plus alignment)
> here now.
>
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1443433
> Signed-off-by: Thomas Huth <thuth at redhat.com>
I don't speak Forth, but from the description it sounds like a good idea.
> ---
> slof/fs/pci-scan.fs | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/slof/fs/pci-scan.fs b/slof/fs/pci-scan.fs
> index c0dbbed..9578189 100644
> --- a/slof/fs/pci-scan.fs
> +++ b/slof/fs/pci-scan.fs
> @@ -81,7 +81,7 @@ here 100 allot CONSTANT pci-device-vec
> \ needed for scanning possible devices behind the bridge
> : pci-bridge-set-mmio-base ( addr -- )
> pci-next-mmio @ 100000 #aligned \ read the current Value and align to 1MB boundary
> - dup 100000 + pci-next-mmio ! \ and write back with 1MB for bridge
> + dup pci-next-mmio ! \ and write it back
> 10 rshift \ mmio-base reg is only the upper 16 bits
> pci-max-mmio @ 1- FFFF0000 and or \ and Insert mmio Limit (set it to max)
> swap 20 + rtas-config-l! \ and write it into the bridge
> @@ -91,7 +91,8 @@ 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 mmio is disabled
> : pci-bridge-set-mmio-limit ( addr -- )
> - pci-next-mmio @ 100000 #aligned \ fetch current value and align to 1MB
> + pci-next-mmio @ 100000 + \ add space for hot-plugging
> + 100000 #aligned \ align to 1MB boundary
> dup pci-next-mmio ! \ and write it back
> 1- FFFF0000 and \ make it one less and keep upper 16 bits
> over 20 + rtas-config-l@ 0000FFFF and \ fetch original value
> @@ -103,7 +104,7 @@ here 100 allot CONSTANT pci-device-vec
> \ 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 100000 + pci-next-mem ! \ and write back with 1MB for bridge
> + dup pci-next-mem ! \ and write it back
> over 24 + rtas-config-w@ \ check if 64bit support
> 1 and IF \ IF 64 bit support
> pci-next-mem64 @ 100000000 #aligned \ | read the current Value of 64-bit and align to 4GB boundary
> @@ -123,7 +124,8 @@ 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 #aligned \ read the current Value and align to 1MB boundary
> + 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 24 + rtas-config-w@ \ check if 64bit support
> @@ -145,7 +147,7 @@ here 100 allot CONSTANT pci-device-vec
> \ needed for scanning possible devices behind the bridge
> : pci-bridge-set-io-base ( addr -- )
> pci-next-io @ 1000 #aligned \ read the current Value and align to 4KB boundary
> - dup 1000 + pci-next-io ! \ and write back with 4K for bridge
> + dup pci-next-io ! \ and write it back
> over 1C + rtas-config-l@ \ check if 32bit support
> 1 and IF \ IF 32 bit support
> 2dup 10 rshift \ | keep upper 16 bits
> @@ -162,7 +164,8 @@ 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 io is disabled
> : pci-bridge-set-io-limit ( addr -- )
> - pci-next-io @ 1000 #aligned \ read the current Value and align to 4KB boundary
> + pci-next-io @ 800 + \ add space for hot-plugging
> + 1000 #aligned \ align to 4KB boundary
> dup pci-next-io ! \ and write it back
> 1- \ make limit one less than boundary
> over 1D + rtas-config-b@ \ check if 32bit support
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/slof/attachments/20170516/76b1c5c7/attachment.sig>
More information about the SLOF
mailing list