diff options
Diffstat (limited to 'arch/x86/kernel/apic')
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 59 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/vector.c | 6 | 
2 files changed, 33 insertions, 32 deletions
| diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 5f973fed3c9f..e53dda210cd7 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -352,8 +352,6 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)  		 * According to Intel, MFENCE can do the serialization here.  		 */  		asm volatile("mfence" : : : "memory"); - -		printk_once(KERN_DEBUG "TSC deadline timer enabled\n");  		return;  	} @@ -546,13 +544,7 @@ static struct clock_event_device lapic_clockevent = {  };  static DEFINE_PER_CPU(struct clock_event_device, lapic_events); -#define DEADLINE_MODEL_MATCH_FUNC(model, func)	\ -	{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&func } - -#define DEADLINE_MODEL_MATCH_REV(model, rev)	\ -	{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)rev } - -static u32 hsx_deadline_rev(void) +static __init u32 hsx_deadline_rev(void)  {  	switch (boot_cpu_data.x86_stepping) {  	case 0x02: return 0x3a; /* EP */ @@ -562,7 +554,7 @@ static u32 hsx_deadline_rev(void)  	return ~0U;  } -static u32 bdx_deadline_rev(void) +static __init u32 bdx_deadline_rev(void)  {  	switch (boot_cpu_data.x86_stepping) {  	case 0x02: return 0x00000011; @@ -574,7 +566,7 @@ static u32 bdx_deadline_rev(void)  	return ~0U;  } -static u32 skx_deadline_rev(void) +static __init u32 skx_deadline_rev(void)  {  	switch (boot_cpu_data.x86_stepping) {  	case 0x03: return 0x01000136; @@ -587,40 +579,41 @@ static u32 skx_deadline_rev(void)  	return ~0U;  } -static const struct x86_cpu_id deadline_match[] = { -	DEADLINE_MODEL_MATCH_FUNC( INTEL_FAM6_HASWELL_X,	hsx_deadline_rev), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL_X,	0x0b000020), -	DEADLINE_MODEL_MATCH_FUNC( INTEL_FAM6_BROADWELL_D,	bdx_deadline_rev), -	DEADLINE_MODEL_MATCH_FUNC( INTEL_FAM6_SKYLAKE_X,	skx_deadline_rev), +static const struct x86_cpu_id deadline_match[] __initconst = { +	X86_MATCH_INTEL_FAM6_MODEL( HASWELL_X,		&hsx_deadline_rev), +	X86_MATCH_INTEL_FAM6_MODEL( BROADWELL_X,	0x0b000020), +	X86_MATCH_INTEL_FAM6_MODEL( BROADWELL_D,	&bdx_deadline_rev), +	X86_MATCH_INTEL_FAM6_MODEL( SKYLAKE_X,		&skx_deadline_rev), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL,		0x22), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL_L,	0x20), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL_G,	0x17), +	X86_MATCH_INTEL_FAM6_MODEL( HASWELL,		0x22), +	X86_MATCH_INTEL_FAM6_MODEL( HASWELL_L,		0x20), +	X86_MATCH_INTEL_FAM6_MODEL( HASWELL_G,		0x17), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL,	0x25), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL_G,	0x17), +	X86_MATCH_INTEL_FAM6_MODEL( BROADWELL,		0x25), +	X86_MATCH_INTEL_FAM6_MODEL( BROADWELL_G,	0x17), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_SKYLAKE_L,	0xb2), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_SKYLAKE,		0xb2), +	X86_MATCH_INTEL_FAM6_MODEL( SKYLAKE_L,		0xb2), +	X86_MATCH_INTEL_FAM6_MODEL( SKYLAKE,		0xb2), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_KABYLAKE_L,	0x52), -	DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_KABYLAKE,		0x52), +	X86_MATCH_INTEL_FAM6_MODEL( KABYLAKE_L,		0x52), +	X86_MATCH_INTEL_FAM6_MODEL( KABYLAKE,		0x52),  	{},  }; -static void apic_check_deadline_errata(void) +static __init bool apic_validate_deadline_timer(void)  {  	const struct x86_cpu_id *m;  	u32 rev; -	if (!boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER) || -	    boot_cpu_has(X86_FEATURE_HYPERVISOR)) -		return; +	if (!boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER)) +		return false; +	if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) +		return true;  	m = x86_match_cpu(deadline_match);  	if (!m) -		return; +		return true;  	/*  	 * Function pointers will have the MSB set due to address layout, @@ -632,11 +625,12 @@ static void apic_check_deadline_errata(void)  		rev = (u32)m->driver_data;  	if (boot_cpu_data.microcode >= rev) -		return; +		return true;  	setup_clear_cpu_cap(X86_FEATURE_TSC_DEADLINE_TIMER);  	pr_err(FW_BUG "TSC_DEADLINE disabled due to Errata; "  	       "please update microcode to version: 0x%x (or later)\n", rev); +	return false;  }  /* @@ -2098,7 +2092,8 @@ void __init init_apic_mappings(void)  {  	unsigned int new_apicid; -	apic_check_deadline_errata(); +	if (apic_validate_deadline_timer()) +		pr_debug("TSC deadline timer available\n");  	if (x2apic_mode) {  		boot_cpu_physical_apicid = read_apic_id(); diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index 48293d15f1e1..67768e54438b 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c @@ -557,6 +557,12 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq,  		irqd->hwirq = virq + i;  		irqd_set_single_target(irqd);  		/* +		 * Prevent that any of these interrupts is invoked in +		 * non interrupt context via e.g. generic_handle_irq() +		 * as that can corrupt the affinity move state. +		 */ +		irqd_set_handle_enforce_irqctx(irqd); +		/*  		 * Legacy vectors are already assigned when the IOAPIC  		 * takes them over. They stay on the same vector. This is  		 * required for check_timer() to work correctly as it might |