[PATCH] pci: fix interrupt-map for bridges
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Fri Sep 13 15:19:23 EST 2013
Alexey Kardashevskiy <aik at ozlabs.ru> writes:
> The previous scheme always put 0 as a parent slot#. However it is
> not always the case and QEMU's PCI bridge does not support putting
> device at slot#0 as it claims SHPC support for hotplug.
>
> This modifies the interrups map to let the linux guest resolve XICS
> global interrupt number correctly.
>
> Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>
> ---
>
> This is the example of working system:
>
> [root at erif_root pci at 1]# lspci
> 0001:00:01.0 PCI bridge: Red Hat, Inc. Device 0001
> 0001:01:02.0 PCI bridge: Red Hat, Inc. Device 0001
> 0001:01:03.0 PCI bridge: Red Hat, Inc. Device 0001
> 0001:02:01.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (Copper) (rev 06)
> 0001:02:02.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (Copper) (rev 06)
> 0001:03:01.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (Copper) (rev 06)
> 0001:03:02.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (Copper) (rev 06)
> [root at erif_root pci at 1]# pwd
> /proc/device-tree/pci at 80000002000000f/pci at 1
> [root at erif_root pci at 1]# hexdump -e '9/4 "%08x "' -e '"\n"' i*map
> 00001000 00000000 00000000 00000001 3e57f7e0 00000800 00000000 00000000 00000003
> 00001000 00000000 00000000 00000002 3e57f7e0 00000800 00000000 00000000 00000000
> 00001000 00000000 00000000 00000003 3e57f7e0 00000800 00000000 00000000 00000001
> 00001000 00000000 00000000 00000004 3e57f7e0 00000800 00000000 00000000 00000002
> 00001800 00000000 00000000 00000001 3e57f7e0 00000800 00000000 00000000 00000000
> 00001800 00000000 00000000 00000002 3e57f7e0 00000800 00000000 00000000 00000001
> 00001800 00000000 00000000 00000003 3e57f7e0 00000800 00000000 00000000 00000002
> 00001800 00000000 00000000 00000004 3e57f7e0 00000800 00000000 00000000 00000003
> [root at erif_root pci at 1]# cd pci at 2/
> [root at erif_root pci at 2]# hexdump -e '9/4 "%08x "' -e '"\n"' i*map
> 00000800 00000000 00000000 00000001 3e5a86f0 00001000 00000000 00000000 00000002
> 00000800 00000000 00000000 00000002 3e5a86f0 00001000 00000000 00000000 00000003
> 00000800 00000000 00000000 00000003 3e5a86f0 00001000 00000000 00000000 00000000
> 00000800 00000000 00000000 00000004 3e5a86f0 00001000 00000000 00000000 00000001
> 00001000 00000000 00000000 00000001 3e5a86f0 00001000 00000000 00000000 00000003
> 00001000 00000000 00000000 00000002 3e5a86f0 00001000 00000000 00000000 00000000
> 00001000 00000000 00000000 00000003 3e5a86f0 00001000 00000000 00000000 00000001
> 00001000 00000000 00000000 00000004 3e5a86f0 00001000 00000000 00000000 00000002
> [root at erif_root pci at 2]# cd ethernet@
> ethernet at 1/ ethernet at 2/
> [root at erif_root pci at 2]# cd ethernet at 1/
> [root at erif_root ethernet at 1]# lsprop reg
> reg 00020800 00000000 00000000 00000000 00000000
> 02020810 00000000 00000000 00000000 00020000
> 02020814 00000000 00000000 00000000 00020000
> 01020818 00000000 00000000 00000000 00000020
> 02020830 00000000 00000000 00000000 00020000
> [root at erif_root ethernet at 1]# lsprop interrupts
> interrupts 00000002
> ---
> board-qemu/slof/pci-interrupts.fs | 31 ++++++++++++++++++++-----------
> 1 file changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/board-qemu/slof/pci-interrupts.fs b/board-qemu/slof/pci-interrupts.fs
> index a12d7bb..62785a7 100644
> --- a/board-qemu/slof/pci-interrupts.fs
> +++ b/board-qemu/slof/pci-interrupts.fs
> @@ -1,17 +1,26 @@
>
> : pci-gen-irq-map-one ( prop-addr prop-len slot pin -- prop-addr prop-len )
> - 2dup + 4 mod ( prop-addr prop-len slot pin parentpin )
> + 2dup + 4 mod ( prop-addr prop-len slot pin parentpin )
> + >r >r >r ( prop-addr prop-len R: swizzledpin pin slot )
> +
> + \ Child slot#
> + r> B lshift encode-int+ ( prop-addr prop-len R: swizzledpin pin )
Redundant push to the R-Stack, can just be
>r >r ( prop-addr prop-len slot R: swizzledpin pin )
\ Child slot#
B lshift encode-int+ ( prop-addr prop-len R: swizzledpin pin )
> + \ Child 64bit BAR (not really used)
> + 0 encode-64+
> + \ Chile pin#
> + r> encode-int+ ( prop-addr prop-len R: swizzledpin )
> +
> + \ Parent phandle
> + get-parent encode-int+
> +
> + \ Parent slot#
> get-node >space
> - pci-addr2dev + 1- 4 mod 1+ \ do swizzling ( prop-addr prop-len slot pin swizzledpin )
> - >r >r >r ( prop-addr prop-len R: swizzledpin pin slot )
> -
> - r> B lshift encode-int+
> - 0 encode-64+ \ device slot ( prop-addr prop-len R: swizzledpin pin )
> - r> encode-int+ \ device pin ( prop-addr prop-len R: swizzledpin )
> -
> - get-parent encode-int+ \ parent phandle
> - 0 encode-int+ 0 encode-64+ \ parent slot
> - r> encode-int+ \ parent swizzled pin ( prop-addr prop-len R: )
> + pci-addr2dev B lshift ( prop-addr prop-len parent-slot R: swizzledpin )
> + encode-int+
> + \ Parent 64bit BAR (not really used)
> + 0 encode-64+
> + \ Parent pin
> + r> encode-int+ ( prop-addr prop-len R: )
> ;
>
> : pci-gen-irq-entry ( prop-addr prop-len config-addr -- prop-addr prop-len )
Regards,
Nikunj
More information about the Linuxppc-dev
mailing list