diff options
| -rw-r--r-- | drivers/edac/amd64_edac.c | 15 | ||||
| -rw-r--r-- | drivers/edac/edac_mc.c | 6 | ||||
| -rw-r--r-- | drivers/edac/edac_mc_sysfs.c | 17 | ||||
| -rw-r--r-- | include/linux/edac.h | 7 |
4 files changed, 19 insertions, 26 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 910b0116c128..e1d13c463c90 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
| @@ -2048,12 +2048,18 @@ static int init_csrows(struct mem_ctl_info *mci) | |||
| 2048 | edac_dbg(1, "MC node: %d, csrow: %d\n", | 2048 | edac_dbg(1, "MC node: %d, csrow: %d\n", |
| 2049 | pvt->mc_node_id, i); | 2049 | pvt->mc_node_id, i); |
| 2050 | 2050 | ||
| 2051 | if (row_dct0) | 2051 | if (row_dct0) { |
| 2052 | nr_pages = amd64_csrow_nr_pages(pvt, 0, i); | 2052 | nr_pages = amd64_csrow_nr_pages(pvt, 0, i); |
| 2053 | csrow->channels[0]->dimm->nr_pages = nr_pages; | ||
| 2054 | } | ||
| 2053 | 2055 | ||
| 2054 | /* K8 has only one DCT */ | 2056 | /* K8 has only one DCT */ |
| 2055 | if (boot_cpu_data.x86 != 0xf && row_dct1) | 2057 | if (boot_cpu_data.x86 != 0xf && row_dct1) { |
| 2056 | nr_pages += amd64_csrow_nr_pages(pvt, 1, i); | 2058 | int row_dct1_pages = amd64_csrow_nr_pages(pvt, 1, i); |
| 2059 | |||
| 2060 | csrow->channels[1]->dimm->nr_pages = row_dct1_pages; | ||
| 2061 | nr_pages += row_dct1_pages; | ||
| 2062 | } | ||
| 2057 | 2063 | ||
| 2058 | mtype = amd64_determine_memory_type(pvt, i); | 2064 | mtype = amd64_determine_memory_type(pvt, i); |
| 2059 | 2065 | ||
| @@ -2072,9 +2078,7 @@ static int init_csrows(struct mem_ctl_info *mci) | |||
| 2072 | dimm = csrow->channels[j]->dimm; | 2078 | dimm = csrow->channels[j]->dimm; |
| 2073 | dimm->mtype = mtype; | 2079 | dimm->mtype = mtype; |
| 2074 | dimm->edac_mode = edac_mode; | 2080 | dimm->edac_mode = edac_mode; |
| 2075 | dimm->nr_pages = nr_pages; | ||
| 2076 | } | 2081 | } |
| 2077 | csrow->nr_pages = nr_pages; | ||
| 2078 | } | 2082 | } |
| 2079 | 2083 | ||
| 2080 | return empty; | 2084 | return empty; |
| @@ -2419,7 +2423,6 @@ static int amd64_init_one_instance(struct pci_dev *F2) | |||
| 2419 | 2423 | ||
| 2420 | mci->pvt_info = pvt; | 2424 | mci->pvt_info = pvt; |
| 2421 | mci->pdev = &pvt->F2->dev; | 2425 | mci->pdev = &pvt->F2->dev; |
| 2422 | mci->csbased = 1; | ||
| 2423 | 2426 | ||
| 2424 | setup_mci_misc_attrs(mci, fam_type); | 2427 | setup_mci_misc_attrs(mci, fam_type); |
| 2425 | 2428 | ||
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index cdb81aa73ab7..27e86d938262 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c | |||
| @@ -86,7 +86,7 @@ static void edac_mc_dump_dimm(struct dimm_info *dimm, int number) | |||
| 86 | edac_dimm_info_location(dimm, location, sizeof(location)); | 86 | edac_dimm_info_location(dimm, location, sizeof(location)); |
| 87 | 87 | ||
| 88 | edac_dbg(4, "%s%i: %smapped as virtual row %d, chan %d\n", | 88 | edac_dbg(4, "%s%i: %smapped as virtual row %d, chan %d\n", |
| 89 | dimm->mci->mem_is_per_rank ? "rank" : "dimm", | 89 | dimm->mci->csbased ? "rank" : "dimm", |
| 90 | number, location, dimm->csrow, dimm->cschannel); | 90 | number, location, dimm->csrow, dimm->cschannel); |
| 91 | edac_dbg(4, " dimm = %p\n", dimm); | 91 | edac_dbg(4, " dimm = %p\n", dimm); |
| 92 | edac_dbg(4, " dimm->label = '%s'\n", dimm->label); | 92 | edac_dbg(4, " dimm->label = '%s'\n", dimm->label); |
| @@ -341,7 +341,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num, | |||
| 341 | memcpy(mci->layers, layers, sizeof(*layer) * n_layers); | 341 | memcpy(mci->layers, layers, sizeof(*layer) * n_layers); |
| 342 | mci->nr_csrows = tot_csrows; | 342 | mci->nr_csrows = tot_csrows; |
| 343 | mci->num_cschannel = tot_channels; | 343 | mci->num_cschannel = tot_channels; |
| 344 | mci->mem_is_per_rank = per_rank; | 344 | mci->csbased = per_rank; |
| 345 | 345 | ||
| 346 | /* | 346 | /* |
| 347 | * Alocate and fill the csrow/channels structs | 347 | * Alocate and fill the csrow/channels structs |
| @@ -1235,7 +1235,7 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type, | |||
| 1235 | * incrementing the compat API counters | 1235 | * incrementing the compat API counters |
| 1236 | */ | 1236 | */ |
| 1237 | edac_dbg(4, "%s csrows map: (%d,%d)\n", | 1237 | edac_dbg(4, "%s csrows map: (%d,%d)\n", |
| 1238 | mci->mem_is_per_rank ? "rank" : "dimm", | 1238 | mci->csbased ? "rank" : "dimm", |
| 1239 | dimm->csrow, dimm->cschannel); | 1239 | dimm->csrow, dimm->cschannel); |
| 1240 | if (row == -1) | 1240 | if (row == -1) |
| 1241 | row = dimm->csrow; | 1241 | row = dimm->csrow; |
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 4f4b6137d74e..5899a76eec3b 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c | |||
| @@ -143,7 +143,7 @@ static const char *edac_caps[] = { | |||
| 143 | * and the per-dimm/per-rank one | 143 | * and the per-dimm/per-rank one |
| 144 | */ | 144 | */ |
| 145 | #define DEVICE_ATTR_LEGACY(_name, _mode, _show, _store) \ | 145 | #define DEVICE_ATTR_LEGACY(_name, _mode, _show, _store) \ |
| 146 | struct device_attribute dev_attr_legacy_##_name = __ATTR(_name, _mode, _show, _store) | 146 | static struct device_attribute dev_attr_legacy_##_name = __ATTR(_name, _mode, _show, _store) |
| 147 | 147 | ||
| 148 | struct dev_ch_attribute { | 148 | struct dev_ch_attribute { |
| 149 | struct device_attribute attr; | 149 | struct device_attribute attr; |
| @@ -180,9 +180,6 @@ static ssize_t csrow_size_show(struct device *dev, | |||
| 180 | int i; | 180 | int i; |
| 181 | u32 nr_pages = 0; | 181 | u32 nr_pages = 0; |
| 182 | 182 | ||
| 183 | if (csrow->mci->csbased) | ||
| 184 | return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages)); | ||
| 185 | |||
| 186 | for (i = 0; i < csrow->nr_channels; i++) | 183 | for (i = 0; i < csrow->nr_channels; i++) |
| 187 | nr_pages += csrow->channels[i]->dimm->nr_pages; | 184 | nr_pages += csrow->channels[i]->dimm->nr_pages; |
| 188 | return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages)); | 185 | return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages)); |
| @@ -612,7 +609,7 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci, | |||
| 612 | device_initialize(&dimm->dev); | 609 | device_initialize(&dimm->dev); |
| 613 | 610 | ||
| 614 | dimm->dev.parent = &mci->dev; | 611 | dimm->dev.parent = &mci->dev; |
| 615 | if (mci->mem_is_per_rank) | 612 | if (mci->csbased) |
| 616 | dev_set_name(&dimm->dev, "rank%d", index); | 613 | dev_set_name(&dimm->dev, "rank%d", index); |
| 617 | else | 614 | else |
| 618 | dev_set_name(&dimm->dev, "dimm%d", index); | 615 | dev_set_name(&dimm->dev, "dimm%d", index); |
| @@ -778,14 +775,10 @@ static ssize_t mci_size_mb_show(struct device *dev, | |||
| 778 | for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) { | 775 | for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) { |
| 779 | struct csrow_info *csrow = mci->csrows[csrow_idx]; | 776 | struct csrow_info *csrow = mci->csrows[csrow_idx]; |
| 780 | 777 | ||
| 781 | if (csrow->mci->csbased) { | 778 | for (j = 0; j < csrow->nr_channels; j++) { |
| 782 | total_pages += csrow->nr_pages; | 779 | struct dimm_info *dimm = csrow->channels[j]->dimm; |
| 783 | } else { | ||
| 784 | for (j = 0; j < csrow->nr_channels; j++) { | ||
| 785 | struct dimm_info *dimm = csrow->channels[j]->dimm; | ||
| 786 | 780 | ||
| 787 | total_pages += dimm->nr_pages; | 781 | total_pages += dimm->nr_pages; |
| 788 | } | ||
| 789 | } | 782 | } |
| 790 | } | 783 | } |
| 791 | 784 | ||
diff --git a/include/linux/edac.h b/include/linux/edac.h index 4fd4999ccb5b..0b763276f619 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h | |||
| @@ -561,7 +561,6 @@ struct csrow_info { | |||
| 561 | 561 | ||
| 562 | u32 ue_count; /* Uncorrectable Errors for this csrow */ | 562 | u32 ue_count; /* Uncorrectable Errors for this csrow */ |
| 563 | u32 ce_count; /* Correctable Errors for this csrow */ | 563 | u32 ce_count; /* Correctable Errors for this csrow */ |
| 564 | u32 nr_pages; /* combined pages count of all channels */ | ||
| 565 | 564 | ||
| 566 | struct mem_ctl_info *mci; /* the parent */ | 565 | struct mem_ctl_info *mci; /* the parent */ |
| 567 | 566 | ||
| @@ -676,11 +675,11 @@ struct mem_ctl_info { | |||
| 676 | * sees memory sticks ("dimms"), and the ones that sees memory ranks. | 675 | * sees memory sticks ("dimms"), and the ones that sees memory ranks. |
| 677 | * All old memory controllers enumerate memories per rank, but most | 676 | * All old memory controllers enumerate memories per rank, but most |
| 678 | * of the recent drivers enumerate memories per DIMM, instead. | 677 | * of the recent drivers enumerate memories per DIMM, instead. |
| 679 | * When the memory controller is per rank, mem_is_per_rank is true. | 678 | * When the memory controller is per rank, csbased is true. |
| 680 | */ | 679 | */ |
| 681 | unsigned n_layers; | 680 | unsigned n_layers; |
| 682 | struct edac_mc_layer *layers; | 681 | struct edac_mc_layer *layers; |
| 683 | bool mem_is_per_rank; | 682 | bool csbased; |
| 684 | 683 | ||
| 685 | /* | 684 | /* |
| 686 | * DIMM info. Will eventually remove the entire csrows_info some day | 685 | * DIMM info. Will eventually remove the entire csrows_info some day |
| @@ -741,8 +740,6 @@ struct mem_ctl_info { | |||
| 741 | u32 fake_inject_ue; | 740 | u32 fake_inject_ue; |
| 742 | u16 fake_inject_count; | 741 | u16 fake_inject_count; |
| 743 | #endif | 742 | #endif |
| 744 | __u8 csbased : 1, /* csrow-based memory controller */ | ||
| 745 | __resv : 7; | ||
| 746 | }; | 743 | }; |
| 747 | 744 | ||
| 748 | #endif | 745 | #endif |
