|
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
|