diff options
Diffstat (limited to 'drivers/edac/e752x_edac.c')
-rw-r--r-- | drivers/edac/e752x_edac.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index 4fbc5892bc2b..12e7677b834b 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #define EDAC_MOD_STR "e752x_edac" | 29 | #define EDAC_MOD_STR "e752x_edac" |
30 | 30 | ||
31 | static int force_function_unhide; | 31 | static int force_function_unhide; |
32 | static int sysbus_parity = -1; | ||
32 | 33 | ||
33 | static struct edac_pci_ctl_info *e752x_pci; | 34 | static struct edac_pci_ctl_info *e752x_pci; |
34 | 35 | ||
@@ -1049,6 +1050,37 @@ fail: | |||
1049 | return 1; | 1050 | return 1; |
1050 | } | 1051 | } |
1051 | 1052 | ||
1053 | /* Setup system bus parity mask register. | ||
1054 | * Sysbus parity supported on: | ||
1055 | * e7320/e7520/e7525 + Xeon | ||
1056 | * i3100 + Xeon/Celeron | ||
1057 | * Sysbus parity not supported on: | ||
1058 | * i3100 + Pentium M/Celeron M/Core Duo/Core2 Duo | ||
1059 | */ | ||
1060 | static void e752x_init_sysbus_parity_mask(struct e752x_pvt *pvt) | ||
1061 | { | ||
1062 | char *cpu_id = cpu_data(0).x86_model_id; | ||
1063 | struct pci_dev *dev = pvt->dev_d0f1; | ||
1064 | int enable = 1; | ||
1065 | |||
1066 | /* Allow module paramter override, else see if CPU supports parity */ | ||
1067 | if (sysbus_parity != -1) { | ||
1068 | enable = sysbus_parity; | ||
1069 | } else if (cpu_id[0] && | ||
1070 | ((strstr(cpu_id, "Pentium") && strstr(cpu_id, " M ")) || | ||
1071 | (strstr(cpu_id, "Celeron") && strstr(cpu_id, " M ")) || | ||
1072 | (strstr(cpu_id, "Core") && strstr(cpu_id, "Duo")))) { | ||
1073 | e752x_printk(KERN_INFO, "System Bus Parity not " | ||
1074 | "supported by CPU, disabling\n"); | ||
1075 | enable = 0; | ||
1076 | } | ||
1077 | |||
1078 | if (enable) | ||
1079 | pci_write_config_word(dev, E752X_SYSBUS_ERRMASK, 0x0000); | ||
1080 | else | ||
1081 | pci_write_config_word(dev, E752X_SYSBUS_ERRMASK, 0x0309); | ||
1082 | } | ||
1083 | |||
1052 | static void e752x_init_error_reporting_regs(struct e752x_pvt *pvt) | 1084 | static void e752x_init_error_reporting_regs(struct e752x_pvt *pvt) |
1053 | { | 1085 | { |
1054 | struct pci_dev *dev; | 1086 | struct pci_dev *dev; |
@@ -1062,7 +1094,9 @@ static void e752x_init_error_reporting_regs(struct e752x_pvt *pvt) | |||
1062 | pci_write_config_byte(dev, E752X_HI_ERRMASK, 0x00); | 1094 | pci_write_config_byte(dev, E752X_HI_ERRMASK, 0x00); |
1063 | pci_write_config_byte(dev, E752X_HI_SMICMD, 0x00); | 1095 | pci_write_config_byte(dev, E752X_HI_SMICMD, 0x00); |
1064 | } | 1096 | } |
1065 | pci_write_config_word(dev, E752X_SYSBUS_ERRMASK, 0x00); | 1097 | |
1098 | e752x_init_sysbus_parity_mask(pvt); | ||
1099 | |||
1066 | pci_write_config_word(dev, E752X_SYSBUS_SMICMD, 0x00); | 1100 | pci_write_config_word(dev, E752X_SYSBUS_SMICMD, 0x00); |
1067 | pci_write_config_byte(dev, E752X_BUF_ERRMASK, 0x00); | 1101 | pci_write_config_byte(dev, E752X_BUF_ERRMASK, 0x00); |
1068 | pci_write_config_byte(dev, E752X_BUF_SMICMD, 0x00); | 1102 | pci_write_config_byte(dev, E752X_BUF_SMICMD, 0x00); |
@@ -1291,3 +1325,7 @@ MODULE_PARM_DESC(force_function_unhide, "if BIOS sets Dev0:Fun1 up as hidden:" | |||
1291 | " 1=force unhide and hope BIOS doesn't fight driver for Dev0:Fun1 access"); | 1325 | " 1=force unhide and hope BIOS doesn't fight driver for Dev0:Fun1 access"); |
1292 | module_param(edac_op_state, int, 0444); | 1326 | module_param(edac_op_state, int, 0444); |
1293 | MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI"); | 1327 | MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI"); |
1328 | |||
1329 | module_param(sysbus_parity, int, 0444); | ||
1330 | MODULE_PARM_DESC(sysbus_parity, "0=disable system bus parity checking," | ||
1331 | " 1=enable system bus parity checking, default=auto-detect"); | ||