aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/Kconfig8
-rw-r--r--arch/x86/kernel/Makefile2
-rw-r--r--arch/x86/kernel/acpi/boot.c4
-rw-r--r--arch/x86/kernel/apic_32.c42
-rw-r--r--arch/x86/kernel/apic_64.c239
-rw-r--r--arch/x86/kernel/cpu/common_64.c2
-rw-r--r--arch/x86/kernel/cpu/feature_names.c2
-rw-r--r--arch/x86/kernel/genapic_64.c30
-rw-r--r--arch/x86/kernel/genapic_flat_64.c36
-rw-r--r--arch/x86/kernel/genx2apic_cluster.c153
-rw-r--r--arch/x86/kernel/genx2apic_phys.c140
-rw-r--r--arch/x86/kernel/genx2apic_uv_x.c36
-rw-r--r--arch/x86/kernel/i8259.c24
-rw-r--r--arch/x86/kernel/io_apic_32.c5
-rw-r--r--arch/x86/kernel/io_apic_64.c608
-rw-r--r--arch/x86/kernel/mpparse.c2
-rw-r--r--arch/x86/kernel/paravirt.c3
-rw-r--r--arch/x86/kernel/setup.c2
-rw-r--r--arch/x86/kernel/smpboot.c39
-rw-r--r--arch/x86/kernel/vmi_32.c6
-rw-r--r--arch/x86/lguest/boot.c39
-rw-r--r--arch/x86/mach-generic/bigsmp.c5
-rw-r--r--arch/x86/mach-generic/es7000.c3
-rw-r--r--arch/x86/mach-generic/numaq.c4
-rw-r--r--arch/x86/mach-generic/summit.c5
-rw-r--r--arch/x86/xen/enlighten.c46
26 files changed, 1368 insertions, 117 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 96e0c2ebc388..baca55455005 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1650,6 +1650,14 @@ config DMAR_FLOPPY_WA
1650 workaround will setup a 1:1 mapping for the first 1650 workaround will setup a 1:1 mapping for the first
1651 16M to make floppy (an ISA device) work. 1651 16M to make floppy (an ISA device) work.
1652 1652
1653config INTR_REMAP
1654 bool "Support for Interrupt Remapping (EXPERIMENTAL)"
1655 depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI && EXPERIMENTAL
1656 help
1657 Supports Interrupt remapping for IO-APIC and MSI devices.
1658 To use x2apic mode in the CPU's which support x2APIC enhancements or
1659 to support platforms with CPU's having > 8 bit APIC ID, say Y.
1660
1653source "drivers/pci/pcie/Kconfig" 1661source "drivers/pci/pcie/Kconfig"
1654 1662
1655source "drivers/pci/Kconfig" 1663source "drivers/pci/Kconfig"
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index da140611bb57..673f1d12b420 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -102,6 +102,8 @@ obj-$(CONFIG_OLPC) += olpc.o
102# 64 bit specific files 102# 64 bit specific files
103ifeq ($(CONFIG_X86_64),y) 103ifeq ($(CONFIG_X86_64),y)
104 obj-y += genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o 104 obj-y += genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o
105 obj-y += genx2apic_cluster.o
106 obj-y += genx2apic_phys.o
105 obj-$(CONFIG_X86_PM_TIMER) += pmtimer_64.o 107 obj-$(CONFIG_X86_PM_TIMER) += pmtimer_64.o
106 obj-$(CONFIG_AUDIT) += audit_64.o 108 obj-$(CONFIG_AUDIT) += audit_64.o
107 109
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index f489d7a9be92..b41b27af33e6 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -761,7 +761,7 @@ static void __init acpi_register_lapic_address(unsigned long address)
761 761
762 set_fixmap_nocache(FIX_APIC_BASE, address); 762 set_fixmap_nocache(FIX_APIC_BASE, address);
763 if (boot_cpu_physical_apicid == -1U) { 763 if (boot_cpu_physical_apicid == -1U) {
764 boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); 764 boot_cpu_physical_apicid = read_apic_id();
765#ifdef CONFIG_X86_32 765#ifdef CONFIG_X86_32
766 apic_version[boot_cpu_physical_apicid] = 766 apic_version[boot_cpu_physical_apicid] =
767 GET_APIC_VERSION(apic_read(APIC_LVR)); 767 GET_APIC_VERSION(apic_read(APIC_LVR));
@@ -1337,7 +1337,9 @@ static void __init acpi_process_madt(void)
1337 acpi_ioapic = 1; 1337 acpi_ioapic = 1;
1338 1338
1339 smp_found_config = 1; 1339 smp_found_config = 1;
1340#ifdef CONFIG_X86_32
1340 setup_apic_routing(); 1341 setup_apic_routing();
1342#endif
1341 } 1343 }
1342 } 1344 }
1343 if (error == -EINVAL) { 1345 if (error == -EINVAL) {
diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c
index a437d027f20b..34101962fb0e 100644
--- a/arch/x86/kernel/apic_32.c
+++ b/arch/x86/kernel/apic_32.c
@@ -145,13 +145,18 @@ static int modern_apic(void)
145 return lapic_get_version() >= 0x14; 145 return lapic_get_version() >= 0x14;
146} 146}
147 147
148void apic_wait_icr_idle(void) 148/*
149 * Paravirt kernels also might be using these below ops. So we still
150 * use generic apic_read()/apic_write(), which might be pointing to different
151 * ops in PARAVIRT case.
152 */
153void xapic_wait_icr_idle(void)
149{ 154{
150 while (apic_read(APIC_ICR) & APIC_ICR_BUSY) 155 while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
151 cpu_relax(); 156 cpu_relax();
152} 157}
153 158
154u32 safe_apic_wait_icr_idle(void) 159u32 safe_xapic_wait_icr_idle(void)
155{ 160{
156 u32 send_status; 161 u32 send_status;
157 int timeout; 162 int timeout;
@@ -167,6 +172,35 @@ u32 safe_apic_wait_icr_idle(void)
167 return send_status; 172 return send_status;
168} 173}
169 174
175void xapic_icr_write(u32 low, u32 id)
176{
177 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(id));
178 apic_write_around(APIC_ICR, low);
179}
180
181u64 xapic_icr_read(void)
182{
183 u32 icr1, icr2;
184
185 icr2 = apic_read(APIC_ICR2);
186 icr1 = apic_read(APIC_ICR);
187
188 return icr1 | ((u64)icr2 << 32);
189}
190
191static struct apic_ops xapic_ops = {
192 .read = native_apic_mem_read,
193 .write = native_apic_mem_write,
194 .write_atomic = native_apic_mem_write_atomic,
195 .icr_read = xapic_icr_read,
196 .icr_write = xapic_icr_write,
197 .wait_icr_idle = xapic_wait_icr_idle,
198 .safe_wait_icr_idle = safe_xapic_wait_icr_idle,
199};
200
201struct apic_ops __read_mostly *apic_ops = &xapic_ops;
202EXPORT_SYMBOL_GPL(apic_ops);
203
170/** 204/**
171 * enable_NMI_through_LVT0 - enable NMI through local vector table 0 205 * enable_NMI_through_LVT0 - enable NMI through local vector table 0
172 */ 206 */
@@ -1201,7 +1235,7 @@ void __init init_apic_mappings(void)
1201 * default configuration (or the MP table is broken). 1235 * default configuration (or the MP table is broken).
1202 */ 1236 */
1203 if (boot_cpu_physical_apicid == -1U) 1237 if (boot_cpu_physical_apicid == -1U)
1204 boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); 1238 boot_cpu_physical_apicid = read_apic_id();
1205 1239
1206} 1240}
1207 1241
@@ -1241,7 +1275,7 @@ int __init APIC_init_uniprocessor(void)
1241 * might be zero if read from MP tables. Get it from LAPIC. 1275 * might be zero if read from MP tables. Get it from LAPIC.
1242 */ 1276 */
1243#ifdef CONFIG_CRASH_DUMP 1277#ifdef CONFIG_CRASH_DUMP
1244 boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); 1278 boot_cpu_physical_apicid = read_apic_id();
1245#endif 1279#endif
1246 physid_set_mask_of_physid(boot_cpu_physical_apicid, &phys_cpu_present_map); 1280 physid_set_mask_of_physid(boot_cpu_physical_apicid, &phys_cpu_present_map);
1247 1281
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c
index 1e3d32e27c14..c75f58a66d8e 100644
--- a/arch/x86/kernel/apic_64.c
+++ b/arch/x86/kernel/apic_64.c
@@ -27,6 +27,7 @@
27#include <linux/clockchips.h> 27#include <linux/clockchips.h>
28#include <linux/acpi_pmtmr.h> 28#include <linux/acpi_pmtmr.h>
29#include <linux/module.h> 29#include <linux/module.h>
30#include <linux/dmar.h>
30 31
31#include <asm/atomic.h> 32#include <asm/atomic.h>
32#include <asm/smp.h> 33#include <asm/smp.h>
@@ -39,6 +40,7 @@
39#include <asm/proto.h> 40#include <asm/proto.h>
40#include <asm/timex.h> 41#include <asm/timex.h>
41#include <asm/apic.h> 42#include <asm/apic.h>
43#include <asm/i8259.h>
42 44
43#include <mach_ipi.h> 45#include <mach_ipi.h>
44#include <mach_apic.h> 46#include <mach_apic.h>
@@ -46,6 +48,11 @@
46static int disable_apic_timer __cpuinitdata; 48static int disable_apic_timer __cpuinitdata;
47static int apic_calibrate_pmtmr __initdata; 49static int apic_calibrate_pmtmr __initdata;
48int disable_apic; 50int disable_apic;
51int disable_x2apic;
52int x2apic;
53
54/* x2apic enabled before OS handover */
55int x2apic_preenabled;
49 56
50/* Local APIC timer works in C2 */ 57/* Local APIC timer works in C2 */
51int local_apic_timer_c2_ok; 58int local_apic_timer_c2_ok;
@@ -119,13 +126,13 @@ static int modern_apic(void)
119 return lapic_get_version() >= 0x14; 126 return lapic_get_version() >= 0x14;
120} 127}
121 128
122void apic_wait_icr_idle(void) 129void xapic_wait_icr_idle(void)
123{ 130{
124 while (apic_read(APIC_ICR) & APIC_ICR_BUSY) 131 while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
125 cpu_relax(); 132 cpu_relax();
126} 133}
127 134
128u32 safe_apic_wait_icr_idle(void) 135u32 safe_xapic_wait_icr_idle(void)
129{ 136{
130 u32 send_status; 137 u32 send_status;
131 int timeout; 138 int timeout;
@@ -141,6 +148,71 @@ u32 safe_apic_wait_icr_idle(void)
141 return send_status; 148 return send_status;
142} 149}
143 150
151void xapic_icr_write(u32 low, u32 id)
152{
153 apic_write(APIC_ICR2, id << 24);
154 apic_write(APIC_ICR, low);
155}
156
157u64 xapic_icr_read(void)
158{
159 u32 icr1, icr2;
160
161 icr2 = apic_read(APIC_ICR2);
162 icr1 = apic_read(APIC_ICR);
163
164 return (icr1 | ((u64)icr2 << 32));
165}
166
167static struct apic_ops xapic_ops = {
168 .read = native_apic_mem_read,
169 .write = native_apic_mem_write,
170 .write_atomic = native_apic_mem_write_atomic,
171 .icr_read = xapic_icr_read,
172 .icr_write = xapic_icr_write,
173 .wait_icr_idle = xapic_wait_icr_idle,
174 .safe_wait_icr_idle = safe_xapic_wait_icr_idle,
175};
176
177struct apic_ops __read_mostly *apic_ops = &xapic_ops;
178
179EXPORT_SYMBOL_GPL(apic_ops);
180
181static void x2apic_wait_icr_idle(void)
182{
183 /* no need to wait for icr idle in x2apic */
184 return;
185}
186
187static u32 safe_x2apic_wait_icr_idle(void)
188{
189 /* no need to wait for icr idle in x2apic */
190 return 0;
191}
192
193void x2apic_icr_write(u32 low, u32 id)
194{
195 wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low);
196}
197
198u64 x2apic_icr_read(void)
199{
200 unsigned long val;
201
202 rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val);
203 return val;
204}
205
206static struct apic_ops x2apic_ops = {
207 .read = native_apic_msr_read,
208 .write = native_apic_msr_write,
209 .write_atomic = native_apic_msr_write,
210 .icr_read = x2apic_icr_read,
211 .icr_write = x2apic_icr_write,
212 .wait_icr_idle = x2apic_wait_icr_idle,
213 .safe_wait_icr_idle = safe_x2apic_wait_icr_idle,
214};
215
144/** 216/**
145 * enable_NMI_through_LVT0 - enable NMI through local vector table 0 217 * enable_NMI_through_LVT0 - enable NMI through local vector table 0
146 */ 218 */
@@ -626,10 +698,10 @@ int __init verify_local_APIC(void)
626 /* 698 /*
627 * The ID register is read/write in a real APIC. 699 * The ID register is read/write in a real APIC.
628 */ 700 */
629 reg0 = read_apic_id(); 701 reg0 = apic_read(APIC_ID);
630 apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg0); 702 apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg0);
631 apic_write(APIC_ID, reg0 ^ APIC_ID_MASK); 703 apic_write(APIC_ID, reg0 ^ APIC_ID_MASK);
632 reg1 = read_apic_id(); 704 reg1 = apic_read(APIC_ID);
633 apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg1); 705 apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg1);
634 apic_write(APIC_ID, reg0); 706 apic_write(APIC_ID, reg0);
635 if (reg1 != (reg0 ^ APIC_ID_MASK)) 707 if (reg1 != (reg0 ^ APIC_ID_MASK))
@@ -830,6 +902,125 @@ void __cpuinit end_local_APIC_setup(void)
830 apic_pm_activate(); 902 apic_pm_activate();
831} 903}
832 904
905void check_x2apic(void)
906{
907 int msr, msr2;
908
909 rdmsr(MSR_IA32_APICBASE, msr, msr2);
910
911 if (msr & X2APIC_ENABLE) {
912 printk("x2apic enabled by BIOS, switching to x2apic ops\n");
913 x2apic_preenabled = x2apic = 1;
914 apic_ops = &x2apic_ops;
915 }
916}
917
918void enable_x2apic(void)
919{
920 int msr, msr2;
921
922 rdmsr(MSR_IA32_APICBASE, msr, msr2);
923 if (!(msr & X2APIC_ENABLE)) {
924 printk("Enabling x2apic\n");
925 wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, 0);
926 }
927}
928
929void enable_IR_x2apic(void)
930{
931#ifdef CONFIG_INTR_REMAP
932 int ret;
933 unsigned long flags;
934
935 if (!cpu_has_x2apic)
936 return;
937
938 if (!x2apic_preenabled && disable_x2apic) {
939 printk(KERN_INFO
940 "Skipped enabling x2apic and Interrupt-remapping "
941 "because of nox2apic\n");
942 return;
943 }
944
945 if (x2apic_preenabled && disable_x2apic)
946 panic("Bios already enabled x2apic, can't enforce nox2apic");
947
948 if (!x2apic_preenabled && skip_ioapic_setup) {
949 printk(KERN_INFO
950 "Skipped enabling x2apic and Interrupt-remapping "
951 "because of skipping io-apic setup\n");
952 return;
953 }
954
955 ret = dmar_table_init();
956 if (ret) {
957 printk(KERN_INFO
958 "dmar_table_init() failed with %d:\n", ret);
959
960 if (x2apic_preenabled)
961 panic("x2apic enabled by bios. But IR enabling failed");
962 else
963 printk(KERN_INFO
964 "Not enabling x2apic,Intr-remapping\n");
965 return;
966 }
967
968 local_irq_save(flags);
969 mask_8259A();
970 save_mask_IO_APIC_setup();
971
972 ret = enable_intr_remapping(1);
973
974 if (ret && x2apic_preenabled) {
975 local_irq_restore(flags);
976 panic("x2apic enabled by bios. But IR enabling failed");
977 }
978
979 if (ret)
980 goto end;
981
982 if (!x2apic) {
983 x2apic = 1;
984 apic_ops = &x2apic_ops;
985 enable_x2apic();
986 }
987end:
988 if (ret)
989 /*
990 * IR enabling failed
991 */
992 restore_IO_APIC_setup();
993 else
994 reinit_intr_remapped_IO_APIC(x2apic_preenabled);
995
996 unmask_8259A();
997 local_irq_restore(flags);
998
999 if (!ret) {
1000 if (!x2apic_preenabled)
1001 printk(KERN_INFO
1002 "Enabled x2apic and interrupt-remapping\n");
1003 else
1004 printk(KERN_INFO
1005 "Enabled Interrupt-remapping\n");
1006 } else
1007 printk(KERN_ERR
1008 "Failed to enable Interrupt-remapping and x2apic\n");
1009#else
1010 if (!cpu_has_x2apic)
1011 return;
1012
1013 if (x2apic_preenabled)
1014 panic("x2apic enabled prior OS handover,"
1015 " enable CONFIG_INTR_REMAP");
1016
1017 printk(KERN_INFO "Enable CONFIG_INTR_REMAP for enabling intr-remapping "
1018 " and x2apic\n");
1019#endif
1020
1021 return;
1022}
1023
833/* 1024/*
834 * Detect and enable local APICs on non-SMP boards. 1025 * Detect and enable local APICs on non-SMP boards.
835 * Original code written by Keir Fraser. 1026 * Original code written by Keir Fraser.
@@ -869,7 +1060,7 @@ void __init early_init_lapic_mapping(void)
869 * Fetch the APIC ID of the BSP in case we have a 1060 * Fetch the APIC ID of the BSP in case we have a
870 * default configuration (or the MP table is broken). 1061 * default configuration (or the MP table is broken).
871 */ 1062 */
872 boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); 1063 boot_cpu_physical_apicid = read_apic_id();
873} 1064}
874 1065
875/** 1066/**
@@ -877,6 +1068,11 @@ void __init early_init_lapic_mapping(void)
877 */ 1068 */
878void __init init_apic_mappings(void) 1069void __init init_apic_mappings(void)
879{ 1070{
1071 if (x2apic) {
1072 boot_cpu_physical_apicid = read_apic_id();
1073 return;
1074 }
1075
880 /* 1076 /*
881 * If no local APIC can be found then set up a fake all 1077 * If no local APIC can be found then set up a fake all
882 * zeroes page to simulate the local APIC and another 1078 * zeroes page to simulate the local APIC and another
@@ -896,7 +1092,7 @@ void __init init_apic_mappings(void)
896 * Fetch the APIC ID of the BSP in case we have a 1092 * Fetch the APIC ID of the BSP in case we have a
897 * default configuration (or the MP table is broken). 1093 * default configuration (or the MP table is broken).
898 */ 1094 */
899 boot_cpu_physical_apicid = GET_APIC_ID(read_apic_id()); 1095 boot_cpu_physical_apicid = read_apic_id();
900} 1096}
901 1097
902/* 1098/*
@@ -915,6 +1111,9 @@ int __init APIC_init_uniprocessor(void)
915 return -1; 1111 return -1;
916 } 1112 }
917 1113
1114 enable_IR_x2apic();
1115 setup_apic_routing();
1116
918 verify_local_APIC(); 1117 verify_local_APIC();
919 1118
920 connect_bsp_APIC(); 1119 connect_bsp_APIC();
@@ -1096,6 +1295,11 @@ void __cpuinit generic_processor_info(int apicid, int version)
1096 cpu_set(cpu, cpu_present_map); 1295 cpu_set(cpu, cpu_present_map);
1097} 1296}
1098 1297
1298int hard_smp_processor_id(void)
1299{
1300 return read_apic_id();
1301}
1302
1099/* 1303/*
1100 * Power management 1304 * Power management
1101 */ 1305 */
@@ -1132,7 +1336,7 @@ static int lapic_suspend(struct sys_device *dev, pm_message_t state)
1132 1336
1133 maxlvt = lapic_get_maxlvt(); 1337 maxlvt = lapic_get_maxlvt();
1134 1338
1135 apic_pm_state.apic_id = read_apic_id(); 1339 apic_pm_state.apic_id = apic_read(APIC_ID);
1136 apic_pm_state.apic_taskpri = apic_read(APIC_TASKPRI); 1340 apic_pm_state.apic_taskpri = apic_read(APIC_TASKPRI);
1137 apic_pm_state.apic_ldr = apic_read(APIC_LDR); 1341 apic_pm_state.apic_ldr = apic_read(APIC_LDR);
1138 apic_pm_state.apic_dfr = apic_read(APIC_DFR); 1342 apic_pm_state.apic_dfr = apic_read(APIC_DFR);
@@ -1167,10 +1371,14 @@ static int lapic_resume(struct sys_device *dev)
1167 maxlvt = lapic_get_maxlvt(); 1371 maxlvt = lapic_get_maxlvt();
1168 1372
1169 local_irq_save(flags); 1373 local_irq_save(flags);
1170 rdmsr(MSR_IA32_APICBASE, l, h); 1374 if (!x2apic) {
1171 l &= ~MSR_IA32_APICBASE_BASE; 1375 rdmsr(MSR_IA32_APICBASE, l, h);
1172 l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr; 1376 l &= ~MSR_IA32_APICBASE_BASE;
1173 wrmsr(MSR_IA32_APICBASE, l, h); 1377 l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr;
1378 wrmsr(MSR_IA32_APICBASE, l, h);
1379 } else
1380 enable_x2apic();
1381
1174 apic_write(APIC_LVTERR, ERROR_APIC_VECTOR | APIC_LVT_MASKED); 1382 apic_write(APIC_LVTERR, ERROR_APIC_VECTOR | APIC_LVT_MASKED);
1175 apic_write(APIC_ID, apic_pm_state.apic_id); 1383 apic_write(APIC_ID, apic_pm_state.apic_id);
1176 apic_write(APIC_DFR, apic_pm_state.apic_dfr); 1384 apic_write(APIC_DFR, apic_pm_state.apic_dfr);
@@ -1310,6 +1518,15 @@ __cpuinit int apic_is_clustered_box(void)
1310 return (clusters > 2); 1518 return (clusters > 2);
1311} 1519}
1312 1520
1521static __init int setup_nox2apic(char *str)
1522{
1523 disable_x2apic = 1;
1524 clear_cpu_cap(&boot_cpu_data, X86_FEATURE_X2APIC);
1525 return 0;
1526}
1527early_param("nox2apic", setup_nox2apic);
1528
1529
1313/* 1530/*
1314 * APIC command line parameters 1531 * APIC command line parameters
1315 */ 1532 */
diff --git a/arch/x86/kernel/cpu/common_64.c b/arch/x86/kernel/cpu/common_64.c
index 7b8cc72feb40..c6bee77ca9e6 100644
--- a/arch/x86/kernel/cpu/common_64.c
+++ b/arch/x86/kernel/cpu/common_64.c
@@ -608,6 +608,8 @@ void __cpuinit cpu_init(void)
608 barrier(); 608 barrier();
609 609
610 check_efer(); 610 check_efer();
611 if (cpu != 0 && x2apic)
612 enable_x2apic();
611 613
612 /* 614 /*
613 * set up and load the per-CPU TSS 615 * set up and load the per-CPU TSS
diff --git a/arch/x86/kernel/cpu/feature_names.c b/arch/x86/kernel/cpu/feature_names.c
index e43ad4ad4cba..0bf4d37a0483 100644
--- a/arch/x86/kernel/cpu/feature_names.c
+++ b/arch/x86/kernel/cpu/feature_names.c
@@ -45,7 +45,7 @@ const char * const x86_cap_flags[NCAPINTS*32] = {
45 /* Intel-defined (#2) */ 45 /* Intel-defined (#2) */
46 "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est", 46 "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est",
47 "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL, 47 "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL,
48 NULL, NULL, "dca", "sse4_1", "sse4_2", NULL, NULL, "popcnt", 48 NULL, NULL, "dca", "sse4_1", "sse4_2", "x2apic", NULL, "popcnt",
49 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 49 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
50 50
51 /* VIA/Cyrix/Centaur-defined */ 51 /* VIA/Cyrix/Centaur-defined */
diff --git a/arch/x86/kernel/genapic_64.c b/arch/x86/kernel/genapic_64.c
index 1fa8be5bd217..3940d8161f8b 100644
--- a/arch/x86/kernel/genapic_64.c
+++ b/arch/x86/kernel/genapic_64.c
@@ -16,6 +16,7 @@
16#include <linux/ctype.h> 16#include <linux/ctype.h>
17#include <linux/init.h> 17#include <linux/init.h>
18#include <linux/hardirq.h> 18#include <linux/hardirq.h>
19#include <linux/dmar.h>
19 20
20#include <asm/smp.h> 21#include <asm/smp.h>
21#include <asm/ipi.h> 22#include <asm/ipi.h>
@@ -29,6 +30,15 @@ DEFINE_PER_CPU(int, x2apic_extra_bits);
29 30
30struct genapic __read_mostly *genapic = &apic_flat; 31struct genapic __read_mostly *genapic = &apic_flat;
31 32
33static int x2apic_phys = 0;
34
35static int set_x2apic_phys_mode(char *arg)
36{
37 x2apic_phys = 1;
38 return 0;
39}
40early_param("x2apic_phys", set_x2apic_phys_mode);
41
32static enum uv_system_type uv_system_type; 42static enum uv_system_type uv_system_type;
33 43
34/* 44/*
@@ -38,7 +48,12 @@ void __init setup_apic_routing(void)
38{ 48{
39 if (uv_system_type == UV_NON_UNIQUE_APIC) 49 if (uv_system_type == UV_NON_UNIQUE_APIC)
40 genapic = &apic_x2apic_uv_x; 50 genapic = &apic_x2apic_uv_x;
41 else 51 else if (cpu_has_x2apic && intr_remapping_enabled) {
52 if (x2apic_phys)
53 genapic = &apic_x2apic_phys;
54 else
55 genapic = &apic_x2apic_cluster;
56 } else
42#ifdef CONFIG_ACPI 57#ifdef CONFIG_ACPI
43 /* 58 /*
44 * Quirk: some x86_64 machines can only use physical APIC mode 59 * Quirk: some x86_64 machines can only use physical APIC mode
@@ -61,7 +76,7 @@ void __init setup_apic_routing(void)
61 76
62/* Same for both flat and physical. */ 77/* Same for both flat and physical. */
63 78
64void send_IPI_self(int vector) 79void apic_send_IPI_self(int vector)
65{ 80{
66 __send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL); 81 __send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
67} 82}
@@ -79,17 +94,6 @@ int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
79 return 0; 94 return 0;
80} 95}
81 96
82unsigned int read_apic_id(void)
83{
84 unsigned int id;
85
86 WARN_ON(preemptible() && num_online_cpus() > 1);
87 id = apic_read(APIC_ID);
88 if (uv_system_type >= UV_X2APIC)
89 id |= __get_cpu_var(x2apic_extra_bits);
90 return id;
91}
92
93enum uv_system_type get_uv_system_type(void) 97enum uv_system_type get_uv_system_type(void)
94{ 98{
95 return uv_system_type; 99 return uv_system_type;
diff --git a/arch/x86/kernel/genapic_flat_64.c b/arch/x86/kernel/genapic_flat_64.c
index 1a9c68845ee8..2c973cbf054f 100644
--- a/arch/x86/kernel/genapic_flat_64.c
+++ b/arch/x86/kernel/genapic_flat_64.c
@@ -15,9 +15,11 @@
15#include <linux/kernel.h> 15#include <linux/kernel.h>
16#include <linux/ctype.h> 16#include <linux/ctype.h>
17#include <linux/init.h> 17#include <linux/init.h>
18#include <linux/hardirq.h>
18#include <asm/smp.h> 19#include <asm/smp.h>
19#include <asm/ipi.h> 20#include <asm/ipi.h>
20#include <asm/genapic.h> 21#include <asm/genapic.h>
22#include <mach_apicdef.h>
21 23
22static cpumask_t flat_target_cpus(void) 24static cpumask_t flat_target_cpus(void)
23{ 25{
@@ -95,9 +97,33 @@ static void flat_send_IPI_all(int vector)
95 __send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL); 97 __send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
96} 98}
97 99
100static unsigned int get_apic_id(unsigned long x)
101{
102 unsigned int id;
103
104 id = (((x)>>24) & 0xFFu);
105 return id;
106}
107
108static unsigned long set_apic_id(unsigned int id)
109{
110 unsigned long x;
111
112 x = ((id & 0xFFu)<<24);
113 return x;
114}
115
116static unsigned int read_xapic_id(void)
117{
118 unsigned int id;
119
120 id = get_apic_id(apic_read(APIC_ID));
121 return id;
122}
123
98static int flat_apic_id_registered(void) 124static int flat_apic_id_registered(void)
99{ 125{
100 return physid_isset(GET_APIC_ID(read_apic_id()), phys_cpu_present_map); 126 return physid_isset(read_xapic_id(), phys_cpu_present_map);
101} 127}
102 128
103static unsigned int flat_cpu_mask_to_apicid(cpumask_t cpumask) 129static unsigned int flat_cpu_mask_to_apicid(cpumask_t cpumask)
@@ -121,8 +147,12 @@ struct genapic apic_flat = {
121 .send_IPI_all = flat_send_IPI_all, 147 .send_IPI_all = flat_send_IPI_all,
122 .send_IPI_allbutself = flat_send_IPI_allbutself, 148 .send_IPI_allbutself = flat_send_IPI_allbutself,
123 .send_IPI_mask = flat_send_IPI_mask, 149 .send_IPI_mask = flat_send_IPI_mask,
150 .send_IPI_self = apic_send_IPI_self,
124 .cpu_mask_to_apicid = flat_cpu_mask_to_apicid, 151 .cpu_mask_to_apicid = flat_cpu_mask_to_apicid,
125 .phys_pkg_id = phys_pkg_id, 152 .phys_pkg_id = phys_pkg_id,
153 .get_apic_id = get_apic_id,
154 .set_apic_id = set_apic_id,
155 .apic_id_mask = (0xFFu<<24),
126}; 156};
127 157
128/* 158/*
@@ -185,6 +215,10 @@ struct genapic apic_physflat = {
185 .send_IPI_all = physflat_send_IPI_all, 215 .send_IPI_all = physflat_send_IPI_all,
186 .send_IPI_allbutself = physflat_send_IPI_allbutself, 216 .send_IPI_allbutself = physflat_send_IPI_allbutself,
187 .send_IPI_mask = physflat_send_IPI_mask, 217 .send_IPI_mask = physflat_send_IPI_mask,
218 .send_IPI_self = apic_send_IPI_self,
188 .cpu_mask_to_apicid = physflat_cpu_mask_to_apicid, 219 .cpu_mask_to_apicid = physflat_cpu_mask_to_apicid,
189 .phys_pkg_id = phys_pkg_id, 220 .phys_pkg_id = phys_pkg_id,
221 .get_apic_id = get_apic_id,
222 .set_apic_id = set_apic_id,
223 .apic_id_mask = (0xFFu<<24),
190}; 224};
diff --git a/arch/x86/kernel/genx2apic_cluster.c b/arch/x86/kernel/genx2apic_cluster.c
new file mode 100644
index 000000000000..40bc0140d89f
--- /dev/null
+++ b/arch/x86/kernel/genx2apic_cluster.c
@@ -0,0 +1,153 @@
1#include <linux/threads.h>
2#include <linux/cpumask.h>
3#include <linux/string.h>
4#include <linux/kernel.h>
5#include <linux/ctype.h>
6#include <linux/init.h>
7#include <asm/smp.h>
8#include <asm/ipi.h>
9#include <asm/genapic.h>
10
11DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid);
12
13/* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */
14
15static cpumask_t x2apic_target_cpus(void)
16{
17 return cpumask_of_cpu(0);
18}
19
20/*
21 * for now each logical cpu is in its own vector allocation domain.
22 */
23static cpumask_t x2apic_vector_allocation_domain(int cpu)
24{
25 cpumask_t domain = CPU_MASK_NONE;
26 cpu_set(cpu, domain);
27 return domain;
28}
29
30static void __x2apic_send_IPI_dest(unsigned int apicid, int vector,
31 unsigned int dest)
32{
33 unsigned long cfg;
34
35 cfg = __prepare_ICR(0, vector, dest);
36
37 /*
38 * send the IPI.
39 */
40 x2apic_icr_write(cfg, apicid);
41}
42
43/*
44 * for now, we send the IPI's one by one in the cpumask.
45 * TBD: Based on the cpu mask, we can send the IPI's to the cluster group
46 * at once. We have 16 cpu's in a cluster. This will minimize IPI register
47 * writes.
48 */
49static void x2apic_send_IPI_mask(cpumask_t mask, int vector)
50{
51 unsigned long flags;
52 unsigned long query_cpu;
53
54 local_irq_save(flags);
55 for_each_cpu_mask(query_cpu, mask) {
56 __x2apic_send_IPI_dest(per_cpu(x86_cpu_to_logical_apicid, query_cpu),
57 vector, APIC_DEST_LOGICAL);
58 }
59 local_irq_restore(flags);
60}
61
62static void x2apic_send_IPI_allbutself(int vector)
63{
64 cpumask_t mask = cpu_online_map;
65
66 cpu_clear(smp_processor_id(), mask);
67
68 if (!cpus_empty(mask))
69 x2apic_send_IPI_mask(mask, vector);
70}
71
72static void x2apic_send_IPI_all(int vector)
73{
74 x2apic_send_IPI_mask(cpu_online_map, vector);
75}
76
77static int x2apic_apic_id_registered(void)
78{
79 return 1;
80}
81
82static unsigned int x2apic_cpu_mask_to_apicid(cpumask_t cpumask)
83{
84 int cpu;
85
86 /*
87 * We're using fixed IRQ delivery, can only return one phys APIC ID.
88 * May as well be the first.
89 */
90 cpu = first_cpu(cpumask);
91 if ((unsigned)cpu < NR_CPUS)
92 return per_cpu(x86_cpu_to_logical_apicid, cpu);
93 else
94 return BAD_APICID;
95}
96
97static unsigned int get_apic_id(unsigned long x)
98{
99 unsigned int id;
100
101 id = x;
102 return id;
103}
104
105static unsigned long set_apic_id(unsigned int id)
106{
107 unsigned long x;
108
109 x = id;
110 return x;
111}
112
113static unsigned int x2apic_read_id(void)
114{
115 return apic_read(APIC_ID);
116}
117
118static unsigned int phys_pkg_id(int index_msb)
119{
120 return x2apic_read_id() >> index_msb;
121}
122
123static void x2apic_send_IPI_self(int vector)
124{
125 apic_write(APIC_SELF_IPI, vector);
126}
127
128static void init_x2apic_ldr(void)
129{
130 int cpu = smp_processor_id();
131
132 per_cpu(x86_cpu_to_logical_apicid, cpu) = apic_read(APIC_LDR);
133 return;
134}
135
136struct genapic apic_x2apic_cluster = {
137 .name = "cluster x2apic",
138 .int_delivery_mode = dest_LowestPrio,
139 .int_dest_mode = (APIC_DEST_LOGICAL != 0),
140 .target_cpus = x2apic_target_cpus,
141 .vector_allocation_domain = x2apic_vector_allocation_domain,
142 .apic_id_registered = x2apic_apic_id_registered,
143 .init_apic_ldr = init_x2apic_ldr,
144 .send_IPI_all = x2apic_send_IPI_all,
145 .send_IPI_allbutself = x2apic_send_IPI_allbutself,
146 .send_IPI_mask = x2apic_send_IPI_mask,
147 .send_IPI_self = x2apic_send_IPI_self,
148 .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid,
149 .phys_pkg_id = phys_pkg_id,
150 .get_apic_id = get_apic_id,
151 .set_apic_id = set_apic_id,
152 .apic_id_mask = (0xFFFFFFFFu),
153};
diff --git a/arch/x86/kernel/genx2apic_phys.c b/arch/x86/kernel/genx2apic_phys.c
new file mode 100644
index 000000000000..2f3c6ca19de9
--- /dev/null
+++ b/arch/x86/kernel/genx2apic_phys.c
@@ -0,0 +1,140 @@
1#include <linux/threads.h>
2#include <linux/cpumask.h>
3#include <linux/string.h>
4#include <linux/kernel.h>
5#include <linux/ctype.h>
6#include <linux/init.h>
7#include <asm/smp.h>
8#include <asm/ipi.h>
9#include <asm/genapic.h>
10
11
12/* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */
13
14static cpumask_t x2apic_target_cpus(void)
15{
16 return cpumask_of_cpu(0);
17}
18
19static cpumask_t x2apic_vector_allocation_domain(int cpu)
20{
21 cpumask_t domain = CPU_MASK_NONE;
22 cpu_set(cpu, domain);
23 return domain;
24}
25
26static void __x2apic_send_IPI_dest(unsigned int apicid, int vector,
27 unsigned int dest)
28{
29 unsigned long cfg;
30
31 cfg = __prepare_ICR(0, vector, dest);
32
33 /*
34 * send the IPI.
35 */
36 x2apic_icr_write(cfg, apicid);
37}
38
39static void x2apic_send_IPI_mask(cpumask_t mask, int vector)
40{
41 unsigned long flags;
42 unsigned long query_cpu;
43
44 local_irq_save(flags);
45 for_each_cpu_mask(query_cpu, mask) {
46 __x2apic_send_IPI_dest(per_cpu(x86_cpu_to_apicid, query_cpu),
47 vector, APIC_DEST_PHYSICAL);
48 }
49 local_irq_restore(flags);
50}
51
52static void x2apic_send_IPI_allbutself(int vector)
53{
54 cpumask_t mask = cpu_online_map;
55
56 cpu_clear(smp_processor_id(), mask);
57
58 if (!cpus_empty(mask))
59 x2apic_send_IPI_mask(mask, vector);
60}
61
62static void x2apic_send_IPI_all(int vector)
63{
64 x2apic_send_IPI_mask(cpu_online_map, vector);
65}
66
67static int x2apic_apic_id_registered(void)
68{
69 return 1;
70}
71
72static unsigned int x2apic_cpu_mask_to_apicid(cpumask_t cpumask)
73{
74 int cpu;
75
76 /*
77 * We're using fixed IRQ delivery, can only return one phys APIC ID.
78 * May as well be the first.
79 */
80 cpu = first_cpu(cpumask);
81 if ((unsigned)cpu < NR_CPUS)
82 return per_cpu(x86_cpu_to_apicid, cpu);
83 else
84 return BAD_APICID;
85}
86
87static unsigned int get_apic_id(unsigned long x)
88{
89 unsigned int id;
90
91 id = x;
92 return id;
93}
94
95static unsigned long set_apic_id(unsigned int id)
96{
97 unsigned long x;
98
99 x = id;
100 return x;
101}
102
103static unsigned int x2apic_read_id(void)
104{
105 return apic_read(APIC_ID);
106}
107
108static unsigned int phys_pkg_id(int index_msb)
109{
110 return x2apic_read_id() >> index_msb;
111}
112
113void x2apic_send_IPI_self(int vector)
114{
115 apic_write(APIC_SELF_IPI, vector);
116}
117
118void init_x2apic_ldr(void)
119{
120 return;
121}
122
123struct genapic apic_x2apic_phys = {
124 .name = "physical x2apic",
125 .int_delivery_mode = dest_Fixed,
126 .int_dest_mode = (APIC_DEST_PHYSICAL != 0),
127 .target_cpus = x2apic_target_cpus,
128 .vector_allocation_domain = x2apic_vector_allocation_domain,
129 .apic_id_registered = x2apic_apic_id_registered,
130 .init_apic_ldr = init_x2apic_ldr,
131 .send_IPI_all = x2apic_send_IPI_all,
132 .send_IPI_allbutself = x2apic_send_IPI_allbutself,
133 .send_IPI_mask = x2apic_send_IPI_mask,
134 .send_IPI_self = x2apic_send_IPI_self,
135 .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid,
136 .phys_pkg_id = phys_pkg_id,
137 .get_apic_id = get_apic_id,
138 .set_apic_id = set_apic_id,
139 .apic_id_mask = (0xFFFFFFFFu),
140};
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c
index 711f11c30b06..3ca29cd8c23c 100644
--- a/arch/x86/kernel/genx2apic_uv_x.c
+++ b/arch/x86/kernel/genx2apic_uv_x.c
@@ -18,6 +18,7 @@
18#include <linux/sched.h> 18#include <linux/sched.h>
19#include <linux/bootmem.h> 19#include <linux/bootmem.h>
20#include <linux/module.h> 20#include <linux/module.h>
21#include <linux/hardirq.h>
21#include <asm/smp.h> 22#include <asm/smp.h>
22#include <asm/ipi.h> 23#include <asm/ipi.h>
23#include <asm/genapic.h> 24#include <asm/genapic.h>
@@ -119,6 +120,10 @@ static int uv_apic_id_registered(void)
119 return 1; 120 return 1;
120} 121}
121 122
123static void uv_init_apic_ldr(void)
124{
125}
126
122static unsigned int uv_cpu_mask_to_apicid(cpumask_t cpumask) 127static unsigned int uv_cpu_mask_to_apicid(cpumask_t cpumask)
123{ 128{
124 int cpu; 129 int cpu;
@@ -134,9 +139,34 @@ static unsigned int uv_cpu_mask_to_apicid(cpumask_t cpumask)
134 return BAD_APICID; 139 return BAD_APICID;
135} 140}
136 141
142static unsigned int get_apic_id(unsigned long x)
143{
144 unsigned int id;
145
146 WARN_ON(preemptible() && num_online_cpus() > 1);
147 id = x | __get_cpu_var(x2apic_extra_bits);
148
149 return id;
150}
151
152static long set_apic_id(unsigned int id)
153{
154 unsigned long x;
155
156 /* maskout x2apic_extra_bits ? */
157 x = id;
158 return x;
159}
160
161static unsigned int uv_read_apic_id(void)
162{
163
164 return get_apic_id(apic_read(APIC_ID));
165}
166
137static unsigned int phys_pkg_id(int index_msb) 167static unsigned int phys_pkg_id(int index_msb)
138{ 168{
139 return GET_APIC_ID(read_apic_id()) >> index_msb; 169 return uv_read_apic_id() >> index_msb;
140} 170}
141 171
142#ifdef ZZZ /* Needs x2apic patch */ 172#ifdef ZZZ /* Needs x2apic patch */
@@ -153,12 +183,16 @@ struct genapic apic_x2apic_uv_x = {
153 .target_cpus = uv_target_cpus, 183 .target_cpus = uv_target_cpus,
154 .vector_allocation_domain = uv_vector_allocation_domain,/* Fixme ZZZ */ 184 .vector_allocation_domain = uv_vector_allocation_domain,/* Fixme ZZZ */
155 .apic_id_registered = uv_apic_id_registered, 185 .apic_id_registered = uv_apic_id_registered,
186 .init_apic_ldr = uv_init_apic_ldr,
156 .send_IPI_all = uv_send_IPI_all, 187 .send_IPI_all = uv_send_IPI_all,
157 .send_IPI_allbutself = uv_send_IPI_allbutself, 188 .send_IPI_allbutself = uv_send_IPI_allbutself,
158 .send_IPI_mask = uv_send_IPI_mask, 189 .send_IPI_mask = uv_send_IPI_mask,
159 /* ZZZ.send_IPI_self = uv_send_IPI_self, */ 190 /* ZZZ.send_IPI_self = uv_send_IPI_self, */
160 .cpu_mask_to_apicid = uv_cpu_mask_to_apicid, 191 .cpu_mask_to_apicid = uv_cpu_mask_to_apicid,
161 .phys_pkg_id = phys_pkg_id, /* Fixme ZZZ */ 192 .phys_pkg_id = phys_pkg_id, /* Fixme ZZZ */
193 .get_apic_id = get_apic_id,
194 .set_apic_id = set_apic_id,
195 .apic_id_mask = (0xFFFFFFFFu),
162}; 196};
163 197
164static __cpuinit void set_x2apic_extra_bits(int pnode) 198static __cpuinit void set_x2apic_extra_bits(int pnode)
diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c
index dc92b49d9204..4b8a53d841f7 100644
--- a/arch/x86/kernel/i8259.c
+++ b/arch/x86/kernel/i8259.c
@@ -282,6 +282,30 @@ static int __init i8259A_init_sysfs(void)
282 282
283device_initcall(i8259A_init_sysfs); 283device_initcall(i8259A_init_sysfs);
284 284
285void mask_8259A(void)
286{
287 unsigned long flags;
288
289 spin_lock_irqsave(&i8259A_lock, flags);
290
291 outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */
292 outb(0xff, PIC_SLAVE_IMR); /* mask all of 8259A-2 */
293
294 spin_unlock_irqrestore(&i8259A_lock, flags);
295}
296
297void unmask_8259A(void)
298{
299 unsigned long flags;
300
301 spin_lock_irqsave(&i8259A_lock, flags);
302
303 outb(cached_master_mask, PIC_MASTER_IMR); /* restore master IRQ mask */
304 outb(cached_slave_mask, PIC_SLAVE_IMR); /* restore slave IRQ mask */
305
306 spin_unlock_irqrestore(&i8259A_lock, flags);
307}
308
285void init_8259A(int auto_eoi) 309void init_8259A(int auto_eoi)
286{ 310{
287 unsigned long flags; 311 unsigned long flags;
diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c
index 558abf4c796a..a82065b0699e 100644
--- a/arch/x86/kernel/io_apic_32.c
+++ b/arch/x86/kernel/io_apic_32.c
@@ -1494,7 +1494,7 @@ void /*__init*/ print_local_APIC(void *dummy)
1494 smp_processor_id(), hard_smp_processor_id()); 1494 smp_processor_id(), hard_smp_processor_id());
1495 v = apic_read(APIC_ID); 1495 v = apic_read(APIC_ID);
1496 printk(KERN_INFO "... APIC ID: %08x (%01x)\n", v, 1496 printk(KERN_INFO "... APIC ID: %08x (%01x)\n", v,
1497 GET_APIC_ID(read_apic_id())); 1497 GET_APIC_ID(v));
1498 v = apic_read(APIC_LVR); 1498 v = apic_read(APIC_LVR);
1499 printk(KERN_INFO "... APIC VERSION: %08x\n", v); 1499 printk(KERN_INFO "... APIC VERSION: %08x\n", v);
1500 ver = GET_APIC_VERSION(v); 1500 ver = GET_APIC_VERSION(v);
@@ -1702,8 +1702,7 @@ void disable_IO_APIC(void)
1702 entry.dest_mode = 0; /* Physical */ 1702 entry.dest_mode = 0; /* Physical */
1703 entry.delivery_mode = dest_ExtINT; /* ExtInt */ 1703 entry.delivery_mode = dest_ExtINT; /* ExtInt */
1704 entry.vector = 0; 1704 entry.vector = 0;
1705 entry.dest.physical.physical_dest = 1705 entry.dest.physical.physical_dest = read_apic_id();
1706 GET_APIC_ID(read_apic_id());
1707 1706
1708 /* 1707 /*
1709 * Add it to the IO-APIC irq-routing table: 1708 * Add it to the IO-APIC irq-routing table:
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c
index 6510cde36b35..39f0be37e9a1 100644
--- a/arch/x86/kernel/io_apic_64.c
+++ b/arch/x86/kernel/io_apic_64.c
@@ -37,6 +37,7 @@
37#include <acpi/acpi_bus.h> 37#include <acpi/acpi_bus.h>
38#endif 38#endif
39#include <linux/bootmem.h> 39#include <linux/bootmem.h>
40#include <linux/dmar.h>
40 41
41#include <asm/idle.h> 42#include <asm/idle.h>
42#include <asm/io.h> 43#include <asm/io.h>
@@ -48,6 +49,7 @@
48#include <asm/nmi.h> 49#include <asm/nmi.h>
49#include <asm/msidef.h> 50#include <asm/msidef.h>
50#include <asm/hypertransport.h> 51#include <asm/hypertransport.h>
52#include <asm/irq_remapping.h>
51 53
52#include <mach_ipi.h> 54#include <mach_ipi.h>
53#include <mach_apic.h> 55#include <mach_apic.h>
@@ -107,6 +109,9 @@ DEFINE_SPINLOCK(vector_lock);
107 */ 109 */
108int nr_ioapic_registers[MAX_IO_APICS]; 110int nr_ioapic_registers[MAX_IO_APICS];
109 111
112/* I/O APIC RTE contents at the OS boot up */
113struct IO_APIC_route_entry *early_ioapic_entries[MAX_IO_APICS];
114
110/* I/O APIC entries */ 115/* I/O APIC entries */
111struct mp_config_ioapic mp_ioapics[MAX_IO_APICS]; 116struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];
112int nr_ioapics; 117int nr_ioapics;
@@ -302,7 +307,12 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, u8 vector)
302 pin = entry->pin; 307 pin = entry->pin;
303 if (pin == -1) 308 if (pin == -1)
304 break; 309 break;
305 io_apic_write(apic, 0x11 + pin*2, dest); 310 /*
311 * With interrupt-remapping, destination information comes
312 * from interrupt-remapping table entry.
313 */
314 if (!irq_remapped(irq))
315 io_apic_write(apic, 0x11 + pin*2, dest);
306 reg = io_apic_read(apic, 0x10 + pin*2); 316 reg = io_apic_read(apic, 0x10 + pin*2);
307 reg &= ~IO_APIC_REDIR_VECTOR_MASK; 317 reg &= ~IO_APIC_REDIR_VECTOR_MASK;
308 reg |= vector; 318 reg |= vector;
@@ -439,6 +449,69 @@ static void clear_IO_APIC (void)
439 clear_IO_APIC_pin(apic, pin); 449 clear_IO_APIC_pin(apic, pin);
440} 450}
441 451
452/*
453 * Saves and masks all the unmasked IO-APIC RTE's
454 */
455int save_mask_IO_APIC_setup(void)
456{
457 union IO_APIC_reg_01 reg_01;
458 unsigned long flags;
459 int apic, pin;
460
461 /*
462 * The number of IO-APIC IRQ registers (== #pins):
463 */
464 for (apic = 0; apic < nr_ioapics; apic++) {
465 spin_lock_irqsave(&ioapic_lock, flags);
466 reg_01.raw = io_apic_read(apic, 1);
467 spin_unlock_irqrestore(&ioapic_lock, flags);
468 nr_ioapic_registers[apic] = reg_01.bits.entries+1;
469 }
470
471 for (apic = 0; apic < nr_ioapics; apic++) {
472 early_ioapic_entries[apic] =
473 kzalloc(sizeof(struct IO_APIC_route_entry) *
474 nr_ioapic_registers[apic], GFP_KERNEL);
475 if (!early_ioapic_entries[apic])
476 return -ENOMEM;
477 }
478
479 for (apic = 0; apic < nr_ioapics; apic++)
480 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
481 struct IO_APIC_route_entry entry;
482
483 entry = early_ioapic_entries[apic][pin] =
484 ioapic_read_entry(apic, pin);
485 if (!entry.mask) {
486 entry.mask = 1;
487 ioapic_write_entry(apic, pin, entry);
488 }
489 }
490 return 0;
491}
492
493void restore_IO_APIC_setup(void)
494{
495 int apic, pin;
496
497 for (apic = 0; apic < nr_ioapics; apic++)
498 for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
499 ioapic_write_entry(apic, pin,
500 early_ioapic_entries[apic][pin]);
501}
502
503void reinit_intr_remapped_IO_APIC(int intr_remapping)
504{
505 /*
506 * for now plain restore of previous settings.
507 * TBD: In the case of OS enabling interrupt-remapping,
508 * IO-APIC RTE's need to be setup to point to interrupt-remapping
509 * table entries. for now, do a plain restore, and wait for
510 * the setup_IO_APIC_irqs() to do proper initialization.
511 */
512 restore_IO_APIC_setup();
513}
514
442int skip_ioapic_setup; 515int skip_ioapic_setup;
443int ioapic_force; 516int ioapic_force;
444 517
@@ -833,18 +906,98 @@ void setup_vector_irq(int cpu)
833 906
834 907
835static struct irq_chip ioapic_chip; 908static struct irq_chip ioapic_chip;
909#ifdef CONFIG_INTR_REMAP
910static struct irq_chip ir_ioapic_chip;
911#endif
836 912
837static void ioapic_register_intr(int irq, unsigned long trigger) 913static void ioapic_register_intr(int irq, unsigned long trigger)
838{ 914{
839 if (trigger) { 915 if (trigger)
840 irq_desc[irq].status |= IRQ_LEVEL; 916 irq_desc[irq].status |= IRQ_LEVEL;
841 set_irq_chip_and_handler_name(irq, &ioapic_chip, 917 else
842 handle_fasteoi_irq, "fasteoi");
843 } else {
844 irq_desc[irq].status &= ~IRQ_LEVEL; 918 irq_desc[irq].status &= ~IRQ_LEVEL;
919
920#ifdef CONFIG_INTR_REMAP
921 if (irq_remapped(irq)) {
922 irq_desc[irq].status |= IRQ_MOVE_PCNTXT;
923 if (trigger)
924 set_irq_chip_and_handler_name(irq, &ir_ioapic_chip,
925 handle_fasteoi_irq,
926 "fasteoi");
927 else
928 set_irq_chip_and_handler_name(irq, &ir_ioapic_chip,
929 handle_edge_irq, "edge");
930 return;
931 }
932#endif
933 if (trigger)
934 set_irq_chip_and_handler_name(irq, &ioapic_chip,
935 handle_fasteoi_irq,
936 "fasteoi");
937 else
845 set_irq_chip_and_handler_name(irq, &ioapic_chip, 938 set_irq_chip_and_handler_name(irq, &ioapic_chip,
846 handle_edge_irq, "edge"); 939 handle_edge_irq, "edge");
940}
941
942static int setup_ioapic_entry(int apic, int irq,
943 struct IO_APIC_route_entry *entry,
944 unsigned int destination, int trigger,
945 int polarity, int vector)
946{
947 /*
948 * add it to the IO-APIC irq-routing table:
949 */
950 memset(entry,0,sizeof(*entry));
951
952#ifdef CONFIG_INTR_REMAP
953 if (intr_remapping_enabled) {
954 struct intel_iommu *iommu = map_ioapic_to_ir(apic);
955 struct irte irte;
956 struct IR_IO_APIC_route_entry *ir_entry =
957 (struct IR_IO_APIC_route_entry *) entry;
958 int index;
959
960 if (!iommu)
961 panic("No mapping iommu for ioapic %d\n", apic);
962
963 index = alloc_irte(iommu, irq, 1);
964 if (index < 0)
965 panic("Failed to allocate IRTE for ioapic %d\n", apic);
966
967 memset(&irte, 0, sizeof(irte));
968
969 irte.present = 1;
970 irte.dst_mode = INT_DEST_MODE;
971 irte.trigger_mode = trigger;
972 irte.dlvry_mode = INT_DELIVERY_MODE;
973 irte.vector = vector;
974 irte.dest_id = IRTE_DEST(destination);
975
976 modify_irte(irq, &irte);
977
978 ir_entry->index2 = (index >> 15) & 0x1;
979 ir_entry->zero = 0;
980 ir_entry->format = 1;
981 ir_entry->index = (index & 0x7fff);
982 } else
983#endif
984 {
985 entry->delivery_mode = INT_DELIVERY_MODE;
986 entry->dest_mode = INT_DEST_MODE;
987 entry->dest = destination;
847 } 988 }
989
990 entry->mask = 0; /* enable IRQ */
991 entry->trigger = trigger;
992 entry->polarity = polarity;
993 entry->vector = vector;
994
995 /* Mask level triggered irqs.
996 * Use IRQ_DELAYED_DISABLE for edge triggered irqs.
997 */
998 if (trigger)
999 entry->mask = 1;
1000 return 0;
848} 1001}
849 1002
850static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, 1003static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
@@ -869,24 +1022,15 @@ static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
869 apic, mp_ioapics[apic].mp_apicid, pin, cfg->vector, 1022 apic, mp_ioapics[apic].mp_apicid, pin, cfg->vector,
870 irq, trigger, polarity); 1023 irq, trigger, polarity);
871 1024
872 /*
873 * add it to the IO-APIC irq-routing table:
874 */
875 memset(&entry,0,sizeof(entry));
876 1025
877 entry.delivery_mode = INT_DELIVERY_MODE; 1026 if (setup_ioapic_entry(mp_ioapics[apic].mp_apicid, irq, &entry,
878 entry.dest_mode = INT_DEST_MODE; 1027 cpu_mask_to_apicid(mask), trigger, polarity,
879 entry.dest = cpu_mask_to_apicid(mask); 1028 cfg->vector)) {
880 entry.mask = 0; /* enable IRQ */ 1029 printk("Failed to setup ioapic entry for ioapic %d, pin %d\n",
881 entry.trigger = trigger; 1030 mp_ioapics[apic].mp_apicid, pin);
882 entry.polarity = polarity; 1031 __clear_irq_vector(irq);
883 entry.vector = cfg->vector; 1032 return;
884 1033 }
885 /* Mask level triggered irqs.
886 * Use IRQ_DELAYED_DISABLE for edge triggered irqs.
887 */
888 if (trigger)
889 entry.mask = 1;
890 1034
891 ioapic_register_intr(irq, trigger); 1035 ioapic_register_intr(irq, trigger);
892 if (irq < 16) 1036 if (irq < 16)
@@ -938,6 +1082,9 @@ static void __init setup_timer_IRQ0_pin(unsigned int apic, unsigned int pin,
938{ 1082{
939 struct IO_APIC_route_entry entry; 1083 struct IO_APIC_route_entry entry;
940 1084
1085 if (intr_remapping_enabled)
1086 return;
1087
941 memset(&entry, 0, sizeof(entry)); 1088 memset(&entry, 0, sizeof(entry));
942 1089
943 /* 1090 /*
@@ -1084,6 +1231,7 @@ static __apicdebuginit void print_APIC_bitfield (int base)
1084void __apicdebuginit print_local_APIC(void * dummy) 1231void __apicdebuginit print_local_APIC(void * dummy)
1085{ 1232{
1086 unsigned int v, ver, maxlvt; 1233 unsigned int v, ver, maxlvt;
1234 unsigned long icr;
1087 1235
1088 if (apic_verbosity == APIC_QUIET) 1236 if (apic_verbosity == APIC_QUIET)
1089 return; 1237 return;
@@ -1091,7 +1239,7 @@ void __apicdebuginit print_local_APIC(void * dummy)
1091 printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n", 1239 printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
1092 smp_processor_id(), hard_smp_processor_id()); 1240 smp_processor_id(), hard_smp_processor_id());
1093 v = apic_read(APIC_ID); 1241 v = apic_read(APIC_ID);
1094 printk(KERN_INFO "... APIC ID: %08x (%01x)\n", v, GET_APIC_ID(read_apic_id())); 1242 printk(KERN_INFO "... APIC ID: %08x (%01x)\n", v, read_apic_id());
1095 v = apic_read(APIC_LVR); 1243 v = apic_read(APIC_LVR);
1096 printk(KERN_INFO "... APIC VERSION: %08x\n", v); 1244 printk(KERN_INFO "... APIC VERSION: %08x\n", v);
1097 ver = GET_APIC_VERSION(v); 1245 ver = GET_APIC_VERSION(v);
@@ -1127,10 +1275,9 @@ void __apicdebuginit print_local_APIC(void * dummy)
1127 v = apic_read(APIC_ESR); 1275 v = apic_read(APIC_ESR);
1128 printk(KERN_DEBUG "... APIC ESR: %08x\n", v); 1276 printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
1129 1277
1130 v = apic_read(APIC_ICR); 1278 icr = apic_icr_read();
1131 printk(KERN_DEBUG "... APIC ICR: %08x\n", v); 1279 printk(KERN_DEBUG "... APIC ICR: %08x\n", icr);
1132 v = apic_read(APIC_ICR2); 1280 printk(KERN_DEBUG "... APIC ICR2: %08x\n", icr >> 32);
1133 printk(KERN_DEBUG "... APIC ICR2: %08x\n", v);
1134 1281
1135 v = apic_read(APIC_LVTT); 1282 v = apic_read(APIC_LVTT);
1136 printk(KERN_DEBUG "... APIC LVTT: %08x\n", v); 1283 printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
@@ -1285,7 +1432,7 @@ void disable_IO_APIC(void)
1285 entry.dest_mode = 0; /* Physical */ 1432 entry.dest_mode = 0; /* Physical */
1286 entry.delivery_mode = dest_ExtINT; /* ExtInt */ 1433 entry.delivery_mode = dest_ExtINT; /* ExtInt */
1287 entry.vector = 0; 1434 entry.vector = 0;
1288 entry.dest = GET_APIC_ID(read_apic_id()); 1435 entry.dest = read_apic_id();
1289 1436
1290 /* 1437 /*
1291 * Add it to the IO-APIC irq-routing table: 1438 * Add it to the IO-APIC irq-routing table:
@@ -1393,6 +1540,147 @@ static int ioapic_retrigger_irq(unsigned int irq)
1393 */ 1540 */
1394 1541
1395#ifdef CONFIG_SMP 1542#ifdef CONFIG_SMP
1543
1544#ifdef CONFIG_INTR_REMAP
1545static void ir_irq_migration(struct work_struct *work);
1546
1547static DECLARE_DELAYED_WORK(ir_migration_work, ir_irq_migration);
1548
1549/*
1550 * Migrate the IO-APIC irq in the presence of intr-remapping.
1551 *
1552 * For edge triggered, irq migration is a simple atomic update(of vector
1553 * and cpu destination) of IRTE and flush the hardware cache.
1554 *
1555 * For level triggered, we need to modify the io-apic RTE aswell with the update
1556 * vector information, along with modifying IRTE with vector and destination.
1557 * So irq migration for level triggered is little bit more complex compared to
1558 * edge triggered migration. But the good news is, we use the same algorithm
1559 * for level triggered migration as we have today, only difference being,
1560 * we now initiate the irq migration from process context instead of the
1561 * interrupt context.
1562 *
1563 * In future, when we do a directed EOI (combined with cpu EOI broadcast
1564 * suppression) to the IO-APIC, level triggered irq migration will also be
1565 * as simple as edge triggered migration and we can do the irq migration
1566 * with a simple atomic update to IO-APIC RTE.
1567 */
1568static void migrate_ioapic_irq(int irq, cpumask_t mask)
1569{
1570 struct irq_cfg *cfg = irq_cfg + irq;
1571 struct irq_desc *desc = irq_desc + irq;
1572 cpumask_t tmp, cleanup_mask;
1573 struct irte irte;
1574 int modify_ioapic_rte = desc->status & IRQ_LEVEL;
1575 unsigned int dest;
1576 unsigned long flags;
1577
1578 cpus_and(tmp, mask, cpu_online_map);
1579 if (cpus_empty(tmp))
1580 return;
1581
1582 if (get_irte(irq, &irte))
1583 return;
1584
1585 if (assign_irq_vector(irq, mask))
1586 return;
1587
1588 cpus_and(tmp, cfg->domain, mask);
1589 dest = cpu_mask_to_apicid(tmp);
1590
1591 if (modify_ioapic_rte) {
1592 spin_lock_irqsave(&ioapic_lock, flags);
1593 __target_IO_APIC_irq(irq, dest, cfg->vector);
1594 spin_unlock_irqrestore(&ioapic_lock, flags);
1595 }
1596
1597 irte.vector = cfg->vector;
1598 irte.dest_id = IRTE_DEST(dest);
1599
1600 /*
1601 * Modified the IRTE and flushes the Interrupt entry cache.
1602 */
1603 modify_irte(irq, &irte);
1604
1605 if (cfg->move_in_progress) {
1606 cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map);
1607 cfg->move_cleanup_count = cpus_weight(cleanup_mask);
1608 send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
1609 cfg->move_in_progress = 0;
1610 }
1611
1612 irq_desc[irq].affinity = mask;
1613}
1614
1615static int migrate_irq_remapped_level(int irq)
1616{
1617 int ret = -1;
1618
1619 mask_IO_APIC_irq(irq);
1620
1621 if (io_apic_level_ack_pending(irq)) {
1622 /*
1623 * Interrupt in progress. Migrating irq now will change the
1624 * vector information in the IO-APIC RTE and that will confuse
1625 * the EOI broadcast performed by cpu.
1626 * So, delay the irq migration to the next instance.
1627 */
1628 schedule_delayed_work(&ir_migration_work, 1);
1629 goto unmask;
1630 }
1631
1632 /* everthing is clear. we have right of way */
1633 migrate_ioapic_irq(irq, irq_desc[irq].pending_mask);
1634
1635 ret = 0;
1636 irq_desc[irq].status &= ~IRQ_MOVE_PENDING;
1637 cpus_clear(irq_desc[irq].pending_mask);
1638
1639unmask:
1640 unmask_IO_APIC_irq(irq);
1641 return ret;
1642}
1643
1644static void ir_irq_migration(struct work_struct *work)
1645{
1646 int irq;
1647
1648 for (irq = 0; irq < NR_IRQS; irq++) {
1649 struct irq_desc *desc = irq_desc + irq;
1650 if (desc->status & IRQ_MOVE_PENDING) {
1651 unsigned long flags;
1652
1653 spin_lock_irqsave(&desc->lock, flags);
1654 if (!desc->chip->set_affinity ||
1655 !(desc->status & IRQ_MOVE_PENDING)) {
1656 desc->status &= ~IRQ_MOVE_PENDING;
1657 spin_unlock_irqrestore(&desc->lock, flags);
1658 continue;
1659 }
1660
1661 desc->chip->set_affinity(irq,
1662 irq_desc[irq].pending_mask);
1663 spin_unlock_irqrestore(&desc->lock, flags);
1664 }
1665 }
1666}
1667
1668/*
1669 * Migrates the IRQ destination in the process context.
1670 */
1671static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
1672{
1673 if (irq_desc[irq].status & IRQ_LEVEL) {
1674 irq_desc[irq].status |= IRQ_MOVE_PENDING;
1675 irq_desc[irq].pending_mask = mask;
1676 migrate_irq_remapped_level(irq);
1677 return;
1678 }
1679
1680 migrate_ioapic_irq(irq, mask);
1681}
1682#endif
1683
1396asmlinkage void smp_irq_move_cleanup_interrupt(void) 1684asmlinkage void smp_irq_move_cleanup_interrupt(void)
1397{ 1685{
1398 unsigned vector, me; 1686 unsigned vector, me;
@@ -1449,6 +1737,17 @@ static void irq_complete_move(unsigned int irq)
1449#else 1737#else
1450static inline void irq_complete_move(unsigned int irq) {} 1738static inline void irq_complete_move(unsigned int irq) {}
1451#endif 1739#endif
1740#ifdef CONFIG_INTR_REMAP
1741static void ack_x2apic_level(unsigned int irq)
1742{
1743 ack_x2APIC_irq();
1744}
1745
1746static void ack_x2apic_edge(unsigned int irq)
1747{
1748 ack_x2APIC_irq();
1749}
1750#endif
1452 1751
1453static void ack_apic_edge(unsigned int irq) 1752static void ack_apic_edge(unsigned int irq)
1454{ 1753{
@@ -1523,6 +1822,21 @@ static struct irq_chip ioapic_chip __read_mostly = {
1523 .retrigger = ioapic_retrigger_irq, 1822 .retrigger = ioapic_retrigger_irq,
1524}; 1823};
1525 1824
1825#ifdef CONFIG_INTR_REMAP
1826static struct irq_chip ir_ioapic_chip __read_mostly = {
1827 .name = "IR-IO-APIC",
1828 .startup = startup_ioapic_irq,
1829 .mask = mask_IO_APIC_irq,
1830 .unmask = unmask_IO_APIC_irq,
1831 .ack = ack_x2apic_edge,
1832 .eoi = ack_x2apic_level,
1833#ifdef CONFIG_SMP
1834 .set_affinity = set_ir_ioapic_affinity_irq,
1835#endif
1836 .retrigger = ioapic_retrigger_irq,
1837};
1838#endif
1839
1526static inline void init_IO_APIC_traps(void) 1840static inline void init_IO_APIC_traps(void)
1527{ 1841{
1528 int irq; 1842 int irq;
@@ -1707,6 +2021,8 @@ static inline void __init check_timer(void)
1707 * 8259A. 2021 * 8259A.
1708 */ 2022 */
1709 if (pin1 == -1) { 2023 if (pin1 == -1) {
2024 if (intr_remapping_enabled)
2025 panic("BIOS bug: timer not connected to IO-APIC");
1710 pin1 = pin2; 2026 pin1 = pin2;
1711 apic1 = apic2; 2027 apic1 = apic2;
1712 no_pin1 = 1; 2028 no_pin1 = 1;
@@ -1733,6 +2049,8 @@ static inline void __init check_timer(void)
1733 clear_IO_APIC_pin(0, pin1); 2049 clear_IO_APIC_pin(0, pin1);
1734 goto out; 2050 goto out;
1735 } 2051 }
2052 if (intr_remapping_enabled)
2053 panic("timer doesn't work through Interrupt-remapped IO-APIC");
1736 clear_IO_APIC_pin(apic1, pin1); 2054 clear_IO_APIC_pin(apic1, pin1);
1737 if (!no_pin1) 2055 if (!no_pin1)
1738 apic_printk(APIC_QUIET,KERN_ERR "..MP-BIOS bug: " 2056 apic_printk(APIC_QUIET,KERN_ERR "..MP-BIOS bug: "
@@ -1969,6 +2287,9 @@ void destroy_irq(unsigned int irq)
1969 2287
1970 dynamic_irq_cleanup(irq); 2288 dynamic_irq_cleanup(irq);
1971 2289
2290#ifdef CONFIG_INTR_REMAP
2291 free_irte(irq);
2292#endif
1972 spin_lock_irqsave(&vector_lock, flags); 2293 spin_lock_irqsave(&vector_lock, flags);
1973 __clear_irq_vector(irq); 2294 __clear_irq_vector(irq);
1974 spin_unlock_irqrestore(&vector_lock, flags); 2295 spin_unlock_irqrestore(&vector_lock, flags);
@@ -1987,11 +2308,42 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms
1987 2308
1988 tmp = TARGET_CPUS; 2309 tmp = TARGET_CPUS;
1989 err = assign_irq_vector(irq, tmp); 2310 err = assign_irq_vector(irq, tmp);
1990 if (!err) { 2311 if (err)
1991 cpus_and(tmp, cfg->domain, tmp); 2312 return err;
1992 dest = cpu_mask_to_apicid(tmp); 2313
2314 cpus_and(tmp, cfg->domain, tmp);
2315 dest = cpu_mask_to_apicid(tmp);
2316
2317#ifdef CONFIG_INTR_REMAP
2318 if (irq_remapped(irq)) {
2319 struct irte irte;
2320 int ir_index;
2321 u16 sub_handle;
2322
2323 ir_index = map_irq_to_irte_handle(irq, &sub_handle);
2324 BUG_ON(ir_index == -1);
2325
2326 memset (&irte, 0, sizeof(irte));
2327
2328 irte.present = 1;
2329 irte.dst_mode = INT_DEST_MODE;
2330 irte.trigger_mode = 0; /* edge */
2331 irte.dlvry_mode = INT_DELIVERY_MODE;
2332 irte.vector = cfg->vector;
2333 irte.dest_id = IRTE_DEST(dest);
2334
2335 modify_irte(irq, &irte);
1993 2336
1994 msg->address_hi = MSI_ADDR_BASE_HI; 2337 msg->address_hi = MSI_ADDR_BASE_HI;
2338 msg->data = sub_handle;
2339 msg->address_lo = MSI_ADDR_BASE_LO | MSI_ADDR_IR_EXT_INT |
2340 MSI_ADDR_IR_SHV |
2341 MSI_ADDR_IR_INDEX1(ir_index) |
2342 MSI_ADDR_IR_INDEX2(ir_index);
2343 } else
2344#endif
2345 {
2346 msg->address_hi = MSI_ADDR_BASE_HI;
1995 msg->address_lo = 2347 msg->address_lo =
1996 MSI_ADDR_BASE_LO | 2348 MSI_ADDR_BASE_LO |
1997 ((INT_DEST_MODE == 0) ? 2349 ((INT_DEST_MODE == 0) ?
@@ -2041,6 +2393,55 @@ static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
2041 write_msi_msg(irq, &msg); 2393 write_msi_msg(irq, &msg);
2042 irq_desc[irq].affinity = mask; 2394 irq_desc[irq].affinity = mask;
2043} 2395}
2396
2397#ifdef CONFIG_INTR_REMAP
2398/*
2399 * Migrate the MSI irq to another cpumask. This migration is
2400 * done in the process context using interrupt-remapping hardware.
2401 */
2402static void ir_set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
2403{
2404 struct irq_cfg *cfg = irq_cfg + irq;
2405 unsigned int dest;
2406 cpumask_t tmp, cleanup_mask;
2407 struct irte irte;
2408
2409 cpus_and(tmp, mask, cpu_online_map);
2410 if (cpus_empty(tmp))
2411 return;
2412
2413 if (get_irte(irq, &irte))
2414 return;
2415
2416 if (assign_irq_vector(irq, mask))
2417 return;
2418
2419 cpus_and(tmp, cfg->domain, mask);
2420 dest = cpu_mask_to_apicid(tmp);
2421
2422 irte.vector = cfg->vector;
2423 irte.dest_id = IRTE_DEST(dest);
2424
2425 /*
2426 * atomically update the IRTE with the new destination and vector.
2427 */
2428 modify_irte(irq, &irte);
2429
2430 /*
2431 * After this point, all the interrupts will start arriving
2432 * at the new destination. So, time to cleanup the previous
2433 * vector allocation.
2434 */
2435 if (cfg->move_in_progress) {
2436 cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map);
2437 cfg->move_cleanup_count = cpus_weight(cleanup_mask);
2438 send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
2439 cfg->move_in_progress = 0;
2440 }
2441
2442 irq_desc[irq].affinity = mask;
2443}
2444#endif
2044#endif /* CONFIG_SMP */ 2445#endif /* CONFIG_SMP */
2045 2446
2046/* 2447/*
@@ -2058,26 +2459,157 @@ static struct irq_chip msi_chip = {
2058 .retrigger = ioapic_retrigger_irq, 2459 .retrigger = ioapic_retrigger_irq,
2059}; 2460};
2060 2461
2061int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) 2462#ifdef CONFIG_INTR_REMAP
2463static struct irq_chip msi_ir_chip = {
2464 .name = "IR-PCI-MSI",
2465 .unmask = unmask_msi_irq,
2466 .mask = mask_msi_irq,
2467 .ack = ack_x2apic_edge,
2468#ifdef CONFIG_SMP
2469 .set_affinity = ir_set_msi_irq_affinity,
2470#endif
2471 .retrigger = ioapic_retrigger_irq,
2472};
2473
2474/*
2475 * Map the PCI dev to the corresponding remapping hardware unit
2476 * and allocate 'nvec' consecutive interrupt-remapping table entries
2477 * in it.
2478 */
2479static int msi_alloc_irte(struct pci_dev *dev, int irq, int nvec)
2480{
2481 struct intel_iommu *iommu;
2482 int index;
2483
2484 iommu = map_dev_to_ir(dev);
2485 if (!iommu) {
2486 printk(KERN_ERR
2487 "Unable to map PCI %s to iommu\n", pci_name(dev));
2488 return -ENOENT;
2489 }
2490
2491 index = alloc_irte(iommu, irq, nvec);
2492 if (index < 0) {
2493 printk(KERN_ERR
2494 "Unable to allocate %d IRTE for PCI %s\n", nvec,
2495 pci_name(dev));
2496 return -ENOSPC;
2497 }
2498 return index;
2499}
2500#endif
2501
2502static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc, int irq)
2062{ 2503{
2504 int ret;
2063 struct msi_msg msg; 2505 struct msi_msg msg;
2506
2507 ret = msi_compose_msg(dev, irq, &msg);
2508 if (ret < 0)
2509 return ret;
2510
2511 set_irq_msi(irq, desc);
2512 write_msi_msg(irq, &msg);
2513
2514#ifdef CONFIG_INTR_REMAP
2515 if (irq_remapped(irq)) {
2516 struct irq_desc *desc = irq_desc + irq;
2517 /*
2518 * irq migration in process context
2519 */
2520 desc->status |= IRQ_MOVE_PCNTXT;
2521 set_irq_chip_and_handler_name(irq, &msi_ir_chip, handle_edge_irq, "edge");
2522 } else
2523#endif
2524 set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge");
2525
2526 return 0;
2527}
2528
2529int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
2530{
2064 int irq, ret; 2531 int irq, ret;
2532
2065 irq = create_irq(); 2533 irq = create_irq();
2066 if (irq < 0) 2534 if (irq < 0)
2067 return irq; 2535 return irq;
2068 2536
2069 ret = msi_compose_msg(dev, irq, &msg); 2537#ifdef CONFIG_INTR_REMAP
2538 if (!intr_remapping_enabled)
2539 goto no_ir;
2540
2541 ret = msi_alloc_irte(dev, irq, 1);
2542 if (ret < 0)
2543 goto error;
2544no_ir:
2545#endif
2546 ret = setup_msi_irq(dev, desc, irq);
2070 if (ret < 0) { 2547 if (ret < 0) {
2071 destroy_irq(irq); 2548 destroy_irq(irq);
2072 return ret; 2549 return ret;
2073 } 2550 }
2551 return 0;
2074 2552
2075 set_irq_msi(irq, desc); 2553#ifdef CONFIG_INTR_REMAP
2076 write_msi_msg(irq, &msg); 2554error:
2555 destroy_irq(irq);
2556 return ret;
2557#endif
2558}
2077 2559
2078 set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge"); 2560int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
2561{
2562 int irq, ret, sub_handle;
2563 struct msi_desc *desc;
2564#ifdef CONFIG_INTR_REMAP
2565 struct intel_iommu *iommu = 0;
2566 int index = 0;
2567#endif
2079 2568
2569 sub_handle = 0;
2570 list_for_each_entry(desc, &dev->msi_list, list) {
2571 irq = create_irq();
2572 if (irq < 0)
2573 return irq;
2574#ifdef CONFIG_INTR_REMAP
2575 if (!intr_remapping_enabled)
2576 goto no_ir;
2577
2578 if (!sub_handle) {
2579 /*
2580 * allocate the consecutive block of IRTE's
2581 * for 'nvec'
2582 */
2583 index = msi_alloc_irte(dev, irq, nvec);
2584 if (index < 0) {
2585 ret = index;
2586 goto error;
2587 }
2588 } else {
2589 iommu = map_dev_to_ir(dev);
2590 if (!iommu) {
2591 ret = -ENOENT;
2592 goto error;
2593 }
2594 /*
2595 * setup the mapping between the irq and the IRTE
2596 * base index, the sub_handle pointing to the
2597 * appropriate interrupt remap table entry.
2598 */
2599 set_irte_irq(irq, iommu, index, sub_handle);
2600 }
2601no_ir:
2602#endif
2603 ret = setup_msi_irq(dev, desc, irq);
2604 if (ret < 0)
2605 goto error;
2606 sub_handle++;
2607 }
2080 return 0; 2608 return 0;
2609
2610error:
2611 destroy_irq(irq);
2612 return ret;
2081} 2613}
2082 2614
2083void arch_teardown_msi_irq(unsigned int irq) 2615void arch_teardown_msi_irq(unsigned int irq)
@@ -2325,6 +2857,10 @@ void __init setup_ioapic_dest(void)
2325 setup_IO_APIC_irq(ioapic, pin, irq, 2857 setup_IO_APIC_irq(ioapic, pin, irq,
2326 irq_trigger(irq_entry), 2858 irq_trigger(irq_entry),
2327 irq_polarity(irq_entry)); 2859 irq_polarity(irq_entry));
2860#ifdef CONFIG_INTR_REMAP
2861 else if (intr_remapping_enabled)
2862 set_ir_ioapic_affinity_irq(irq, TARGET_CPUS);
2863#endif
2328 else 2864 else
2329 set_ioapic_affinity_irq(irq, TARGET_CPUS); 2865 set_ioapic_affinity_irq(irq, TARGET_CPUS);
2330 } 2866 }
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 3b25e49380c6..70e1f3e287fb 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -545,7 +545,9 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early)
545 generic_bigsmp_probe(); 545 generic_bigsmp_probe();
546#endif 546#endif
547 547
548#ifdef CONFIG_X86_32
548 setup_apic_routing(); 549 setup_apic_routing();
550#endif
549 if (!num_processors) 551 if (!num_processors)
550 printk(KERN_ERR "MPTABLE: no processors registered!\n"); 552 printk(KERN_ERR "MPTABLE: no processors registered!\n");
551 return num_processors; 553 return num_processors;
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index e0f571d58c19..e0f139106c7e 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -360,9 +360,6 @@ struct pv_cpu_ops pv_cpu_ops = {
360 360
361struct pv_apic_ops pv_apic_ops = { 361struct pv_apic_ops pv_apic_ops = {
362#ifdef CONFIG_X86_LOCAL_APIC 362#ifdef CONFIG_X86_LOCAL_APIC
363 .apic_write = native_apic_write,
364 .apic_write_atomic = native_apic_write_atomic,
365 .apic_read = native_apic_read,
366 .setup_boot_clock = setup_boot_APIC_clock, 363 .setup_boot_clock = setup_boot_APIC_clock,
367 .setup_secondary_clock = setup_secondary_APIC_clock, 364 .setup_secondary_clock = setup_secondary_APIC_clock,
368 .startup_ipi_hook = paravirt_nop, 365 .startup_ipi_hook = paravirt_nop,
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 531b55b8e81a..6121ffd46b9e 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -735,6 +735,8 @@ void __init setup_arch(char **cmdline_p)
735 num_physpages = max_pfn; 735 num_physpages = max_pfn;
736 736
737 check_efer(); 737 check_efer();
738 if (cpu_has_x2apic)
739 check_x2apic();
738 740
739 /* How many end-of-memory variables you have, grandma! */ 741 /* How many end-of-memory variables you have, grandma! */
740 /* need this before calling reserve_initrd */ 742 /* need this before calling reserve_initrd */
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 687376ab07e8..23c3b3d1f4cc 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -123,7 +123,6 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);
123 123
124static atomic_t init_deasserted; 124static atomic_t init_deasserted;
125 125
126static int boot_cpu_logical_apicid;
127 126
128/* representing cpus for which sibling maps can be computed */ 127/* representing cpus for which sibling maps can be computed */
129static cpumask_t cpu_sibling_setup_map; 128static cpumask_t cpu_sibling_setup_map;
@@ -165,6 +164,8 @@ static void unmap_cpu_to_node(int cpu)
165#endif 164#endif
166 165
167#ifdef CONFIG_X86_32 166#ifdef CONFIG_X86_32
167static int boot_cpu_logical_apicid;
168
168u8 cpu_2_logical_apicid[NR_CPUS] __read_mostly = 169u8 cpu_2_logical_apicid[NR_CPUS] __read_mostly =
169 { [0 ... NR_CPUS-1] = BAD_APICID }; 170 { [0 ... NR_CPUS-1] = BAD_APICID };
170 171
@@ -210,7 +211,7 @@ static void __cpuinit smp_callin(void)
210 /* 211 /*
211 * (This works even if the APIC is not enabled.) 212 * (This works even if the APIC is not enabled.)
212 */ 213 */
213 phys_id = GET_APIC_ID(read_apic_id()); 214 phys_id = read_apic_id();
214 cpuid = smp_processor_id(); 215 cpuid = smp_processor_id();
215 if (cpu_isset(cpuid, cpu_callin_map)) { 216 if (cpu_isset(cpuid, cpu_callin_map)) {
216 panic("%s: phys CPU#%d, CPU#%d already present??\n", __func__, 217 panic("%s: phys CPU#%d, CPU#%d already present??\n", __func__,
@@ -546,8 +547,7 @@ static inline void __inquire_remote_apic(int apicid)
546 printk(KERN_CONT 547 printk(KERN_CONT
547 "a previous APIC delivery may have failed\n"); 548 "a previous APIC delivery may have failed\n");
548 549
549 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(apicid)); 550 apic_icr_write(APIC_DM_REMRD | regs[i], apicid);
550 apic_write_around(APIC_ICR, APIC_DM_REMRD | regs[i]);
551 551
552 timeout = 0; 552 timeout = 0;
553 do { 553 do {
@@ -579,11 +579,9 @@ wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
579 int maxlvt; 579 int maxlvt;
580 580
581 /* Target chip */ 581 /* Target chip */
582 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(logical_apicid));
583
584 /* Boot on the stack */ 582 /* Boot on the stack */
585 /* Kick the second */ 583 /* Kick the second */
586 apic_write_around(APIC_ICR, APIC_DM_NMI | APIC_DEST_LOGICAL); 584 apic_icr_write(APIC_DM_NMI | APIC_DEST_LOGICAL, logical_apicid);
587 585
588 Dprintk("Waiting for send to finish...\n"); 586 Dprintk("Waiting for send to finish...\n");
589 send_status = safe_apic_wait_icr_idle(); 587 send_status = safe_apic_wait_icr_idle();
@@ -639,13 +637,11 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
639 /* 637 /*
640 * Turn INIT on target chip 638 * Turn INIT on target chip
641 */ 639 */
642 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(phys_apicid));
643
644 /* 640 /*
645 * Send IPI 641 * Send IPI
646 */ 642 */
647 apic_write_around(APIC_ICR, APIC_INT_LEVELTRIG | APIC_INT_ASSERT 643 apic_icr_write(APIC_INT_LEVELTRIG | APIC_INT_ASSERT | APIC_DM_INIT,
648 | APIC_DM_INIT); 644 phys_apicid);
649 645
650 Dprintk("Waiting for send to finish...\n"); 646 Dprintk("Waiting for send to finish...\n");
651 send_status = safe_apic_wait_icr_idle(); 647 send_status = safe_apic_wait_icr_idle();
@@ -655,10 +651,8 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
655 Dprintk("Deasserting INIT.\n"); 651 Dprintk("Deasserting INIT.\n");
656 652
657 /* Target chip */ 653 /* Target chip */
658 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(phys_apicid));
659
660 /* Send IPI */ 654 /* Send IPI */
661 apic_write_around(APIC_ICR, APIC_INT_LEVELTRIG | APIC_DM_INIT); 655 apic_icr_write(APIC_INT_LEVELTRIG | APIC_DM_INIT, phys_apicid);
662 656
663 Dprintk("Waiting for send to finish...\n"); 657 Dprintk("Waiting for send to finish...\n");
664 send_status = safe_apic_wait_icr_idle(); 658 send_status = safe_apic_wait_icr_idle();
@@ -703,12 +697,10 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
703 */ 697 */
704 698
705 /* Target chip */ 699 /* Target chip */
706 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(phys_apicid));
707
708 /* Boot on the stack */ 700 /* Boot on the stack */
709 /* Kick the second */ 701 /* Kick the second */
710 apic_write_around(APIC_ICR, APIC_DM_STARTUP 702 apic_icr_write(APIC_DM_STARTUP | (start_eip >> 12),
711 | (start_eip >> 12)); 703 phys_apicid);
712 704
713 /* 705 /*
714 * Give the other CPU some time to accept the IPI. 706 * Give the other CPU some time to accept the IPI.
@@ -1147,10 +1139,17 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
1147 * Setup boot CPU information 1139 * Setup boot CPU information
1148 */ 1140 */
1149 smp_store_cpu_info(0); /* Final full version of the data */ 1141 smp_store_cpu_info(0); /* Final full version of the data */
1142#ifdef CONFIG_X86_32
1150 boot_cpu_logical_apicid = logical_smp_processor_id(); 1143 boot_cpu_logical_apicid = logical_smp_processor_id();
1144#endif
1151 current_thread_info()->cpu = 0; /* needed? */ 1145 current_thread_info()->cpu = 0; /* needed? */
1152 set_cpu_sibling_map(0); 1146 set_cpu_sibling_map(0);
1153 1147
1148#ifdef CONFIG_X86_64
1149 enable_IR_x2apic();
1150 setup_apic_routing();
1151#endif
1152
1154 if (smp_sanity_check(max_cpus) < 0) { 1153 if (smp_sanity_check(max_cpus) < 0) {
1155 printk(KERN_INFO "SMP disabled\n"); 1154 printk(KERN_INFO "SMP disabled\n");
1156 disable_smp(); 1155 disable_smp();
@@ -1158,9 +1157,9 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
1158 } 1157 }
1159 1158
1160 preempt_disable(); 1159 preempt_disable();
1161 if (GET_APIC_ID(read_apic_id()) != boot_cpu_physical_apicid) { 1160 if (read_apic_id() != boot_cpu_physical_apicid) {
1162 panic("Boot APIC ID in local APIC unexpected (%d vs %d)", 1161 panic("Boot APIC ID in local APIC unexpected (%d vs %d)",
1163 GET_APIC_ID(read_apic_id()), boot_cpu_physical_apicid); 1162 read_apic_id(), boot_cpu_physical_apicid);
1164 /* Or can we switch back to PIC here? */ 1163 /* Or can we switch back to PIC here? */
1165 } 1164 }
1166 preempt_enable(); 1165 preempt_enable();
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c
index b15346092b7b..237082833c14 100644
--- a/arch/x86/kernel/vmi_32.c
+++ b/arch/x86/kernel/vmi_32.c
@@ -904,9 +904,9 @@ static inline int __init activate_vmi(void)
904#endif 904#endif
905 905
906#ifdef CONFIG_X86_LOCAL_APIC 906#ifdef CONFIG_X86_LOCAL_APIC
907 para_fill(pv_apic_ops.apic_read, APICRead); 907 para_fill(apic_ops->read, APICRead);
908 para_fill(pv_apic_ops.apic_write, APICWrite); 908 para_fill(apic_ops->write, APICWrite);
909 para_fill(pv_apic_ops.apic_write_atomic, APICWrite); 909 para_fill(apic_ops->write_atomic, APICWrite);
910#endif 910#endif
911 911
912 /* 912 /*
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index 50dad44fb542..675ee7a6475e 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -783,14 +783,45 @@ static void lguest_wbinvd(void)
783 * code qualifies for Advanced. It will also never interrupt anything. It 783 * code qualifies for Advanced. It will also never interrupt anything. It
784 * does, however, allow us to get through the Linux boot code. */ 784 * does, however, allow us to get through the Linux boot code. */
785#ifdef CONFIG_X86_LOCAL_APIC 785#ifdef CONFIG_X86_LOCAL_APIC
786static void lguest_apic_write(unsigned long reg, u32 v) 786static void lguest_apic_write(u32 reg, u32 v)
787{ 787{
788} 788}
789 789
790static u32 lguest_apic_read(unsigned long reg) 790static u32 lguest_apic_read(u32 reg)
791{ 791{
792 return 0; 792 return 0;
793} 793}
794
795static u64 lguest_apic_icr_read(void)
796{
797 return 0;
798}
799
800static void lguest_apic_icr_write(u32 low, u32 id)
801{
802 /* Warn to see if there's any stray references */
803 WARN_ON(1);
804}
805
806static void lguest_apic_wait_icr_idle(void)
807{
808 return;
809}
810
811static u32 lguest_apic_safe_wait_icr_idle(void)
812{
813 return 0;
814}
815
816static struct apic_ops lguest_basic_apic_ops = {
817 .read = lguest_apic_read,
818 .write = lguest_apic_write,
819 .write_atomic = lguest_apic_write,
820 .icr_read = lguest_apic_icr_read,
821 .icr_write = lguest_apic_icr_write,
822 .wait_icr_idle = lguest_apic_wait_icr_idle,
823 .safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle,
824};
794#endif 825#endif
795 826
796/* STOP! Until an interrupt comes in. */ 827/* STOP! Until an interrupt comes in. */
@@ -990,9 +1021,7 @@ __init void lguest_init(void)
990 1021
991#ifdef CONFIG_X86_LOCAL_APIC 1022#ifdef CONFIG_X86_LOCAL_APIC
992 /* apic read/write intercepts */ 1023 /* apic read/write intercepts */
993 pv_apic_ops.apic_write = lguest_apic_write; 1024 apic_ops = &lguest_basic_apic_ops;
994 pv_apic_ops.apic_write_atomic = lguest_apic_write;
995 pv_apic_ops.apic_read = lguest_apic_read;
996#endif 1025#endif
997 1026
998 /* time operations */ 1027 /* time operations */
diff --git a/arch/x86/mach-generic/bigsmp.c b/arch/x86/mach-generic/bigsmp.c
index 59d771714559..b31f2800638e 100644
--- a/arch/x86/mach-generic/bigsmp.c
+++ b/arch/x86/mach-generic/bigsmp.c
@@ -5,17 +5,16 @@
5#define APIC_DEFINITION 1 5#define APIC_DEFINITION 1
6#include <linux/threads.h> 6#include <linux/threads.h>
7#include <linux/cpumask.h> 7#include <linux/cpumask.h>
8#include <asm/smp.h>
9#include <asm/mpspec.h> 8#include <asm/mpspec.h>
10#include <asm/genapic.h> 9#include <asm/genapic.h>
11#include <asm/fixmap.h> 10#include <asm/fixmap.h>
12#include <asm/apicdef.h> 11#include <asm/apicdef.h>
13#include <linux/kernel.h> 12#include <linux/kernel.h>
14#include <linux/smp.h>
15#include <linux/init.h> 13#include <linux/init.h>
16#include <linux/dmi.h> 14#include <linux/dmi.h>
17#include <asm/mach-bigsmp/mach_apic.h>
18#include <asm/mach-bigsmp/mach_apicdef.h> 15#include <asm/mach-bigsmp/mach_apicdef.h>
16#include <linux/smp.h>
17#include <asm/mach-bigsmp/mach_apic.h>
19#include <asm/mach-bigsmp/mach_ipi.h> 18#include <asm/mach-bigsmp/mach_ipi.h>
20#include <asm/mach-default/mach_mpparse.h> 19#include <asm/mach-default/mach_mpparse.h>
21 20
diff --git a/arch/x86/mach-generic/es7000.c b/arch/x86/mach-generic/es7000.c
index 4742626f08c4..9b30547d746e 100644
--- a/arch/x86/mach-generic/es7000.c
+++ b/arch/x86/mach-generic/es7000.c
@@ -4,16 +4,15 @@
4#define APIC_DEFINITION 1 4#define APIC_DEFINITION 1
5#include <linux/threads.h> 5#include <linux/threads.h>
6#include <linux/cpumask.h> 6#include <linux/cpumask.h>
7#include <asm/smp.h>
8#include <asm/mpspec.h> 7#include <asm/mpspec.h>
9#include <asm/genapic.h> 8#include <asm/genapic.h>
10#include <asm/fixmap.h> 9#include <asm/fixmap.h>
11#include <asm/apicdef.h> 10#include <asm/apicdef.h>
12#include <linux/kernel.h> 11#include <linux/kernel.h>
13#include <linux/string.h> 12#include <linux/string.h>
14#include <linux/smp.h>
15#include <linux/init.h> 13#include <linux/init.h>
16#include <asm/mach-es7000/mach_apicdef.h> 14#include <asm/mach-es7000/mach_apicdef.h>
15#include <linux/smp.h>
17#include <asm/mach-es7000/mach_apic.h> 16#include <asm/mach-es7000/mach_apic.h>
18#include <asm/mach-es7000/mach_ipi.h> 17#include <asm/mach-es7000/mach_ipi.h>
19#include <asm/mach-es7000/mach_mpparse.h> 18#include <asm/mach-es7000/mach_mpparse.h>
diff --git a/arch/x86/mach-generic/numaq.c b/arch/x86/mach-generic/numaq.c
index 8091e68764c4..95c07efff6b7 100644
--- a/arch/x86/mach-generic/numaq.c
+++ b/arch/x86/mach-generic/numaq.c
@@ -4,7 +4,6 @@
4#define APIC_DEFINITION 1 4#define APIC_DEFINITION 1
5#include <linux/threads.h> 5#include <linux/threads.h>
6#include <linux/cpumask.h> 6#include <linux/cpumask.h>
7#include <linux/smp.h>
8#include <asm/mpspec.h> 7#include <asm/mpspec.h>
9#include <asm/genapic.h> 8#include <asm/genapic.h>
10#include <asm/fixmap.h> 9#include <asm/fixmap.h>
@@ -12,8 +11,9 @@
12#include <linux/kernel.h> 11#include <linux/kernel.h>
13#include <linux/string.h> 12#include <linux/string.h>
14#include <linux/init.h> 13#include <linux/init.h>
15#include <asm/mach-numaq/mach_apic.h>
16#include <asm/mach-numaq/mach_apicdef.h> 14#include <asm/mach-numaq/mach_apicdef.h>
15#include <linux/smp.h>
16#include <asm/mach-numaq/mach_apic.h>
17#include <asm/mach-numaq/mach_ipi.h> 17#include <asm/mach-numaq/mach_ipi.h>
18#include <asm/mach-numaq/mach_mpparse.h> 18#include <asm/mach-numaq/mach_mpparse.h>
19#include <asm/mach-numaq/mach_wakecpu.h> 19#include <asm/mach-numaq/mach_wakecpu.h>
diff --git a/arch/x86/mach-generic/summit.c b/arch/x86/mach-generic/summit.c
index a97ea0f35b1e..752edd96b1bf 100644
--- a/arch/x86/mach-generic/summit.c
+++ b/arch/x86/mach-generic/summit.c
@@ -4,17 +4,16 @@
4#define APIC_DEFINITION 1 4#define APIC_DEFINITION 1
5#include <linux/threads.h> 5#include <linux/threads.h>
6#include <linux/cpumask.h> 6#include <linux/cpumask.h>
7#include <asm/smp.h>
8#include <asm/mpspec.h> 7#include <asm/mpspec.h>
9#include <asm/genapic.h> 8#include <asm/genapic.h>
10#include <asm/fixmap.h> 9#include <asm/fixmap.h>
11#include <asm/apicdef.h> 10#include <asm/apicdef.h>
12#include <linux/kernel.h> 11#include <linux/kernel.h>
13#include <linux/string.h> 12#include <linux/string.h>
14#include <linux/smp.h>
15#include <linux/init.h> 13#include <linux/init.h>
16#include <asm/mach-summit/mach_apic.h>
17#include <asm/mach-summit/mach_apicdef.h> 14#include <asm/mach-summit/mach_apicdef.h>
15#include <linux/smp.h>
16#include <asm/mach-summit/mach_apic.h>
18#include <asm/mach-summit/mach_ipi.h> 17#include <asm/mach-summit/mach_ipi.h>
19#include <asm/mach-summit/mach_mpparse.h> 18#include <asm/mach-summit/mach_mpparse.h>
20 19
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index bb508456ef52..402f3e2c7bee 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -548,16 +548,48 @@ static void xen_io_delay(void)
548} 548}
549 549
550#ifdef CONFIG_X86_LOCAL_APIC 550#ifdef CONFIG_X86_LOCAL_APIC
551static u32 xen_apic_read(unsigned long reg) 551static u32 xen_apic_read(u32 reg)
552{ 552{
553 return 0; 553 return 0;
554} 554}
555 555
556static void xen_apic_write(unsigned long reg, u32 val) 556static void xen_apic_write(u32 reg, u32 val)
557{ 557{
558 /* Warn to see if there's any stray references */ 558 /* Warn to see if there's any stray references */
559 WARN_ON(1); 559 WARN_ON(1);
560} 560}
561
562static u64 xen_apic_icr_read(void)
563{
564 return 0;
565}
566
567static void xen_apic_icr_write(u32 low, u32 id)
568{
569 /* Warn to see if there's any stray references */
570 WARN_ON(1);
571}
572
573static void xen_apic_wait_icr_idle(void)
574{
575 return;
576}
577
578static u32 xen_safe_apic_wait_icr_idle(void)
579{
580 return 0;
581}
582
583static struct apic_ops xen_basic_apic_ops = {
584 .read = xen_apic_read,
585 .write = xen_apic_write,
586 .write_atomic = xen_apic_write,
587 .icr_read = xen_apic_icr_read,
588 .icr_write = xen_apic_icr_write,
589 .wait_icr_idle = xen_apic_wait_icr_idle,
590 .safe_wait_icr_idle = xen_safe_apic_wait_icr_idle,
591};
592
561#endif 593#endif
562 594
563static void xen_flush_tlb(void) 595static void xen_flush_tlb(void)
@@ -1130,9 +1162,6 @@ static const struct pv_irq_ops xen_irq_ops __initdata = {
1130 1162
1131static const struct pv_apic_ops xen_apic_ops __initdata = { 1163static const struct pv_apic_ops xen_apic_ops __initdata = {
1132#ifdef CONFIG_X86_LOCAL_APIC 1164#ifdef CONFIG_X86_LOCAL_APIC
1133 .apic_write = xen_apic_write,
1134 .apic_write_atomic = xen_apic_write,
1135 .apic_read = xen_apic_read,
1136 .setup_boot_clock = paravirt_nop, 1165 .setup_boot_clock = paravirt_nop,
1137 .setup_secondary_clock = paravirt_nop, 1166 .setup_secondary_clock = paravirt_nop,
1138 .startup_ipi_hook = paravirt_nop, 1167 .startup_ipi_hook = paravirt_nop,
@@ -1294,6 +1323,13 @@ asmlinkage void __init xen_start_kernel(void)
1294 pv_apic_ops = xen_apic_ops; 1323 pv_apic_ops = xen_apic_ops;
1295 pv_mmu_ops = xen_mmu_ops; 1324 pv_mmu_ops = xen_mmu_ops;
1296 1325
1326#ifdef CONFIG_X86_LOCAL_APIC
1327 /*
1328 * set up the basic apic ops.
1329 */
1330 apic_ops = &xen_basic_apic_ops;
1331#endif
1332
1297 if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { 1333 if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
1298 pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; 1334 pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
1299 pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; 1335 pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit;