Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17fc14ff authored by Jacob Shin's avatar Jacob Shin Committed by Linus Torvalds
Browse files

[PATCH] x86_64: apic support for extended apic interrupt



Add support for extended APIC LVT found in future AMD processors.

Signed-off-by: default avatarJacob Shin <jacob.shin@amd.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c38bfdc8
Loading
Loading
Loading
Loading
+4 −6
Original line number Original line Diff line number Diff line
@@ -909,15 +909,13 @@ int setup_profiling_timer(unsigned int multiplier)
	return -EINVAL;
	return -EINVAL;
}
}


#ifdef CONFIG_X86_MCE_AMD
void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector,
void setup_threshold_lvt(unsigned long lvt_off)
			    unsigned char msg_type, unsigned char mask)
{
{
	unsigned int v = 0;
	unsigned long reg = (lvt_off << 4) + K8_APIC_EXT_LVT_BASE;
	unsigned long reg = (lvt_off << 4) + 0x500;
	unsigned int  v   = (mask << 16) | (msg_type << 8) | vector;
	v |= THRESHOLD_APIC_VECTOR;
	apic_write(reg, v);
	apic_write(reg, v);
}
}
#endif /* CONFIG_X86_MCE_AMD */


#undef APIC_DIVISOR
#undef APIC_DIVISOR


+10 −1
Original line number Original line Diff line number Diff line
@@ -84,9 +84,18 @@ extern void disable_APIC_timer(void);
extern void enable_APIC_timer(void);
extern void enable_APIC_timer(void);
extern void clustered_apic_check(void);
extern void clustered_apic_check(void);


extern void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector,
				   unsigned char msg_type, unsigned char mask);

#define K8_APIC_EXT_LVT_BASE    0x500
#define K8_APIC_EXT_INT_MSG_FIX 0x0
#define K8_APIC_EXT_INT_MSG_SMI 0x2
#define K8_APIC_EXT_INT_MSG_NMI 0x4
#define K8_APIC_EXT_INT_MSG_EXT 0x7
#define K8_APIC_EXT_LVT_ENTRY_THRESHOLD    0

extern int disable_timer_pin_1;
extern int disable_timer_pin_1;


extern void setup_threshold_lvt(unsigned long lvt_off);


void smp_send_timer_broadcast_ipi(void);
void smp_send_timer_broadcast_ipi(void);
void switch_APIC_timer_to_ipi(void *cpumask);
void switch_APIC_timer_to_ipi(void *cpumask);