diff options
-rw-r--r-- | drivers/edac/mce_amd_inj.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/edac/mce_amd_inj.c b/drivers/edac/mce_amd_inj.c index 7f3a97a5ad17..15f6aa18b2f8 100644 --- a/drivers/edac/mce_amd_inj.c +++ b/drivers/edac/mce_amd_inj.c | |||
@@ -25,6 +25,8 @@ | |||
25 | static struct mce i_mce; | 25 | static struct mce i_mce; |
26 | static struct dentry *dfs_inj; | 26 | static struct dentry *dfs_inj; |
27 | 27 | ||
28 | static u8 n_banks; | ||
29 | |||
28 | #define MCE_INJECT_SET(reg) \ | 30 | #define MCE_INJECT_SET(reg) \ |
29 | static int inj_##reg##_set(void *data, u64 val) \ | 31 | static int inj_##reg##_set(void *data, u64 val) \ |
30 | { \ | 32 | { \ |
@@ -174,11 +176,9 @@ static int inj_bank_set(void *data, u64 val) | |||
174 | { | 176 | { |
175 | struct mce *m = (struct mce *)data; | 177 | struct mce *m = (struct mce *)data; |
176 | 178 | ||
177 | if (val > 5) { | 179 | if (val >= n_banks) { |
178 | if (boot_cpu_data.x86 != 0x15 || val > 6) { | 180 | pr_err("Non-existent MCE bank: %llu\n", val); |
179 | pr_err("Non-existent MCE bank: %llu\n", val); | 181 | return -EINVAL; |
180 | return -EINVAL; | ||
181 | } | ||
182 | } | 182 | } |
183 | 183 | ||
184 | m->bank = val; | 184 | m->bank = val; |
@@ -207,6 +207,10 @@ static struct dfs_node { | |||
207 | static int __init init_mce_inject(void) | 207 | static int __init init_mce_inject(void) |
208 | { | 208 | { |
209 | int i; | 209 | int i; |
210 | u64 cap; | ||
211 | |||
212 | rdmsrl(MSR_IA32_MCG_CAP, cap); | ||
213 | n_banks = cap & MCG_BANKCNT_MASK; | ||
210 | 214 | ||
211 | dfs_inj = debugfs_create_dir("mce-inject", NULL); | 215 | dfs_inj = debugfs_create_dir("mce-inject", NULL); |
212 | if (!dfs_inj) | 216 | if (!dfs_inj) |