[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