amd64_edac: Beef up early exit reporting
[pandora-kernel.git] / drivers / edac / amd64_edac.c
index 495b4d5..e4ad091 100644 (file)
@@ -229,7 +229,7 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate)
 
        scrubval = scrubrates[i].scrubval;
 
-       pci_write_bits32(ctl, K8_SCRCTRL, scrubval, 0x001F);
+       pci_write_bits32(ctl, SCRCTRL, scrubval, 0x001F);
 
        if (scrubval)
                return scrubrates[i].bandwidth;
@@ -250,7 +250,7 @@ static int amd64_get_scrub_rate(struct mem_ctl_info *mci)
        u32 scrubval = 0;
        int i, retval = -EINVAL;
 
-       amd64_read_pci_cfg(pvt->F3, K8_SCRCTRL, &scrubval);
+       amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
 
        scrubval = scrubval & 0x001F;
 
@@ -393,6 +393,9 @@ static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
 #define for_each_chip_select(i, dct, pvt) \
        for (i = 0; i < pvt->csels[dct].b_cnt; i++)
 
+#define chip_select_base(i, dct, pvt) \
+       pvt->csels[dct].csbases[i]
+
 #define for_each_chip_select_mask(i, dct, pvt) \
        for (i = 0; i < pvt->csels[dct].m_cnt; i++)
 
@@ -788,11 +791,6 @@ static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
 
 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
 
-static u16 extract_syndrome(struct err_regs *err)
-{
-       return ((err->nbsh >> 15) & 0xff) | ((err->nbsl >> 16) & 0xff00);
-}
-
 /*
  * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
  * are ECC capable.
@@ -843,11 +841,11 @@ static void dump_misc_regs(struct amd64_pvt *pvt)
        debugf1("F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
 
        debugf1("  NB two channel DRAM capable: %s\n",
-               (pvt->nbcap & K8_NBCAP_DCT_DUAL) ? "yes" : "no");
+               (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
 
        debugf1("  ECC capable: %s, ChipKill ECC capable: %s\n",
-               (pvt->nbcap & K8_NBCAP_SECDED) ? "yes" : "no",
-               (pvt->nbcap & K8_NBCAP_CHIPKILL) ? "yes" : "no");
+               (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
+               (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
 
        amd64_dump_dramcfg_low(pvt->dclr0, 0);
 
@@ -975,12 +973,18 @@ static int k8_early_channel_count(struct amd64_pvt *pvt)
        return (flag) ? 2 : 1;
 }
 
-/* Extract the ERROR ADDRESS for the K8 CPUs */
-static u64 k8_get_error_address(struct mem_ctl_info *mci,
-                               struct err_regs *info)
+/* On F10h and later ErrAddr is MC4_ADDR[47:1] */
+static u64 get_error_address(struct mce *m)
 {
-       return (((u64) (info->nbeah & 0xff)) << 32) +
-                       (info->nbeal & ~0x03);
+       u8 start_bit = 1;
+       u8 end_bit   = 47;
+
+       if (boot_cpu_data.x86 == 0xf) {
+               start_bit = 3;
+               end_bit   = 39;
+       }
+
+       return m->addr & GENMASK(start_bit, end_bit);
 }
 
 static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
@@ -1000,18 +1004,16 @@ static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
        amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
 }
 
-static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci,
-                                   struct err_regs *err_info, u64 sys_addr)
+static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
+                                   u16 syndrome)
 {
        struct mem_ctl_info *src_mci;
+       struct amd64_pvt *pvt = mci->pvt_info;
        int channel, csrow;
        u32 page, offset;
-       u16 syndrome;
-
-       syndrome = extract_syndrome(err_info);
 
        /* CHIPKILL enabled */
-       if (err_info->nbcfg & K8_NBCFG_CHIPKILL) {
+       if (pvt->nbcfg & NBCFG_CHIPKILL) {
                channel = get_channel_from_ecc_syndrome(mci, syndrome);
                if (channel < 0) {
                        /*
@@ -1082,15 +1084,13 @@ static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, int cs_mode)
  * Pass back:
  *     contents of the DCL0_LOW register
  */
-static int f10_early_channel_count(struct amd64_pvt *pvt)
+static int f1x_early_channel_count(struct amd64_pvt *pvt)
 {
        int i, j, channels = 0;
 
-       /* If we are in 128 bit mode, then we are using 2 channels */
-       if (pvt->dclr0 & F10_WIDTH_128) {
-               channels = 2;
-               return channels;
-       }
+       /* On F10h, if we are in 128 bit mode, then we are using 2 channels */
+       if (boot_cpu_data.x86 == 0x10 && (pvt->dclr0 & F10_WIDTH_128))
+               return 2;
 
        /*
         * Need to check if in unganged mode: In such, there are 2 channels,
@@ -1138,13 +1138,6 @@ static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, int cs_mode)
        return dbam_map[cs_mode];
 }
 
-static u64 f10_get_error_address(struct mem_ctl_info *mci,
-                       struct err_regs *info)
-{
-       return (((u64) (info->nbeah & 0xffff)) << 32) +
-                       (info->nbeal & ~0x01);
-}
-
 static void f10_read_dram_ctl_register(struct amd64_pvt *pvt)
 {
 
@@ -1264,30 +1257,23 @@ static u64 f10_get_norm_dct_addr(struct amd64_pvt *pvt, int range,
        return (sys_addr & GENMASK(6,47)) - (chan_off & GENMASK(23,47));
 }
 
-/* Hack for the time being - Can we get this from BIOS?? */
-#define        CH0SPARE_RANK   0
-#define        CH1SPARE_RANK   1
-
 /*
  * checks if the csrow passed in is marked as SPARED, if so returns the new
  * spare row
  */
 static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
 {
-       u32 swap_done;
-       u32 bad_dram_cs;
+       int tmp_cs;
 
-       /* Depending on channel, isolate respective SPARING info */
-       if (dct) {
-               swap_done = F10_ONLINE_SPARE_SWAPDONE1(pvt->online_spare);
-               bad_dram_cs = F10_ONLINE_SPARE_BADDRAM_CS1(pvt->online_spare);
-               if (swap_done && (csrow == bad_dram_cs))
-                       csrow = CH1SPARE_RANK;
-       } else {
-               swap_done = F10_ONLINE_SPARE_SWAPDONE0(pvt->online_spare);
-               bad_dram_cs = F10_ONLINE_SPARE_BADDRAM_CS0(pvt->online_spare);
-               if (swap_done && (csrow == bad_dram_cs))
-                       csrow = CH0SPARE_RANK;
+       if (online_spare_swap_done(pvt, dct) &&
+           csrow == online_spare_bad_dramcs(pvt, dct)) {
+
+               for_each_chip_select(tmp_cs, dct, pvt) {
+                       if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
+                               csrow = tmp_cs;
+                               break;
+                       }
+               }
        }
        return csrow;
 }
@@ -1341,13 +1327,49 @@ static int f10_lookup_addr_in_dct(u64 in_addr, u32 nid, u8 dct)
        return cs_found;
 }
 
+/*
+ * See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
+ * swapped with a region located at the bottom of memory so that the GPU can use
+ * the interleaved region and thus two channels.
+ */
+static u64 f10_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
+{
+       u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
+
+       if (boot_cpu_data.x86 == 0x10) {
+               /* only revC3 and revE have that feature */
+               if (boot_cpu_data.x86_model < 4 ||
+                   (boot_cpu_data.x86_model < 0xa &&
+                    boot_cpu_data.x86_mask < 3))
+                       return sys_addr;
+       }
+
+       amd64_read_dct_pci_cfg(pvt, SWAP_INTLV_REG, &swap_reg);
+
+       if (!(swap_reg & 0x1))
+               return sys_addr;
+
+       swap_base       = (swap_reg >> 3) & 0x7f;
+       swap_limit      = (swap_reg >> 11) & 0x7f;
+       rgn_size        = (swap_reg >> 20) & 0x7f;
+       tmp_addr        = sys_addr >> 27;
+
+       if (!(sys_addr >> 34) &&
+           (((tmp_addr >= swap_base) &&
+            (tmp_addr <= swap_limit)) ||
+            (tmp_addr < rgn_size)))
+               return sys_addr ^ (u64)swap_base << 27;
+
+       return sys_addr;
+}
+
 /* For a given @dram_range, check if @sys_addr falls within it. */
 static int f10_match_to_this_node(struct amd64_pvt *pvt, int range,
                                  u64 sys_addr, int *nid, int *chan_sel)
 {
        int cs_found = -EINVAL;
        u64 chan_addr;
-       u32 tmp, dct_sel_base;
+       u32 dct_sel_base;
        u8 channel;
        bool high_range = false;
 
@@ -1358,9 +1380,22 @@ static int f10_match_to_this_node(struct amd64_pvt *pvt, int range,
        debugf1("(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
                range, sys_addr, get_dram_limit(pvt, range));
 
+       if (dhar_valid(pvt) &&
+           dhar_base(pvt) <= sys_addr &&
+           sys_addr < BIT_64(32)) {
+               amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
+                           sys_addr);
+               return -EINVAL;
+       }
+
        if (intlv_en &&
-           (intlv_sel != ((sys_addr >> 12) & intlv_en)))
+           (intlv_sel != ((sys_addr >> 12) & intlv_en))) {
+               amd64_warn("Botched intlv bits, en: 0x%x, sel: 0x%x\n",
+                          intlv_en, intlv_sel);
                return -EINVAL;
+       }
+
+       sys_addr = f10_swap_interleaved_region(pvt, sys_addr);
 
        dct_sel_base = dct_sel_baseaddr(pvt);
 
@@ -1378,24 +1413,32 @@ static int f10_match_to_this_node(struct amd64_pvt *pvt, int range,
        chan_addr = f10_get_norm_dct_addr(pvt, range, sys_addr,
                                          high_range, dct_sel_base);
 
-       /* remove Node ID (in case of node interleaving) */
-       tmp = chan_addr & 0xFC0;
-
-       chan_addr = ((chan_addr >> hweight8(intlv_en)) & GENMASK(12, 47)) | tmp;
+       /* Remove node interleaving, see F1x120 */
+       if (intlv_en)
+               chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
+                           (chan_addr & 0xfff);
 
-       /* remove channel interleave and hash */
+       /* remove channel interleave */
        if (dct_interleave_enabled(pvt) &&
           !dct_high_range_enabled(pvt) &&
           !dct_ganging_enabled(pvt)) {
-               if (dct_sel_interleave_addr(pvt) != 1)
-                       chan_addr = (chan_addr >> 1) & GENMASK(6, 63);
-               else {
-                       tmp = chan_addr & 0xFC0;
-                       chan_addr = ((chan_addr & GENMASK(14, 63)) >> 1) | tmp;
-               }
+
+               if (dct_sel_interleave_addr(pvt) != 1) {
+                       if (dct_sel_interleave_addr(pvt) == 0x3)
+                               /* hash 9 */
+                               chan_addr = ((chan_addr >> 10) << 9) |
+                                            (chan_addr & 0x1ff);
+                       else
+                               /* A[6] or hash 6 */
+                               chan_addr = ((chan_addr >> 7) << 6) |
+                                            (chan_addr & 0x3f);
+               } else
+                       /* A[12] */
+                       chan_addr = ((chan_addr >> 13) << 12) |
+                                    (chan_addr & 0xfff);
        }
 
-       debugf1("   (ChannelAddrLong=0x%llx)\n", chan_addr);
+       debugf1("   Normalized DCT addr: 0x%llx\n", chan_addr);
 
        cs_found = f10_lookup_addr_in_dct(chan_addr, node_id, channel);
 
@@ -1436,14 +1479,12 @@ static int f10_translate_sysaddr_to_cs(struct amd64_pvt *pvt, u64 sys_addr,
  * The @sys_addr is usually an error address received from the hardware
  * (MCX_ADDR).
  */
-static void f10_map_sysaddr_to_csrow(struct mem_ctl_info *mci,
-                                    struct err_regs *err_info,
-                                    u64 sys_addr)
+static void f10_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
+                                    u16 syndrome)
 {
        struct amd64_pvt *pvt = mci->pvt_info;
        u32 page, offset;
        int nid, csrow, chan = 0;
-       u16 syndrome;
 
        csrow = f10_translate_sysaddr_to_cs(pvt, sys_addr, &nid, &chan);
 
@@ -1454,14 +1495,12 @@ static void f10_map_sysaddr_to_csrow(struct mem_ctl_info *mci,
 
        error_address_to_page_and_offset(sys_addr, &page, &offset);
 
-       syndrome = extract_syndrome(err_info);
-
        /*
         * We need the syndromes for channel detection only when we're
         * ganged. Otherwise @chan should already contain the channel at
         * this point.
         */
-       if (dct_ganging_enabled(pvt) && (pvt->nbcfg & K8_NBCFG_CHIPKILL))
+       if (dct_ganging_enabled(pvt))
                chan = get_channel_from_ecc_syndrome(mci, syndrome);
 
        if (chan >= 0)
@@ -1529,7 +1568,6 @@ static struct amd64_family_type amd64_family_types[] = {
                .f3_id = PCI_DEVICE_ID_AMD_K8_NB_MISC,
                .ops = {
                        .early_channel_count    = k8_early_channel_count,
-                       .get_error_address      = k8_get_error_address,
                        .map_sysaddr_to_csrow   = k8_map_sysaddr_to_csrow,
                        .dbam_to_cs             = k8_dbam_to_chip_select,
                        .read_dct_pci_cfg       = k8_read_dct_pci_cfg,
@@ -1540,8 +1578,7 @@ static struct amd64_family_type amd64_family_types[] = {
                .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
                .f3_id = PCI_DEVICE_ID_AMD_10H_NB_MISC,
                .ops = {
-                       .early_channel_count    = f10_early_channel_count,
-                       .get_error_address      = f10_get_error_address,
+                       .early_channel_count    = f1x_early_channel_count,
                        .read_dram_ctl_register = f10_read_dram_ctl_register,
                        .map_sysaddr_to_csrow   = f10_map_sysaddr_to_csrow,
                        .dbam_to_cs             = f10_dbam_to_chip_select,
@@ -1551,6 +1588,7 @@ static struct amd64_family_type amd64_family_types[] = {
        [F15_CPUS] = {
                .ctl_name = "F15h",
                .ops = {
+                       .early_channel_count    = f1x_early_channel_count,
                        .read_dct_pci_cfg       = f15_read_dct_pci_cfg,
                }
        },
@@ -1741,31 +1779,30 @@ static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
  * Handle any Correctable Errors (CEs) that have occurred. Check for valid ERROR
  * ADDRESS and process.
  */
-static void amd64_handle_ce(struct mem_ctl_info *mci,
-                           struct err_regs *info)
+static void amd64_handle_ce(struct mem_ctl_info *mci, struct mce *m)
 {
        struct amd64_pvt *pvt = mci->pvt_info;
        u64 sys_addr;
+       u16 syndrome;
 
        /* Ensure that the Error Address is VALID */
-       if (!(info->nbsh & K8_NBSH_VALID_ERROR_ADDR)) {
+       if (!(m->status & MCI_STATUS_ADDRV)) {
                amd64_mc_err(mci, "HW has no ERROR_ADDRESS available\n");
                edac_mc_handle_ce_no_info(mci, EDAC_MOD_STR);
                return;
        }
 
-       sys_addr = pvt->ops->get_error_address(mci, info);
+       sys_addr = get_error_address(m);
+       syndrome = extract_syndrome(m->status);
 
        amd64_mc_err(mci, "CE ERROR_ADDRESS= 0x%llx\n", sys_addr);
 
-       pvt->ops->map_sysaddr_to_csrow(mci, info, sys_addr);
+       pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, syndrome);
 }
 
 /* Handle any Un-correctable Errors (UEs) */
-static void amd64_handle_ue(struct mem_ctl_info *mci,
-                           struct err_regs *info)
+static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)
 {
-       struct amd64_pvt *pvt = mci->pvt_info;
        struct mem_ctl_info *log_mci, *src_mci = NULL;
        int csrow;
        u64 sys_addr;
@@ -1773,13 +1810,13 @@ static void amd64_handle_ue(struct mem_ctl_info *mci,
 
        log_mci = mci;
 
-       if (!(info->nbsh & K8_NBSH_VALID_ERROR_ADDR)) {
+       if (!(m->status & MCI_STATUS_ADDRV)) {
                amd64_mc_err(mci, "HW has no ERROR_ADDRESS available\n");
                edac_mc_handle_ue_no_info(log_mci, EDAC_MOD_STR);
                return;
        }
 
-       sys_addr = pvt->ops->get_error_address(mci, info);
+       sys_addr = get_error_address(m);
 
        /*
         * Find out which node the error address belongs to. This may be
@@ -1807,14 +1844,14 @@ static void amd64_handle_ue(struct mem_ctl_info *mci,
 }
 
 static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci,
-                                           struct err_regs *info)
+                                           struct mce *m)
 {
-       u16 ec = EC(info->nbsl);
-       u8 xec = XEC(info->nbsl, 0x1f);
-       int ecc_type = (info->nbsh >> 13) & 0x3;
+       u16 ec = EC(m->status);
+       u8 xec = XEC(m->status, 0x1f);
+       u8 ecc_type = (m->status >> 45) & 0x3;
 
        /* Bail early out if this was an 'observed' error */
-       if (PP(ec) == K8_NBSL_PP_OBS)
+       if (PP(ec) == NBSL_PP_OBS)
                return;
 
        /* Do only ECC errors */
@@ -1822,34 +1859,16 @@ static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci,
                return;
 
        if (ecc_type == 2)
-               amd64_handle_ce(mci, info);
+               amd64_handle_ce(mci, m);
        else if (ecc_type == 1)
-               amd64_handle_ue(mci, info);
+               amd64_handle_ue(mci, m);
 }
 
 void amd64_decode_bus_error(int node_id, struct mce *m, u32 nbcfg)
 {
        struct mem_ctl_info *mci = mcis[node_id];
-       struct err_regs regs;
-
-       regs.nbsl  = (u32) m->status;
-       regs.nbsh  = (u32)(m->status >> 32);
-       regs.nbeal = (u32) m->addr;
-       regs.nbeah = (u32)(m->addr >> 32);
-       regs.nbcfg = nbcfg;
-
-       __amd64_decode_bus_error(mci, &regs);
-
-       /*
-        * Check the UE bit of the NB status high register, if set generate some
-        * logs. If NOT a GART error, then process the event as a NO-INFO event.
-        * If it was a GART error, skip that process.
-        *
-        * FIXME: this should go somewhere else, if at all.
-        */
-       if (regs.nbsh & K8_NBSH_UC_ERR && !report_gart_errors)
-               edac_mc_handle_ue_no_info(mci, "UE bit is set");
 
+       __amd64_decode_bus_error(mci, m);
 }
 
 /*
@@ -1917,7 +1936,7 @@ static void read_mc_regs(struct amd64_pvt *pvt)
        } else
                debugf0("  TOP_MEM2 disabled.\n");
 
-       amd64_read_pci_cfg(pvt->F3, K8_NBCAP, &pvt->nbcap);
+       amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
 
        if (pvt->ops->read_dram_ctl_register)
                pvt->ops->read_dram_ctl_register(pvt);
@@ -2050,14 +2069,13 @@ static int init_csrows(struct mem_ctl_info *mci)
        u32 val;
        int i, empty = 1;
 
-       amd64_read_pci_cfg(pvt->F3, K8_NBCFG, &val);
+       amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
 
        pvt->nbcfg = val;
-       pvt->ctl_error_info.nbcfg = val;
 
        debugf0("node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
                pvt->mc_node_id, val,
-               !!(val & K8_NBCFG_CHIPKILL), !!(val & K8_NBCFG_ECC_ENABLE));
+               !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
 
        for_each_chip_select(i, 0, pvt) {
                csrow = &mci->csrows[i];
@@ -2099,9 +2117,9 @@ static int init_csrows(struct mem_ctl_info *mci)
                /*
                 * determine whether CHIPKILL or JUST ECC or NO ECC is operating
                 */
-               if (pvt->nbcfg & K8_NBCFG_ECC_ENABLE)
+               if (pvt->nbcfg & NBCFG_ECC_ENABLE)
                        csrow->edac_mode =
-                           (pvt->nbcfg & K8_NBCFG_CHIPKILL) ?
+                           (pvt->nbcfg & NBCFG_CHIPKILL) ?
                            EDAC_S4ECD4ED : EDAC_SECDED;
                else
                        csrow->edac_mode = EDAC_NONE;
@@ -2138,7 +2156,7 @@ static bool amd64_nb_mce_bank_enabled_on_node(int nid)
 
        for_each_cpu(cpu, mask) {
                struct msr *reg = per_cpu_ptr(msrs, cpu);
-               nbe = reg->l & K8_MSR_MCGCTL_NBE;
+               nbe = reg->l & MSR_MCGCTL_NBE;
 
                debugf0("core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
                        cpu, reg->q,
@@ -2173,16 +2191,16 @@ static int toggle_ecc_err_reporting(struct ecc_settings *s, u8 nid, bool on)
                struct msr *reg = per_cpu_ptr(msrs, cpu);
 
                if (on) {
-                       if (reg->l & K8_MSR_MCGCTL_NBE)
+                       if (reg->l & MSR_MCGCTL_NBE)
                                s->flags.nb_mce_enable = 1;
 
-                       reg->l |= K8_MSR_MCGCTL_NBE;
+                       reg->l |= MSR_MCGCTL_NBE;
                } else {
                        /*
                         * Turn off NB MCE reporting only when it was off before
                         */
                        if (!s->flags.nb_mce_enable)
-                               reg->l &= ~K8_MSR_MCGCTL_NBE;
+                               reg->l &= ~MSR_MCGCTL_NBE;
                }
        }
        wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
@@ -2196,40 +2214,38 @@ static bool enable_ecc_error_reporting(struct ecc_settings *s, u8 nid,
                                       struct pci_dev *F3)
 {
        bool ret = true;
-       u32 value, mask = K8_NBCTL_CECCEn | K8_NBCTL_UECCEn;
+       u32 value, mask = 0x3;          /* UECC/CECC enable */
 
        if (toggle_ecc_err_reporting(s, nid, ON)) {
                amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
                return false;
        }
 
-       amd64_read_pci_cfg(F3, K8_NBCTL, &value);
+       amd64_read_pci_cfg(F3, NBCTL, &value);
 
-       /* turn on UECCEn and CECCEn bits */
        s->old_nbctl   = value & mask;
        s->nbctl_valid = true;
 
        value |= mask;
-       amd64_write_pci_cfg(F3, K8_NBCTL, value);
+       amd64_write_pci_cfg(F3, NBCTL, value);
 
-       amd64_read_pci_cfg(F3, K8_NBCFG, &value);
+       amd64_read_pci_cfg(F3, NBCFG, &value);
 
-       debugf0("1: node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
-               nid, value,
-               !!(value & K8_NBCFG_CHIPKILL), !!(value & K8_NBCFG_ECC_ENABLE));
+       debugf0("1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
+               nid, value, !!(value & NBCFG_ECC_ENABLE));
 
-       if (!(value & K8_NBCFG_ECC_ENABLE)) {
+       if (!(value & NBCFG_ECC_ENABLE)) {
                amd64_warn("DRAM ECC disabled on this node, enabling...\n");
 
                s->flags.nb_ecc_prev = 0;
 
                /* Attempt to turn on DRAM ECC Enable */
-               value |= K8_NBCFG_ECC_ENABLE;
-               amd64_write_pci_cfg(F3, K8_NBCFG, value);
+               value |= NBCFG_ECC_ENABLE;
+               amd64_write_pci_cfg(F3, NBCFG, value);
 
-               amd64_read_pci_cfg(F3, K8_NBCFG, &value);
+               amd64_read_pci_cfg(F3, NBCFG, &value);
 
-               if (!(value & K8_NBCFG_ECC_ENABLE)) {
+               if (!(value & NBCFG_ECC_ENABLE)) {
                        amd64_warn("Hardware rejected DRAM ECC enable,"
                                   "check memory DIMM configuration.\n");
                        ret = false;
@@ -2240,9 +2256,8 @@ static bool enable_ecc_error_reporting(struct ecc_settings *s, u8 nid,
                s->flags.nb_ecc_prev = 1;
        }
 
-       debugf0("2: node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
-               nid, value,
-               !!(value & K8_NBCFG_CHIPKILL), !!(value & K8_NBCFG_ECC_ENABLE));
+       debugf0("2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
+               nid, value, !!(value & NBCFG_ECC_ENABLE));
 
        return ret;
 }
@@ -2250,22 +2265,23 @@ static bool enable_ecc_error_reporting(struct ecc_settings *s, u8 nid,
 static void restore_ecc_error_reporting(struct ecc_settings *s, u8 nid,
                                        struct pci_dev *F3)
 {
-       u32 value, mask = K8_NBCTL_CECCEn | K8_NBCTL_UECCEn;
+       u32 value, mask = 0x3;          /* UECC/CECC enable */
+
 
        if (!s->nbctl_valid)
                return;
 
-       amd64_read_pci_cfg(F3, K8_NBCTL, &value);
+       amd64_read_pci_cfg(F3, NBCTL, &value);
        value &= ~mask;
        value |= s->old_nbctl;
 
-       amd64_write_pci_cfg(F3, K8_NBCTL, value);
+       amd64_write_pci_cfg(F3, NBCTL, value);
 
        /* restore previous BIOS DRAM ECC "off" setting we force-enabled */
        if (!s->flags.nb_ecc_prev) {
-               amd64_read_pci_cfg(F3, K8_NBCFG, &value);
-               value &= ~K8_NBCFG_ECC_ENABLE;
-               amd64_write_pci_cfg(F3, K8_NBCFG, value);
+               amd64_read_pci_cfg(F3, NBCFG, &value);
+               value &= ~NBCFG_ECC_ENABLE;
+               amd64_write_pci_cfg(F3, NBCFG, value);
        }
 
        /* restore the NB Enable MCGCTL bit */
@@ -2291,9 +2307,9 @@ static bool ecc_enabled(struct pci_dev *F3, u8 nid)
        u8 ecc_en = 0;
        bool nb_mce_en = false;
 
-       amd64_read_pci_cfg(F3, K8_NBCFG, &value);
+       amd64_read_pci_cfg(F3, NBCFG, &value);
 
-       ecc_en = !!(value & K8_NBCFG_ECC_ENABLE);
+       ecc_en = !!(value & NBCFG_ECC_ENABLE);
        amd64_info("DRAM ECC %s.\n", (ecc_en ? "enabled" : "disabled"));
 
        nb_mce_en = amd64_nb_mce_bank_enabled_on_node(nid);
@@ -2338,10 +2354,10 @@ static void setup_mci_misc_attrs(struct mem_ctl_info *mci)
        mci->mtype_cap          = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
        mci->edac_ctl_cap       = EDAC_FLAG_NONE;
 
-       if (pvt->nbcap & K8_NBCAP_SECDED)
+       if (pvt->nbcap & NBCAP_SECDED)
                mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
 
-       if (pvt->nbcap & K8_NBCAP_CHIPKILL)
+       if (pvt->nbcap & NBCAP_CHIPKILL)
                mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
 
        mci->edac_cap           = amd64_determine_edac_cap(pvt);