Borislav Petkov 455d3c
From: Yazen Ghannam <yazen.ghannam@amd.com>
Borislav Petkov 455d3c
Date: Tue, 22 Oct 2019 20:35:11 +0000
Borislav Petkov 455d3c
Subject: EDAC/amd64: Save max number of controllers to family type
Borislav Petkov 455d3c
Git-commit: 5e4c55276ae8758f5789722b384bb2ab3de3a24f
Borislav Petkov 455d3c
Patch-mainline: v5.5-rc1
Borislav Petkov 455d3c
References: bsc#1180552
Borislav Petkov 455d3c
Borislav Petkov 455d3c
The maximum number of memory controllers is fixed within a family/model
Borislav Petkov 455d3c
group. In most cases, this has been fixed at 2, but some systems may
Borislav Petkov 455d3c
have up to 8.
Borislav Petkov 455d3c
Borislav Petkov 455d3c
The struct amd64_family_type already contains family/model-specific
Borislav Petkov 455d3c
information, and this can be used rather than adding model checks to
Borislav Petkov 455d3c
various functions.
Borislav Petkov 455d3c
Borislav Petkov 455d3c
Create a new field in struct amd64_family_type for max_mcs.
Borislav Petkov 455d3c
Set this when setting other family type information, and use this when
Borislav Petkov 455d3c
needing the maximum number of memory controllers possible for a system.
Borislav Petkov 455d3c
Borislav Petkov 455d3c
Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Borislav Petkov 455d3c
Signed-off-by: Borislav Petkov <bp@suse.de>
Borislav Petkov 455d3c
Cc: "linux-edac@vger.kernel.org" <linux-edac@vger.kernel.org>
Borislav Petkov 455d3c
Cc: James Morse <james.morse@arm.com>
Borislav Petkov 455d3c
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
Borislav Petkov 455d3c
Cc: Robert Richter <rrichter@marvell.com>
Borislav Petkov 455d3c
Cc: Tony Luck <tony.luck@intel.com>
Borislav Petkov 455d3c
Link: https://lkml.kernel.org/r/20191106012448.243970-4-Yazen.Ghannam@amd.com
Borislav Petkov 455d3c
---
Borislav Petkov 455d3c
 drivers/edac/amd64_edac.c |   43 +++++++++++++------------------------------
Borislav Petkov 455d3c
 drivers/edac/amd64_edac.h |    2 ++
Borislav Petkov 455d3c
 2 files changed, 15 insertions(+), 30 deletions(-)
Borislav Petkov 455d3c
Borislav Petkov 455d3c
--- a/drivers/edac/amd64_edac.c
Borislav Petkov 455d3c
+++ b/drivers/edac/amd64_edac.c
Borislav Petkov 455d3c
@@ -20,9 +20,6 @@ static struct amd64_family_type *fam_typ
Borislav Petkov 455d3c
 /* Per-node stuff */
Borislav Petkov 455d3c
 static struct ecc_settings **ecc_stngs;
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
-/* Number of Unified Memory Controllers */
Borislav Petkov 455d3c
-static u8 num_umcs;
Borislav Petkov 455d3c
-
Borislav Petkov 455d3c
 /*
Borislav Petkov 455d3c
  * Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
Borislav Petkov 455d3c
  * bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
Borislav Petkov 455d3c
@@ -455,7 +452,7 @@ static void get_cs_base_and_mask(struct
Borislav Petkov 455d3c
 	for (i = 0; i < pvt->csels[dct].m_cnt; i++)
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
 #define for_each_umc(i) \
Borislav Petkov 455d3c
-	for (i = 0; i < num_umcs; i++)
Borislav Petkov 455d3c
+	for (i = 0; i < fam_type->max_mcs; i++)
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
 /*
Borislav Petkov 455d3c
  * @input_addr is an InputAddr associated with the node given by mci. Return the
Borislav Petkov 455d3c
@@ -2225,6 +2222,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "K8",
Borislav Petkov 455d3c
 		.f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
Borislav Petkov 455d3c
 		.f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= k8_early_channel_count,
Borislav Petkov 455d3c
 			.map_sysaddr_to_csrow	= k8_map_sysaddr_to_csrow,
Borislav Petkov 455d3c
@@ -2235,6 +2233,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F10h",
Borislav Petkov 455d3c
 		.f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
Borislav Petkov 455d3c
 		.f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f1x_early_channel_count,
Borislav Petkov 455d3c
 			.map_sysaddr_to_csrow	= f1x_map_sysaddr_to_csrow,
Borislav Petkov 455d3c
@@ -2245,6 +2244,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F15h",
Borislav Petkov 455d3c
 		.f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1,
Borislav Petkov 455d3c
 		.f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f1x_early_channel_count,
Borislav Petkov 455d3c
 			.map_sysaddr_to_csrow	= f1x_map_sysaddr_to_csrow,
Borislav Petkov 455d3c
@@ -2255,6 +2255,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F15h_M30h",
Borislav Petkov 455d3c
 		.f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1,
Borislav Petkov 455d3c
 		.f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f1x_early_channel_count,
Borislav Petkov 455d3c
 			.map_sysaddr_to_csrow	= f1x_map_sysaddr_to_csrow,
Borislav Petkov 455d3c
@@ -2265,6 +2266,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F15h_M60h",
Borislav Petkov 455d3c
 		.f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1,
Borislav Petkov 455d3c
 		.f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f1x_early_channel_count,
Borislav Petkov 455d3c
 			.map_sysaddr_to_csrow	= f1x_map_sysaddr_to_csrow,
Borislav Petkov 455d3c
@@ -2275,6 +2277,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F16h",
Borislav Petkov 455d3c
 		.f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1,
Borislav Petkov 455d3c
 		.f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f1x_early_channel_count,
Borislav Petkov 455d3c
 			.map_sysaddr_to_csrow	= f1x_map_sysaddr_to_csrow,
Borislav Petkov 455d3c
@@ -2285,6 +2288,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F16h_M30h",
Borislav Petkov 455d3c
 		.f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
Borislav Petkov 455d3c
 		.f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f1x_early_channel_count,
Borislav Petkov 455d3c
 			.map_sysaddr_to_csrow	= f1x_map_sysaddr_to_csrow,
Borislav Petkov 455d3c
@@ -2295,6 +2299,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F17h",
Borislav Petkov 455d3c
 		.f0_id = PCI_DEVICE_ID_AMD_17H_DF_F0,
Borislav Petkov 455d3c
 		.f6_id = PCI_DEVICE_ID_AMD_17H_DF_F6,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f17_early_channel_count,
Borislav Petkov 455d3c
 			.dbam_to_cs		= f17_addr_mask_to_cs_size,
Borislav Petkov 455d3c
@@ -2304,6 +2309,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F17h_M10h",
Borislav Petkov 455d3c
 		.f0_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F0,
Borislav Petkov 455d3c
 		.f6_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F6,
Borislav Petkov 455d3c
+		.max_mcs = 2,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f17_early_channel_count,
Borislav Petkov 455d3c
 			.dbam_to_cs		= f17_addr_mask_to_cs_size,
Borislav Petkov 455d3c
@@ -2313,6 +2319,7 @@ static struct amd64_family_type family_t
Borislav Petkov 455d3c
 		.ctl_name = "F17h_M30h",
Borislav Petkov 455d3c
 		.f0_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F0,
Borislav Petkov 455d3c
 		.f6_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F6,
Borislav Petkov 455d3c
+		.max_mcs = 8,
Borislav Petkov 455d3c
 		.ops = {
Borislav Petkov 455d3c
 			.early_channel_count	= f17_early_channel_count,
Borislav Petkov 455d3c
 			.dbam_to_cs		= f17_addr_mask_to_cs_size,
Borislav Petkov 455d3c
@@ -3387,29 +3394,13 @@ static const struct attribute_group *amd
Borislav Petkov 455d3c
 	NULL
Borislav Petkov 455d3c
 };
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
-/* Set the number of Unified Memory Controllers in the system. */
Borislav Petkov 455d3c
-static void compute_num_umcs(void)
Borislav Petkov 455d3c
-{
Borislav Petkov 455d3c
-	u8 model = boot_cpu_data.x86_model;
Borislav Petkov 455d3c
-
Borislav Petkov 455d3c
-	if (boot_cpu_data.x86 < 0x17)
Borislav Petkov 455d3c
-		return;
Borislav Petkov 455d3c
-
Borislav Petkov 455d3c
-	if (model >= 0x30 && model <= 0x3f)
Borislav Petkov 455d3c
-		num_umcs = 8;
Borislav Petkov 455d3c
-	else
Borislav Petkov 455d3c
-		num_umcs = 2;
Borislav Petkov 455d3c
-
Borislav Petkov 455d3c
-	edac_dbg(1, "Number of UMCs: %x", num_umcs);
Borislav Petkov 455d3c
-}
Borislav Petkov 455d3c
-
Borislav Petkov 455d3c
 static int hw_info_get(struct amd64_pvt *pvt)
Borislav Petkov 455d3c
 {
Borislav Petkov 455d3c
 	u16 pci_id1, pci_id2;
Borislav Petkov 455d3c
 	int ret = -EINVAL;
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
 	if (pvt->fam >= 0x17) {
Borislav Petkov 455d3c
-		pvt->umc = kcalloc(num_umcs, sizeof(struct amd64_umc), GFP_KERNEL);
Borislav Petkov 455d3c
+		pvt->umc = kcalloc(fam_type->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
Borislav Petkov 455d3c
 		if (!pvt->umc)
Borislav Petkov 455d3c
 			return -ENOMEM;
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
@@ -3462,14 +3453,8 @@ static int init_one_instance(struct amd6
Borislav Petkov 455d3c
 	 * Always allocate two channels since we can have setups with DIMMs on
Borislav Petkov 455d3c
 	 * only one channel. Also, this simplifies handling later for the price
Borislav Petkov 455d3c
 	 * of a couple of KBs tops.
Borislav Petkov 455d3c
-	 *
Borislav Petkov 455d3c
-	 * On Fam17h+, the number of controllers may be greater than two. So set
Borislav Petkov 455d3c
-	 * the size equal to the maximum number of UMCs.
Borislav Petkov 455d3c
 	 */
Borislav Petkov 455d3c
-	if (pvt->fam >= 0x17)
Borislav Petkov 455d3c
-		layers[1].size = num_umcs;
Borislav Petkov 455d3c
-	else
Borislav Petkov 455d3c
-		layers[1].size = 2;
Borislav Petkov 455d3c
+	layers[1].size = fam_type->max_mcs;
Borislav Petkov 455d3c
 	layers[1].is_virt_csrow = false;
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
 	mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
Borislav Petkov 455d3c
@@ -3654,8 +3639,6 @@ static int __init amd64_edac_init(void)
Borislav Petkov 455d3c
 	if (!msrs)
Borislav Petkov 455d3c
 		goto err_free;
Borislav Petkov 455d3c
 
Borislav Petkov 455d3c
-	compute_num_umcs();
Borislav Petkov 455d3c
-
Borislav Petkov 455d3c
 	for (i = 0; i < amd_nb_num(); i++) {
Borislav Petkov 455d3c
 		err = probe_one_instance(i);
Borislav Petkov 455d3c
 		if (err) {
Borislav Petkov 455d3c
--- a/drivers/edac/amd64_edac.h
Borislav Petkov 455d3c
+++ b/drivers/edac/amd64_edac.h
Borislav Petkov 455d3c
@@ -476,6 +476,8 @@ struct low_ops {
Borislav Petkov 455d3c
 struct amd64_family_type {
Borislav Petkov 455d3c
 	const char *ctl_name;
Borislav Petkov 455d3c
 	u16 f0_id, f1_id, f2_id, f6_id;
Borislav Petkov 455d3c
+	/* Maximum number of memory controllers per die/node. */
Borislav Petkov 455d3c
+	u8 max_mcs;
Borislav Petkov 455d3c
 	struct low_ops ops;
Borislav Petkov 455d3c
 };
Borislav Petkov 455d3c