[SLOF] [PATCH v3] pci: force minimum mem bar alignment of 64K for board-qemu

Alexey Kardashevskiy aik at ozlabs.ru
Thu Mar 9 12:48:25 AEDT 2017


On 08/03/17 18:53, Michael Roth wrote:
> This is needed to ensure VFIO passthrough devices are able to
> offload MMIO accesses to KVM.
> 
> Cc: Segher Boessenkool <segher at kernel.crashing.org>
> Cc: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
> Cc: David Gibson <david at gibson.dropbear.id.au>
> Signed-off-by: Michael Roth <mdroth at linux.vnet.ibm.com>
> ---
> v3:
>   * default to 64K, and plan to move BAR assignment to QEMU to avoid
>     needing to use property to maintain older behavior (Alexey)

Thanks, applied.


> v2:
>   * default to 0 min-align instead of 64K (David)
> ---
>  board-qemu/slof/pci-phb.fs |  6 ++++++
>  slof/engine.in             |  1 +
>  slof/fs/pci-properties.fs  | 38 ++++++++++++++++++++++++++++++--------
>  slof/fs/pci-scan.fs        |  3 +++
>  4 files changed, 40 insertions(+), 8 deletions(-)
> 
> diff --git a/board-qemu/slof/pci-phb.fs b/board-qemu/slof/pci-phb.fs
> index 667514e..fc2341c 100644
> --- a/board-qemu/slof/pci-phb.fs
> +++ b/board-qemu/slof/pci-phb.fs
> @@ -331,6 +331,12 @@ setup-puid
>     my-puid TO puid                  \ Set current puid
>     phb-parse-ranges
>     1 TO pci-hotplug-enabled
> +   s" qemu,mem-bar-min-align" get-node get-property 0= IF
> +       decode-int TO pci-mem-bar-min-align
> +       2drop
> +   ELSE
> +       10000 TO pci-mem-bar-min-align
> +   THEN
>     s" qemu,phb-enumerated" get-node get-property 0<> IF
>         1 0 (probe-pci-host-bridge)
>     ELSE
> diff --git a/slof/engine.in b/slof/engine.in
> index 0344a38..549e409 100644
> --- a/slof/engine.in
> +++ b/slof/engine.in
> @@ -145,6 +145,7 @@ col(D2/ >R U2/ R@ LIT(8*CELLSIZE-1) LSHIFT OR R> 2/)
>  col(NEGATE 0 SWAP -)
>  col(ABS DUP 0< 0BRANCH(1) NEGATE)
>  col(MAX 2DUP < 0BRANCH(1) SWAP DROP)
> +col(UMAX 2DUP U< 0BRANCH(1) SWAP DROP)
>  col(MIN 2DUP > 0BRANCH(1) SWAP DROP)
>  col(U* *)
>  col(1+ 1 +)
> diff --git a/slof/fs/pci-properties.fs b/slof/fs/pci-properties.fs
> index 7faa714..e6fd843 100644
> --- a/slof/fs/pci-properties.fs
> +++ b/slof/fs/pci-properties.fs
> @@ -91,17 +91,37 @@
>  \ ***************************************************************************************
>  \ align the current mem and set var to next mem
>  \ align with a size of 0 returns 0 !!!
> -: assign-var ( size var -- al-mem )
> -        2dup @                          \ ( size var size cur-mem ) read current free mem
> -        swap #aligned                   \ ( size var al-mem )       align the mem to the size
> -        dup 2swap -rot +                \ ( al-mem var new-mem )    add size to aligned mem
> -        swap !                          \ ( al-mem )                set variable to new mem
> +: assign-var-align ( size align var -- al-mem )
> +        dup >r @                        \ ( size align cur-mem )
> +        swap #aligned                   \ ( size al-mem )
> +        tuck +                          \ ( al-mem new-mem )
> +        r> !                            \ ( al-mem )
> +;
> +
> +: assign-var-min-align ( size min-align var -- al-mem )
> +        >r over umax                    \ ( size align )
> +        r> assign-var-align             \ ( al-mem )
>  ;
>  
>  \ set bar to current free mem ( in variable ) and set variable to next free mem
>  : assign-bar-value32 ( bar size var -- 4 )
>          over IF                         \ IF size > 0
> -                assign-var              \ | ( bar al-mem ) set variable to next mem
> +                >r                      \ | ( bar size )
> +                pci-mem-bar-min-align   \ | ( bar size min-align )
> +                r> assign-var-min-align \ | ( bar al-mem ) set variable to next mem
> +                swap rtas-config-l!     \ | ( -- )         set the bar to al-mem
> +        ELSE                            \ ELSE
> +                2drop drop              \ | clear stack
> +        THEN                            \ FI
> +        4                               \ size of the base-address-register
> +;
> +
> +\ set bar to current free mem ( in variable ) and set variable to next free mem
> +: assign-io-bar-value32 ( bar size var -- 4 )
> +        over IF                         \ IF size > 0
> +                >r                      \ | ( bar size )
> +                dup                     \ | ( bar size size-align )
> +                r> assign-var-align     \ | ( bar al-mem ) set variable to next mem
>                  swap rtas-config-l!     \ | ( -- )         set the bar to al-mem
>          ELSE                            \ ELSE
>                  2drop drop              \ | clear stack
> @@ -112,7 +132,9 @@
>  \ set bar to current free mem ( in variable ) and set variable to next free mem
>  : assign-bar-value64 ( bar size var -- 8 )
>          over IF                         \ IF size > 0
> -                assign-var              \ | ( bar al-mem ) set variable to next mem
> +                >r                      \ | ( bar size )
> +                pci-mem-bar-min-align   \ | ( bar size min-align )
> +                r> assign-var-min-align \ | ( bar al-mem ) set variable to next mem
>                  swap                    \ | ( al-mem addr ) calc config-addr of this bar
>                  2dup rtas-config-l!     \ | ( al-mem addr ) set the Lower part of the bar to al-mem
>                  4 + swap 20 rshift      \ | ( al-mem>>32 addr ) prepare the upper part of the al-mem
> @@ -163,7 +185,7 @@
>  : assign-io-bar ( bar-addr -- 4 )
>          dup pci-bar-size-io             \ fetch size
>          pci-next-io                     \ var to change
> -        assign-bar-value32              \ and set it all
> +        assign-io-bar-value32           \ and set it all
>  ;
>  
>  \ Setup an Expansion ROM bar
> diff --git a/slof/fs/pci-scan.fs b/slof/fs/pci-scan.fs
> index a528c8e..bd8cc0d 100644
> --- a/slof/fs/pci-scan.fs
> +++ b/slof/fs/pci-scan.fs
> @@ -24,6 +24,9 @@ VARIABLE pci-max-io
>  VARIABLE pci-next-mem64           \ prefetchable 64-bit memory mapped
>  VARIABLE pci-max-mem64
>  
> +\ 0 to default to natural alignment
> +0 VALUE pci-mem-bar-min-align
> +
>  \ Counter of busses found
>  0 VALUE pci-bus-number
>  \ Counter of devices found
> 


-- 
Alexey


More information about the SLOF mailing list