aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-02-11 04:49:40 -0500
committerIngo Molnar <mingo@elte.hu>2009-02-11 04:49:40 -0500
commitd5b5a232b2f2b6e64762308e90d47248dddfd72f (patch)
tree968c0568b62d6eeeec22a2ca07f1be6de07c437d
parent0e81cb59c7120191c0243c686b591797bc79e5c6 (diff)
parentbf56957d176c279175464f385f3eb03d65819328 (diff)
Merge branch 'x86/apic' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen into x86/apic
-rw-r--r--arch/x86/include/asm/apic.h35
-rw-r--r--arch/x86/include/asm/hw_irq.h2
-rw-r--r--arch/x86/include/asm/io_apic.h6
-rw-r--r--arch/x86/include/asm/mpspec.h2
-rw-r--r--arch/x86/kernel/acpi/boot.c18
-rw-r--r--arch/x86/kernel/io_apic.c10
6 files changed, 56 insertions, 17 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index b03711d7990b..f4835a1be360 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -139,12 +139,35 @@ struct apic_ops {
139 139
140extern struct apic_ops *apic_ops; 140extern struct apic_ops *apic_ops;
141 141
142#define apic_read (apic_ops->read) 142static inline u32 apic_read(u32 reg)
143#define apic_write (apic_ops->write) 143{
144#define apic_icr_read (apic_ops->icr_read) 144 return apic_ops->read(reg);
145#define apic_icr_write (apic_ops->icr_write) 145}
146#define apic_wait_icr_idle (apic_ops->wait_icr_idle) 146
147#define safe_apic_wait_icr_idle (apic_ops->safe_wait_icr_idle) 147static inline void apic_write(u32 reg, u32 val)
148{
149 apic_ops->write(reg, val);
150}
151
152static inline u64 apic_icr_read(void)
153{
154 return apic_ops->icr_read();
155}
156
157static inline void apic_icr_write(u32 low, u32 high)
158{
159 apic_ops->icr_write(low, high);
160}
161
162static inline void apic_wait_icr_idle(void)
163{
164 apic_ops->wait_icr_idle();
165}
166
167static inline u32 safe_apic_wait_icr_idle(void)
168{
169 return apic_ops->safe_wait_icr_idle();
170}
148 171
149extern int get_physical_broadcast(void); 172extern int get_physical_broadcast(void);
150 173
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index 1b82781b898d..370e1c83bb49 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -65,9 +65,7 @@ extern void disable_IO_APIC(void);
65extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); 65extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
66extern void setup_ioapic_dest(void); 66extern void setup_ioapic_dest(void);
67 67
68#ifdef CONFIG_X86_64
69extern void enable_IO_APIC(void); 68extern void enable_IO_APIC(void);
70#endif
71 69
72/* Statistics */ 70/* Statistics */
73extern atomic_t irq_err_count; 71extern atomic_t irq_err_count;
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index 309d0e23193a..59cb4a1317b7 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -169,6 +169,12 @@ extern void reinit_intr_remapped_IO_APIC(int);
169 169
170extern void probe_nr_irqs_gsi(void); 170extern void probe_nr_irqs_gsi(void);
171 171
172extern int setup_ioapic_entry(int apic, int irq,
173 struct IO_APIC_route_entry *entry,
174 unsigned int destination, int trigger,
175 int polarity, int vector);
176extern void ioapic_write_entry(int apic, int pin,
177 struct IO_APIC_route_entry e);
172#else /* !CONFIG_X86_IO_APIC */ 178#else /* !CONFIG_X86_IO_APIC */
173#define io_apic_assign_pci_irqs 0 179#define io_apic_assign_pci_irqs 0
174static const int timer_through_8259 = 0; 180static const int timer_through_8259 = 0;
diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h
index 8c5620147c40..5916c8df09d9 100644
--- a/arch/x86/include/asm/mpspec.h
+++ b/arch/x86/include/asm/mpspec.h
@@ -77,6 +77,8 @@ extern int acpi_probe_gsi(void);
77#ifdef CONFIG_X86_IO_APIC 77#ifdef CONFIG_X86_IO_APIC
78extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, 78extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
79 u32 gsi, int triggering, int polarity); 79 u32 gsi, int triggering, int polarity);
80extern int mp_find_ioapic(int gsi);
81extern int mp_find_ioapic_pin(int ioapic, int gsi);
80#else 82#else
81static inline int 83static inline int
82mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, 84mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index c334fe75dcd6..bba162c81d5b 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -872,7 +872,7 @@ static struct {
872 DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); 872 DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
873} mp_ioapic_routing[MAX_IO_APICS]; 873} mp_ioapic_routing[MAX_IO_APICS];
874 874
875static int mp_find_ioapic(int gsi) 875int mp_find_ioapic(int gsi)
876{ 876{
877 int i = 0; 877 int i = 0;
878 878
@@ -887,6 +887,16 @@ static int mp_find_ioapic(int gsi)
887 return -1; 887 return -1;
888} 888}
889 889
890int mp_find_ioapic_pin(int ioapic, int gsi)
891{
892 if (WARN_ON(ioapic == -1))
893 return -1;
894 if (WARN_ON(gsi > mp_ioapic_routing[ioapic].gsi_end))
895 return -1;
896
897 return gsi - mp_ioapic_routing[ioapic].gsi_base;
898}
899
890static u8 __init uniq_ioapic_id(u8 id) 900static u8 __init uniq_ioapic_id(u8 id)
891{ 901{
892#ifdef CONFIG_X86_32 902#ifdef CONFIG_X86_32
@@ -1022,7 +1032,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
1022 ioapic = mp_find_ioapic(gsi); 1032 ioapic = mp_find_ioapic(gsi);
1023 if (ioapic < 0) 1033 if (ioapic < 0)
1024 return; 1034 return;
1025 pin = gsi - mp_ioapic_routing[ioapic].gsi_base; 1035 pin = mp_find_ioapic_pin(ioapic, gsi);
1026 1036
1027 /* 1037 /*
1028 * TBD: This check is for faulty timer entries, where the override 1038 * TBD: This check is for faulty timer entries, where the override
@@ -1142,7 +1152,7 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity)
1142 return gsi; 1152 return gsi;
1143 } 1153 }
1144 1154
1145 ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base; 1155 ioapic_pin = mp_find_ioapic_pin(ioapic, gsi);
1146 1156
1147#ifdef CONFIG_X86_32 1157#ifdef CONFIG_X86_32
1148 if (ioapic_renumber_irq) 1158 if (ioapic_renumber_irq)
@@ -1231,7 +1241,7 @@ int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
1231 mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); 1241 mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
1232 ioapic = mp_find_ioapic(gsi); 1242 ioapic = mp_find_ioapic(gsi);
1233 mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id; 1243 mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id;
1234 mp_irq.dstirq = gsi - mp_ioapic_routing[ioapic].gsi_base; 1244 mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
1235 1245
1236 save_mp_irq(&mp_irq); 1246 save_mp_irq(&mp_irq);
1237#endif 1247#endif
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c
index 56e51eb551a5..7248ca11bdcd 100644
--- a/arch/x86/kernel/io_apic.c
+++ b/arch/x86/kernel/io_apic.c
@@ -486,7 +486,7 @@ __ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
486 io_apic_write(apic, 0x10 + 2*pin, eu.w1); 486 io_apic_write(apic, 0x10 + 2*pin, eu.w1);
487} 487}
488 488
489static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) 489void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
490{ 490{
491 unsigned long flags; 491 unsigned long flags;
492 spin_lock_irqsave(&ioapic_lock, flags); 492 spin_lock_irqsave(&ioapic_lock, flags);
@@ -1478,10 +1478,10 @@ static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long t
1478 handle_edge_irq, "edge"); 1478 handle_edge_irq, "edge");
1479} 1479}
1480 1480
1481static int setup_ioapic_entry(int apic_id, int irq, 1481int setup_ioapic_entry(int apic_id, int irq,
1482 struct IO_APIC_route_entry *entry, 1482 struct IO_APIC_route_entry *entry,
1483 unsigned int destination, int trigger, 1483 unsigned int destination, int trigger,
1484 int polarity, int vector) 1484 int polarity, int vector)
1485{ 1485{
1486 /* 1486 /*
1487 * add it to the IO-APIC irq-routing table: 1487 * add it to the IO-APIC irq-routing table: