|
@@ -191,6 +191,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? */
|
|
@@ -259,6 +263,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.
|
|
@@ -268,20 +285,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);
|
|
|
}
|
|
|
|
|
@@ -315,6 +324,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;
|