aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2015-01-15 16:22:24 -0500
committerThomas Gleixner <tglx@linutronix.de>2015-01-22 09:10:55 -0500
commit44e25ff9e6912347a1a54c757fc75681d0dc42d0 (patch)
tree2adeb04280626555ead340b6db9beb1c461725a7
parent12e189d3cfa4c64de758bde18626184bf32c65fc (diff)
x86/x2apic: Disable x2apic from nox2apic setup
There is no point in postponing the hardware disablement of x2apic. It can be disabled right away in the nox2apic setup function. Disable it right away and set the state to DISABLED . This allows to remove all the nox2apic conditionals all over the place. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Jiang Liu <jiang.liu@linux.intel.com> Cc: Joerg Roedel <joro@8bytes.org> Cc: Tony Luck <tony.luck@intel.com> Cc: Borislav Petkov <bp@alien8.de> Link: http://lkml.kernel.org/r/20150115211703.051214090@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--arch/x86/include/asm/apic.h1
-rw-r--r--arch/x86/kernel/apic/apic.c59
2 files changed, 24 insertions, 36 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 951caa17d8ba..5d7488e9b66e 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -187,7 +187,6 @@ static inline int x2apic_enabled(void)
187 187
188#define x2apic_supported() (cpu_has_x2apic) 188#define x2apic_supported() (cpu_has_x2apic)
189#else 189#else
190static inline void disable_x2apic(void) { }
191static inline void check_x2apic(void) { } 190static inline void check_x2apic(void) { }
192static inline void enable_x2apic(void) { } 191static inline void enable_x2apic(void) { }
193static inline int x2apic_enabled(void) { return 0; } 192static inline int x2apic_enabled(void) { return 0; }
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index b374b0de342b..90b8ac5df250 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -1474,12 +1474,8 @@ void __init bsp_end_local_APIC_setup(void)
1474 1474
1475} 1475}
1476 1476
1477/* Control whether x2APIC mode is enabled or not */
1478static bool nox2apic __initdata;
1479
1480#ifdef CONFIG_X86_X2APIC 1477#ifdef CONFIG_X86_X2APIC
1481int x2apic_mode; 1478int x2apic_mode;
1482static int x2apic_disabled;
1483 1479
1484enum { 1480enum {
1485 X2APIC_OFF, 1481 X2APIC_OFF,
@@ -1488,6 +1484,19 @@ enum {
1488}; 1484};
1489static int x2apic_state; 1485static int x2apic_state;
1490 1486
1487static inline void __x2apic_disable(void)
1488{
1489 u64 msr;
1490
1491 rdmsrl(MSR_IA32_APICBASE, msr);
1492 if (!(msr & X2APIC_ENABLE))
1493 return;
1494 /* Disable xapic and x2apic first and then reenable xapic mode */
1495 wrmsrl(MSR_IA32_APICBASE, msr & ~(X2APIC_ENABLE | XAPIC_ENABLE));
1496 wrmsrl(MSR_IA32_APICBASE, msr & ~X2APIC_ENABLE);
1497 printk_once(KERN_INFO "x2apic disabled\n");
1498}
1499
1491static int __init setup_nox2apic(char *str) 1500static int __init setup_nox2apic(char *str)
1492{ 1501{
1493 if (x2apic_enabled()) { 1502 if (x2apic_enabled()) {
@@ -1498,28 +1507,17 @@ static int __init setup_nox2apic(char *str)
1498 apicid); 1507 apicid);
1499 return 0; 1508 return 0;
1500 } 1509 }
1501 1510 pr_warning("x2apic already enabled.\n");
1502 pr_warning("x2apic already enabled. will disable it\n"); 1511 __x2apic_disable();
1503 } else 1512 }
1504 setup_clear_cpu_cap(X86_FEATURE_X2APIC); 1513 setup_clear_cpu_cap(X86_FEATURE_X2APIC);
1505
1506 nox2apic = true;
1507 x2apic_state = X2APIC_DISABLED; 1514 x2apic_state = X2APIC_DISABLED;
1515 x2apic_mode = 0;
1508 return 0; 1516 return 0;
1509} 1517}
1510early_param("nox2apic", setup_nox2apic); 1518early_param("nox2apic", setup_nox2apic);
1511 1519
1512/* 1520static __init void x2apic_disable(void)
1513 * Need to disable xapic and x2apic at the same time and then enable xapic mode
1514 */
1515static inline void __disable_x2apic(u64 msr)
1516{
1517 wrmsrl(MSR_IA32_APICBASE,
1518 msr & ~(X2APIC_ENABLE | XAPIC_ENABLE));
1519 wrmsrl(MSR_IA32_APICBASE, msr & ~X2APIC_ENABLE);
1520}
1521
1522static __init void disable_x2apic(void)
1523{ 1521{
1524 u64 msr; 1522 u64 msr;
1525 1523
@@ -1533,20 +1531,13 @@ static __init void disable_x2apic(void)
1533 if (x2apic_id >= 255) 1531 if (x2apic_id >= 255)
1534 panic("Cannot disable x2apic, id: %08x\n", x2apic_id); 1532 panic("Cannot disable x2apic, id: %08x\n", x2apic_id);
1535 1533
1536 pr_info("Disabling x2apic\n"); 1534 __x2apic_disable();
1537 __disable_x2apic(msr);
1538
1539 if (nox2apic) {
1540 clear_cpu_cap(&cpu_data(0), X86_FEATURE_X2APIC);
1541 setup_clear_cpu_cap(X86_FEATURE_X2APIC);
1542 }
1543 1535
1544 x2apic_mode = 0; 1536 x2apic_mode = 0;
1545 1537
1546 register_lapic_address(mp_lapic_addr); 1538 register_lapic_address(mp_lapic_addr);
1547 } 1539 }
1548 1540
1549 x2apic_disabled = 1;
1550 x2apic_state = X2APIC_DISABLED; 1541 x2apic_state = X2APIC_DISABLED;
1551} 1542}
1552 1543
@@ -1554,9 +1545,8 @@ void enable_x2apic(void)
1554{ 1545{
1555 u64 msr; 1546 u64 msr;
1556 1547
1557 rdmsrl(MSR_IA32_APICBASE, msr); 1548 if (x2apic_state == X2APIC_DISABLED) {
1558 if (x2apic_disabled) { 1549 __x2apic_disable();
1559 __disable_x2apic(msr);
1560 x2apic_mode = 0; 1550 x2apic_mode = 0;
1561 return; 1551 return;
1562 } 1552 }
@@ -1564,6 +1554,7 @@ void enable_x2apic(void)
1564 if (!x2apic_mode) 1554 if (!x2apic_mode)
1565 return; 1555 return;
1566 1556
1557 rdmsrl(MSR_IA32_APICBASE, msr);
1567 if (!(msr & X2APIC_ENABLE)) { 1558 if (!(msr & X2APIC_ENABLE)) {
1568 printk_once(KERN_INFO "Enabling x2apic\n"); 1559 printk_once(KERN_INFO "Enabling x2apic\n");
1569 wrmsrl(MSR_IA32_APICBASE, msr | X2APIC_ENABLE); 1560 wrmsrl(MSR_IA32_APICBASE, msr | X2APIC_ENABLE);
@@ -1584,7 +1575,7 @@ static __init void try_to_enable_x2apic(int remap_mode)
1584 (IS_ENABLED(CONFIG_HYPERVISOR_GUEST) && 1575 (IS_ENABLED(CONFIG_HYPERVISOR_GUEST) &&
1585 !hypervisor_x2apic_available())) { 1576 !hypervisor_x2apic_available())) {
1586 pr_info("x2apic: IRQ remapping doesn't support X2APIC mode\n"); 1577 pr_info("x2apic: IRQ remapping doesn't support X2APIC mode\n");
1587 disable_x2apic(); 1578 x2apic_disable();
1588 return; 1579 return;
1589 } 1580 }
1590 1581
@@ -1657,8 +1648,6 @@ void __init enable_IR_x2apic(void)
1657 legacy_pic->mask_all(); 1648 legacy_pic->mask_all();
1658 mask_ioapic_entries(); 1649 mask_ioapic_entries();
1659 1650
1660 if (nox2apic)
1661 disable_x2apic();
1662 /* If irq_remapping_prepare() succeded, try to enable it */ 1651 /* If irq_remapping_prepare() succeded, try to enable it */
1663 if (ir_stat >= 0) 1652 if (ir_stat >= 0)
1664 ir_stat = try_to_enable_IR(); 1653 ir_stat = try_to_enable_IR();