Skip to content

Commit

Permalink
x86/mce/AMD: Fix LVT offset configuration for thresholding
Browse files Browse the repository at this point in the history
For processor families with the Scalable MCA feature, the LVT
offset for threshold interrupts is configured only in MSR
0xC0000410 and not in each per bank MISC register as was done in
earlier families.

Obtain the LVT offset from the correct MSR for those families.

Signed-off-by: Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Link: http://lkml.kernel.org/r/1453750913-4781-7-git-send-email-bp@alien8.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Aravind Gopalakrishnan authored and Ingo Molnar committed Feb 1, 2016
1 parent 60f116f commit f57a1f3
Showing 1 changed file with 26 additions and 1 deletion.
27 changes: 26 additions & 1 deletion arch/x86/kernel/cpu/mcheck/mce_amd.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@
#define DEF_LVT_OFF 0x2
#define DEF_INT_TYPE_APIC 0x2

/* Scalable MCA: */

/* Threshold LVT offset is at MSR0xC0000410[15:12] */
#define SMCA_THR_LVT_OFF 0xF000

static const char * const th_names[] = {
"load_store",
"insn_fetch",
Expand Down Expand Up @@ -142,6 +147,14 @@ static int lvt_off_valid(struct threshold_block *b, int apic, u32 lo, u32 hi)
}

if (apic != msr) {
/*
* On SMCA CPUs, LVT offset is programmed at a different MSR, and
* the BIOS provides the value. The original field where LVT offset
* was set is reserved. Return early here:
*/
if (mce_flags.smca)
return 0;

pr_err(FW_BUG "cpu %d, invalid threshold interrupt offset %d "
"for bank %d, block %d (MSR%08X=0x%x%08x)\n",
b->cpu, apic, b->bank, b->block, b->address, hi, lo);
Expand Down Expand Up @@ -300,7 +313,19 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
goto init;

b.interrupt_enable = 1;
new = (high & MASK_LVTOFF_HI) >> 20;

if (mce_flags.smca) {
u32 smca_low, smca_high;

/* Gather LVT offset for thresholding: */
if (rdmsr_safe(MSR_CU_DEF_ERR, &smca_low, &smca_high))
break;

new = (smca_low & SMCA_THR_LVT_OFF) >> 12;
} else {
new = (high & MASK_LVTOFF_HI) >> 20;
}

offset = setup_APIC_mce_threshold(offset, new);

if ((offset == new) &&
Expand Down

0 comments on commit f57a1f3

Please sign in to comment.