History

edac: move nr_pages to dimm struct

The number of pages is a dimm property. Move it to the dimm struct. After this change, it is possible to add sysfs nodes for the DIMM's that will properly represent the DIMM stick properties, including its size. A TODO fix here is to properly represent dual-rank/quad-rank DIMMs when the memory controller represents the memory via chip select rows.

Mauro Carvalho Chehab committed 14 years ago

Commit a895bf81 parent 5e2af0c28 files · +146 −116Browse files

Unified · Split

28 files
  1. drivers/edac/amd64_edac.c +6 −4
  2. drivers/edac/amd76x_edac.c +3 −3
  3. drivers/edac/cell_edac.c +5 −3
  4. drivers/edac/cpc925_edac.c +5 −3
  5. drivers/edac/e752x_edac.c +4 −2
  6. drivers/edac/e7xxx_edac.c +3 −2
  7. drivers/edac/edac_mc.c +10 −6
  8. drivers/edac/edac_mc_sysfs.c +33 −14
  9. drivers/edac/i3000_edac.c +4 −2
  10. drivers/edac/i3200_edac.c +1 −2
  11. drivers/edac/i5000_edac.c +8 −6
  12. drivers/edac/i5100_edac.c +13 −9
  13. drivers/edac/i5400_edac.c +3 −6
  14. drivers/edac/i7300_edac.c +6 −16
  15. drivers/edac/i7core_edac.c +3 −7
  16. drivers/edac/i82443bxgx_edac.c +1 −1
  17. drivers/edac/i82860_edac.c +1 −1
  18. drivers/edac/i82875p_edac.c +3 −2
  19. drivers/edac/i82975x_edac.c +8 −3
  20. drivers/edac/mpc85xx_edac.c +2 −1
  21. drivers/edac/mv64x60_edac.c +2 −1
  22. drivers/edac/pasemi_edac.c +7 −7
  23. drivers/edac/ppc4xx_edac.c +3 −2
  24. drivers/edac/r82600_edac.c +2 −1
  25. drivers/edac/sb_edac.c +2 −6
  26. drivers/edac/tile_edac.c +1 −1
  27. drivers/edac/x38_edac.c +2 −2
  28. include/linux/edac.h +5 −3
drivers/edac/amd64_edac.c+6−4
@@ -2152,7 +2152,7 @@ static u32 amd64_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr) · 2151 unmodified lines
21522152 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode) << (20 - PAGE_SHIFT);
21532153
21542154 debugf0(" (csrow=%d) DBAM map index= %d\n", csrow_nr, cs_mode);
2155− debugf0(" nr_pages= %u channel-count = %d\n",
2155+ debugf0(" nr_pages/channel= %u channel-count = %d\n",
21562156 nr_pages, pvt->channel_count);
21572157
21582158 return nr_pages;
@@ -2171,6 +2171,7 @@ static int init_csrows(struct mem_ctl_info *mci) · 12 unmodified lines
21712171 int i, j, empty = 1;
21722172 enum mem_type mtype;
21732173 enum edac_type edac_mode;
2174+ int nr_pages = 0;
21742175
21752176 amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
21762177
@@ -2194,9 +2195,9 @@ static int init_csrows(struct mem_ctl_info *mci) · 17 unmodified lines
21942195
21952196 empty = 0;
21962197 if (csrow_enabled(i, 0, pvt))
2197− csrow->nr_pages = amd64_csrow_nr_pages(pvt, 0, i);
2198+ nr_pages = amd64_csrow_nr_pages(pvt, 0, i);
21982199 if (csrow_enabled(i, 1, pvt))
2199− csrow->nr_pages += amd64_csrow_nr_pages(pvt, 1, i);
2200+ nr_pages += amd64_csrow_nr_pages(pvt, 1, i);
22002201
22012202 get_cs_base_and_mask(pvt, i, 0, &base, &mask);
22022203 /* 8 bytes of resolution */
@@ -2204,7 +2205,7 @@ static int init_csrows(struct mem_ctl_info *mci) · 1 unmodified line
22042205 mtype = amd64_determine_memory_type(pvt, i);
22052206
22062207 debugf1(" for MC node %d csrow %d:\n", pvt->mc_node_id, i);
2207− debugf1(" nr_pages: %u\n", csrow->nr_pages);
2208+ debugf1(" nr_pages: %u\n", nr_pages * pvt->channel_count);
22082209
22092210 /*
22102211 * determine whether CHIPKILL or JUST ECC or NO ECC is operating
@@ -2218,6 +2219,7 @@ static int init_csrows(struct mem_ctl_info *mci) · 7 unmodified lines
22182219 for (j = 0; j < pvt->channel_count; j++) {
22192220 csrow->channels[j].dimm->mtype = mtype;
22202221 csrow->channels[j].dimm->edac_mode = edac_mode;
2222+ csrow->channels[j].dimm->nr_pages = nr_pages;
22212223 }
22222224 }
22232225
drivers/edac/amd76x_edac.c+3−3
@@ -205,10 +205,10 @@ static void amd76x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, · 204 unmodified lines
205205 mba_mask = ((mba & 0xff80) << 16) | 0x7fffffUL;
206206 pci_read_config_dword(pdev, AMD76X_DRAM_MODE_STATUS, &dms);
207207 csrow->first_page = mba_base >> PAGE_SHIFT;
208− csrow->nr_pages = (mba_mask + 1) >> PAGE_SHIFT;
209− csrow->last_page = csrow->first_page + csrow->nr_pages - 1;
208+ dimm->nr_pages = (mba_mask + 1) >> PAGE_SHIFT;
209+ csrow->last_page = csrow->first_page + dimm->nr_pages - 1;
210210 csrow->page_mask = mba_mask >> PAGE_SHIFT;
211− dimm->grain = csrow->nr_pages << PAGE_SHIFT;
211+ dimm->grain = dimm->nr_pages << PAGE_SHIFT;
212212 dimm->mtype = MEM_RDDR;
213213 dimm->dtype = ((dms >> index) & 0x1) ? DEV_X4 : DEV_UNKNOWN;
214214 dimm->edac_mode = edac_mode;
drivers/edac/cell_edac.c+5−3
@@ -128,6 +128,7 @@ static void __devinit cell_edac_init_csrows(struct mem_ctl_info *mci) · 127 unmodified lines
128128 struct cell_edac_priv *priv = mci->pvt_info;
129129 struct device_node *np;
130130 int j;
131+ u32 nr_pages;
131132
132133 for (np = NULL;
133134 (np = of_find_node_by_name(np, "memory")) != NULL;) {
@@ -142,19 +143,20 @@ static void __devinit cell_edac_init_csrows(struct mem_ctl_info *mci) · 8 unmodified lines
142143 if (of_node_to_nid(np) != priv->node)
143144 continue;
144145 csrow->first_page = r.start >> PAGE_SHIFT;
145− csrow->nr_pages = resource_size(&r) >> PAGE_SHIFT;
146− csrow->last_page = csrow->first_page + csrow->nr_pages - 1;
146+ nr_pages = resource_size(&r) >> PAGE_SHIFT;
147+ csrow->last_page = csrow->first_page + nr_pages - 1;
147148
148149 for (j = 0; j < csrow->nr_channels; j++) {
149150 dimm = csrow->channels[j].dimm;
150151 dimm->mtype = MEM_XDR;
151152 dimm->edac_mode = EDAC_SECDED;
153+ dimm->nr_pages = nr_pages / csrow->nr_channels;
152154 }
153155 dev_dbg(mci->dev,
154156 "Initialized on node %d, chanmask=0x%x,"
155157 " first_page=0x%lx, nr_pages=0x%x\n",
156158 priv->node, priv->chanmask,
157− csrow->first_page, csrow->nr_pages);
159+ csrow->first_page, dimm->nr_pages);
158160 break;
159161 }
160162 }
drivers/edac/cpc925_edac.c+5−3
@@ -332,7 +332,7 @@ static void cpc925_init_csrows(struct mem_ctl_info *mci) · 331 unmodified lines
332332 struct dimm_info *dimm;
333333 int index, j;
334334 u32 mbmr, mbbar, bba;
335− unsigned long row_size, last_nr_pages = 0;
335+ unsigned long row_size, nr_pages, last_nr_pages = 0;
336336
337337 get_total_mem(pdata);
338338
@@ -351,12 +351,14 @@ static void cpc925_init_csrows(struct mem_ctl_info *mci) · 12 unmodified lines
351351
352352 row_size = bba * (1UL << 28); /* 256M */
353353 csrow->first_page = last_nr_pages;
354− csrow->nr_pages = row_size >> PAGE_SHIFT;
355− csrow->last_page = csrow->first_page + csrow->nr_pages - 1;
354+ nr_pages = row_size >> PAGE_SHIFT;
355+ csrow->last_page = csrow->first_page + nr_pages - 1;
356356 last_nr_pages = csrow->last_page + 1;
357357
358358 for (j = 0; j < csrow->nr_channels; j++) {
359359 dimm = csrow->channels[j].dimm;
360+
361+ dimm->nr_pages = nr_pages / csrow->nr_channels;
360362 dimm->mtype = MEM_RDDR;
361363 dimm->edac_mode = EDAC_SECDED;
362364
drivers/edac/e752x_edac.c+4−2
@@ -1044,7 +1044,7 @@ static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, · 1043 unmodified lines
10441044 int drc_drbg; /* DRB granularity 0=64mb, 1=128mb */
10451045 int drc_ddim; /* DRAM Data Integrity Mode 0=none, 2=edac */
10461046 u8 value;
1047− u32 dra, drc, cumul_size, i;
1047+ u32 dra, drc, cumul_size, i, nr_pages;
10481048
10491049 dra = 0;
10501050 for (index = 0; index < 4; index++) {
@@ -1078,11 +1078,13 @@ static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, · 27 unmodified lines
10781078
10791079 csrow->first_page = last_cumul_size;
10801080 csrow->last_page = cumul_size - 1;
1081− csrow->nr_pages = cumul_size - last_cumul_size;
1081+ nr_pages = cumul_size - last_cumul_size;
10821082 last_cumul_size = cumul_size;
10831083
10841084 for (i = 0; i < drc_chan + 1; i++) {
10851085 struct dimm_info *dimm = csrow->channels[i].dimm;
1086+
1087+ dimm->nr_pages = nr_pages / (drc_chan + 1);
10861088 dimm->grain = 1 << 12; /* 4KiB - resolution of CELOG */
10871089 dimm->mtype = MEM_RDDR; /* only one type supported */
10881090 dimm->dtype = mem_dev ? DEV_X4 : DEV_X8;
drivers/edac/e7xxx_edac.c+3−2
@@ -349,7 +349,7 @@ static void e7xxx_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, · 348 unmodified lines
349349 unsigned long last_cumul_size;
350350 int index, j;
351351 u8 value;
352− u32 dra, cumul_size;
352+ u32 dra, cumul_size, nr_pages;
353353 int drc_chan, drc_drbg, drc_ddim, mem_dev;
354354 struct csrow_info *csrow;
355355 struct dimm_info *dimm;
@@ -380,12 +380,13 @@ static void e7xxx_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, · 24 unmodified lines
380380
381381 csrow->first_page = last_cumul_size;
382382 csrow->last_page = cumul_size - 1;
383− csrow->nr_pages = cumul_size - last_cumul_size;
383+ nr_pages = cumul_size - last_cumul_size;
384384 last_cumul_size = cumul_size;
385385
386386 for (j = 0; j < drc_chan + 1; j++) {
387387 dimm = csrow->channels[j].dimm;
388388
389+ dimm->nr_pages = nr_pages / (drc_chan + 1);
389390 dimm->grain = 1 << 12; /* 4KiB - resolution of CELOG */
390391 dimm->mtype = MEM_RDDR; /* only one type supported */
391392 dimm->dtype = mem_dev ? DEV_X4 : DEV_X8;
drivers/edac/edac_mc.c+10−6
@@ -43,9 +43,10 @@ static void edac_mc_dump_channel(struct rank_info *chan) · 42 unmodified lines
4343 {
4444 debugf4("\tchannel = %p\n", chan);
4545 debugf4("\tchannel->chan_idx = %d\n", chan->chan_idx);
46− debugf4("\tchannel->ce_count = %d\n", chan->dimm->ce_count);
47− debugf4("\tchannel->label = '%s'\n", chan->dimm->label);
4846 debugf4("\tchannel->csrow = %p\n\n", chan->csrow);
47+ debugf4("\tdimm->ce_count = %d\n", chan->dimm->ce_count);
48+ debugf4("\tdimm->label = '%s'\n", chan->dimm->label);
49+ debugf4("\tdimm->nr_pages = 0x%x\n", chan->dimm->nr_pages);
4950 }
5051
5152 static void edac_mc_dump_csrow(struct csrow_info *csrow)
@@ -55,7 +56,6 @@ static void edac_mc_dump_csrow(struct csrow_info *csrow) · 3 unmodified lines
5556 debugf4("\tcsrow->first_page = 0x%lx\n", csrow->first_page);
5657 debugf4("\tcsrow->last_page = 0x%lx\n", csrow->last_page);
5758 debugf4("\tcsrow->page_mask = 0x%lx\n", csrow->page_mask);
58− debugf4("\tcsrow->nr_pages = 0x%x\n", csrow->nr_pages);
5959 debugf4("\tcsrow->nr_channels = %d\n", csrow->nr_channels);
6060 debugf4("\tcsrow->channels = %p\n", csrow->channels);
6161 debugf4("\tcsrow->mci = %p\n\n", csrow->mci);
@@ -652,15 +652,19 @@ static void edac_mc_scrub_block(unsigned long page, unsigned long offset, · 590 unmodified lines
652652 int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci, unsigned long page)
653653 {
654654 struct csrow_info *csrows = mci->csrows;
655− int row, i;
655+ int row, i, j, n;
656656
657657 debugf1("MC%d: %s(): 0x%lx\n", mci->mc_idx, __func__, page);
658658 row = -1;
659659
660660 for (i = 0; i < mci->nr_csrows; i++) {
661661 struct csrow_info *csrow = &csrows[i];
662−
663− if (csrow->nr_pages == 0)
662+ n = 0;
663+ for (j = 0; j < csrow->nr_channels; j++) {
664+ struct dimm_info *dimm = csrow->channels[j].dimm;
665+ n += dimm->nr_pages;
666+ }
667+ if (n == 0)
664668 continue;
665669
666670 debugf3("MC%d: %s(): first(0x%lx) page(0x%lx) last(0x%lx) "
drivers/edac/edac_mc_sysfs.c+33−14
@@ -144,7 +144,13 @@ static ssize_t csrow_ce_count_show(struct csrow_info *csrow, char *data, · 143 unmodified lines
144144 static ssize_t csrow_size_show(struct csrow_info *csrow, char *data,
145145 int private)
146146 {
147− return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages));
147+ int i;
148+ u32 nr_pages = 0;
149+
150+ for (i = 0; i < csrow->nr_channels; i++)
151+ nr_pages += csrow->channels[i].dimm->nr_pages;
152+
153+ return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages));
148154 }
149155
150156 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) · 368 unmodified lines
519525
520526 static ssize_t mci_size_mb_show(struct mem_ctl_info *mci, char *data)
521527 {
522− int total_pages, csrow_idx;
528+ int total_pages = 0, csrow_idx, j;
523529
524− for (total_pages = csrow_idx = 0; csrow_idx < mci->nr_csrows;
525− csrow_idx++) {
530+ for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) {
526531 struct csrow_info *csrow = &mci->csrows[csrow_idx];
527532
528− if (!csrow->nr_pages)
529− continue;
533+ for (j = 0; j < csrow->nr_channels; j++) {
534+ struct dimm_info *dimm = csrow->channels[j].dimm;
530535
531− total_pages += csrow->nr_pages;
536+ total_pages += dimm->nr_pages;
537+ }
532538 }
533539
534540 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, · 365 unmodified lines
900906 */
901907 int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
902908 {
903− int i;
909+ int i, j;
904910 int err;
905911 struct csrow_info *csrow;
906912 struct kobject *kobj_mci = &mci->edac_mci_kobj;
@@ -934,10 +940,13 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) · 27 unmodified lines
934940 /* Make directories for each CSROW object under the mc<id> kobject
935941 */
936942 for (i = 0; i < mci->nr_csrows; i++) {
943+ int nr_pages = 0;
944+
937945 csrow = &mci->csrows[i];
946+ for (j = 0; j < csrow->nr_channels; j++)
947+ nr_pages += csrow->channels[j].dimm->nr_pages;
938948
939− /* Only expose populated CSROWs */
940− if (csrow->nr_pages > 0) {
949+ if (nr_pages > 0) {
941950 err = edac_create_csrow_object(mci, csrow, i);
942951 if (err) {
943952 debugf1("%s() failure: create csrow %d obj\n",
@@ -949,10 +958,14 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) · 5 unmodified lines
949958
950959 return 0;
951960
952− /* CSROW error: backout what has already been registered, */
953961 fail1:
954962 for (i--; i >= 0; i--) {
955− if (mci->csrows[i].nr_pages > 0)
963+ int nr_pages = 0;
964+
965+ csrow = &mci->csrows[i];
966+ for (j = 0; j < csrow->nr_channels; j++)
967+ nr_pages += csrow->channels[j].dimm->nr_pages;
968+ if (nr_pages > 0)
956969 kobject_put(&mci->csrows[i].kobj);
957970 }
958971
@@ -972,14 +985,20 @@ fail0: · 13 unmodified lines
972985 */
973986 void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
974987 {
975− int i;
988+ struct csrow_info *csrow;
989+ int i, j;
976990
977991 debugf0("%s()\n", __func__);
978992
979993 /* remove all csrow kobjects */
980994 debugf4("%s() unregister this mci kobj\n", __func__);
981995 for (i = 0; i < mci->nr_csrows; i++) {
982− if (mci->csrows[i].nr_pages > 0) {
996+ int nr_pages = 0;
997+
998+ csrow = &mci->csrows[i];
999+ for (j = 0; j < csrow->nr_channels; j++)
1000+ nr_pages += csrow->channels[j].dimm->nr_pages;
1001+ if (nr_pages > 0) {
9831002 debugf0("%s() unreg csrow-%d\n", __func__, i);
9841003 kobject_put(&mci->csrows[i].kobj);
9851004 }
drivers/edac/i3000_edac.c+4−2
@@ -306,7 +306,7 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) · 305 unmodified lines
306306 int rc;
307307 int i, j;
308308 struct mem_ctl_info *mci = NULL;
309− unsigned long last_cumul_size;
309+ unsigned long last_cumul_size, nr_pages;
310310 int interleaved, nr_channels;
311311 unsigned char dra[I3000_RANKS / 2], drb[I3000_RANKS];
312312 unsigned char *c0dra = dra, *c1dra = &dra[I3000_RANKS_PER_CHANNEL / 2];
@@ -391,11 +391,13 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) · 78 unmodified lines
391391
392392 csrow->first_page = last_cumul_size;
393393 csrow->last_page = cumul_size - 1;
394− csrow->nr_pages = cumul_size - last_cumul_size;
394+ nr_pages = cumul_size - last_cumul_size;
395395 last_cumul_size = cumul_size;
396396
397397 for (j = 0; j < nr_channels; j++) {
398398 struct dimm_info *dimm = csrow->channels[j].dimm;
399+
400+ dimm->nr_pages = nr_pages / nr_channels;
399401 dimm->grain = I3000_DEAP_GRAIN;
400402 dimm->mtype = MEM_DDR2;
401403 dimm->dtype = DEV_UNKNOWN;
drivers/edac/i3200_edac.c+1−2
@@ -376,11 +376,10 @@ static int i3200_probe1(struct pci_dev *pdev, int dev_idx) · 375 unmodified lines
376376 if (nr_pages == 0)
377377 continue;
378378
379− csrow->nr_pages = nr_pages;
380−
381379 for (j = 0; j < nr_channels; j++) {
382380 struct dimm_info *dimm = csrow->channels[j].dimm;
383381
382+ dimm->nr_pages = nr_pages / nr_channels;
384383 dimm->grain = nr_pages << PAGE_SHIFT;
385384 dimm->mtype = MEM_DDR2;
386385 dimm->dtype = DEV_UNKNOWN;
drivers/edac/i5000_edac.c+8−6
@@ -1236,6 +1236,7 @@ static int i5000_init_csrows(struct mem_ctl_info *mci) · 1235 unmodified lines
12361236 {
12371237 struct i5000_pvt *pvt;
12381238 struct csrow_info *p_csrow;
1239+ struct dimm_info *dimm;
12391240 int empty, channel_count;
12401241 int max_csrows;
12411242 int mtr, mtr1;
@@ -1265,21 +1266,22 @@ static int i5000_init_csrows(struct mem_ctl_info *mci) · 23 unmodified lines
12651266
12661267 csrow_megs = 0;
12671268 for (channel = 0; channel < pvt->maxch; channel++) {
1269+ dimm = p_csrow->channels[channel].dimm;
12681270 csrow_megs += pvt->dimm_info[csrow][channel].megabytes;
1269− p_csrow->channels[channel].dimm->grain = 8;
1271+ dimm->grain = 8;
12701272
12711273 /* Assume DDR2 for now */
1272− p_csrow->channels[channel].dimm->mtype = MEM_FB_DDR2;
1274+ dimm->mtype = MEM_FB_DDR2;
12731275
12741276 /* ask what device type on this row */
12751277 if (MTR_DRAM_WIDTH(mtr))
1276− p_csrow->channels[channel].dimm->dtype = DEV_X8;
1278+ dimm->dtype = DEV_X8;
12771279 else
1278− p_csrow->channels[channel].dimm->dtype = DEV_X4;
1280+ dimm->dtype = DEV_X4;
12791281
1280− p_csrow->channels[channel].dimm->edac_mode = EDAC_S8ECD8ED;
1282+ dimm->edac_mode = EDAC_S8ECD8ED;
1283+ dimm->nr_pages = (csrow_megs << 8) / pvt->maxch;
12811284 }
1282− p_csrow->nr_pages = csrow_megs << 8;
12831285
12841286 empty = 0;
12851287 }
drivers/edac/i5100_edac.c+13−9
@@ -859,7 +859,6 @@ static void __devinit i5100_init_csrows(struct mem_ctl_info *mci) · 858 unmodified lines
859859 * FIXME: these two are totally bogus -- I don't see how to
860860 * map them correctly to this structure...
861861 */
862− mci->csrows[i].nr_pages = npages;
863862 mci->csrows[i].csrow_idx = i;
864863 mci->csrows[i].mci = mci;
865864 mci->csrows[i].nr_channels = 1;
@@ -867,14 +866,19 @@ static void __devinit i5100_init_csrows(struct mem_ctl_info *mci) · 1 unmodified line
867866 total_pages += npages;
868867
869868 dimm = mci->csrows[i].channels[0].dimm;
870− dimm->grain = 32;
871− dimm->dtype = (priv->mtr[chan][rank].width == 4) ?
872− DEV_X4 : DEV_X8;
873− dimm->mtype = MEM_RDDR2;
874− dimm->edac_mode = EDAC_SECDED;
875− snprintf(dimm->label, sizeof(dimm->label),
876− "DIMM%u",
877− i5100_rank_to_slot(mci, chan, rank));
869+ dimm->nr_pages = npages;
870+ if (npages) {
871+ total_pages += npages;
872+
873+ dimm->grain = 32;
874+ dimm->dtype = (priv->mtr[chan][rank].width == 4) ?
875+ DEV_X4 : DEV_X8;
876+ dimm->mtype = MEM_RDDR2;
877+ dimm->edac_mode = EDAC_SECDED;
878+ snprintf(dimm->label, sizeof(dimm->label),
879+ "DIMM%u",
880+ i5100_rank_to_slot(mci, chan, rank));
881+ }
878882 }
879883 }
880884
drivers/edac/i5400_edac.c+3−6
@@ -1156,7 +1156,7 @@ static int i5400_init_csrows(struct mem_ctl_info *mci) · 1155 unmodified lines
11561156 int empty, channel_count;
11571157 int max_csrows;
11581158 int mtr;
1159− int csrow_megs;
1159+ int size_mb;
11601160 int channel;
11611161 int csrow;
11621162 struct dimm_info *dimm;
@@ -1171,8 +1171,6 @@ static int i5400_init_csrows(struct mem_ctl_info *mci) · 8 unmodified lines
11711171 for (csrow = 0; csrow < max_csrows; csrow++) {
11721172 p_csrow = &mci->csrows[csrow];
11731173
1174− p_csrow->csrow_idx = csrow;
1175−
11761174 /* use branch 0 for the basis */
11771175 mtr = determine_mtr(pvt, csrow, 0);
11781176
@@ -1180,12 +1178,11 @@ static int i5400_init_csrows(struct mem_ctl_info *mci) · 1 unmodified line
11801178 if (!MTR_DIMMS_PRESENT(mtr))
11811179 continue;
11821180
1183− csrow_megs = 0;
11841181 for (channel = 0; channel < pvt->maxch; channel++) {
1185− csrow_megs += pvt->dimm_info[csrow][channel].megabytes;
1182+ size_mb = pvt->dimm_info[csrow][channel].megabytes;
11861183
1187− p_csrow->nr_pages = csrow_megs << 8;
11881184 dimm = p_csrow->channels[channel].dimm;
1185+ dimm->nr_pages = size_mb << 8;
11891186 dimm->grain = 8;
11901187 dimm->dtype = MTR_DRAM_WIDTH(mtr) ? DEV_X8 : DEV_X4;
11911188 dimm->mtype = MEM_RDDR2;
drivers/edac/i7300_edac.c+6−16
@@ -617,9 +617,7 @@ static void i7300_enable_error_reporting(struct mem_ctl_info *mci) · 616 unmodified lines
617617 static int decode_mtr(struct i7300_pvt *pvt,
618618 int slot, int ch, int branch,
619619 struct i7300_dimm_info *dinfo,
620− struct csrow_info *p_csrow,
621− struct dimm_info *dimm,
622− u32 *nr_pages)
620+ struct dimm_info *dimm)
623621 {
624622 int mtr, ans, addrBits, channel;
625623
@@ -651,7 +649,6 @@ static int decode_mtr(struct i7300_pvt *pvt, · 25 unmodified lines
651649 addrBits -= 3; /* 8 bits per bytes */
652650
653651 dinfo->megabytes = 1 << addrBits;
654− *nr_pages = dinfo->megabytes << 8;
655652
656653 debugf2("\t\tWIDTH: x%d\n", MTR_DRAM_WIDTH(mtr));
657654
@@ -664,8 +661,6 @@ static int decode_mtr(struct i7300_pvt *pvt, · 6 unmodified lines
664661 debugf2("\t\tNUMCOL: %s\n", numcol_toString[MTR_DIMM_COLS(mtr)]);
665662 debugf2("\t\tSIZE: %d MB\n", dinfo->megabytes);
666663
667− p_csrow->csrow_idx = slot;
668−
669664 /*
670665 * The type of error detection actually depends of the
671666 * mode of operation. When it is just one single memory chip, at
@@ -675,6 +670,7 @@ static int decode_mtr(struct i7300_pvt *pvt, · 3 unmodified lines
675670 * See datasheet Sections 7.3.6 to 7.3.8
676671 */
677672
673+ dimm->nr_pages = MiB_TO_PAGES(dinfo->megabytes);
678674 dimm->grain = 8;
679675 dimm->mtype = MEM_FB_DDR2;
680676 if (IS_SINGLE_MODE(pvt->mc_settings_a)) {
@@ -774,11 +770,9 @@ static int i7300_init_csrows(struct mem_ctl_info *mci) · 93 unmodified lines
774770 {
775771 struct i7300_pvt *pvt;
776772 struct i7300_dimm_info *dinfo;
777− struct csrow_info *p_csrow;
778773 int rc = -ENODEV;
779774 int mtr;
780775 int ch, branch, slot, channel;
781− u32 nr_pages;
782776 struct dimm_info *dimm;
783777
784778 pvt = mci->pvt_info;
@@ -804,7 +798,6 @@ static int i7300_init_csrows(struct mem_ctl_info *mci) · 19 unmodified lines
804798 }
805799
806800 /* Get the set of MTR[0-7] regs by each branch */
807− nr_pages = 0;
808801 for (slot = 0; slot < MAX_SLOTS; slot++) {
809802 int where = mtr_regs[slot];
810803 for (branch = 0; branch < MAX_BRANCHES; branch++) {
@@ -815,21 +808,18 @@ static int i7300_init_csrows(struct mem_ctl_info *mci) · 4 unmodified lines
815808 int channel = to_channel(ch, branch);
816809
817810 dinfo = &pvt->dimm_info[slot][channel];
818− p_csrow = &mci->csrows[slot];
819811
820− dimm = p_csrow->channels[branch * MAX_CH_PER_BRANCH + ch].dimm;
812+ dimm = mci->csrows[slot].channels[branch * MAX_CH_PER_BRANCH + ch].dimm;
821813
822814 mtr = decode_mtr(pvt, slot, ch, branch,
823− dinfo, p_csrow, dimm,
824− &nr_pages);
815+ dinfo, dimm);
816+
825817 /* if no DIMMS on this row, continue */
826818 if (!MTR_DIMMS_PRESENT(mtr))
827819 continue;
828820
829− /* Update per_csrow memory count */
830− p_csrow->nr_pages += nr_pages;
831−
832821 rc = 0;
822+
833823 }
834824 }
835825 }
drivers/edac/i7core_edac.c+3−7
@@ -715,17 +715,12 @@ static int get_dimm_config(struct mem_ctl_info *mci) · 714 unmodified lines
715715 npages = MiB_TO_PAGES(size);
716716
717717 csr = &mci->csrows[csrow];
718− csr->nr_pages = npages;
719−
720− csr->csrow_idx = csrow;
721− csr->nr_channels = 1;
722−
723− csr->channels[0].chan_idx = i;
724− csr->channels[0].ce_count = 0;
725718
726719 pvt->csrow_map[i][j] = csrow;
727720
728721 dimm = csr->channels[0].dimm;
722+ dimm->nr_pages = npages;
723+
729724 switch (banks) {
730725 case 4:
731726 dimm->dtype = DEV_X4;
@@ -746,6 +741,7 @@ static int get_dimm_config(struct mem_ctl_info *mci) · 14 unmodified lines
746741 dimm->grain = 8;
747742 dimm->edac_mode = mode;
748743 dimm->mtype = mtype;
744+ csrow++;
749745 }
750746
751747 pci_read_config_dword(pdev, MC_SAG_CH_0, &value[0]);
drivers/edac/i82443bxgx_edac.c+1−1
@@ -220,7 +220,7 @@ static void i82443bxgx_init_csrows(struct mem_ctl_info *mci, · 219 unmodified lines
220220 row_base = row_high_limit_last;
221221 csrow->first_page = row_base >> PAGE_SHIFT;
222222 csrow->last_page = (row_high_limit >> PAGE_SHIFT) - 1;
223− csrow->nr_pages = csrow->last_page - csrow->first_page + 1;
223+ dimm->nr_pages = csrow->last_page - csrow->first_page + 1;
224224 /* EAP reports in 4kilobyte granularity [61] */
225225 dimm->grain = 1 << 12;
226226 dimm->mtype = mtype;
drivers/edac/i82860_edac.c+1−1
@@ -167,7 +167,7 @@ static void i82860_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev) · 166 unmodified lines
167167
168168 csrow->first_page = last_cumul_size;
169169 csrow->last_page = cumul_size - 1;
170− csrow->nr_pages = cumul_size - last_cumul_size;
170+ dimm->nr_pages = cumul_size - last_cumul_size;
171171 last_cumul_size = cumul_size;
172172 dimm->grain = 1 << 12; /* I82860_EAP has 4KiB reolution */
173173 dimm->mtype = MEM_RMBS;
drivers/edac/i82875p_edac.c+3−2
@@ -347,7 +347,7 @@ static void i82875p_init_csrows(struct mem_ctl_info *mci, · 346 unmodified lines
347347 unsigned long last_cumul_size;
348348 u8 value;
349349 u32 drc_ddim; /* DRAM Data Integrity Mode 0=none,2=edac */
350− u32 cumul_size;
350+ u32 cumul_size, nr_pages;
351351 int index, j;
352352
353353 drc_ddim = (drc >> 18) & 0x1;
@@ -371,12 +371,13 @@ static void i82875p_init_csrows(struct mem_ctl_info *mci, · 17 unmodified lines
371371
372372 csrow->first_page = last_cumul_size;
373373 csrow->last_page = cumul_size - 1;
374− csrow->nr_pages = cumul_size - last_cumul_size;
374+ nr_pages = cumul_size - last_cumul_size;
375375 last_cumul_size = cumul_size;
376376
377377 for (j = 0; j < nr_chans; j++) {
378378 dimm = csrow->channels[j].dimm;
379379
380+ dimm->nr_pages = nr_pages / nr_chans;
380381 dimm->grain = 1 << 12; /* I82875P_EAP has 4KiB reolution */
381382 dimm->mtype = MEM_DDR;
382383 dimm->dtype = DEV_UNKNOWN;
drivers/edac/i82975x_edac.c+8−3
@@ -370,7 +370,7 @@ static void i82975x_init_csrows(struct mem_ctl_info *mci, · 369 unmodified lines
370370 struct csrow_info *csrow;
371371 unsigned long last_cumul_size;
372372 u8 value;
373− u32 cumul_size;
373+ u32 cumul_size, nr_pages;
374374 int index, chan;
375375 struct dimm_info *dimm;
376376 enum dev_type dtype;
@@ -402,6 +402,7 @@ static void i82975x_init_csrows(struct mem_ctl_info *mci, · 25 unmodified lines
402402 debugf3("%s(): (%d) cumul_size 0x%x\n", __func__, index,
403403 cumul_size);
404404
405+ nr_pages = cumul_size - last_cumul_size;
405406 /*
406407 * Initialise dram labels
407408 * index values:
@@ -411,6 +412,11 @@ static void i82975x_init_csrows(struct mem_ctl_info *mci, · 3 unmodified lines
411412 dtype = i82975x_dram_type(mch_window, index);
412413 for (chan = 0; chan < csrow->nr_channels; chan++) {
413414 dimm = mci->csrows[index].channels[chan].dimm;
415+
416+ if (!nr_pages)
417+ continue;
418+
419+ dimm->nr_pages = nr_pages / csrow->nr_channels;
414420 strncpy(csrow->channels[chan].dimm->label,
415421 labels[(index >> 1) + (chan * 2)],
416422 EDAC_MC_LABEL_LEN);
@@ -420,12 +426,11 @@ static void i82975x_init_csrows(struct mem_ctl_info *mci, · 3 unmodified lines
420426 dimm->edac_mode = EDAC_SECDED; /* only supported */
421427 }
422428
423− if (cumul_size == last_cumul_size)
429+ if (!nr_pages)
424430 continue; /* not populated */
425431
426432 csrow->first_page = last_cumul_size;
427433 csrow->last_page = cumul_size - 1;
428− csrow->nr_pages = cumul_size - last_cumul_size;
429434 last_cumul_size = cumul_size;
430435 }
431436 }
drivers/edac/mpc85xx_edac.c+2−1
@@ -947,7 +947,8 @@ static void __devinit mpc85xx_init_csrows(struct mem_ctl_info *mci) · 946 unmodified lines
947947
948948 csrow->first_page = start;
949949 csrow->last_page = end;
950− csrow->nr_pages = end + 1 - start;
950+
951+ dimm->nr_pages = end + 1 - start;
951952 dimm->grain = 8;
952953 dimm->mtype = mtype;
953954 dimm->dtype = DEV_UNKNOWN;
drivers/edac/mv64x60_edac.c+2−1
@@ -667,7 +667,8 @@ static void mv64x60_init_csrows(struct mem_ctl_info *mci, · 666 unmodified lines
667667
668668 csrow = &mci->csrows[0];
669669 dimm = csrow->channels[0].dimm;
670− csrow->nr_pages = pdata->total_mem >> PAGE_SHIFT;
670+
671+ dimm->nr_pages = pdata->total_mem >> PAGE_SHIFT;
671672 dimm->grain = 8;
672673
673674 dimm->mtype = (ctl & MV64X60_SDRAM_REGISTERED) ? MEM_RDDR : MEM_DDR;
drivers/edac/pasemi_edac.c+7−7
@@ -153,20 +153,20 @@ static int pasemi_edac_init_csrows(struct mem_ctl_info *mci, · 152 unmodified lines
153153 switch ((rankcfg & MCDRAM_RANKCFG_TYPE_SIZE_M) >>
154154 MCDRAM_RANKCFG_TYPE_SIZE_S) {
155155 case 0:
156− csrow->nr_pages = 128 << (20 - PAGE_SHIFT);
156+ dimm->nr_pages = 128 << (20 - PAGE_SHIFT);
157157 break;
158158 case 1:
159− csrow->nr_pages = 256 << (20 - PAGE_SHIFT);
159+ dimm->nr_pages = 256 << (20 - PAGE_SHIFT);
160160 break;
161161 case 2:
162162 case 3:
163− csrow->nr_pages = 512 << (20 - PAGE_SHIFT);
163+ dimm->nr_pages = 512 << (20 - PAGE_SHIFT);
164164 break;
165165 case 4:
166− csrow->nr_pages = 1024 << (20 - PAGE_SHIFT);
166+ dimm->nr_pages = 1024 << (20 - PAGE_SHIFT);
167167 break;
168168 case 5:
169− csrow->nr_pages = 2048 << (20 - PAGE_SHIFT);
169+ dimm->nr_pages = 2048 << (20 - PAGE_SHIFT);
170170 break;
171171 default:
172172 edac_mc_printk(mci, KERN_ERR,
@@ -176,8 +176,8 @@ static int pasemi_edac_init_csrows(struct mem_ctl_info *mci, · 3 unmodified lines
176176 }
177177
178178 csrow->first_page = last_page_in_mmc;
179− csrow->last_page = csrow->first_page + csrow->nr_pages - 1;
180− last_page_in_mmc += csrow->nr_pages;
179+ csrow->last_page = csrow->first_page + dimm->nr_pages - 1;
180+ last_page_in_mmc += dimm->nr_pages;
181181 csrow->page_mask = 0;
182182 dimm->grain = PASEMI_EDAC_ERROR_GRAIN;
183183 dimm->mtype = MEM_DDR;
drivers/edac/ppc4xx_edac.c+3−2
@@ -896,7 +896,7 @@ ppc4xx_edac_init_csrows(struct mem_ctl_info *mci, u32 mcopt1) · 895 unmodified lines
896896 enum dev_type dtype;
897897 enum edac_type edac_mode;
898898 int row, j;
899− u32 mbxcf, size;
899+ u32 mbxcf, size, nr_pages;
900900
901901 /* Establish the memory type and width */
902902
@@ -947,7 +947,7 @@ ppc4xx_edac_init_csrows(struct mem_ctl_info *mci, u32 mcopt1) · 44 unmodified lines
947947 case SDRAM_MBCF_SZ_2GB:
948948 case SDRAM_MBCF_SZ_4GB:
949949 case SDRAM_MBCF_SZ_8GB:
950− csi->nr_pages = SDRAM_MBCF_SZ_TO_PAGES(size);
950+ nr_pages = SDRAM_MBCF_SZ_TO_PAGES(size);
951951 break;
952952 default:
953953 ppc4xx_edac_mc_printk(KERN_ERR, mci,
@@ -973,6 +973,7 @@ ppc4xx_edac_init_csrows(struct mem_ctl_info *mci, u32 mcopt1) · 19 unmodified lines
973973 for (j = 0; j < csi->nr_channels; j++) {
974974 struct dimm_info *dimm = csi->channels[j].dimm;
975975
976+ dimm->nr_pages = nr_pages / csi->nr_channels;
976977 dimm->grain = 1;
977978
978979 dimm->mtype = mtype;
drivers/edac/r82600_edac.c+2−1
@@ -249,7 +249,8 @@ static void r82600_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, · 248 unmodified lines
249249
250250 csrow->first_page = row_base >> PAGE_SHIFT;
251251 csrow->last_page = (row_high_limit >> PAGE_SHIFT) - 1;
252− csrow->nr_pages = csrow->last_page - csrow->first_page + 1;
252+
253+ dimm->nr_pages = csrow->last_page - csrow->first_page + 1;
253254 /* Error address is top 19 bits - so granularity is *
254255 * 14 bits */
255256 dimm->grain = 1 << 14;
drivers/edac/sb_edac.c+2−6
@@ -561,7 +561,6 @@ static int get_dimm_config(struct mem_ctl_info *mci) · 560 unmodified lines
561561 u32 reg;
562562 enum edac_type mode;
563563 enum mem_type mtype;
564− struct dimm_info *dimm;
565564
566565 pci_read_config_dword(pvt->pci_br, SAD_TARGET, &reg);
567566 pvt->sbridge_dev->source_id = SOURCE_ID(reg);
@@ -613,11 +612,11 @@ static int get_dimm_config(struct mem_ctl_info *mci) · 45 unmodified lines
613612 /* On all supported DDR3 DIMM types, there are 8 banks available */
614613 banks = 8;
615614
616− dimm = mci->dimms;
617615 for (i = 0; i < NUM_CHANNELS; i++) {
618616 u32 mtr;
619617
620618 for (j = 0; j < ARRAY_SIZE(mtr_regs); j++) {
619+ struct dimm_info *dimm = &mci->dimms[j];
621620 pci_read_config_dword(pvt->pci_tad[i],
622621 mtr_regs[j], &mtr);
623622 debugf4("Channel #%d MTR%d = %x\n", i, j, mtr);
@@ -642,15 +641,12 @@ static int get_dimm_config(struct mem_ctl_info *mci) · 18 unmodified lines
642641 * csrows.
643642 */
644643 csr = &mci->csrows[csrow];
645− csr->nr_pages = npages;
646− csr->csrow_idx = csrow;
647− csr->nr_channels = 1;
648− csr->channels[0].chan_idx = i;
649644 pvt->csrow_map[i][j] = csrow;
650645 last_page += npages;
651646 csrow++;
652647
653648 csr->channels[0].dimm = dimm;
649+ dimm->nr_pages = npages;
654650 dimm->grain = 32;
655651 dimm->dtype = (banks == 8) ? DEV_X8 : DEV_X4;
656652 dimm->mtype = mtype;
drivers/edac/tile_edac.c+1−1
@@ -110,7 +110,7 @@ static int __devinit tile_edac_init_csrows(struct mem_ctl_info *mci) · 109 unmodified lines
110110 return -1;
111111 }
112112
113− csrow->nr_pages = mem_info.mem_size >> PAGE_SHIFT;
113+ dimm->nr_pages = mem_info.mem_size >> PAGE_SHIFT;
114114 dimm->grain = TILE_EDAC_ERROR_GRAIN;
115115 dimm->dtype = DEV_UNKNOWN;
116116
drivers/edac/x38_edac.c+2−2
@@ -373,10 +373,10 @@ static int x38_probe1(struct pci_dev *pdev, int dev_idx) · 372 unmodified lines
373373 if (nr_pages == 0)
374374 continue;
375375
376− csrow->nr_pages = nr_pages;
377−
378376 for (j = 0; j < x38_channel_num; j++) {
379377 struct dimm_info *dimm = csrow->channels[j].dimm;
378+
379+ dimm->nr_pages = nr_pages / x38_channel_num;
380380 dimm->grain = nr_pages << PAGE_SHIFT;
381381 dimm->mtype = MEM_DDR2;
382382 dimm->dtype = DEV_UNKNOWN;
include/linux/edac.h+5−3
@@ -324,6 +324,8 @@ struct dimm_info { · 323 unmodified lines
324324 enum mem_type mtype; /* memory dimm type */
325325 enum edac_type edac_mode; /* EDAC mode for this dimm */
326326
327+ u32 nr_pages; /* number of pages in csrow */
328+
327329 u32 ce_count; /* Correctable Errors for this dimm */
328330 };
329331
@@ -350,12 +352,12 @@ struct rank_info { · 20 unmodified lines
350352 };
351353
352354 struct csrow_info {
355+ /* Used only by edac_mc_find_csrow_by_page() */
353356 unsigned long first_page; /* first page number in csrow */
354357 unsigned long last_page; /* last page number in csrow */
355− u32 nr_pages; /* number of pages in csrow */
356358 unsigned long page_mask; /* used for interleaving -
357− * 0UL for non intlv
358− */
359+ * 0UL for non intlv */
360+
359361 int csrow_idx; /* the chip-select row */
360362
361363 u32 ue_count; /* Uncorrectable Errors for this csrow */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t