I have a PMC board supporting legacy INTx interrupts (no MSI) sitting on a carrier board slotted into the J23 connector of the LX2160ARDB. When the RDB is booted, the kernel recognizes the carrier board (as a PCI bridge) as well as the actual PMC board (Communication controller) and assigns BARs to accessible memory regions. The problem is that the PMC board is assigned IRQ 0 causing the subsequently loaded 3rd party driver to crash. I have tested NXP kernels tagged LSDK-19.06-V4.19 as well as LSDK-19.06-V4.14 & LSDK-19.06-V4.14-RT.
The PMC and carrier board combo works fine on an i7-based PC running Linux (tried Mint, Ubuntu, CentOS). IRQ assigned is not 0.
- LX2160ARDB using this composite image https://lsdk.github.io/agreement.html?version=1906&down_idx=48&title=firmware_lx2160ardb_uboot_xspiboot.img.
- Kernel is built from NXP kernel tree tagged with LSDK-19.06-V4.19.
Running lspci -vvv (full log attached) produces:
0000:02:04.0 Communication controller: ILC Data Device Corp Device 2402 (rev ba)
Subsystem: ILC Data Device Corp Device 2402
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 128, Cache Line Size: 32 bytes
Interrupt: pin A routed to IRQ 0
compatible = "fsl,lx2160a-pcie";
reg = <0x00 0x03600000 0x0 0x00100000 /* controller registers */
0x90 0x00000000 0x0 0x00001000>; /* configuration space */
reg-names = "csr_axi_slave", "config_axi_slave";
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */
interrupt-names = "aer", "pme", "intr";
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
apio-wins = <8>;
ppio-wins = <8>;
bus-range = <0x0 0xff>;
ranges = <0x82000000 0x0 0x40000000 0x90 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
msi-parent = <&its>;
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 7>;
interrupt-map = <0000 0 0 1 &gic 0 0 GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
<0000 0 0 2 &gic 0 0 GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
<0000 0 0 3 &gic 0 0 GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
<0000 0 0 4 &gic 0 0 GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
GIC_SPI 118 as well as 119 - 122 should map to the following internal interrupt sources according to the LX2160A reference manual rev. D p. 353:
When I dumped irq_domain_map (testing with 4.14 kernel), it was evident that there was no hwirq set for 151-154 (or 161-164), only for 150 (PEX3) & 160 (PEX5), both belonging to the interrupt-controller@6000000 domain. Could it be that the PEX INTA-B-C-D can also be signalled through PEX 3?
I have also tried booting with pci=nomsi with no luck.
Looking at the device-tree bindings documentation in layerscape-pci.txt as well as mobiveil-pci.txt and comparing the examples given, with respect to the interrupt-map property, there is a difference in how this property is set up.
I've attached the following files:
- boot.txt - Console from power on util bash prompt available
- interrupts.txt - Dump from "cat /proc/interrupts"
- kernel_conf.txt - Kernel configuration
- lspci.txt - Full dump from lspci -vvv
- uboot_pci.txt - How the U-Boot sees the PMC board
Any help is very much appreciated.