Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
[firefly-linux-kernel-4.4.55.git] / drivers / edac / amd64_edac.c
index 98e14ee4833c4d26b805843bcbe30daf29f99bb3..f8bf00010d45a78652c9a922ddb5a2d5c65a7448 100644 (file)
@@ -1239,9 +1239,17 @@ static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
        if (num_dcts_intlv == 2) {
                select = (sys_addr >> 8) & 0x3;
                channel = select ? 0x3 : 0;
-       } else if (num_dcts_intlv == 4)
-               channel = (sys_addr >> 8) & 0x7;
-
+       } else if (num_dcts_intlv == 4) {
+               u8 intlv_addr = dct_sel_interleave_addr(pvt);
+               switch (intlv_addr) {
+               case 0x4:
+                       channel = (sys_addr >> 8) & 0x3;
+                       break;
+               case 0x5:
+                       channel = (sys_addr >> 9) & 0x3;
+                       break;
+               }
+       }
        return channel;
 }
 
@@ -1799,6 +1807,17 @@ static struct amd64_family_type family_types[] = {
                        .read_dct_pci_cfg       = f10_read_dct_pci_cfg,
                }
        },
+       [F16_M30H_CPUS] = {
+               .ctl_name = "F16h_M30h",
+               .f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
+               .f3_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F3,
+               .ops = {
+                       .early_channel_count    = f1x_early_channel_count,
+                       .map_sysaddr_to_csrow   = f1x_map_sysaddr_to_csrow,
+                       .dbam_to_cs             = f16_dbam_to_chip_select,
+                       .read_dct_pci_cfg       = f10_read_dct_pci_cfg,
+               }
+       },
 };
 
 /*
@@ -2578,6 +2597,11 @@ static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt)
                break;
 
        case 0x16:
+               if (pvt->model == 0x30) {
+                       fam_type = &family_types[F16_M30H_CPUS];
+                       pvt->ops = &family_types[F16_M30H_CPUS].ops;
+                       break;
+               }
                fam_type        = &family_types[F16_CPUS];
                pvt->ops        = &family_types[F16_CPUS].ops;
                break;
@@ -2830,6 +2854,14 @@ static const struct pci_device_id amd64_pci_table[] = {
                .class          = 0,
                .class_mask     = 0,
        },
+       {
+               .vendor         = PCI_VENDOR_ID_AMD,
+               .device         = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .class          = 0,
+               .class_mask     = 0,
+       },
 
        {0, }
 };