diff options
-rw-r--r-- | drivers/edac/amd64_edac.c | 76 |
1 files changed, 25 insertions, 51 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 173dc4a84166..bde3d027c2d3 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
@@ -2783,7 +2783,7 @@ static void check_mcg_ctl(void *ret) | |||
2783 | } | 2783 | } |
2784 | 2784 | ||
2785 | /* check MCG_CTL on all the cpus on this node */ | 2785 | /* check MCG_CTL on all the cpus on this node */ |
2786 | static int amd64_mcg_ctl_enabled_on_cpus(const cpumask_t *mask) | 2786 | static int mcg_ctl_enabled_on_node(const struct cpumask *mask) |
2787 | { | 2787 | { |
2788 | int ret = 1; | 2788 | int ret = 1; |
2789 | preempt_disable(); | 2789 | preempt_disable(); |
@@ -2799,71 +2799,45 @@ static int amd64_mcg_ctl_enabled_on_cpus(const cpumask_t *mask) | |||
2799 | * the memory system completely. A command line option allows to force-enable | 2799 | * the memory system completely. A command line option allows to force-enable |
2800 | * hardware ECC later in amd64_enable_ecc_error_reporting(). | 2800 | * hardware ECC later in amd64_enable_ecc_error_reporting(). |
2801 | */ | 2801 | */ |
2802 | static const char *ecc_warning = | ||
2803 | "WARNING: ECC is disabled by BIOS. Module will NOT be loaded.\n" | ||
2804 | " Either Enable ECC in the BIOS, or set 'ecc_enable_override'.\n" | ||
2805 | " Also, use of the override can cause unknown side effects.\n"; | ||
2806 | |||
2802 | static int amd64_check_ecc_enabled(struct amd64_pvt *pvt) | 2807 | static int amd64_check_ecc_enabled(struct amd64_pvt *pvt) |
2803 | { | 2808 | { |
2804 | u32 value; | 2809 | u32 value; |
2805 | int err = 0, ret = 0; | 2810 | int err = 0; |
2806 | u8 ecc_enabled = 0; | 2811 | u8 ecc_enabled = 0, mcg_ctl_en = 0; |
2807 | 2812 | ||
2808 | err = pci_read_config_dword(pvt->misc_f3_ctl, K8_NBCFG, &value); | 2813 | err = pci_read_config_dword(pvt->misc_f3_ctl, K8_NBCFG, &value); |
2809 | if (err) | 2814 | if (err) |
2810 | debugf0("Reading K8_NBCTL failed\n"); | 2815 | debugf0("Reading K8_NBCTL failed\n"); |
2811 | 2816 | ||
2812 | ecc_enabled = !!(value & K8_NBCFG_ECC_ENABLE); | 2817 | ecc_enabled = !!(value & K8_NBCFG_ECC_ENABLE); |
2818 | if (!ecc_enabled) | ||
2819 | amd64_printk(KERN_WARNING, "This node reports that Memory ECC " | ||
2820 | "is currently disabled, set F3x%x[22] (%s).\n", | ||
2821 | K8_NBCFG, pci_name(pvt->misc_f3_ctl)); | ||
2822 | else | ||
2823 | amd64_printk(KERN_INFO, "ECC is enabled by BIOS.\n"); | ||
2813 | 2824 | ||
2814 | ret = amd64_mcg_ctl_enabled_on_cpus(cpumask_of_node(pvt->mc_node_id)); | 2825 | mcg_ctl_en = mcg_ctl_enabled_on_node(cpumask_of_node(pvt->mc_node_id)); |
2815 | 2826 | if (!mcg_ctl_en) | |
2816 | debugf0("K8_NBCFG=0x%x, DRAM ECC is %s\n", value, | 2827 | amd64_printk(KERN_WARNING, "NB MCE bank disabled, set MSR " |
2817 | (value & K8_NBCFG_ECC_ENABLE ? "enabled" : "disabled")); | 2828 | "0x%08x[4] on node %d to enable.\n", |
2818 | 2829 | MSR_IA32_MCG_CTL, pvt->mc_node_id); | |
2819 | if (!ecc_enabled || !ret) { | ||
2820 | if (!ecc_enabled) { | ||
2821 | amd64_printk(KERN_WARNING, "This node reports that " | ||
2822 | "Memory ECC is currently " | ||
2823 | "disabled.\n"); | ||
2824 | 2830 | ||
2825 | amd64_printk(KERN_WARNING, "bit 0x%lx in register " | 2831 | if (!ecc_enabled || !mcg_ctl_en) { |
2826 | "F3x%x of the MISC_CONTROL device (%s) " | ||
2827 | "should be enabled\n", K8_NBCFG_ECC_ENABLE, | ||
2828 | K8_NBCFG, pci_name(pvt->misc_f3_ctl)); | ||
2829 | } | ||
2830 | if (!ret) { | ||
2831 | amd64_printk(KERN_WARNING, "bit 0x%016lx in MSR 0x%08x " | ||
2832 | "of node %d should be enabled\n", | ||
2833 | K8_MSR_MCGCTL_NBE, MSR_IA32_MCG_CTL, | ||
2834 | pvt->mc_node_id); | ||
2835 | } | ||
2836 | if (!ecc_enable_override) { | 2832 | if (!ecc_enable_override) { |
2837 | amd64_printk(KERN_WARNING, "WARNING: ECC is NOT " | 2833 | amd64_printk(KERN_WARNING, "%s", ecc_warning); |
2838 | "currently enabled by the BIOS. Module " | 2834 | return -ENODEV; |
2839 | "will NOT be loaded.\n" | 2835 | } |
2840 | " Either Enable ECC in the BIOS, " | 2836 | } else |
2841 | "or use the 'ecc_enable_override' " | ||
2842 | "parameter.\n" | ||
2843 | " Might be a BIOS bug, if BIOS says " | ||
2844 | "ECC is enabled\n" | ||
2845 | " Use of the override can cause " | ||
2846 | "unknown side effects.\n"); | ||
2847 | ret = -ENODEV; | ||
2848 | } else | ||
2849 | /* | ||
2850 | * enable further driver loading if ECC enable is | ||
2851 | * overridden. | ||
2852 | */ | ||
2853 | ret = 0; | ||
2854 | } else { | ||
2855 | amd64_printk(KERN_INFO, | ||
2856 | "ECC is enabled by BIOS, Proceeding " | ||
2857 | "with EDAC module initialization\n"); | ||
2858 | |||
2859 | /* Signal good ECC status */ | ||
2860 | ret = 0; | ||
2861 | |||
2862 | /* CLEAR the override, since BIOS controlled it */ | 2837 | /* CLEAR the override, since BIOS controlled it */ |
2863 | ecc_enable_override = 0; | 2838 | ecc_enable_override = 0; |
2864 | } | ||
2865 | 2839 | ||
2866 | return ret; | 2840 | return 0; |
2867 | } | 2841 | } |
2868 | 2842 | ||
2869 | struct mcidev_sysfs_attribute sysfs_attrs[ARRAY_SIZE(amd64_dbg_attrs) + | 2843 | struct mcidev_sysfs_attribute sysfs_attrs[ARRAY_SIZE(amd64_dbg_attrs) + |