Merge branch 'x86/mce' into x86/ras
[cascardo/linux.git] / arch / x86 / kernel / cpu / mcheck / mce_intel.c
index d564053..4cfe045 100644 (file)
@@ -203,6 +203,10 @@ static void cmci_discover(int banks)
                if (test_bit(i, owned))
                        continue;
 
+               /* Skip banks in firmware first mode */
+               if (test_bit(i, mce_banks_ce_disabled))
+                       continue;
+
                rdmsrl(MSR_IA32_MCx_CTL2(i), val);
 
                /* Already owned by someone else? */
@@ -271,6 +275,19 @@ void cmci_recheck(void)
        local_irq_restore(flags);
 }
 
+/* Caller must hold the lock on cmci_discover_lock */
+static void __cmci_disable_bank(int bank)
+{
+       u64 val;
+
+       if (!test_bit(bank, __get_cpu_var(mce_banks_owned)))
+               return;
+       rdmsrl(MSR_IA32_MCx_CTL2(bank), val);
+       val &= ~MCI_CTL2_CMCI_EN;
+       wrmsrl(MSR_IA32_MCx_CTL2(bank), val);
+       __clear_bit(bank, __get_cpu_var(mce_banks_owned));
+}
+
 /*
  * Disable CMCI on this CPU for all banks it owns when it goes down.
  * This allows other CPUs to claim the banks on rediscovery.
@@ -280,20 +297,12 @@ void cmci_clear(void)
        unsigned long flags;
        int i;
        int banks;
-       u64 val;
 
        if (!cmci_supported(&banks))
                return;
        raw_spin_lock_irqsave(&cmci_discover_lock, flags);
-       for (i = 0; i < banks; i++) {
-               if (!test_bit(i, __get_cpu_var(mce_banks_owned)))
-                       continue;
-               /* Disable CMCI */
-               rdmsrl(MSR_IA32_MCx_CTL2(i), val);
-               val &= ~MCI_CTL2_CMCI_EN;
-               wrmsrl(MSR_IA32_MCx_CTL2(i), val);
-               __clear_bit(i, __get_cpu_var(mce_banks_owned));
-       }
+       for (i = 0; i < banks; i++)
+               __cmci_disable_bank(i);
        raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);
 }
 
@@ -327,6 +336,19 @@ void cmci_reenable(void)
                cmci_discover(banks);
 }
 
+void cmci_disable_bank(int bank)
+{
+       int banks;
+       unsigned long flags;
+
+       if (!cmci_supported(&banks))
+               return;
+
+       raw_spin_lock_irqsave(&cmci_discover_lock, flags);
+       __cmci_disable_bank(bank);
+       raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);
+}
+
 static void intel_init_cmci(void)
 {
        int banks;