]> Pileus Git - ~andy/linux/commitdiff
x86, io_apic: Convert setup_ioapic_entry to function pointer
authorJoerg Roedel <joro@8bytes.org>
Wed, 26 Sep 2012 10:44:40 +0000 (12:44 +0200)
committerJoerg Roedel <joro@8bytes.org>
Mon, 28 Jan 2013 11:17:26 +0000 (12:17 +0100)
This pointer is changed to a different function when IRQ
remapping is enabled.

Signed-off-by: Joerg Roedel <joro@8bytes.org>
Acked-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
arch/x86/include/asm/io_apic.h
arch/x86/include/asm/x86_init.h
arch/x86/kernel/apic/io_apic.c
arch/x86/kernel/x86_init.c
drivers/iommu/irq_remapping.c

index a744cbbe02de568fbbe37a48a0371555d99b8219..71f5f0865e7cb6d22f3967912176068db56bd05e 100644 (file)
@@ -149,6 +149,10 @@ extern int io_apic_set_pci_routing(struct device *dev, int irq,
 void setup_IO_APIC_irq_extra(u32 gsi);
 extern void ioapic_insert_resources(void);
 
+extern int native_setup_ioapic_entry(int, struct IO_APIC_route_entry *,
+                                    unsigned int, int,
+                                    struct io_apic_irq_attr *);
+
 int io_apic_setup_irq_pin_once(unsigned int irq, int node, struct io_apic_irq_attr *attr);
 
 extern int save_ioapic_entries(void);
@@ -232,6 +236,7 @@ static inline void disable_ioapic_support(void) { }
 #define native_disable_io_apic         NULL
 #define native_io_apic_print_entries   NULL
 #define native_ioapic_set_affinity     NULL
+#define native_setup_ioapic_entry      NULL
 #endif
 
 #endif /* _ASM_X86_IO_APIC_H */
index 20d9f97c14a27cd784b4c9938f6e6aa098ebf8e9..17da29cf1a479003e31bba60c27dde4d0eba4be7 100644 (file)
@@ -190,6 +190,8 @@ struct x86_msi_ops {
        int  (*setup_hpet_msi)(unsigned int irq, unsigned int id);
 };
 
+struct IO_APIC_route_entry;
+struct io_apic_irq_attr;
 struct irq_data;
 struct cpumask;
 
@@ -203,6 +205,9 @@ struct x86_io_apic_ops {
        int             (*set_affinity)(struct irq_data *data,
                                        const struct cpumask *mask,
                                        bool force);
+       int             (*setup_entry)(int irq, struct IO_APIC_route_entry *entry,
+                                      unsigned int destination, int vector,
+                                      struct io_apic_irq_attr *attr);
 };
 
 extern struct x86_init_ops x86_init;
index d9ca3be9636ccda25e87f7c2e5aeca41060aafeb..9a7131f29c83e38a826392a267939e485ff60e37 100644 (file)
@@ -1315,14 +1315,10 @@ static void ioapic_register_intr(unsigned int irq, struct irq_cfg *cfg,
                                      fasteoi ? "fasteoi" : "edge");
 }
 
-static int setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry,
-                              unsigned int destination, int vector,
-                              struct io_apic_irq_attr *attr)
+int native_setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry,
+                             unsigned int destination, int vector,
+                             struct io_apic_irq_attr *attr)
 {
-       if (irq_remapping_enabled)
-               return setup_ioapic_remapped_entry(irq, entry, destination,
-                                                  vector, attr);
-
        memset(entry, 0, sizeof(*entry));
 
        entry->delivery_mode = apic->irq_delivery_mode;
@@ -1370,8 +1366,8 @@ static void setup_ioapic_irq(unsigned int irq, struct irq_cfg *cfg,
                    attr->ioapic, mpc_ioapic_id(attr->ioapic), attr->ioapic_pin,
                    cfg->vector, irq, attr->trigger, attr->polarity, dest);
 
-       if (setup_ioapic_entry(irq, &entry, dest, cfg->vector, attr)) {
-               pr_warn("Failed to setup ioapic entry for ioapic %d, pin %d\n",
+       if (x86_io_apic_ops.setup_entry(irq, &entry, dest, cfg->vector, attr)) {
+               pr_warn("Failed to setup ioapic entry for ioapic  %d, pin %d\n",
                        mpc_ioapic_id(attr->ioapic), attr->ioapic_pin);
                __clear_irq_vector(irq, cfg);
 
index 2ca3475e90a8fd7c436fe1f3576ffa67319e9920..06db44f4fbf554bee4486b728fc0a353e94413b7 100644 (file)
@@ -127,4 +127,5 @@ struct x86_io_apic_ops x86_io_apic_ops = {
        .disable                = native_disable_io_apic,
        .print_entries          = native_io_apic_print_entries,
        .set_affinity           = native_ioapic_set_affinity,
+       .setup_entry            = native_setup_ioapic_entry,
 };
index 67b243c6c4e958d5b1eaaf5a4d2e9683592823f0..886ad67987fd6774c5eb82785cec73c33ee606a1 100644 (file)
@@ -146,6 +146,7 @@ static void __init irq_remapping_modify_x86_ops(void)
 {
        x86_io_apic_ops.disable         = irq_remapping_disable_io_apic;
        x86_io_apic_ops.set_affinity    = set_remapped_irq_affinity;
+       x86_io_apic_ops.setup_entry     = setup_ioapic_remapped_entry;
        x86_msi.setup_msi_irqs          = irq_remapping_setup_msi_irqs;
        x86_msi.setup_hpet_msi          = setup_hpet_msi_remapped;
 }