diff options
Diffstat (limited to 'arch/x86/kernel/apic')
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 34 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/apic_numachip.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_phys.c | 6 | 
3 files changed, 31 insertions, 16 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 11544d8f1e9..edc24480469 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -1637,9 +1637,11 @@ static int __init apic_verify(void)  	mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;  	/* The BIOS may have set up the APIC at some other address */ -	rdmsr(MSR_IA32_APICBASE, l, h); -	if (l & MSR_IA32_APICBASE_ENABLE) -		mp_lapic_addr = l & MSR_IA32_APICBASE_BASE; +	if (boot_cpu_data.x86 >= 6) { +		rdmsr(MSR_IA32_APICBASE, l, h); +		if (l & MSR_IA32_APICBASE_ENABLE) +			mp_lapic_addr = l & MSR_IA32_APICBASE_BASE; +	}  	pr_info("Found and enabled local APIC!\n");  	return 0; @@ -1657,13 +1659,15 @@ int __init apic_force_enable(unsigned long addr)  	 * MSR. This can only be done in software for Intel P6 or later  	 * and AMD K7 (Model > 1) or later.  	 */ -	rdmsr(MSR_IA32_APICBASE, l, h); -	if (!(l & MSR_IA32_APICBASE_ENABLE)) { -		pr_info("Local APIC disabled by BIOS -- reenabling.\n"); -		l &= ~MSR_IA32_APICBASE_BASE; -		l |= MSR_IA32_APICBASE_ENABLE | addr; -		wrmsr(MSR_IA32_APICBASE, l, h); -		enabled_via_apicbase = 1; +	if (boot_cpu_data.x86 >= 6) { +		rdmsr(MSR_IA32_APICBASE, l, h); +		if (!(l & MSR_IA32_APICBASE_ENABLE)) { +			pr_info("Local APIC disabled by BIOS -- reenabling.\n"); +			l &= ~MSR_IA32_APICBASE_BASE; +			l |= MSR_IA32_APICBASE_ENABLE | addr; +			wrmsr(MSR_IA32_APICBASE, l, h); +			enabled_via_apicbase = 1; +		}  	}  	return apic_verify();  } @@ -2209,10 +2213,12 @@ static void lapic_resume(void)  		 * FIXME! This will be wrong if we ever support suspend on  		 * SMP! We'll need to do this as part of the CPU restore!  		 */ -		rdmsr(MSR_IA32_APICBASE, l, h); -		l &= ~MSR_IA32_APICBASE_BASE; -		l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr; -		wrmsr(MSR_IA32_APICBASE, l, h); +		if (boot_cpu_data.x86 >= 6) { +			rdmsr(MSR_IA32_APICBASE, l, h); +			l &= ~MSR_IA32_APICBASE_BASE; +			l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr; +			wrmsr(MSR_IA32_APICBASE, l, h); +		}  	}  	maxlvt = lapic_get_maxlvt(); diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c index 899803e0321..23e75422e01 100644 --- a/arch/x86/kernel/apic/apic_numachip.c +++ b/arch/x86/kernel/apic/apic_numachip.c @@ -207,8 +207,11 @@ static void __init map_csrs(void)  static void fixup_cpu_id(struct cpuinfo_x86 *c, int node)  { -	c->phys_proc_id = node; -	per_cpu(cpu_llc_id, smp_processor_id()) = node; + +	if (c->phys_proc_id != node) { +		c->phys_proc_id = node; +		per_cpu(cpu_llc_id, smp_processor_id()) = node; +	}  }  static int __init numachip_system_init(void) diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index 8a778db45e3..991e315f422 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c @@ -24,6 +24,12 @@ static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id)  {  	if (x2apic_phys)  		return x2apic_enabled(); +	else if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) && +		(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL) && +		x2apic_enabled()) { +		printk(KERN_DEBUG "System requires x2apic physical mode\n"); +		return 1; +	}  	else  		return 0;  }  |