[SLOF] [PATCH] pci: Avoid 32-bit prefetchable memory area if possible

Alexey Kardashevskiy aik at ozlabs.ru
Mon Jul 17 16:18:05 AEST 2017


On 14/07/17 19:45, Thomas Huth wrote:
> PCI bridges can only have one prefetchable memory area. If we are
> already using 64-bit prefetchable memory regions, we can not use
> a dedicated 32-bit prefetchable memory region anymore. In that
> case the 32-bit BARs should all be located in the 32-bit non-
> prefetchable memory space instead.
> 
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> ---
>  board-qemu/slof/pci-phb.fs | 16 +++++++++++-----
>  slof/fs/pci-properties.fs  |  7 ++++++-
>  2 files changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/board-qemu/slof/pci-phb.fs b/board-qemu/slof/pci-phb.fs
> index b7bf9cf..926efba 100644
> --- a/board-qemu/slof/pci-phb.fs
> +++ b/board-qemu/slof/pci-phb.fs
> @@ -253,12 +253,9 @@ setup-puid
>              THEN
>           ENDOF
>           2000000 OF                             \ 32-bit memory space?
> -            decode-64 pci-next-mem !            \ Decode mem base address
> +            decode-64 dup >r pci-next-mmio !    \ Decode base address
>              decode-64 drop                      \ Forget the parent address
> -            decode-64 2 / dup >r                \ Decode and calc size/2
> -            pci-next-mem @ + dup pci-max-mem !  \ and calc max mem address
> -            dup pci-next-mmio !                 \ which is the same as MMIO base
> -            r> + pci-max-mmio !                 \ calc max MMIO address
> +            decode-64 r> + pci-max-mmio !       \ calc max MMIO address
>           ENDOF
>           3000000 OF                             \ 64-bit memory space?
>              decode-64 dup >r pci-next-mem64 !
> @@ -270,6 +267,15 @@ setup-puid
>     ( prop-addr prop-len )
>     2drop
>  
> +   \ If we do not have 64-bit prefetchable memory, split the 32-bit space:

When is this ^^^^^^^^^^^^^^^^^^^ possible?


> +   pci-next-mem64 @ 0= IF
> +      pci-next-mmio @ pci-next-mem !            \ Start of 32-bit prefetchable
> +      pci-max-mmio @ pci-next-mmio @ - 2 /      \ Calculate new size
> +      pci-next-mmio @ +                         \ The middle of the area
> +      dup pci-max-mem !
> +      pci-next-mmio !
> +   THEN
> +
>     phb-debug? IF
>       ." pci-next-io   = " pci-next-io @ . cr
>       ." pci-max-io    = " pci-max-io  @ . cr
> diff --git a/slof/fs/pci-properties.fs b/slof/fs/pci-properties.fs
> index b7bb534..6f8f013 100644
> --- a/slof/fs/pci-properties.fs
> +++ b/slof/fs/pci-properties.fs
> @@ -159,7 +159,12 @@
>  \ Setup a prefetchable 32bit BAR and return its size
>  : assign-mem32-bar ( bar-addr -- 4 )
>          dup pci-bar-size-mem32          \ fetch size
> -        pci-next-mem                    \ var to change
> +        \ Do we have a dedicated 32-bit prefetchable area? If not, use MMIO
> +        pci-next-mem @ IF
> +            pci-next-mem
> +        ELSE
> +            pci-next-mmio
> +        THEN


The commit log explains this chunk but not the other chunks.

How did you test the change to get different behaviour?



>          assign-bar-value32              \ and set it all
>  ;
>  
> 


-- 
Alexey


More information about the SLOF mailing list