diff options
Diffstat (limited to 'drivers/edac/r82600_edac.c')
-rw-r--r-- | drivers/edac/r82600_edac.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/drivers/edac/r82600_edac.c b/drivers/edac/r82600_edac.c index 6d908ad72d64..e1cacd164f31 100644 --- a/drivers/edac/r82600_edac.c +++ b/drivers/edac/r82600_edac.c | |||
@@ -179,10 +179,11 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, | |||
179 | error_found = 1; | 179 | error_found = 1; |
180 | 180 | ||
181 | if (handle_errors) | 181 | if (handle_errors) |
182 | edac_mc_handle_ce(mci, page, 0, /* not avail */ | 182 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, |
183 | syndrome, | 183 | page, 0, syndrome, |
184 | edac_mc_find_csrow_by_page(mci, page), | 184 | edac_mc_find_csrow_by_page(mci, page), |
185 | 0, mci->ctl_name); | 185 | 0, -1, |
186 | mci->ctl_name, "", NULL); | ||
186 | } | 187 | } |
187 | 188 | ||
188 | if (info->eapr & BIT(1)) { /* UE? */ | 189 | if (info->eapr & BIT(1)) { /* UE? */ |
@@ -190,9 +191,11 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, | |||
190 | 191 | ||
191 | if (handle_errors) | 192 | if (handle_errors) |
192 | /* 82600 doesn't give enough info */ | 193 | /* 82600 doesn't give enough info */ |
193 | edac_mc_handle_ue(mci, page, 0, | 194 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, |
194 | edac_mc_find_csrow_by_page(mci, page), | 195 | page, 0, 0, |
195 | mci->ctl_name); | 196 | edac_mc_find_csrow_by_page(mci, page), |
197 | 0, -1, | ||
198 | mci->ctl_name, "", NULL); | ||
196 | } | 199 | } |
197 | 200 | ||
198 | return error_found; | 201 | return error_found; |
@@ -216,6 +219,7 @@ static void r82600_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
216 | u8 dramcr) | 219 | u8 dramcr) |
217 | { | 220 | { |
218 | struct csrow_info *csrow; | 221 | struct csrow_info *csrow; |
222 | struct dimm_info *dimm; | ||
219 | int index; | 223 | int index; |
220 | u8 drbar; /* SDRAM Row Boundary Address Register */ | 224 | u8 drbar; /* SDRAM Row Boundary Address Register */ |
221 | u32 row_high_limit, row_high_limit_last; | 225 | u32 row_high_limit, row_high_limit_last; |
@@ -227,6 +231,7 @@ static void r82600_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
227 | 231 | ||
228 | for (index = 0; index < mci->nr_csrows; index++) { | 232 | for (index = 0; index < mci->nr_csrows; index++) { |
229 | csrow = &mci->csrows[index]; | 233 | csrow = &mci->csrows[index]; |
234 | dimm = csrow->channels[0].dimm; | ||
230 | 235 | ||
231 | /* find the DRAM Chip Select Base address and mask */ | 236 | /* find the DRAM Chip Select Base address and mask */ |
232 | pci_read_config_byte(pdev, R82600_DRBA + index, &drbar); | 237 | pci_read_config_byte(pdev, R82600_DRBA + index, &drbar); |
@@ -247,16 +252,17 @@ static void r82600_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
247 | 252 | ||
248 | csrow->first_page = row_base >> PAGE_SHIFT; | 253 | csrow->first_page = row_base >> PAGE_SHIFT; |
249 | csrow->last_page = (row_high_limit >> PAGE_SHIFT) - 1; | 254 | csrow->last_page = (row_high_limit >> PAGE_SHIFT) - 1; |
250 | csrow->nr_pages = csrow->last_page - csrow->first_page + 1; | 255 | |
256 | dimm->nr_pages = csrow->last_page - csrow->first_page + 1; | ||
251 | /* Error address is top 19 bits - so granularity is * | 257 | /* Error address is top 19 bits - so granularity is * |
252 | * 14 bits */ | 258 | * 14 bits */ |
253 | csrow->grain = 1 << 14; | 259 | dimm->grain = 1 << 14; |
254 | csrow->mtype = reg_sdram ? MEM_RDDR : MEM_DDR; | 260 | dimm->mtype = reg_sdram ? MEM_RDDR : MEM_DDR; |
255 | /* FIXME - check that this is unknowable with this chipset */ | 261 | /* FIXME - check that this is unknowable with this chipset */ |
256 | csrow->dtype = DEV_UNKNOWN; | 262 | dimm->dtype = DEV_UNKNOWN; |
257 | 263 | ||
258 | /* Mode is global on 82600 */ | 264 | /* Mode is global on 82600 */ |
259 | csrow->edac_mode = ecc_on ? EDAC_SECDED : EDAC_NONE; | 265 | dimm->edac_mode = ecc_on ? EDAC_SECDED : EDAC_NONE; |
260 | row_high_limit_last = row_high_limit; | 266 | row_high_limit_last = row_high_limit; |
261 | } | 267 | } |
262 | } | 268 | } |
@@ -264,6 +270,7 @@ static void r82600_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
264 | static int r82600_probe1(struct pci_dev *pdev, int dev_idx) | 270 | static int r82600_probe1(struct pci_dev *pdev, int dev_idx) |
265 | { | 271 | { |
266 | struct mem_ctl_info *mci; | 272 | struct mem_ctl_info *mci; |
273 | struct edac_mc_layer layers[2]; | ||
267 | u8 dramcr; | 274 | u8 dramcr; |
268 | u32 eapr; | 275 | u32 eapr; |
269 | u32 scrub_disabled; | 276 | u32 scrub_disabled; |
@@ -278,8 +285,13 @@ static int r82600_probe1(struct pci_dev *pdev, int dev_idx) | |||
278 | debugf2("%s(): sdram refresh rate = %#0x\n", __func__, | 285 | debugf2("%s(): sdram refresh rate = %#0x\n", __func__, |
279 | sdram_refresh_rate); | 286 | sdram_refresh_rate); |
280 | debugf2("%s(): DRAMC register = %#0x\n", __func__, dramcr); | 287 | debugf2("%s(): DRAMC register = %#0x\n", __func__, dramcr); |
281 | mci = edac_mc_alloc(0, R82600_NR_CSROWS, R82600_NR_CHANS, 0); | 288 | layers[0].type = EDAC_MC_LAYER_CHIP_SELECT; |
282 | 289 | layers[0].size = R82600_NR_CSROWS; | |
290 | layers[0].is_virt_csrow = true; | ||
291 | layers[1].type = EDAC_MC_LAYER_CHANNEL; | ||
292 | layers[1].size = R82600_NR_CHANS; | ||
293 | layers[1].is_virt_csrow = false; | ||
294 | mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, 0); | ||
283 | if (mci == NULL) | 295 | if (mci == NULL) |
284 | return -ENOMEM; | 296 | return -ENOMEM; |
285 | 297 | ||