Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1eef1282 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Borislav Petkov
Browse files

amd64_edac: Correct DIMM sizes



We were filling the csrow size with a wrong value. 16a528ee ("EDAC:
Fix csrow size reported in sysfs") tried to address the issue. It fixed
the report with the old API but not with the new one. Correct it for the
new API too.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
[ make it a per-csrow accounting regardless of ->channel_count ]
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
parent fbe2d361
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -2048,12 +2048,18 @@ static int init_csrows(struct mem_ctl_info *mci)
		edac_dbg(1, "MC node: %d, csrow: %d\n",
			    pvt->mc_node_id, i);

		if (row_dct0)
		if (row_dct0) {
			nr_pages = amd64_csrow_nr_pages(pvt, 0, i);
			csrow->channels[0]->dimm->nr_pages = nr_pages;
		}

		/* K8 has only one DCT */
		if (boot_cpu_data.x86 != 0xf && row_dct1)
			nr_pages += amd64_csrow_nr_pages(pvt, 1, i);
		if (boot_cpu_data.x86 != 0xf && row_dct1) {
			int row_dct1_pages = amd64_csrow_nr_pages(pvt, 1, i);

			csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
			nr_pages += row_dct1_pages;
		}

		mtype = amd64_determine_memory_type(pvt, i);

@@ -2072,9 +2078,7 @@ static int init_csrows(struct mem_ctl_info *mci)
			dimm = csrow->channels[j]->dimm;
			dimm->mtype = mtype;
			dimm->edac_mode = edac_mode;
			dimm->nr_pages = nr_pages;
		}
		csrow->nr_pages = nr_pages;
	}

	return empty;
+3 −10
Original line number Diff line number Diff line
@@ -180,9 +180,6 @@ static ssize_t csrow_size_show(struct device *dev,
	int i;
	u32 nr_pages = 0;

	if (csrow->mci->csbased)
		return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages));

	for (i = 0; i < csrow->nr_channels; i++)
		nr_pages += csrow->channels[i]->dimm->nr_pages;
	return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages));
@@ -778,16 +775,12 @@ static ssize_t mci_size_mb_show(struct device *dev,
	for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) {
		struct csrow_info *csrow = mci->csrows[csrow_idx];

		if (csrow->mci->csbased) {
			total_pages += csrow->nr_pages;
		} else {
		for (j = 0; j < csrow->nr_channels; j++) {
			struct dimm_info *dimm = csrow->channels[j]->dimm;

			total_pages += dimm->nr_pages;
		}
	}
	}

	return sprintf(data, "%u\n", PAGES_TO_MiB(total_pages));
}
+0 −1
Original line number Diff line number Diff line
@@ -561,7 +561,6 @@ struct csrow_info {

	u32 ue_count;		/* Uncorrectable Errors for this csrow */
	u32 ce_count;		/* Correctable Errors for this csrow */
	u32 nr_pages;		/* combined pages count of all channels */

	struct mem_ctl_info *mci;	/* the parent */