The patch titled Extended interrupt LVT support for AMD Barcelona has been added to the -mm tree. Its filename is extended-interrupt-lvt-support-for-amd-barcelona.patch *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: Extended interrupt LVT support for AMD Barcelona From: "Robert Richter" <robert.richter@xxxxxxx> This patch adds extended interrupt support for AMD Barcelona CPUs. The patch provides functions to setup MCE and IBS interrupt vectors. Compared to the previous K8 implementation the vector offsets are centrally handled now in apic_64.c. Thus, the APIC setup code is responsible for vector mappings. The vector mapping is hardcoded for now. Also macro definitions in apicdef.h has been updated. Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Cc: Andi Kleen <ak@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- arch/x86/kernel/apic_64.c | 26 ++++++++++++++++++---- arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 10 ++++---- include/asm-x86/apic.h | 4 +-- include/asm-x86/apicdef.h | 19 ++++++++++------ 4 files changed, 41 insertions(+), 18 deletions(-) diff -puN arch/x86/kernel/apic_64.c~extended-interrupt-lvt-support-for-amd-barcelona arch/x86/kernel/apic_64.c --- a/arch/x86/kernel/apic_64.c~extended-interrupt-lvt-support-for-amd-barcelona +++ a/arch/x86/kernel/apic_64.c @@ -187,17 +187,35 @@ static void __setup_APIC_LVTT(unsigned i } /* - * Setup extended LVT (K8 specific) + * Setup extended LVT, AMD specific (K8, family 10h) + * + * Vector mappings are hard coded. On K8 only offset 0 (APIC500) and + * MCE interrupts are supported. Thus MCE offset must be set to 0. */ -void setup_APIC_extended_lvt(unsigned char lvt_off, unsigned char vector, - unsigned char msg_type, unsigned char mask) + +#define APIC_EILVT_LVTOFF_MCE 0 +#define APIC_EILVT_LVTOFF_IBS 1 + +static void setup_APIC_eilvt(u8 lvt_off, u8 vector, u8 msg_type, u8 mask) { - unsigned long reg = (lvt_off << 4) + K8_APIC_EXT_LVT_BASE; + unsigned long reg = (lvt_off << 4) + APIC_EILVT0; unsigned int v = (mask << 16) | (msg_type << 8) | vector; apic_write(reg, v); } +u8 setup_APIC_eilvt_mce(u8 vector, u8 msg_type, u8 mask) +{ + setup_APIC_eilvt(APIC_EILVT_LVTOFF_MCE, vector, msg_type, mask); + return APIC_EILVT_LVTOFF_MCE; +} + +u8 setup_APIC_eilvt_ibs(u8 vector, u8 msg_type, u8 mask) +{ + setup_APIC_eilvt(APIC_EILVT_LVTOFF_IBS, vector, msg_type, mask); + return APIC_EILVT_LVTOFF_IBS; +} + /* * Program the next event, relative to now */ diff -puN arch/x86/kernel/cpu/mcheck/mce_amd_64.c~extended-interrupt-lvt-support-for-amd-barcelona arch/x86/kernel/cpu/mcheck/mce_amd_64.c --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c~extended-interrupt-lvt-support-for-amd-barcelona +++ a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c @@ -118,6 +118,7 @@ void __cpuinit mce_amd_feature_init(stru { unsigned int bank, block; unsigned int cpu = smp_processor_id(); + u8 lvt_off; u32 low = 0, high = 0, address = 0; for (bank = 0; bank < NR_BANKS; ++bank) { @@ -153,14 +154,13 @@ void __cpuinit mce_amd_feature_init(stru if (shared_bank[bank] && c->cpu_core_id) break; #endif + lvt_off = setup_APIC_eilvt_mce(THRESHOLD_APIC_VECTOR, + APIC_EILVT_MSG_FIX, 0); + high &= ~MASK_LVTOFF_HI; - high |= K8_APIC_EXT_LVT_ENTRY_THRESHOLD << 20; + high |= lvt_off << 20; wrmsr(address, low, high); - setup_APIC_extended_lvt(K8_APIC_EXT_LVT_ENTRY_THRESHOLD, - THRESHOLD_APIC_VECTOR, - K8_APIC_EXT_INT_MSG_FIX, 0); - threshold_defaults.address = address; threshold_restart_bank(&threshold_defaults, 0, 0); } diff -puN include/asm-x86/apicdef.h~extended-interrupt-lvt-support-for-amd-barcelona include/asm-x86/apicdef.h --- a/include/asm-x86/apicdef.h~extended-interrupt-lvt-support-for-amd-barcelona +++ a/include/asm-x86/apicdef.h @@ -116,13 +116,18 @@ #define APIC_TDR_DIV_32 0x8 #define APIC_TDR_DIV_64 0x9 #define APIC_TDR_DIV_128 0xA - -#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 +#define APIC_EILVT0 0x500 +#define APIC_EILVT_NR_AMD_K8 1 /* Number of extended interrupts */ +#define APIC_EILVT_NR_AMD_10H 4 +#define APIC_EILVT_LVTOFF(x) (((x)>>4)&0xF) +#define APIC_EILVT_MSG_FIX 0x0 +#define APIC_EILVT_MSG_SMI 0x2 +#define APIC_EILVT_MSG_NMI 0x4 +#define APIC_EILVT_MSG_EXT 0x7 +#define APIC_EILVT_MASKED (1<<16) +#define APIC_EILVT1 0x510 +#define APIC_EILVT2 0x520 +#define APIC_EILVT3 0x530 #define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) diff -puN include/asm-x86/apic.h~extended-interrupt-lvt-support-for-amd-barcelona include/asm-x86/apic.h --- a/include/asm-x86/apic.h~extended-interrupt-lvt-support-for-amd-barcelona +++ a/include/asm-x86/apic.h @@ -126,8 +126,8 @@ extern void enable_NMI_through_LVT0(void extern void setup_apic_routing(void); #endif -extern void setup_APIC_extended_lvt(unsigned char lvt_off, unsigned char vector, - unsigned char msg_type, unsigned char mask); +extern u8 setup_APIC_eilvt_mce(u8 vector, u8 msg_type, u8 mask); +extern u8 setup_APIC_eilvt_ibs(u8 vector, u8 msg_type, u8 mask); extern int apic_is_clustered_box(void); _ Patches currently in -mm which might be from robert.richter@xxxxxxx are git-x86.patch extended-interrupt-lvt-support-for-amd-barcelona.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html