Mauro Carvalho Chehab 8df7f55
From 56ba4c93d909ef9dfab4f1101a8c3bf75bc4cdab Mon Sep 17 00:00:00 2001
Mauro Carvalho Chehab 8df7f55
From: Mauro Carvalho Chehab <mchehab@redhat.com>
Mauro Carvalho Chehab 8df7f55
Date: Mon, 11 Mar 2013 08:19:52 -0400
Mauro Carvalho Chehab 8df7f55
Subject: [PATCH EDAC] edac: merge mci.mem_is_per_rank with mci.csbased
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
Both mci.mem_is_per_rank and mci.csbased have the same meaning:
Mauro Carvalho Chehab 8df7f55
the memory controller is csrows based. Merge both fields into one.
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
There's no need for the driver to actually fill it, as the core
Mauro Carvalho Chehab 8df7f55
detectsi it by checking if one of the layes has the csrows type
Mauro Carvalho Chehab 8df7f55
as part of the memory hierarchy:
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	if (layers[i].type == EDAC_MC_LAYER_CHIP_SELECT)
Mauro Carvalho Chehab 8df7f55
			per_rank = true;
Mauro Carvalho Chehab 8df7f55
...
Mauro Carvalho Chehab 8df7f55
	mci->csbased = per_rank;
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
From 2b6018dbd206e4af16edcfb80497b73105e97803 Mon Sep 17 00:00:00 2001
Mauro Carvalho Chehab 8df7f55
From: Mauro Carvalho Chehab <mchehab@redhat.com>
Mauro Carvalho Chehab 8df7f55
Date: Mon, 11 Mar 2013 08:18:24 -0400
Mauro Carvalho Chehab 8df7f55
Subject: [PATCH EDAC] amd64_edac: Correct dimm sizes
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
We were filling the csrow size with a wrong value. 16a528ee3975 ("EDAC:
Mauro Carvalho Chehab 8df7f55
Fix csrow size reported in sysfs") tried to address the issue. It fixed
Mauro Carvalho Chehab 8df7f55
the report with the old API but not with the new one. Correct it for the
Mauro Carvalho Chehab 8df7f55
new API too.
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Mauro Carvalho Chehab 8df7f55
Signed-off-by: Borislav Petkov <bp@suse.de>
Mauro Carvalho Chehab 8df7f55
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
Mauro Carvalho Chehab 8df7f55
index ad8bf2a..10ed0c7 100644
Mauro Carvalho Chehab 8df7f55
--- a/drivers/edac/amd64_edac.c
Mauro Carvalho Chehab 8df7f55
+++ b/drivers/edac/amd64_edac.c
Mauro Carvalho Chehab 8df7f55
@@ -2148,12 +2148,18 @@ static int init_csrows(struct mem_ctl_info *mci)
Mauro Carvalho Chehab 8df7f55
		edac_dbg(1, "MC node: %d, csrow: %d\n",
Mauro Carvalho Chehab 8df7f55
			    pvt->mc_node_id, i);
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
-		if (row_dct0)
Mauro Carvalho Chehab 8df7f55
+		if (row_dct0) {
Mauro Carvalho Chehab 8df7f55
			nr_pages = amd64_csrow_nr_pages(pvt, 0, i);
Mauro Carvalho Chehab 8df7f55
+			csrow->channels[0]->dimm->nr_pages = nr_pages;
Mauro Carvalho Chehab 8df7f55
+		}
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
		/* K8 has only one DCT */
Mauro Carvalho Chehab 8df7f55
-		if (boot_cpu_data.x86 != 0xf && row_dct1)
Mauro Carvalho Chehab 8df7f55
-			nr_pages += amd64_csrow_nr_pages(pvt, 1, i);
Mauro Carvalho Chehab 8df7f55
+		if (boot_cpu_data.x86 != 0xf && row_dct1) {
Mauro Carvalho Chehab 8df7f55
+			int row_dct1_pages = amd64_csrow_nr_pages(pvt, 1, i);
Mauro Carvalho Chehab 8df7f55
+
Mauro Carvalho Chehab 8df7f55
+			csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
Mauro Carvalho Chehab 8df7f55
+			nr_pages += row_dct1_pages;
Mauro Carvalho Chehab 8df7f55
+		}
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
		mtype = amd64_determine_memory_type(pvt, i);
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
@@ -2172,9 +2178,7 @@ static int init_csrows(struct mem_ctl_info *mci)
Mauro Carvalho Chehab 8df7f55
			dimm = csrow->channels[j]->dimm;
Mauro Carvalho Chehab 8df7f55
			dimm->mtype = mtype;
Mauro Carvalho Chehab 8df7f55
			dimm->edac_mode = edac_mode;
Mauro Carvalho Chehab 8df7f55
-			dimm->nr_pages = nr_pages;
Mauro Carvalho Chehab 8df7f55
		}
Mauro Carvalho Chehab 8df7f55
-		csrow->nr_pages = nr_pages;
Mauro Carvalho Chehab 8df7f55
	}
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	return empty;
Mauro Carvalho Chehab 8df7f55
@@ -2519,7 +2523,6 @@ static int amd64_init_one_instance(struct pci_dev *F2)
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	mci->pvt_info = pvt;
Mauro Carvalho Chehab 8df7f55
	mci->pdev = &pvt->F2->dev;
Mauro Carvalho Chehab 8df7f55
-	mci->csbased = 1;
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	setup_mci_misc_attrs(mci, fam_type);
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
Mauro Carvalho Chehab 8df7f55
index cdb81aa..27e86d9 100644
Mauro Carvalho Chehab 8df7f55
--- a/drivers/edac/edac_mc.c
Mauro Carvalho Chehab 8df7f55
+++ b/drivers/edac/edac_mc.c
Mauro Carvalho Chehab 8df7f55
@@ -86,7 +86,7 @@ static void edac_mc_dump_dimm(struct dimm_info *dimm, int number)
Mauro Carvalho Chehab 8df7f55
	edac_dimm_info_location(dimm, location, sizeof(location));
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	edac_dbg(4, "%s%i: %smapped as virtual row %d, chan %d\n",
Mauro Carvalho Chehab 8df7f55
-		 dimm->mci->mem_is_per_rank ? "rank" : "dimm",
Mauro Carvalho Chehab 8df7f55
+		 dimm->mci->csbased ? "rank" : "dimm",
Mauro Carvalho Chehab 8df7f55
		 number, location, dimm->csrow, dimm->cschannel);
Mauro Carvalho Chehab 8df7f55
	edac_dbg(4, "  dimm = %p\n", dimm);
Mauro Carvalho Chehab 8df7f55
	edac_dbg(4, "  dimm->label = '%s'\n", dimm->label);
Mauro Carvalho Chehab 8df7f55
@@ -341,7 +341,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
Mauro Carvalho Chehab 8df7f55
	memcpy(mci->layers, layers, sizeof(*layer) * n_layers);
Mauro Carvalho Chehab 8df7f55
	mci->nr_csrows = tot_csrows;
Mauro Carvalho Chehab 8df7f55
	mci->num_cschannel = tot_channels;
Mauro Carvalho Chehab 8df7f55
-	mci->mem_is_per_rank = per_rank;
Mauro Carvalho Chehab 8df7f55
+	mci->csbased = per_rank;
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	/*
Mauro Carvalho Chehab 8df7f55
	 * Alocate and fill the csrow/channels structs
Mauro Carvalho Chehab 8df7f55
@@ -1235,7 +1235,7 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
Mauro Carvalho Chehab 8df7f55
			 * incrementing the compat API counters
Mauro Carvalho Chehab 8df7f55
			 */
Mauro Carvalho Chehab 8df7f55
			edac_dbg(4, "%s csrows map: (%d,%d)\n",
Mauro Carvalho Chehab 8df7f55
-				 mci->mem_is_per_rank ? "rank" : "dimm",
Mauro Carvalho Chehab 8df7f55
+				 mci->csbased ? "rank" : "dimm",
Mauro Carvalho Chehab 8df7f55
				 dimm->csrow, dimm->cschannel);
Mauro Carvalho Chehab 8df7f55
			if (row == -1)
Mauro Carvalho Chehab 8df7f55
				row = dimm->csrow;
Mauro Carvalho Chehab 8df7f55
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
Mauro Carvalho Chehab 8df7f55
index 4f4b613..6ab4a50 100644
Mauro Carvalho Chehab 8df7f55
--- a/drivers/edac/edac_mc_sysfs.c
Mauro Carvalho Chehab 8df7f55
+++ b/drivers/edac/edac_mc_sysfs.c
Mauro Carvalho Chehab 8df7f55
@@ -180,9 +180,6 @@ static ssize_t csrow_size_show(struct device *dev,
Mauro Carvalho Chehab 8df7f55
	int i;
Mauro Carvalho Chehab 8df7f55
	u32 nr_pages = 0;
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
-	if (csrow->mci->csbased)
Mauro Carvalho Chehab 8df7f55
-		return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages));
Mauro Carvalho Chehab 8df7f55
-
Mauro Carvalho Chehab 8df7f55
	for (i = 0; i < csrow->nr_channels; i++)
Mauro Carvalho Chehab 8df7f55
		nr_pages += csrow->channels[i]->dimm->nr_pages;
Mauro Carvalho Chehab 8df7f55
	return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages));
Mauro Carvalho Chehab 8df7f55
@@ -612,7 +609,7 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci,
Mauro Carvalho Chehab 8df7f55
	device_initialize(&dimm->dev);
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	dimm->dev.parent = &mci->dev;
Mauro Carvalho Chehab 8df7f55
-	if (mci->mem_is_per_rank)
Mauro Carvalho Chehab 8df7f55
+	if (mci->csbased)
Mauro Carvalho Chehab 8df7f55
		dev_set_name(&dimm->dev, "rank%d", index);
Mauro Carvalho Chehab 8df7f55
	else
Mauro Carvalho Chehab 8df7f55
		dev_set_name(&dimm->dev, "dimm%d", index);
Mauro Carvalho Chehab 8df7f55
@@ -778,14 +775,10 @@ static ssize_t mci_size_mb_show(struct device *dev,
Mauro Carvalho Chehab 8df7f55
	for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) {
Mauro Carvalho Chehab 8df7f55
		struct csrow_info *csrow = mci->csrows[csrow_idx];
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
-		if (csrow->mci->csbased) {
Mauro Carvalho Chehab 8df7f55
-			total_pages += csrow->nr_pages;
Mauro Carvalho Chehab 8df7f55
-		} else {
Mauro Carvalho Chehab 8df7f55
-			for (j = 0; j < csrow->nr_channels; j++) {
Mauro Carvalho Chehab 8df7f55
-				struct dimm_info *dimm = csrow->channels[j]->dimm;
Mauro Carvalho Chehab 8df7f55
+		for (j = 0; j < csrow->nr_channels; j++) {
Mauro Carvalho Chehab 8df7f55
+			struct dimm_info *dimm = csrow->channels[j]->dimm;
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
-				total_pages += dimm->nr_pages;
Mauro Carvalho Chehab 8df7f55
-			}
Mauro Carvalho Chehab 8df7f55
+			total_pages += dimm->nr_pages;
Mauro Carvalho Chehab 8df7f55
		}
Mauro Carvalho Chehab 8df7f55
	}
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
diff --git a/include/linux/edac.h b/include/linux/edac.h
Mauro Carvalho Chehab 8df7f55
index 4fd4999..0b76327 100644
Mauro Carvalho Chehab 8df7f55
--- a/include/linux/edac.h
Mauro Carvalho Chehab 8df7f55
+++ b/include/linux/edac.h
Mauro Carvalho Chehab 8df7f55
@@ -561,7 +561,6 @@ struct csrow_info {
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	u32 ue_count;		/* Uncorrectable Errors for this csrow */
Mauro Carvalho Chehab 8df7f55
	u32 ce_count;		/* Correctable Errors for this csrow */
Mauro Carvalho Chehab 8df7f55
-	u32 nr_pages;		/* combined pages count of all channels */
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	struct mem_ctl_info *mci;	/* the parent */
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
@@ -676,11 +675,11 @@ struct mem_ctl_info {
Mauro Carvalho Chehab 8df7f55
	 * sees memory sticks ("dimms"), and the ones that sees memory ranks.
Mauro Carvalho Chehab 8df7f55
	 * All old memory controllers enumerate memories per rank, but most
Mauro Carvalho Chehab 8df7f55
	 * of the recent drivers enumerate memories per DIMM, instead.
Mauro Carvalho Chehab 8df7f55
-	 * When the memory controller is per rank, mem_is_per_rank is true.
Mauro Carvalho Chehab 8df7f55
+	 * When the memory controller is per rank, csbased is true.
Mauro Carvalho Chehab 8df7f55
	 */
Mauro Carvalho Chehab 8df7f55
	unsigned n_layers;
Mauro Carvalho Chehab 8df7f55
	struct edac_mc_layer *layers;
Mauro Carvalho Chehab 8df7f55
-	bool mem_is_per_rank;
Mauro Carvalho Chehab 8df7f55
+	bool csbased;
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
	/*
Mauro Carvalho Chehab 8df7f55
	 * DIMM info. Will eventually remove the entire csrows_info some day
Mauro Carvalho Chehab 8df7f55
@@ -741,8 +740,6 @@ struct mem_ctl_info {
Mauro Carvalho Chehab 8df7f55
	u32 fake_inject_ue;
Mauro Carvalho Chehab 8df7f55
	u16 fake_inject_count;
Mauro Carvalho Chehab 8df7f55
 #endif
Mauro Carvalho Chehab 8df7f55
-	__u8 csbased : 1,	/* csrow-based memory controller */
Mauro Carvalho Chehab 8df7f55
-	     __resv  : 7;
Mauro Carvalho Chehab 8df7f55
 };
Mauro Carvalho Chehab 8df7f55
Mauro Carvalho Chehab 8df7f55
 #endif