diff options
Diffstat (limited to 'arch/x86/kernel/apic/apic.c')
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 58 |
1 files changed, 10 insertions, 48 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 894aa97f0717..dfca210f6a10 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -61,12 +61,6 @@ unsigned int boot_cpu_physical_apicid = -1U; | |||
61 | 61 | ||
62 | /* | 62 | /* |
63 | * The highest APIC ID seen during enumeration. | 63 | * The highest APIC ID seen during enumeration. |
64 | * | ||
65 | * On AMD, this determines the messaging protocol we can use: if all APIC IDs | ||
66 | * are in the 0 ... 7 range, then we can use logical addressing which | ||
67 | * has some performance advantages (better broadcasting). | ||
68 | * | ||
69 | * If there's an APIC ID above 8, we use physical addressing. | ||
70 | */ | 64 | */ |
71 | unsigned int max_physical_apicid; | 65 | unsigned int max_physical_apicid; |
72 | 66 | ||
@@ -241,28 +235,13 @@ static int modern_apic(void) | |||
241 | } | 235 | } |
242 | 236 | ||
243 | /* | 237 | /* |
244 | * bare function to substitute write operation | 238 | * right after this call apic become NOOP driven |
245 | * and it's _that_ fast :) | 239 | * so apic->write/read doesn't do anything |
246 | */ | ||
247 | static void native_apic_write_dummy(u32 reg, u32 v) | ||
248 | { | ||
249 | WARN_ON_ONCE((cpu_has_apic || !disable_apic)); | ||
250 | } | ||
251 | |||
252 | static u32 native_apic_read_dummy(u32 reg) | ||
253 | { | ||
254 | WARN_ON_ONCE((cpu_has_apic && !disable_apic)); | ||
255 | return 0; | ||
256 | } | ||
257 | |||
258 | /* | ||
259 | * right after this call apic->write/read doesn't do anything | ||
260 | * note that there is no restore operation it works one way | ||
261 | */ | 240 | */ |
262 | void apic_disable(void) | 241 | void apic_disable(void) |
263 | { | 242 | { |
264 | apic->read = native_apic_read_dummy; | 243 | pr_info("APIC: switched to apic NOOP\n"); |
265 | apic->write = native_apic_write_dummy; | 244 | apic = &apic_noop; |
266 | } | 245 | } |
267 | 246 | ||
268 | void native_apic_wait_icr_idle(void) | 247 | void native_apic_wait_icr_idle(void) |
@@ -459,7 +438,7 @@ static void lapic_timer_setup(enum clock_event_mode mode, | |||
459 | v = apic_read(APIC_LVTT); | 438 | v = apic_read(APIC_LVTT); |
460 | v |= (APIC_LVT_MASKED | LOCAL_TIMER_VECTOR); | 439 | v |= (APIC_LVT_MASKED | LOCAL_TIMER_VECTOR); |
461 | apic_write(APIC_LVTT, v); | 440 | apic_write(APIC_LVTT, v); |
462 | apic_write(APIC_TMICT, 0xffffffff); | 441 | apic_write(APIC_TMICT, 0); |
463 | break; | 442 | break; |
464 | case CLOCK_EVT_MODE_RESUME: | 443 | case CLOCK_EVT_MODE_RESUME: |
465 | /* Nothing to do here */ | 444 | /* Nothing to do here */ |
@@ -662,7 +641,7 @@ static int __init calibrate_APIC_clock(void) | |||
662 | calibration_result = (delta * APIC_DIVISOR) / LAPIC_CAL_LOOPS; | 641 | calibration_result = (delta * APIC_DIVISOR) / LAPIC_CAL_LOOPS; |
663 | 642 | ||
664 | apic_printk(APIC_VERBOSE, "..... delta %ld\n", delta); | 643 | apic_printk(APIC_VERBOSE, "..... delta %ld\n", delta); |
665 | apic_printk(APIC_VERBOSE, "..... mult: %ld\n", lapic_clockevent.mult); | 644 | apic_printk(APIC_VERBOSE, "..... mult: %u\n", lapic_clockevent.mult); |
666 | apic_printk(APIC_VERBOSE, "..... calibration result: %u\n", | 645 | apic_printk(APIC_VERBOSE, "..... calibration result: %u\n", |
667 | calibration_result); | 646 | calibration_result); |
668 | 647 | ||
@@ -1356,7 +1335,7 @@ void enable_x2apic(void) | |||
1356 | 1335 | ||
1357 | rdmsr(MSR_IA32_APICBASE, msr, msr2); | 1336 | rdmsr(MSR_IA32_APICBASE, msr, msr2); |
1358 | if (!(msr & X2APIC_ENABLE)) { | 1337 | if (!(msr & X2APIC_ENABLE)) { |
1359 | pr_info("Enabling x2apic\n"); | 1338 | printk_once(KERN_INFO "Enabling x2apic\n"); |
1360 | wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, 0); | 1339 | wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, 0); |
1361 | } | 1340 | } |
1362 | } | 1341 | } |
@@ -1392,14 +1371,11 @@ void __init enable_IR_x2apic(void) | |||
1392 | unsigned long flags; | 1371 | unsigned long flags; |
1393 | struct IO_APIC_route_entry **ioapic_entries = NULL; | 1372 | struct IO_APIC_route_entry **ioapic_entries = NULL; |
1394 | int ret, x2apic_enabled = 0; | 1373 | int ret, x2apic_enabled = 0; |
1395 | int dmar_table_init_ret = 0; | 1374 | int dmar_table_init_ret; |
1396 | 1375 | ||
1397 | #ifdef CONFIG_INTR_REMAP | ||
1398 | dmar_table_init_ret = dmar_table_init(); | 1376 | dmar_table_init_ret = dmar_table_init(); |
1399 | if (dmar_table_init_ret) | 1377 | if (dmar_table_init_ret && !x2apic_supported()) |
1400 | pr_debug("dmar_table_init() failed with %d:\n", | 1378 | return; |
1401 | dmar_table_init_ret); | ||
1402 | #endif | ||
1403 | 1379 | ||
1404 | ioapic_entries = alloc_ioapic_entries(); | 1380 | ioapic_entries = alloc_ioapic_entries(); |
1405 | if (!ioapic_entries) { | 1381 | if (!ioapic_entries) { |
@@ -1665,9 +1641,7 @@ int __init APIC_init_uniprocessor(void) | |||
1665 | #endif | 1641 | #endif |
1666 | 1642 | ||
1667 | enable_IR_x2apic(); | 1643 | enable_IR_x2apic(); |
1668 | #ifdef CONFIG_X86_64 | ||
1669 | default_setup_apic_routing(); | 1644 | default_setup_apic_routing(); |
1670 | #endif | ||
1671 | 1645 | ||
1672 | verify_local_APIC(); | 1646 | verify_local_APIC(); |
1673 | connect_bsp_APIC(); | 1647 | connect_bsp_APIC(); |
@@ -1915,18 +1889,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
1915 | if (apicid > max_physical_apicid) | 1889 | if (apicid > max_physical_apicid) |
1916 | max_physical_apicid = apicid; | 1890 | max_physical_apicid = apicid; |
1917 | 1891 | ||
1918 | #ifdef CONFIG_X86_32 | ||
1919 | switch (boot_cpu_data.x86_vendor) { | ||
1920 | case X86_VENDOR_INTEL: | ||
1921 | if (num_processors > 8) | ||
1922 | def_to_bigsmp = 1; | ||
1923 | break; | ||
1924 | case X86_VENDOR_AMD: | ||
1925 | if (max_physical_apicid >= 8) | ||
1926 | def_to_bigsmp = 1; | ||
1927 | } | ||
1928 | #endif | ||
1929 | |||
1930 | #if defined(CONFIG_SMP) || defined(CONFIG_X86_64) | 1892 | #if defined(CONFIG_SMP) || defined(CONFIG_X86_64) |
1931 | early_per_cpu(x86_cpu_to_apicid, cpu) = apicid; | 1893 | early_per_cpu(x86_cpu_to_apicid, cpu) = apicid; |
1932 | early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid; | 1894 | early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid; |