From 73ca5358aab55e2e29993a31f3776c54c05ae729 Mon Sep 17 00:00:00 2001
From: Shaohua Li <shaohua.li@intel.com>
Date: Wed, 11 Jan 2006 22:43:06 +0100
Subject: [PATCH] [PATCH] x86_64: increase MCE bank counts

There is one CPU here whose MCE bank count is 6. This patch increases
x86_64's MCE bank count.

Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---
 arch/x86_64/kernel/mce.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/arch/x86_64/kernel/mce.c b/arch/x86_64/kernel/mce.c
index 63777b8cb8c1..281ad5f1f86a 100644
--- a/arch/x86_64/kernel/mce.c
+++ b/arch/x86_64/kernel/mce.c
@@ -26,7 +26,7 @@
 #include <asm/uaccess.h>
 
 #define MISC_MCELOG_MINOR 227
-#define NR_BANKS 5
+#define NR_BANKS 6
 
 static int mce_dont_init;
 
@@ -574,6 +574,10 @@ ACCESSOR(bank1ctl,bank[1],mce_restart())
 ACCESSOR(bank2ctl,bank[2],mce_restart())
 ACCESSOR(bank3ctl,bank[3],mce_restart())
 ACCESSOR(bank4ctl,bank[4],mce_restart())
+ACCESSOR(bank5ctl,bank[5],mce_restart())
+static struct sysdev_attribute * bank_attributes[NR_BANKS] = {
+	&attr_bank0ctl, &attr_bank1ctl, &attr_bank2ctl,
+	&attr_bank3ctl, &attr_bank4ctl, &attr_bank5ctl};
 ACCESSOR(tolerant,tolerant,)
 ACCESSOR(check_interval,check_interval,mce_restart())
 
@@ -581,6 +585,7 @@ ACCESSOR(check_interval,check_interval,mce_restart())
 static __cpuinit int mce_create_device(unsigned int cpu)
 {
 	int err;
+	int i;
 	if (!mce_available(&cpu_data[cpu]))
 		return -EIO;
 
@@ -590,11 +595,9 @@ static __cpuinit int mce_create_device(unsigned int cpu)
 	err = sysdev_register(&per_cpu(device_mce,cpu));
 
 	if (!err) {
-		sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank0ctl);
-		sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank1ctl);
-		sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank2ctl);
-		sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank3ctl);
-		sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank4ctl);
+		for (i = 0; i < banks; i++)
+			sysdev_create_file(&per_cpu(device_mce,cpu),
+				bank_attributes[i]);
 		sysdev_create_file(&per_cpu(device_mce,cpu), &attr_tolerant);
 		sysdev_create_file(&per_cpu(device_mce,cpu), &attr_check_interval);
 	}
@@ -604,11 +607,11 @@ static __cpuinit int mce_create_device(unsigned int cpu)
 #ifdef CONFIG_HOTPLUG_CPU
 static __cpuinit void mce_remove_device(unsigned int cpu)
 {
-	sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank0ctl);
-	sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank1ctl);
-	sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank2ctl);
-	sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank3ctl);
-	sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank4ctl);
+	int i;
+
+	for (i = 0; i < banks; i++)
+		sysdev_remove_file(&per_cpu(device_mce,cpu),
+			bank_attributes[i]);
 	sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_tolerant);
 	sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_check_interval);
 	sysdev_unregister(&per_cpu(device_mce,cpu));