IMX6 - PCIe device tree assignments
Krzysztof Hałasa
khalasa at piap.pl
Thu Jun 18 03:18:28 PDT 2015
Hello,
The situation: Gateworks Ventana with IMX6q, 8-port PCIe bridge (PLX
tech PEX 8609), two PCIe devices behind the bridge (one of those is an
Ethernet controller).
The Ethernet controller lacks EEPROM/etc. and it's MAC address has to be
initialized using the device tree.
IMX6 [1] PEX [2]
-[0000:00]---00.0-[01-0a]--+-00.0-[02-0a]--+-01.0-[03]--
| +-04.0-[04]----00.0
| +-05.0-[05]--
| +-06.0-[06-07]----00.0-[07]--
| +-07.0-[08]----00.0
| +-08.0-[09]----00.0 Ethernet
| \-09.0-[0a]--
\-00.1 (PEX special device)
Gateworks have the following patch for this (and the MAC address
assignment works):
--- a/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
@@ -369,8 +369,42 @@
reset-gpio = <&gpio1 29 GPIO_ACTIVE_LOW>;
status = "okay";
- eth1: sky2 at 8 { /* MAC/PHY on bus 8 */
- compatible = "marvell,sky2";
+ pcie at 0,0 {
+ /* 00:00.0 0604: 16c3:abcd root host-bridge */
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ reg = <0x0 0 0 0 0>;
+
+ pcie at 0,0 {
+ /* 01:00.0 0604: 10b5:8609 PEX switch bridge */
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ reg = <0x0 0 0 0 0>;
+
+ /*
+ * GigE PCI dev node needs to be defined so that enet
+ * driver can use it to obtain its boot-loader
+ * specified MAC
+ */
+ pcie at 8,0 {
+ /* 02:08.0 0604: 10b5:8609: PEX port bridge */
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ reg = <0x4000 0 0 0 0>;
+
+ eth1: pci at 0,0 {
+ /* 08:00.0 0200: 11ab:4380: GigE */
+ #address-cells = <3>;
+ #size-cells = <2>;
+ device_type = "pci";
+ reg = <0x0 0 0 0 0>;
+ compatible = "marvell,sky2";
+ };
+ };
+ };
};
};
Unfortunately the patch has a side effect - it messes up the PCIe
interrupts. Basically all PCI IRQs except for the special device handled
internally by the PEX 8609 bridge are set to 155:
good bad (with patch)
00:00.0 PCI bridge: (IMX6 host bridge)
Interrupt: pin A routed to IRQ 155
01:00.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 155
01:00.1 System peripheral: PEX-8609
Interrupt: pin B routed to IRQ 154 (not changed)
02:01.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 154 -> 155
02:04.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 155
02:05.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 154 -> 155
02:06.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 153 -> 155
02:07.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 152 -> 155
02:08.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 155
02:09.0 PCI bridge: PEX-8609
Interrupt: pin A routed to IRQ 154 -> 155
04:00.0 Techwell Device 6864
Interrupt: pin A routed to IRQ 155
06:00.0 PCI bridge
08:00.0 Techwell Device 6869
Interrupt: pin A routed to IRQ 152 -> 155
09:00.0 Ethernet controller
Interrupt: pin A routed to IRQ 155
This is the case with v3.18 + the Ventana patchset from Gateworks, and
with vanilla v4.0 with only the above DT patch applied.
The question is: what's wrong in the patch, and how do I fix it?
--
Krzysztof Halasa
Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland
More information about the linux-arm-kernel
mailing list