|
@@ -431,6 +431,35 @@ static void deferred_error_interrupt_enable(struct cpuinfo_x86 *c)
|
|
|
wrmsr(MSR_CU_DEF_ERR, low, high);
|
|
|
}
|
|
|
|
|
|
+static u32 smca_get_block_address(unsigned int cpu, unsigned int bank,
|
|
|
+ unsigned int block)
|
|
|
+{
|
|
|
+ u32 low, high;
|
|
|
+ u32 addr = 0;
|
|
|
+
|
|
|
+ if (smca_get_bank_type(bank) == SMCA_RESERVED)
|
|
|
+ return addr;
|
|
|
+
|
|
|
+ if (!block)
|
|
|
+ return MSR_AMD64_SMCA_MCx_MISC(bank);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * For SMCA enabled processors, BLKPTR field of the first MISC register
|
|
|
+ * (MCx_MISC0) indicates presence of additional MISC regs set (MISC1-4).
|
|
|
+ */
|
|
|
+ if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_CONFIG(bank), &low, &high))
|
|
|
+ return addr;
|
|
|
+
|
|
|
+ if (!(low & MCI_CONFIG_MCAX))
|
|
|
+ return addr;
|
|
|
+
|
|
|
+ if (!rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) &&
|
|
|
+ (low & MASK_BLKPTR_LO))
|
|
|
+ return MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1);
|
|
|
+
|
|
|
+ return addr;
|
|
|
+}
|
|
|
+
|
|
|
static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 high,
|
|
|
unsigned int bank, unsigned int block)
|
|
|
{
|
|
@@ -451,32 +480,8 @@ static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 hi
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (mce_flags.smca) {
|
|
|
- if (smca_get_bank_type(bank) == SMCA_RESERVED)
|
|
|
- return addr;
|
|
|
-
|
|
|
- if (!block) {
|
|
|
- addr = MSR_AMD64_SMCA_MCx_MISC(bank);
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * For SMCA enabled processors, BLKPTR field of the
|
|
|
- * first MISC register (MCx_MISC0) indicates presence of
|
|
|
- * additional MISC register set (MISC1-4).
|
|
|
- */
|
|
|
- u32 low, high;
|
|
|
-
|
|
|
- if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_CONFIG(bank), &low, &high))
|
|
|
- return addr;
|
|
|
-
|
|
|
- if (!(low & MCI_CONFIG_MCAX))
|
|
|
- return addr;
|
|
|
-
|
|
|
- if (!rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) &&
|
|
|
- (low & MASK_BLKPTR_LO))
|
|
|
- addr = MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1);
|
|
|
- }
|
|
|
- return addr;
|
|
|
- }
|
|
|
+ if (mce_flags.smca)
|
|
|
+ return smca_get_block_address(cpu, bank, block);
|
|
|
|
|
|
/* Fall back to method we used for older processors: */
|
|
|
switch (block) {
|