[PATCH v3 0/3] Small INTx fixes for Rockchip's dwc based PCIe controller driver

Diederik de Haas diederik at cknow-tech.com
Wed Sep 23 02:13:13 PDT 2026


Hi,

On Tue Sep 22, 2026 at 4:36 AM CEST, Shawn Lin wrote:
>
> This short series fixes the INTx handling around the newly introduced
> .reset_root_port() (b376b3ff9cb0), and is split in three patches per
> Niklas' suggestion:
>
> Patch 1 stops .reset_root_port() from recreating the INTx irq domain
> on every root port reset, which leaked the old domain and silently
> broke INTx delivery afterwards, the downstream devices' virqs were
> allocated in the previous domain and were never re-mapped. By moving
> the of_irq_get_byname() lookup, the INTx irq domain creation and the
> chained handler installation into rockchip_pcie_configure_rc(), right
> after dw_pcie_host_init(). This leaves .init() with nothing but
> idempotent register programming, so it can safely be re-run by
> .reset_root_port() and dw_pcie_resume_noirq().
>
> Patch 2 makes the irq domain and the chained handler devm-managed, so
> that they are released with the device instead of leaking, which also
> addresses the probe failure leak/use-after-free flagged by the Sashiko
> review.
>
> Patch 3 keeps the INTx IRQ masked while .reset_root_port() gates the
> controller clocks, so the chained handler cannot read the unclocked
> APB bus and raise a synchronous external abort.

I build a kernel with this patch set (7.3~rc4-2) and got several warnings
like this, shortly followed by a stack trace:

  irq: no irq domain found for legacy-interrupt-controller !

Then I build another kernel (7.3~rc4-3) where I disabled this patch set
and then I did not get the warnings/stack traces.

I was able to reproduce this on the following devices:
1) NanoPC-T6 Plus (RK3588)
2) Rock 5B (RK3588)
3) NanoPi-R5S (RK3568)

ad 3) Possibly unrelated, but I sometimes get this error:

  gpio-keys gpio-keys: error -ENXIO: Unable to get irq number for GPIO

      But that is *not* dependent on this patch set; I'm not sure if I've
      seen it with this patch set. Could be because I haven't booted enough
      with the 7.3~rc4-2 kernel. Or maybe this patch set fixed it?
      The (only) correlation is that it has to do with IRQs.

I don't know if this patch set caused the warning/stack traces or just
brought an underlying issue to surface, but hopefully you do.

Warnings/stack trace on NanoPC-T6 Plus (because it's the most extensive):

```
root at nanopc-t6-plus:~# dmesg --level 4
[    2.684054] pci 0003:30:00.0: Primary bus is hard wired to 0
[    2.691234] irq: no irq domain found for legacy-interrupt-controller !
[    3.043257] irq: no irq domain found for legacy-interrupt-controller !
[    3.133600] ------------[ cut here ]------------
[    3.133619] error: hwirq 0x0 is too large for :pcie at fe150000:legacy-interrupt-controller
[    3.133639] WARNING: kernel/irq/irqdomain.c:676 at irq_domain_associate_locked+0x118/0x1a0, CPU#7: kworker/u32:5/60
[    3.133662] Modules linked in: nvme rk808_regulator nvme_core nvme_keyring nvme_auth fusb302 tcpm rockchipdrm fan53555 aux_hpd_bridge dw_hdmi_qp rtc_hym8563 dw_mipi_dsi dw_hdmi analogix_dp drm_dp_aux_bus drm_display_helper rockchip_saradc fixed sdhci_of_dwcmshc cec phy_rockchip_usbdp sdhci_pltfm industrialio_triggered_buffer phy_rockchip_naneng_combphy dw_mmc_rockchip sdhci rc_core typec dw_mmc_pltfm gpio_rockchip phy_rockchip_samsung_hdptx display_connector phy_rockchip_snps_pcie3 kfifo_buf nvmem_rockchip_otp drm_client_lib cqhci ohci_platform spi_rockchip_sfc dw_mmc dw_wdt spi_rockchip rockchip_dfi pl330 drm_dma_helper ehci_platform drm_kms_helper dwc3 ehci_hcd drm ohci_hcd udc_core adc_keys usbcore i2c_rk3x phy_rockchip_inno_usb2 industrialio pwm_rockchip ulpi usb_common
[    3.133815] CPU: 7 UID: 0 PID: 60 Comm: kworker/u32:5 Not tainted 7.3-rc4+unreleased-arm64-cknow #1 PREEMPTLAZY  Debian 7.3~rc4-2
[    3.133831] Hardware name: FriendlyElec NanoPC-T6 Plus (DT)
[    3.133838] Workqueue: async async_run_entry_fn
[    3.133852] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    3.133862] pc : irq_domain_associate_locked+0x118/0x1a0
[    3.133872] lr : irq_domain_associate_locked+0x118/0x1a0
[    3.133881] sp : ffff80008043b9c0
[    3.133887] x29: ffff80008043b9c0 x28: 0000000000000000 x27: 0000000000000000
[    3.133900] x26: ffff000100038c00 x25: 00000000fffffef7 x24: ffff0001095393e8
[    3.133913] x23: 0000000000000000 x22: 0000000000000073 x21: 0000000000000000
[    3.133925] x20: ffff0001196c9e30 x19: ffff000108e8d500 x18: 000000000000000a
[    3.133937] x17: 7075727265746e69 x16: 2d79636167656c3a x15: 0720072007200720
[    3.133949] x14: 0720072007200720 x13: 0720072007200720 x12: 000000000006ff90
[    3.133961] x11: ffffc87b581950d0 x10: ffffc87b5810cf08 x9 : ffffc87b55db6444
[    3.133974] x8 : ffffc87b5817d0e8 x7 : ffffffffffffefff x6 : 0000000000000001
[    3.133985] x5 : ffffc87b5817d078 x4 : 0000000000000000 x3 : 0000000000000000
[    3.133997] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000100b7a580
[    3.134010] Call trace:
[    3.134016]  irq_domain_associate_locked+0x118/0x1a0 (P)
[    3.134028]  irq_create_mapping_affinity_locked+0x98/0x1b8
[    3.134039]  irq_create_fwspec_mapping+0x320/0x3e0
[    3.134049]  irq_create_of_mapping+0x74/0xb0
[    3.134059]  of_irq_parse_and_map_pci+0xf8/0x1f8
[    3.134072]  pci_assign_irq+0x9c/0x180
[    3.134082]  pci_device_probe+0x68/0x170
[    3.134091]  really_probe+0xc8/0x3f8
[    3.134102]  __driver_probe_device+0x168/0x1c8
[    3.134110]  driver_probe_device+0x44/0x128
[    3.134119]  __driver_attach_async_helper+0x58/0xf8
[    3.134128]  async_run_entry_fn+0x40/0x1a0
[    3.134138]  process_one_work+0x1cc/0x550
[    3.134150]  worker_thread+0x18c/0x2f0
[    3.134161]  kthread+0x134/0x150
[    3.134171]  ret_from_fork+0x10/0x20
[    3.134183] ---[ end trace 0000000000000000 ]---
[    3.331933] pci 0004:40:00.0: Primary bus is hard wired to 0
[    3.338953] irq: no irq domain found for legacy-interrupt-controller !
[    3.492147] ------------[ cut here ]------------
[    3.492161] error: hwirq 0x0 is too large for :pcie at fe190000:legacy-interrupt-controller
[    3.492182] WARNING: kernel/irq/irqdomain.c:676 at irq_domain_associate_locked+0x118/0x1a0, CPU#6: (udev-worker)/187
[    3.492205] Modules linked in: r8169(+) realtek phy_package mdio_devres of_mdio fixed_phy fwnode_mdio libphy mdio_bus xhci_plat_hcd xhci_hcd nvme rk808_regulator nvme_core nvme_keyring nvme_auth fusb302 tcpm rockchipdrm fan53555 aux_hpd_bridge dw_hdmi_qp rtc_hym8563 dw_mipi_dsi dw_hdmi analogix_dp drm_dp_aux_bus drm_display_helper rockchip_saradc fixed sdhci_of_dwcmshc cec phy_rockchip_usbdp sdhci_pltfm industrialio_triggered_buffer phy_rockchip_naneng_combphy dw_mmc_rockchip sdhci rc_core typec dw_mmc_pltfm gpio_rockchip phy_rockchip_samsung_hdptx display_connector phy_rockchip_snps_pcie3 kfifo_buf nvmem_rockchip_otp drm_client_lib cqhci ohci_platform spi_rockchip_sfc dw_mmc dw_wdt spi_rockchip rockchip_dfi pl330 drm_dma_helper ehci_platform drm_kms_helper dwc3 ehci_hcd drm ohci_hcd udc_core adc_keys usbcore i2c_rk3x phy_rockchip_inno_usb2 industrialio pwm_rockchip ulpi usb_common
[    3.492388] CPU: 6 UID: 0 PID: 187 Comm: (udev-worker) Tainted: G        W           7.3-rc4+unreleased-arm64-cknow #1 PREEMPTLAZY  Debian 7.3~rc4-2
[    3.492404] Tainted: [W]=WARN
[    3.492410] Hardware name: FriendlyElec NanoPC-T6 Plus (DT)
[    3.492417] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    3.492427] pc : irq_domain_associate_locked+0x118/0x1a0
[    3.492437] lr : irq_domain_associate_locked+0x118/0x1a0
[    3.492446] sp : ffff8000818335e0
[    3.492451] x29: ffff8000818335e0 x28: ffffc87b5865ccb8 x27: ffffc87ae59d7818
[    3.492465] x26: 000000000000000c x25: ffff000103534310 x24: ffff00010a50cde8
[    3.492477] x23: 0000000000000000 x22: 0000000000000088 x21: 0000000000000000
[    3.492490] x20: ffff000168464630 x19: ffff000108fb2a00 x18: 000000000000000a
[    3.492502] x17: 7075727265746e69 x16: 2d79636167656c3a x15: 0720072007200720
[    3.492514] x14: 0720072007200720 x13: 0720072007200720 x12: 000000000006ff90
[    3.492526] x11: ffffc87b581950d0 x10: ffffc87b5810cf08 x9 : ffffc87b55db6444
[    3.492538] x8 : ffffc87b5817d0e8 x7 : ffffffffffffefff x6 : 0000000000000001
[    3.492550] x5 : ffffc87b5817d078 x4 : 0000000000000000 x3 : 0000000000000000
[    3.492562] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff0001097192c0
[    3.492574] Call trace:
[    3.492579]  irq_domain_associate_locked+0x118/0x1a0 (P)
[    3.492591]  irq_create_mapping_affinity_locked+0x98/0x1b8
[    3.492602]  irq_create_fwspec_mapping+0x320/0x3e0
[    3.492613]  irq_create_of_mapping+0x74/0xb0
[    3.492623]  of_irq_parse_and_map_pci+0xf8/0x1f8
[    3.492635]  pci_assign_irq+0x9c/0x180
[    3.492646]  pci_device_probe+0x68/0x170
[    3.492656]  really_probe+0xc8/0x3f8
[    3.492666]  __driver_probe_device+0x168/0x1c8
[    3.492675]  driver_probe_device+0x44/0x128
[    3.492683]  __driver_attach+0xd0/0x228
[    3.492692]  bus_for_each_dev+0x84/0xf0
[    3.492704]  driver_attach+0x2c/0x40
[    3.492712]  bus_add_driver+0x124/0x280
[    3.492720]  driver_register+0x70/0x138
[    3.492729]  __pci_register_driver+0x48/0x60
[    3.492742]  rtl8169_pci_driver_init+0x30/0xfd0 [r8169]
[    3.492768]  do_one_initcall+0x5c/0x458
[    3.492778]  do_init_module+0x5c/0x280
[    3.492788]  load_module+0x1cc0/0x25b8
[    3.492796]  init_module_from_file+0xe8/0x158
[    3.492805]  __arm64_sys_finit_module+0x208/0x360
[    3.492814]  invoke_syscall.constprop.0+0xac/0x110
[    3.492829]  el0_svc_common.constprop.0+0x40/0xf0
[    3.492842]  do_el0_svc+0x24/0x40
[    3.492854]  el0_svc+0x40/0x260
[    3.492867]  el0t_64_sync_handler+0xa0/0xe8
[    3.492879]  el0t_64_sync+0x198/0x1a0
[    3.492888] ---[ end trace 0000000000000000 ]---
[    3.554818] pci 0002:20:00.0: Primary bus is hard wired to 0
[    3.563276] irq: no irq domain found for legacy-interrupt-controller !
[    3.569263] irq: no irq domain found for legacy-interrupt-controller !
[    8.679178] panthor fb000000.gpu: [drm] Firmware protected mode entry is not supported, ignoring
[    8.871598] rockchip-i2s-tdm fddf0000.i2s: using zero-initialized flat cache, this may cause unexpected behavior
[    9.004753] ------------[ cut here ]------------
[    9.004768] error: hwirq 0x0 is too large for :pcie at fe180000:legacy-interrupt-controller
[    9.004779] WARNING: kernel/irq/irqdomain.c:676 at irq_domain_associate_locked+0x118/0x1a0, CPU#5: (udev-worker)/399
[    9.004791] Modules linked in: mt7925e(+) aes_ce_blk mt7925_common snd_soc_audio_graph_card(+) ghash_ce gf128mul mt792x_lib pwm_fan mt76_connac_lib btusb leds_gpio snd_soc_simple_card gpio_ir_recv btrtl snd_soc_simple_card_utils mt76 btintel rk805_pwrkey btbcm snd_soc_hdmi_codec ofpart snd_soc_rockchip_i2s_tdm snd_soc_es8389 mac80211 btmtk snd_soc_core rockchip_thermal bluetooth rockchip_vdec synopsys_hdmirx spi_nor v4l2_vp9 rockchip_rga snd_compress mtd v4l2_dv_timings v4l2_h264 ecdh_generic snd_pcm_dmaengine videobuf2_dma_contig v4l2_mem2mem rockchip_rng videobuf2_dma_sg snd_pcm videobuf2_memops cfg80211 videobuf2_v4l2 videodev snd_timer panthor snd rocket drm_gpuvm videobuf2_common rfkill soundcore gpu_sched libarc4 vsi_iommu mc drm_shmem_helper drm_exec cpufreq_dt evdev pkcs8_key_parser nvme_fabrics efi_pstore configfs autofs4 ext4 crc16 mbcache jbd2 onboard_usb_dev r8169 realtek phy_package mdio_devres of_mdio fixed_phy fwnode_mdio libphy mdio_bus xhci_plat_hcd xhci_hcd nvme rk808_regulator nvme_core nvme_keyring
[    9.004872]  nvme_auth fusb302 tcpm rockchipdrm fan53555 aux_hpd_bridge dw_hdmi_qp rtc_hym8563 dw_mipi_dsi dw_hdmi analogix_dp drm_dp_aux_bus drm_display_helper rockchip_saradc fixed sdhci_of_dwcmshc cec phy_rockchip_usbdp sdhci_pltfm industrialio_triggered_buffer phy_rockchip_naneng_combphy dw_mmc_rockchip sdhci rc_core typec dw_mmc_pltfm gpio_rockchip phy_rockchip_samsung_hdptx display_connector phy_rockchip_snps_pcie3 kfifo_buf nvmem_rockchip_otp drm_client_lib cqhci ohci_platform spi_rockchip_sfc dw_mmc dw_wdt spi_rockchip rockchip_dfi pl330 drm_dma_helper ehci_platform drm_kms_helper dwc3 ehci_hcd drm ohci_hcd udc_core adc_keys usbcore i2c_rk3x phy_rockchip_inno_usb2 industrialio pwm_rockchip ulpi usb_common
[    9.004964] CPU: 5 UID: 0 PID: 399 Comm: (udev-worker) Tainted: G        W           7.3-rc4+unreleased-arm64-cknow #1 PREEMPTLAZY  Debian 7.3~rc4-2
[    9.004971] Tainted: [W]=WARN
[    9.004974] Hardware name: FriendlyElec NanoPC-T6 Plus (DT)
[    9.004977] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    9.004982] pc : irq_domain_associate_locked+0x118/0x1a0
[    9.004986] lr : irq_domain_associate_locked+0x118/0x1a0
[    9.004989] sp : ffff800083c734d0
[    9.004992] x29: ffff800083c734d0 x28: ffffc87b5865ccb8 x27: ffffc87ae61951d8
[    9.004998] x26: 000000000000000c x25: ffff0001035340b0 x24: ffff000107ec6ae8
[    9.005003] x23: 0000000000000000 x22: 00000000000000a3 x21: 0000000000000000
[    9.005008] x20: ffff0001180b0030 x19: ffff000108e26200 x18: 000000000000000a
[    9.005013] x17: 7075727265746e69 x16: 2d79636167656c3a x15: 0720072007200720
[    9.005018] x14: 0720072007200720 x13: 0720072007200720 x12: 000000000006ff90
[    9.005023] x11: ffffc87b581950d0 x10: ffffc87b5810cf08 x9 : ffffc87b55db6444
[    9.005028] x8 : ffffc87b5817d0e8 x7 : ffffffffffffefff x6 : 0000000000000001
[    9.005033] x5 : ffff0005fdeff208 x4 : ffff378aa5f0e000 x3 : ffff000168385dc0
[    9.005038] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000168385dc0
[    9.005044] Call trace:
[    9.005046]  irq_domain_associate_locked+0x118/0x1a0 (P)
[    9.005052]  irq_create_mapping_affinity_locked+0x98/0x1b8
[    9.005056]  irq_create_fwspec_mapping+0x320/0x3e0
[    9.005061]  irq_create_of_mapping+0x74/0xb0
[    9.005065]  of_irq_parse_and_map_pci+0xf8/0x1f8
[    9.005071]  pci_assign_irq+0x9c/0x180
[    9.005076]  pci_device_probe+0x68/0x170
[    9.005080]  really_probe+0xc8/0x3f8
[    9.005085]  __driver_probe_device+0x168/0x1c8
[    9.005088]  driver_probe_device+0x44/0x128
[    9.005092]  __driver_attach+0xd0/0x228
[    9.005095]  bus_for_each_dev+0x84/0xf0
[    9.005100]  driver_attach+0x2c/0x40
[    9.005103]  bus_add_driver+0x124/0x280
[    9.005106]  driver_register+0x70/0x138
[    9.005110]  __pci_register_driver+0x48/0x60
[    9.005116]  mt7925_pci_driver_init+0x30/0xfd0 [mt7925e]
[    9.005125]  do_one_initcall+0x5c/0x458
[    9.005129]  do_init_module+0x5c/0x280
[    9.005134]  load_module+0x1cc0/0x25b8
[    9.005137]  init_module_from_file+0xe8/0x158
[    9.005141]  __arm64_sys_finit_module+0x208/0x360
[    9.005144]  invoke_syscall.constprop.0+0xac/0x110
[    9.005151]  el0_svc_common.constprop.0+0xc0/0xf0
[    9.005156]  do_el0_svc+0x24/0x40
[    9.005161]  el0_svc+0x40/0x260
[    9.005167]  el0t_64_sync_handler+0xa0/0xe8
[    9.005171]  el0t_64_sync+0x198/0x1a0
[    9.005176] ---[ end trace 0000000000000000 ]---
[   10.568235] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
```

The ``mt7925`` one is from my M.2 Wi-Fi+BT card plugged into the system.

rk3588-nanopc-t6-plus-intx-fixes-stacktraces-dmesg.txt:
https://paste.sr.ht/~diederik/85ee576b76934754139a496488d451ef89f88db0

rk3588-rock5b-intx-fixes-stacktraces-dmesg.txt:
https://paste.sr.ht/~diederik/c6d46b2e5e0de22316bd31ad63152afed1a2dc70

rk3568-nanopi-r5s-intx-fixes-stacktraces-dmesg.txt:
https://paste.sr.ht/~diederik/9b83b304646df3823687b75e5e07c683658d1024

Cheers,
  Diederik

> Changes in v3:
> - split devm-managed part into a seperate patch
>
> Changes in v2:
> - Moved the of_irq_get_byname() lookup, the INTx irq domain creation
>   and the chained handler installation out of the host ops .init()
>   callback into rockchip_pcie_configure_rc(), right after
>   dw_pcie_host_init(), as suggested by Niklas Cassel. This supersedes
>   v1 patch 1/2, as .init() no longer creates the irq domain, and
>   removes the rockchip_pcie_host_hw_init() helper from v1.
> - Made the INTx irq domain devm-managed with
>   devm_irq_domain_instantiate() and uninstall the chained handler
>   through a devres action, addressing the probe failure leak and
>   use-after-free flagged by the Sashiko review.
> - keep the INTx IRQ masked while .reset_root_port()
>   gates the controller clocks, responding to the Sashiko review
>   finding about accessing the unclocked APB bus.
>
> Shawn Lin (3):
>   PCI: dw-rockchip: Move the INTx irq setup to probe
>   PCI: dw-rockchip: Make the INTx irq setup devm-managed
>   PCI: dw-rockchip: Mask the INTx IRQ while the controller clocks are
>     gated
>
>  drivers/pci/controller/dwc/pcie-dw-rockchip.c | 77 ++++++++++++++++++++-------
>  1 file changed, 57 insertions(+), 20 deletions(-)





More information about the Linux-rockchip mailing list