]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
x86/apic: Always provide irq_compose_msi_msg() method for vector domain
authorDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 8 Oct 2020 19:50:55 +0000 (20:50 +0100)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 23 Oct 2020 16:25:50 +0000 (17:25 +0100)
This shouldn't be dependent on PCI_MSI. HPET and I/OAPIC can deliver
interrupts through MSI without having any PCI in the system at all.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
arch/x86/include/asm/apic.h
arch/x86/kernel/apic/apic.c
arch/x86/kernel/apic/msi.c
arch/x86/kernel/apic/vector.c

index b0fd204e0023d00bf2c92aaea353c9f513b058c1..f5b88fb723bf322d7dd63d0bb7af856296801a68 100644 (file)
@@ -521,12 +521,10 @@ static inline void apic_smt_update(void) { }
 #endif
 
 struct msi_msg;
+struct irq_cfg;
 
-#ifdef CONFIG_PCI_MSI
-void x86_vector_msi_compose_msg(struct irq_data *data, struct msi_msg *msg);
-#else
-# define x86_vector_msi_compose_msg NULL
-#endif
+extern void __irq_msi_compose_msg(struct irq_cfg *cfg, struct msi_msg *msg,
+                                 bool dmar);
 
 extern void ioapic_zap_locks(void);
 
index 113f6ca7b82849fd18271f3661b78b479accc2e6..fba3ba383ad2ecf380117ffffebbe5ad72f884d4 100644 (file)
@@ -50,6 +50,7 @@
 #include <asm/io_apic.h>
 #include <asm/desc.h>
 #include <asm/hpet.h>
+#include <asm/msidef.h>
 #include <asm/mtrr.h>
 #include <asm/time.h>
 #include <asm/smp.h>
@@ -2480,6 +2481,37 @@ int hard_smp_processor_id(void)
        return read_apic_id();
 }
 
+void __irq_msi_compose_msg(struct irq_cfg *cfg, struct msi_msg *msg,
+                          bool dmar)
+{
+       msg->address_hi = MSI_ADDR_BASE_HI;
+
+       msg->address_lo =
+               MSI_ADDR_BASE_LO |
+               ((apic->irq_dest_mode == 0) ?
+                       MSI_ADDR_DEST_MODE_PHYSICAL :
+                       MSI_ADDR_DEST_MODE_LOGICAL) |
+               MSI_ADDR_REDIRECTION_CPU |
+               MSI_ADDR_DEST_ID(cfg->dest_apicid);
+
+       msg->data =
+               MSI_DATA_TRIGGER_EDGE |
+               MSI_DATA_LEVEL_ASSERT |
+               MSI_DATA_DELIVERY_FIXED |
+               MSI_DATA_VECTOR(cfg->vector);
+
+       /*
+        * Only the IOMMU itself can use the trick of putting destination
+        * APIC ID into the high bits of the address. Anything else would
+        * just be writing to memory if it tried that, and needs IR to
+        * address higher APIC IDs.
+        */
+       if (dmar)
+               msg->address_hi |= MSI_ADDR_EXT_DEST_ID(cfg->dest_apicid);
+       else
+               WARN_ON_ONCE(MSI_ADDR_EXT_DEST_ID(cfg->dest_apicid));
+}
+
 /*
  * Override the generic EOI implementation with an optimized version.
  * Only called during early boot when only one CPU is active and with
index 516df47bde735c514e0a1faeffc3a9111c01a870..de585cfa4d6cb0ec23b307be0a810ec87d2e84bc 100644 (file)
 
 struct irq_domain *x86_pci_msi_default_domain __ro_after_init;
 
-static void __irq_msi_compose_msg(struct irq_cfg *cfg, struct msi_msg *msg,
-                                 bool dmar)
-{
-       msg->address_hi = MSI_ADDR_BASE_HI;
-
-       msg->address_lo =
-               MSI_ADDR_BASE_LO |
-               ((apic->irq_dest_mode == 0) ?
-                       MSI_ADDR_DEST_MODE_PHYSICAL :
-                       MSI_ADDR_DEST_MODE_LOGICAL) |
-               MSI_ADDR_REDIRECTION_CPU |
-               MSI_ADDR_DEST_ID(cfg->dest_apicid);
-
-       msg->data =
-               MSI_DATA_TRIGGER_EDGE |
-               MSI_DATA_LEVEL_ASSERT |
-               MSI_DATA_DELIVERY_FIXED |
-               MSI_DATA_VECTOR(cfg->vector);
-
-       /*
-        * Only the IOMMU itself can use the trick of putting destination
-        * APIC ID into the high bits of the address. Anything else would
-        * just be writing to memory if it tried that, and needs IR to
-        * address higher APIC IDs.
-        */
-       if (dmar)
-               msg->address_hi |= MSI_ADDR_EXT_DEST_ID(cfg->dest_apicid);
-       else
-               WARN_ON_ONCE(MSI_ADDR_EXT_DEST_ID(cfg->dest_apicid));
-}
-
-void x86_vector_msi_compose_msg(struct irq_data *data, struct msi_msg *msg)
-{
-       __irq_msi_compose_msg(irqd_cfg(data), msg, false);
-}
-
 static void irq_msi_update_msg(struct irq_data *irqd, struct irq_cfg *cfg)
 {
        struct msi_msg msg[2] = { [1] = { }, };
index 1eac536327866be07fa06e483d25b39573ade0ee..bb2e2a2488a55ccdc85d5f50b524e8a2d2456b3b 100644 (file)
@@ -818,6 +818,12 @@ void apic_ack_edge(struct irq_data *irqd)
        apic_ack_irq(irqd);
 }
 
+static void x86_vector_msi_compose_msg(struct irq_data *data,
+                                      struct msi_msg *msg)
+{
+       __irq_msi_compose_msg(irqd_cfg(data), msg, false);
+}
+
 static struct irq_chip lapic_controller = {
        .name                   = "APIC",
        .irq_ack                = apic_ack_edge,