|
@@ -144,7 +144,13 @@ static ssize_t csrow_ce_count_show(struct csrow_info *csrow, char *data,
|
|
|
static ssize_t csrow_size_show(struct csrow_info *csrow, char *data,
|
|
|
int private)
|
|
|
{
|
|
|
- return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages));
|
|
|
+ int i;
|
|
|
+ u32 nr_pages = 0;
|
|
|
+
|
|
|
+ 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));
|
|
|
}
|
|
|
|
|
|
static ssize_t csrow_mem_type_show(struct csrow_info *csrow, char *data,
|
|
@@ -519,16 +525,16 @@ static ssize_t mci_ctl_name_show(struct mem_ctl_info *mci, char *data)
|
|
|
|
|
|
static ssize_t mci_size_mb_show(struct mem_ctl_info *mci, char *data)
|
|
|
{
|
|
|
- int total_pages, csrow_idx;
|
|
|
+ int total_pages = 0, csrow_idx, j;
|
|
|
|
|
|
- for (total_pages = csrow_idx = 0; csrow_idx < mci->nr_csrows;
|
|
|
- csrow_idx++) {
|
|
|
+ for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) {
|
|
|
struct csrow_info *csrow = &mci->csrows[csrow_idx];
|
|
|
|
|
|
- if (!csrow->nr_pages)
|
|
|
- continue;
|
|
|
+ for (j = 0; j < csrow->nr_channels; j++) {
|
|
|
+ struct dimm_info *dimm = csrow->channels[j].dimm;
|
|
|
|
|
|
- total_pages += csrow->nr_pages;
|
|
|
+ total_pages += dimm->nr_pages;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return sprintf(data, "%u\n", PAGES_TO_MiB(total_pages));
|
|
@@ -900,7 +906,7 @@ static void edac_remove_mci_instance_attributes(struct mem_ctl_info *mci,
|
|
|
*/
|
|
|
int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
|
|
|
{
|
|
|
- int i;
|
|
|
+ int i, j;
|
|
|
int err;
|
|
|
struct csrow_info *csrow;
|
|
|
struct kobject *kobj_mci = &mci->edac_mci_kobj;
|
|
@@ -934,10 +940,13 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
|
|
|
/* Make directories for each CSROW object under the mc<id> kobject
|
|
|
*/
|
|
|
for (i = 0; i < mci->nr_csrows; i++) {
|
|
|
+ int nr_pages = 0;
|
|
|
+
|
|
|
csrow = &mci->csrows[i];
|
|
|
+ for (j = 0; j < csrow->nr_channels; j++)
|
|
|
+ nr_pages += csrow->channels[j].dimm->nr_pages;
|
|
|
|
|
|
- /* Only expose populated CSROWs */
|
|
|
- if (csrow->nr_pages > 0) {
|
|
|
+ if (nr_pages > 0) {
|
|
|
err = edac_create_csrow_object(mci, csrow, i);
|
|
|
if (err) {
|
|
|
debugf1("%s() failure: create csrow %d obj\n",
|
|
@@ -949,10 +958,14 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
- /* CSROW error: backout what has already been registered, */
|
|
|
fail1:
|
|
|
for (i--; i >= 0; i--) {
|
|
|
- if (mci->csrows[i].nr_pages > 0)
|
|
|
+ int nr_pages = 0;
|
|
|
+
|
|
|
+ csrow = &mci->csrows[i];
|
|
|
+ for (j = 0; j < csrow->nr_channels; j++)
|
|
|
+ nr_pages += csrow->channels[j].dimm->nr_pages;
|
|
|
+ if (nr_pages > 0)
|
|
|
kobject_put(&mci->csrows[i].kobj);
|
|
|
}
|
|
|
|
|
@@ -972,14 +985,20 @@ fail0:
|
|
|
*/
|
|
|
void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
|
|
|
{
|
|
|
- int i;
|
|
|
+ struct csrow_info *csrow;
|
|
|
+ int i, j;
|
|
|
|
|
|
debugf0("%s()\n", __func__);
|
|
|
|
|
|
/* remove all csrow kobjects */
|
|
|
debugf4("%s() unregister this mci kobj\n", __func__);
|
|
|
for (i = 0; i < mci->nr_csrows; i++) {
|
|
|
- if (mci->csrows[i].nr_pages > 0) {
|
|
|
+ int nr_pages = 0;
|
|
|
+
|
|
|
+ csrow = &mci->csrows[i];
|
|
|
+ for (j = 0; j < csrow->nr_channels; j++)
|
|
|
+ nr_pages += csrow->channels[j].dimm->nr_pages;
|
|
|
+ if (nr_pages > 0) {
|
|
|
debugf0("%s() unreg csrow-%d\n", __func__, i);
|
|
|
kobject_put(&mci->csrows[i].kobj);
|
|
|
}
|