linux/drivers/pci
Javier Martinez Canillas d420b11666 PCI: rockchip: Register IRQ handlers after device and data are ready
[ Upstream commit 3cf5f7ab23 ]

An IRQ handler may be called at any time after it is registered, so
anything it relies on must be ready before registration.

rockchip_pcie_subsys_irq_handler() and rockchip_pcie_client_irq_handler()
read registers in the PCIe controller, but we registered them before
turning on clocks to the controller.  If either is called before the clocks
are turned on, the register reads fail and the machine hangs.

Similarly, rockchip_pcie_legacy_int_handler() uses rockchip->irq_domain,
but we installed it before initializing irq_domain.

Register IRQ handlers after their data structures are initialized and
clocks are enabled.

Found by enabling CONFIG_DEBUG_SHIRQ, which calls the IRQ handler when it
is being unregistered.  An error during the probe path might cause this
unregistration and IRQ handler execution before the device or data
structure init has finished.

[bhelgaas: commit log]
Link: https://lore.kernel.org/r/20210608080409.1729276-1-javierm@redhat.com
Reported-by: Peter Robinson <pbrobinson@gmail.com>
Tested-by: Peter Robinson <pbrobinson@gmail.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-07-20 16:05:49 +02:00
..
controller PCI: rockchip: Register IRQ handlers after device and data are ready 2021-07-20 16:05:49 +02:00
endpoint PCI: endpoint: Fix missing destroy_workqueue() 2021-05-19 10:13:02 +02:00
hotplug PCI: pciehp: Ignore Link Down/Up caused by DPC 2021-07-20 16:05:47 +02:00
pcie PCI: pciehp: Ignore Link Down/Up caused by DPC 2021-07-20 16:05:47 +02:00
switch
access.c Merge branch 'pci/misc' 2020-08-05 18:24:16 -05:00
ats.c Merge branch 'pci/doc' 2020-08-05 18:24:22 -05:00
bus.c
ecam.c PCI/ACPI: Add Ampere Altra SOC MCFG quirk 2020-09-17 12:27:43 -05:00
host-bridge.c
iov.c PCI/IOV: Mark VFs as not implementing PCI_COMMAND_MEMORY 2020-09-21 14:42:11 -06:00
irq.c
Kconfig pci-v5.10-changes 2020-10-22 12:41:00 -07:00
Makefile
mmap.c
msi.c PCI/MSI: Make arch_.*_msi_irq[s] fallbacks selectable 2020-09-16 16:52:37 +02:00
of.c Merge branch 'pci/doc' 2020-08-05 18:24:22 -05:00
p2pdma.c PCI/P2PDMA: Avoid pci_get_slot(), which may sleep 2021-07-20 16:05:47 +02:00
pci-acpi.c PM: ACPI: PCI: Drop acpi_pm_set_bridge_wakeup() 2020-12-30 11:54:05 +01:00
pci-bridge-emul.c PCI: pci-bridge-emul: Fix array overruns, improve safety 2021-03-04 11:38:15 +01:00
pci-bridge-emul.h
pci-driver.c pci-v5.10-changes 2020-10-22 12:41:00 -07:00
pci-label.c
pci-mid.c
pci-pf-stub.c PCI/IOV: Simplify pci-pf-stub with module_pci_driver() 2020-09-17 12:40:20 -05:00
pci-stub.c
pci-sysfs.c Merge branch 'pci/misc' 2020-10-21 09:58:36 -05:00
pci.c Revert "PCI: PM: Do not read power state in pci_enable_device_flags()" 2021-06-30 08:47:17 -04:00
pci.h PCI: pciehp: Ignore Link Down/Up caused by DPC 2021-07-20 16:05:47 +02:00
probe.c PCI: Release OF node in pci_scan_device()'s error path 2021-05-19 10:13:01 +02:00
proc.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
quirks.c PCI: Leave Apple Thunderbolt controllers on for s2idle or standby 2021-07-19 09:45:01 +02:00
remove.c
rom.c
search.c
setup-bus.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
setup-irq.c
setup-res.c PCI: Decline to resize resources if boot config must be preserved 2021-03-04 11:37:18 +01:00
slot.c PCI: Fix pci_slot_release() NULL pointer dereference 2020-12-30 11:54:28 +01:00
syscall.c PCI: Align checking of syscall user config accessors 2021-03-04 11:38:12 +01:00
vc.c PCI: Fix kerneldoc warnings 2020-08-05 18:23:14 -05:00
vpd.c PCI: Allow VPD access for QLogic ISP2722 2021-05-14 09:49:57 +02:00
xen-pcifront.c dma-mapping: split <linux/dma-mapping.h> 2020-10-06 07:07:03 +02:00