PCIe interrupts (legacy) on LX2160A (RDB)

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

PCIe interrupts (legacy) on LX2160A (RDB)

1,366 Views
dinkap
Contributor I

Hi,

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.

The setup:

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
Looking at the device tree (fsl-lx2160a.dtsi), legacy interrupts are seen in the interrupt-map property if I'm not mistaken.

pcie@3600000 {
 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";
 dma-coherent;
 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:

  1. boot.txt - Console from power on util bash prompt available
  2. interrupts.txt - Dump from "cat /proc/interrupts"
  3. kernel_conf.txt - Kernel configuration
  4. lspci.txt - Full dump from lspci -vvv
  5. uboot_pci.txt - How the U-Boot sees the PMC board

Any help is very much appreciated.

Regards,

Dino

0 Kudos
0 Replies