PCI/MSI: Make arch_.*_msi_irq[s] fallbacks selectable
authorThomas Gleixner <tglx@linutronix.de>
Wed, 26 Aug 2020 11:17:02 +0000 (13:17 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 16 Sep 2020 14:52:37 +0000 (16:52 +0200)
The arch_.*_msi_irq[s] fallbacks are compiled in whether an architecture
requires them or not. Architectures which are fully utilizing hierarchical
irq domains should never call into that code.

It's not only architectures which depend on that by implementing one or
more of the weak functions, there is also a bunch of drivers which relies
on the weak functions which invoke msi_controller::setup_irq[s] and
msi_controller::teardown_irq.

Make the architectures and drivers which rely on them select them in Kconfig
and if not selected replace them by stub functions which emit a warning and
fail the PCI/MSI interrupt allocation.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20200826112333.992429909@linutronix.de
arch/ia64/Kconfig
arch/mips/Kconfig
arch/powerpc/Kconfig
arch/s390/Kconfig
arch/sparc/Kconfig
arch/x86/Kconfig
drivers/pci/Kconfig
drivers/pci/controller/Kconfig
drivers/pci/msi.c
include/linux/msi.h

index 5b4ec80bf5863ad09a1be531f98ecad6cc453193..7ff5b3bbf160a6d0fc44287daf6acf2b46cc5c4b 100644 (file)
@@ -56,6 +56,7 @@ config IA64
        select NEED_DMA_MAP_STATE
        select NEED_SG_DMA_LENGTH
        select NUMA if !FLATMEM
+       select PCI_MSI_ARCH_FALLBACKS
        default y
        help
          The Itanium Processor Family is Intel's 64-bit successor to
index c95fa3a2484cf056c9dc4238980acd896ef13ca6..3690582eb61f1266120b3bc23c6ce531353aa8b0 100644 (file)
@@ -86,6 +86,7 @@ config MIPS
        select MODULES_USE_ELF_REL if MODULES
        select MODULES_USE_ELF_RELA if MODULES && 64BIT
        select PERF_USE_VMALLOC
+       select PCI_MSI_ARCH_FALLBACKS
        select RTC_LIB
        select SYSCTL_EXCEPTION_TRACE
        select VIRT_TO_BUS
index 65bed1fdeaad71e7bd7c3fdeecdf41f019b4b71e..9e66ca1376af32b083f0e1f81c930a46562736ce 100644 (file)
@@ -246,6 +246,7 @@ config PPC
        select OLD_SIGACTION                    if PPC32
        select OLD_SIGSUSPEND
        select PCI_DOMAINS                      if PCI
+       select PCI_MSI_ARCH_FALLBACKS
        select PCI_SYSCALL                      if PCI
        select PPC_DAWR                         if PPC64
        select RTC_LIB
index b29fcc66ec39b06e5baba74cf3d4fdb8bcbdf42b..63dd5a0aa2528d7fe6999ac06ed7dece2e4041e9 100644 (file)
@@ -185,6 +185,7 @@ config S390
        select OLD_SIGSUSPEND3
        select PCI_DOMAINS              if PCI
        select PCI_MSI                  if PCI
+       select PCI_MSI_ARCH_FALLBACKS
        select SPARSE_IRQ
        select SYSCTL_EXCEPTION_TRACE
        select THREAD_INFO_IN_TASK
index efeff2c896a54451d29cb4254b48d76e17c0096d..21a3239870c0b0273c88b552f253163281e05d9d 100644 (file)
@@ -43,6 +43,7 @@ config SPARC
        select GENERIC_STRNLEN_USER
        select MODULES_USE_ELF_RELA
        select PCI_SYSCALL if PCI
+       select PCI_MSI_ARCH_FALLBACKS
        select ODD_RT_SIGACTION
        select OLD_SIGSUSPEND
        select CPU_NO_EFFICIENT_FFS
index 7101ac64bb209d31966ca255e07a2ddf704397e7..196e0688ec3c4e0f848b7ae1430fcab003aa4854 100644 (file)
@@ -225,6 +225,7 @@ config X86
        select NEED_SG_DMA_LENGTH
        select PCI_DOMAINS                      if PCI
        select PCI_LOCKLESS_CONFIG              if PCI
+       select PCI_MSI_ARCH_FALLBACKS
        select PERF_EVENTS
        select RTC_LIB
        select RTC_MC146818_LIB
index 4bef5c2bae9f587e5739b3cb8b57a4fc270b7681..438a792d2cf7715fcb992871e322768d328d8521 100644 (file)
@@ -56,6 +56,9 @@ config PCI_MSI_IRQ_DOMAIN
        depends on PCI_MSI
        select GENERIC_MSI_IRQ_DOMAIN
 
+config PCI_MSI_ARCH_FALLBACKS
+       bool
+
 config PCI_QUIRKS
        default y
        bool "Enable PCI quirk workarounds" if EXPERT
index f18c3725ef80542cf7ecfe46dd93ea4786aad0d3..4a7afbe189f8c9f87798d419d659f9e7f1a38ef0 100644 (file)
@@ -41,6 +41,7 @@ config PCI_TEGRA
        bool "NVIDIA Tegra PCIe controller"
        depends on ARCH_TEGRA || COMPILE_TEST
        depends on PCI_MSI_IRQ_DOMAIN
+       select PCI_MSI_ARCH_FALLBACKS
        help
          Say Y here if you want support for the PCIe host controller found
          on NVIDIA Tegra SoCs.
@@ -67,6 +68,7 @@ config PCIE_RCAR_HOST
        bool "Renesas R-Car PCIe host controller"
        depends on ARCH_RENESAS || COMPILE_TEST
        depends on PCI_MSI_IRQ_DOMAIN
+       select PCI_MSI_ARCH_FALLBACKS
        help
          Say Y here if you want PCIe controller support on R-Car SoCs in host
          mode.
@@ -95,6 +97,7 @@ config PCI_HOST_GENERIC
 config PCIE_XILINX
        bool "Xilinx AXI PCIe host bridge support"
        depends on OF || COMPILE_TEST
+       select PCI_MSI_ARCH_FALLBACKS
        help
          Say 'Y' here if you want kernel to support the Xilinx AXI PCIe
          Host Bridge driver.
index a2f00d18101610013977412566e38d51231afcf7..d52d118979a6d31ca592e68fd5c54e654ee83024 100644 (file)
@@ -58,8 +58,8 @@ static void pci_msi_teardown_msi_irqs(struct pci_dev *dev)
 #define pci_msi_teardown_msi_irqs      arch_teardown_msi_irqs
 #endif
 
+#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
 /* Arch hooks */
-
 int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
 {
        struct msi_controller *chip = dev->bus->msi;
@@ -132,6 +132,7 @@ void __weak arch_teardown_msi_irqs(struct pci_dev *dev)
 {
        return default_teardown_msi_irqs(dev);
 }
+#endif /* CONFIG_PCI_MSI_ARCH_FALLBACKS */
 
 static void default_restore_msi_irq(struct pci_dev *dev, int irq)
 {
index 0180534b542838bd8c1195816893a6d174d7b7e1..6b584cc4757cdff7edeba1c6a6f22e39fd28307a 100644 (file)
@@ -193,17 +193,38 @@ void pci_msi_mask_irq(struct irq_data *data);
 void pci_msi_unmask_irq(struct irq_data *data);
 
 /*
- * The arch hooks to setup up msi irqs. Those functions are
- * implemented as weak symbols so that they /can/ be overriden by
- * architecture specific code if needed.
+ * The arch hooks to setup up msi irqs. Default functions are implemented
+ * as weak symbols so that they /can/ be overriden by architecture specific
+ * code if needed. These hooks must be enabled by the architecture or by
+ * drivers which depend on them via msi_controller based MSI handling.
+ *
+ * If CONFIG_PCI_MSI_ARCH_FALLBACKS is not selected they are replaced by
+ * stubs with warnings.
  */
+#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
 int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
 void arch_teardown_msi_irq(unsigned int irq);
 int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
 void arch_teardown_msi_irqs(struct pci_dev *dev);
-void arch_restore_msi_irqs(struct pci_dev *dev);
-
 void default_teardown_msi_irqs(struct pci_dev *dev);
+#else
+static inline int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+{
+       WARN_ON_ONCE(1);
+       return -ENODEV;
+}
+
+static inline void arch_teardown_msi_irqs(struct pci_dev *dev)
+{
+       WARN_ON_ONCE(1);
+}
+#endif
+
+/*
+ * The restore hooks are still available as they are useful even
+ * for fully irq domain based setups. Courtesy to XEN/X86.
+ */
+void arch_restore_msi_irqs(struct pci_dev *dev);
 void default_restore_msi_irqs(struct pci_dev *dev);
 
 struct msi_controller {