diff options
Diffstat (limited to 'arch/x86/kernel/apic/apic.c')
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 51 | 
1 files changed, 51 insertions, 0 deletions
| diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 6e272f3ea984..25ddf02598d2 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -1286,6 +1286,55 @@ static int __init apic_intr_mode_select(void)  	return APIC_SYMMETRIC_IO;  } +/* + * An initial setup of the virtual wire mode. + */ +void __init init_bsp_APIC(void) +{ +	unsigned int value; + +	/* +	 * Don't do the setup now if we have a SMP BIOS as the +	 * through-I/O-APIC virtual wire mode might be active. +	 */ +	if (smp_found_config || !boot_cpu_has(X86_FEATURE_APIC)) +		return; + +	/* +	 * Do not trust the local APIC being empty at bootup. +	 */ +	clear_local_APIC(); + +	/* +	 * Enable APIC. +	 */ +	value = apic_read(APIC_SPIV); +	value &= ~APIC_VECTOR_MASK; +	value |= APIC_SPIV_APIC_ENABLED; + +#ifdef CONFIG_X86_32 +	/* This bit is reserved on P4/Xeon and should be cleared */ +	if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && +	    (boot_cpu_data.x86 == 15)) +		value &= ~APIC_SPIV_FOCUS_DISABLED; +	else +#endif +		value |= APIC_SPIV_FOCUS_DISABLED; +	value |= SPURIOUS_APIC_VECTOR; +	apic_write(APIC_SPIV, value); + +	/* +	 * Set up the virtual wire mode. +	 */ +	apic_write(APIC_LVT0, APIC_DM_EXTINT); +	value = APIC_DM_NMI; +	if (!lapic_is_integrated())		/* 82489DX */ +		value |= APIC_LVT_LEVEL_TRIGGER; +	if (apic_extnmi == APIC_EXTNMI_NONE) +		value |= APIC_LVT_MASKED; +	apic_write(APIC_LVT1, value); +} +  /* Init the interrupt delivery mode for the BSP */  void __init apic_intr_mode_init(void)  { @@ -2626,11 +2675,13 @@ static int __init apic_set_verbosity(char *arg)  		apic_verbosity = APIC_DEBUG;  	else if (strcmp("verbose", arg) == 0)  		apic_verbosity = APIC_VERBOSE; +#ifdef CONFIG_X86_64  	else {  		pr_warning("APIC Verbosity level %s not recognised"  			" use apic=verbose or apic=debug\n", arg);  		return -EINVAL;  	} +#endif  	return 0;  } |