diff options
Diffstat (limited to 'drivers/edac')
-rw-r--r-- | drivers/edac/amd76x_edac.c | 26 | ||||
-rw-r--r-- | drivers/edac/e752x_edac.c | 181 | ||||
-rw-r--r-- | drivers/edac/e7xxx_edac.c | 54 | ||||
-rw-r--r-- | drivers/edac/edac_device.c | 110 | ||||
-rw-r--r-- | drivers/edac/edac_device_sysfs.c | 112 | ||||
-rw-r--r-- | drivers/edac/edac_mc.c | 144 | ||||
-rw-r--r-- | drivers/edac/edac_mc_sysfs.c | 84 | ||||
-rw-r--r-- | drivers/edac/edac_module.c | 10 | ||||
-rw-r--r-- | drivers/edac/edac_pci.c | 34 | ||||
-rw-r--r-- | drivers/edac/edac_pci_sysfs.c | 46 | ||||
-rw-r--r-- | drivers/edac/i3000_edac.c | 21 | ||||
-rw-r--r-- | drivers/edac/i5000_edac.c | 160 | ||||
-rw-r--r-- | drivers/edac/i82443bxgx_edac.c | 47 | ||||
-rw-r--r-- | drivers/edac/i82860_edac.c | 24 | ||||
-rw-r--r-- | drivers/edac/i82875p_edac.c | 38 | ||||
-rw-r--r-- | drivers/edac/r82600_edac.c | 23 |
16 files changed, 560 insertions, 554 deletions
diff --git a/drivers/edac/amd76x_edac.c b/drivers/edac/amd76x_edac.c index cc392eebee5c..1c1e02e59585 100644 --- a/drivers/edac/amd76x_edac.c +++ b/drivers/edac/amd76x_edac.c | |||
@@ -86,9 +86,9 @@ struct amd76x_dev_info { | |||
86 | 86 | ||
87 | static const struct amd76x_dev_info amd76x_devs[] = { | 87 | static const struct amd76x_dev_info amd76x_devs[] = { |
88 | [AMD761] = { | 88 | [AMD761] = { |
89 | .ctl_name = "AMD761"}, | 89 | .ctl_name = "AMD761"}, |
90 | [AMD762] = { | 90 | [AMD762] = { |
91 | .ctl_name = "AMD762"}, | 91 | .ctl_name = "AMD762"}, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | static struct edac_pci_ctl_info *amd76x_pci; | 94 | static struct edac_pci_ctl_info *amd76x_pci; |
@@ -102,13 +102,13 @@ static struct edac_pci_ctl_info *amd76x_pci; | |||
102 | * on the chip so that further errors will be reported | 102 | * on the chip so that further errors will be reported |
103 | */ | 103 | */ |
104 | static void amd76x_get_error_info(struct mem_ctl_info *mci, | 104 | static void amd76x_get_error_info(struct mem_ctl_info *mci, |
105 | struct amd76x_error_info *info) | 105 | struct amd76x_error_info *info) |
106 | { | 106 | { |
107 | struct pci_dev *pdev; | 107 | struct pci_dev *pdev; |
108 | 108 | ||
109 | pdev = to_pci_dev(mci->dev); | 109 | pdev = to_pci_dev(mci->dev); |
110 | pci_read_config_dword(pdev, AMD76X_ECC_MODE_STATUS, | 110 | pci_read_config_dword(pdev, AMD76X_ECC_MODE_STATUS, |
111 | &info->ecc_mode_status); | 111 | &info->ecc_mode_status); |
112 | 112 | ||
113 | if (info->ecc_mode_status & BIT(8)) | 113 | if (info->ecc_mode_status & BIT(8)) |
114 | pci_write_bits32(pdev, AMD76X_ECC_MODE_STATUS, | 114 | pci_write_bits32(pdev, AMD76X_ECC_MODE_STATUS, |
@@ -130,8 +130,8 @@ static void amd76x_get_error_info(struct mem_ctl_info *mci, | |||
130 | * then attempt to handle and clean up after the error | 130 | * then attempt to handle and clean up after the error |
131 | */ | 131 | */ |
132 | static int amd76x_process_error_info(struct mem_ctl_info *mci, | 132 | static int amd76x_process_error_info(struct mem_ctl_info *mci, |
133 | struct amd76x_error_info *info, | 133 | struct amd76x_error_info *info, |
134 | int handle_errors) | 134 | int handle_errors) |
135 | { | 135 | { |
136 | int error_found; | 136 | int error_found; |
137 | u32 row; | 137 | u32 row; |
@@ -147,7 +147,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci, | |||
147 | if (handle_errors) { | 147 | if (handle_errors) { |
148 | row = (info->ecc_mode_status >> 4) & 0xf; | 148 | row = (info->ecc_mode_status >> 4) & 0xf; |
149 | edac_mc_handle_ue(mci, mci->csrows[row].first_page, 0, | 149 | edac_mc_handle_ue(mci, mci->csrows[row].first_page, 0, |
150 | row, mci->ctl_name); | 150 | row, mci->ctl_name); |
151 | } | 151 | } |
152 | } | 152 | } |
153 | 153 | ||
@@ -160,7 +160,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci, | |||
160 | if (handle_errors) { | 160 | if (handle_errors) { |
161 | row = info->ecc_mode_status & 0xf; | 161 | row = info->ecc_mode_status & 0xf; |
162 | edac_mc_handle_ce(mci, mci->csrows[row].first_page, 0, | 162 | edac_mc_handle_ce(mci, mci->csrows[row].first_page, 0, |
163 | 0, row, 0, mci->ctl_name); | 163 | 0, row, 0, mci->ctl_name); |
164 | } | 164 | } |
165 | } | 165 | } |
166 | 166 | ||
@@ -183,7 +183,7 @@ static void amd76x_check(struct mem_ctl_info *mci) | |||
183 | } | 183 | } |
184 | 184 | ||
185 | static void amd76x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | 185 | static void amd76x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, |
186 | enum edac_type edac_mode) | 186 | enum edac_type edac_mode) |
187 | { | 187 | { |
188 | struct csrow_info *csrow; | 188 | struct csrow_info *csrow; |
189 | u32 mba, mba_base, mba_mask, dms; | 189 | u32 mba, mba_base, mba_mask, dms; |
@@ -194,7 +194,7 @@ static void amd76x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
194 | 194 | ||
195 | /* find the DRAM Chip Select Base address and mask */ | 195 | /* find the DRAM Chip Select Base address and mask */ |
196 | pci_read_config_dword(pdev, | 196 | pci_read_config_dword(pdev, |
197 | AMD76X_MEM_BASE_ADDR + (index * 4), &mba); | 197 | AMD76X_MEM_BASE_ADDR + (index * 4), &mba); |
198 | 198 | ||
199 | if (!(mba & BIT(0))) | 199 | if (!(mba & BIT(0))) |
200 | continue; | 200 | continue; |
@@ -249,7 +249,7 @@ static int amd76x_probe1(struct pci_dev *pdev, int dev_idx) | |||
249 | mci->mtype_cap = MEM_FLAG_RDDR; | 249 | mci->mtype_cap = MEM_FLAG_RDDR; |
250 | mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_EC | EDAC_FLAG_SECDED; | 250 | mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_EC | EDAC_FLAG_SECDED; |
251 | mci->edac_cap = ems_mode ? | 251 | mci->edac_cap = ems_mode ? |
252 | (EDAC_FLAG_EC | EDAC_FLAG_SECDED) : EDAC_FLAG_NONE; | 252 | (EDAC_FLAG_EC | EDAC_FLAG_SECDED) : EDAC_FLAG_NONE; |
253 | mci->mod_name = EDAC_MOD_STR; | 253 | mci->mod_name = EDAC_MOD_STR; |
254 | mci->mod_ver = AMD76X_REVISION; | 254 | mci->mod_ver = AMD76X_REVISION; |
255 | mci->ctl_name = amd76x_devs[dev_idx].ctl_name; | 255 | mci->ctl_name = amd76x_devs[dev_idx].ctl_name; |
@@ -283,14 +283,14 @@ static int amd76x_probe1(struct pci_dev *pdev, int dev_idx) | |||
283 | debugf3("%s(): success\n", __func__); | 283 | debugf3("%s(): success\n", __func__); |
284 | return 0; | 284 | return 0; |
285 | 285 | ||
286 | fail: | 286 | fail: |
287 | edac_mc_free(mci); | 287 | edac_mc_free(mci); |
288 | return -ENODEV; | 288 | return -ENODEV; |
289 | } | 289 | } |
290 | 290 | ||
291 | /* returns count (>= 0), or negative on error */ | 291 | /* returns count (>= 0), or negative on error */ |
292 | static int __devinit amd76x_init_one(struct pci_dev *pdev, | 292 | static int __devinit amd76x_init_one(struct pci_dev *pdev, |
293 | const struct pci_device_id *ent) | 293 | const struct pci_device_id *ent) |
294 | { | 294 | { |
295 | debugf0("%s()\n", __func__); | 295 | debugf0("%s()\n", __func__); |
296 | 296 | ||
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index 45c55a067c73..a041218370f9 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c | |||
@@ -204,21 +204,21 @@ struct e752x_error_info { | |||
204 | 204 | ||
205 | static const struct e752x_dev_info e752x_devs[] = { | 205 | static const struct e752x_dev_info e752x_devs[] = { |
206 | [E7520] = { | 206 | [E7520] = { |
207 | .err_dev = PCI_DEVICE_ID_INTEL_7520_1_ERR, | 207 | .err_dev = PCI_DEVICE_ID_INTEL_7520_1_ERR, |
208 | .ctl_dev = PCI_DEVICE_ID_INTEL_7520_0, | 208 | .ctl_dev = PCI_DEVICE_ID_INTEL_7520_0, |
209 | .ctl_name = "E7520"}, | 209 | .ctl_name = "E7520"}, |
210 | [E7525] = { | 210 | [E7525] = { |
211 | .err_dev = PCI_DEVICE_ID_INTEL_7525_1_ERR, | 211 | .err_dev = PCI_DEVICE_ID_INTEL_7525_1_ERR, |
212 | .ctl_dev = PCI_DEVICE_ID_INTEL_7525_0, | 212 | .ctl_dev = PCI_DEVICE_ID_INTEL_7525_0, |
213 | .ctl_name = "E7525"}, | 213 | .ctl_name = "E7525"}, |
214 | [E7320] = { | 214 | [E7320] = { |
215 | .err_dev = PCI_DEVICE_ID_INTEL_7320_1_ERR, | 215 | .err_dev = PCI_DEVICE_ID_INTEL_7320_1_ERR, |
216 | .ctl_dev = PCI_DEVICE_ID_INTEL_7320_0, | 216 | .ctl_dev = PCI_DEVICE_ID_INTEL_7320_0, |
217 | .ctl_name = "E7320"}, | 217 | .ctl_name = "E7320"}, |
218 | }; | 218 | }; |
219 | 219 | ||
220 | static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci, | 220 | static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci, |
221 | unsigned long page) | 221 | unsigned long page) |
222 | { | 222 | { |
223 | u32 remap; | 223 | u32 remap; |
224 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; | 224 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; |
@@ -241,7 +241,7 @@ static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci, | |||
241 | } | 241 | } |
242 | 242 | ||
243 | static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, | 243 | static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, |
244 | u32 sec1_add, u16 sec1_syndrome) | 244 | u32 sec1_add, u16 sec1_syndrome) |
245 | { | 245 | { |
246 | u32 page; | 246 | u32 page; |
247 | int row; | 247 | int row; |
@@ -259,10 +259,10 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, | |||
259 | /* chip select are bits 14 & 13 */ | 259 | /* chip select are bits 14 & 13 */ |
260 | row = ((page >> 1) & 3); | 260 | row = ((page >> 1) & 3); |
261 | e752x_printk(KERN_WARNING, | 261 | e752x_printk(KERN_WARNING, |
262 | "Test row %d Table %d %d %d %d %d %d %d %d\n", row, | 262 | "Test row %d Table %d %d %d %d %d %d %d %d\n", row, |
263 | pvt->map[0], pvt->map[1], pvt->map[2], pvt->map[3], | 263 | pvt->map[0], pvt->map[1], pvt->map[2], pvt->map[3], |
264 | pvt->map[4], pvt->map[5], pvt->map[6], | 264 | pvt->map[4], pvt->map[5], pvt->map[6], |
265 | pvt->map[7]); | 265 | pvt->map[7]); |
266 | 266 | ||
267 | /* test for channel remapping */ | 267 | /* test for channel remapping */ |
268 | for (i = 0; i < 8; i++) { | 268 | for (i = 0; i < 8; i++) { |
@@ -289,12 +289,12 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, | |||
289 | 289 | ||
290 | /* e752x mc reads 34:6 of the DRAM linear address */ | 290 | /* e752x mc reads 34:6 of the DRAM linear address */ |
291 | edac_mc_handle_ce(mci, page, offset_in_page(sec1_add << 4), | 291 | edac_mc_handle_ce(mci, page, offset_in_page(sec1_add << 4), |
292 | sec1_syndrome, row, channel, "e752x CE"); | 292 | sec1_syndrome, row, channel, "e752x CE"); |
293 | } | 293 | } |
294 | 294 | ||
295 | static inline void process_ce(struct mem_ctl_info *mci, u16 error_one, | 295 | static inline void process_ce(struct mem_ctl_info *mci, u16 error_one, |
296 | u32 sec1_add, u16 sec1_syndrome, int *error_found, | 296 | u32 sec1_add, u16 sec1_syndrome, int *error_found, |
297 | int handle_error) | 297 | int handle_error) |
298 | { | 298 | { |
299 | *error_found = 1; | 299 | *error_found = 1; |
300 | 300 | ||
@@ -303,7 +303,7 @@ static inline void process_ce(struct mem_ctl_info *mci, u16 error_one, | |||
303 | } | 303 | } |
304 | 304 | ||
305 | static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, | 305 | static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, |
306 | u32 ded_add, u32 scrb_add) | 306 | u32 ded_add, u32 scrb_add) |
307 | { | 307 | { |
308 | u32 error_2b, block_page; | 308 | u32 error_2b, block_page; |
309 | int row; | 309 | int row; |
@@ -318,14 +318,14 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, | |||
318 | block_page = error_2b >> (PAGE_SHIFT - 4); | 318 | block_page = error_2b >> (PAGE_SHIFT - 4); |
319 | 319 | ||
320 | row = pvt->mc_symmetric ? | 320 | row = pvt->mc_symmetric ? |
321 | /* chip select are bits 14 & 13 */ | 321 | /* chip select are bits 14 & 13 */ |
322 | ((block_page >> 1) & 3) : | 322 | ((block_page >> 1) & 3) : |
323 | edac_mc_find_csrow_by_page(mci, block_page); | 323 | edac_mc_find_csrow_by_page(mci, block_page); |
324 | 324 | ||
325 | /* e752x mc reads 34:6 of the DRAM linear address */ | 325 | /* e752x mc reads 34:6 of the DRAM linear address */ |
326 | edac_mc_handle_ue(mci, block_page, | 326 | edac_mc_handle_ue(mci, block_page, |
327 | offset_in_page(error_2b << 4), | 327 | offset_in_page(error_2b << 4), |
328 | row, "e752x UE from Read"); | 328 | row, "e752x UE from Read"); |
329 | } | 329 | } |
330 | if (error_one & 0x0404) { | 330 | if (error_one & 0x0404) { |
331 | error_2b = scrb_add; | 331 | error_2b = scrb_add; |
@@ -334,20 +334,20 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, | |||
334 | block_page = error_2b >> (PAGE_SHIFT - 4); | 334 | block_page = error_2b >> (PAGE_SHIFT - 4); |
335 | 335 | ||
336 | row = pvt->mc_symmetric ? | 336 | row = pvt->mc_symmetric ? |
337 | /* chip select are bits 14 & 13 */ | 337 | /* chip select are bits 14 & 13 */ |
338 | ((block_page >> 1) & 3) : | 338 | ((block_page >> 1) & 3) : |
339 | edac_mc_find_csrow_by_page(mci, block_page); | 339 | edac_mc_find_csrow_by_page(mci, block_page); |
340 | 340 | ||
341 | /* e752x mc reads 34:6 of the DRAM linear address */ | 341 | /* e752x mc reads 34:6 of the DRAM linear address */ |
342 | edac_mc_handle_ue(mci, block_page, | 342 | edac_mc_handle_ue(mci, block_page, |
343 | offset_in_page(error_2b << 4), | 343 | offset_in_page(error_2b << 4), |
344 | row, "e752x UE from Scruber"); | 344 | row, "e752x UE from Scruber"); |
345 | } | 345 | } |
346 | } | 346 | } |
347 | 347 | ||
348 | static inline void process_ue(struct mem_ctl_info *mci, u16 error_one, | 348 | static inline void process_ue(struct mem_ctl_info *mci, u16 error_one, |
349 | u32 ded_add, u32 scrb_add, int *error_found, | 349 | u32 ded_add, u32 scrb_add, int *error_found, |
350 | int handle_error) | 350 | int handle_error) |
351 | { | 351 | { |
352 | *error_found = 1; | 352 | *error_found = 1; |
353 | 353 | ||
@@ -377,15 +377,15 @@ static void do_process_ded_retry(struct mem_ctl_info *mci, u16 error, | |||
377 | error_1b = retry_add; | 377 | error_1b = retry_add; |
378 | page = error_1b >> (PAGE_SHIFT - 4); /* convert the addr to 4k page */ | 378 | page = error_1b >> (PAGE_SHIFT - 4); /* convert the addr to 4k page */ |
379 | row = pvt->mc_symmetric ? ((page >> 1) & 3) : /* chip select are bits 14 & 13 */ | 379 | row = pvt->mc_symmetric ? ((page >> 1) & 3) : /* chip select are bits 14 & 13 */ |
380 | edac_mc_find_csrow_by_page(mci, page); | 380 | edac_mc_find_csrow_by_page(mci, page); |
381 | e752x_mc_printk(mci, KERN_WARNING, | 381 | e752x_mc_printk(mci, KERN_WARNING, |
382 | "CE page 0x%lx, row %d : Memory read retry\n", | 382 | "CE page 0x%lx, row %d : Memory read retry\n", |
383 | (long unsigned int)page, row); | 383 | (long unsigned int)page, row); |
384 | } | 384 | } |
385 | 385 | ||
386 | static inline void process_ded_retry(struct mem_ctl_info *mci, u16 error, | 386 | static inline void process_ded_retry(struct mem_ctl_info *mci, u16 error, |
387 | u32 retry_add, int *error_found, | 387 | u32 retry_add, int *error_found, |
388 | int handle_error) | 388 | int handle_error) |
389 | { | 389 | { |
390 | *error_found = 1; | 390 | *error_found = 1; |
391 | 391 | ||
@@ -418,7 +418,7 @@ static void do_global_error(int fatal, u32 errors) | |||
418 | for (i = 0; i < 11; i++) { | 418 | for (i = 0; i < 11; i++) { |
419 | if (errors & (1 << i)) | 419 | if (errors & (1 << i)) |
420 | e752x_printk(KERN_WARNING, "%sError %s\n", | 420 | e752x_printk(KERN_WARNING, "%sError %s\n", |
421 | fatal_message[fatal], global_message[i]); | 421 | fatal_message[fatal], global_message[i]); |
422 | } | 422 | } |
423 | } | 423 | } |
424 | 424 | ||
@@ -445,12 +445,12 @@ static void do_hub_error(int fatal, u8 errors) | |||
445 | for (i = 0; i < 7; i++) { | 445 | for (i = 0; i < 7; i++) { |
446 | if (errors & (1 << i)) | 446 | if (errors & (1 << i)) |
447 | e752x_printk(KERN_WARNING, "%sError %s\n", | 447 | e752x_printk(KERN_WARNING, "%sError %s\n", |
448 | fatal_message[fatal], hub_message[i]); | 448 | fatal_message[fatal], hub_message[i]); |
449 | } | 449 | } |
450 | } | 450 | } |
451 | 451 | ||
452 | static inline void hub_error(int fatal, u8 errors, int *error_found, | 452 | static inline void hub_error(int fatal, u8 errors, int *error_found, |
453 | int handle_error) | 453 | int handle_error) |
454 | { | 454 | { |
455 | *error_found = 1; | 455 | *error_found = 1; |
456 | 456 | ||
@@ -472,7 +472,7 @@ static void do_membuf_error(u8 errors) | |||
472 | for (i = 0; i < 4; i++) { | 472 | for (i = 0; i < 4; i++) { |
473 | if (errors & (1 << i)) | 473 | if (errors & (1 << i)) |
474 | e752x_printk(KERN_WARNING, "Non-Fatal Error %s\n", | 474 | e752x_printk(KERN_WARNING, "Non-Fatal Error %s\n", |
475 | membuf_message[i]); | 475 | membuf_message[i]); |
476 | } | 476 | } |
477 | } | 477 | } |
478 | 478 | ||
@@ -503,7 +503,7 @@ static void do_sysbus_error(int fatal, u32 errors) | |||
503 | for (i = 0; i < 10; i++) { | 503 | for (i = 0; i < 10; i++) { |
504 | if (errors & (1 << i)) | 504 | if (errors & (1 << i)) |
505 | e752x_printk(KERN_WARNING, "%sError System Bus %s\n", | 505 | e752x_printk(KERN_WARNING, "%sError System Bus %s\n", |
506 | fatal_message[fatal], sysbus_message[i]); | 506 | fatal_message[fatal], sysbus_message[i]); |
507 | } | 507 | } |
508 | } | 508 | } |
509 | 509 | ||
@@ -517,7 +517,7 @@ static inline void sysbus_error(int fatal, u32 errors, int *error_found, | |||
517 | } | 517 | } |
518 | 518 | ||
519 | static void e752x_check_hub_interface(struct e752x_error_info *info, | 519 | static void e752x_check_hub_interface(struct e752x_error_info *info, |
520 | int *error_found, int handle_error) | 520 | int *error_found, int handle_error) |
521 | { | 521 | { |
522 | u8 stat8; | 522 | u8 stat8; |
523 | 523 | ||
@@ -550,7 +550,7 @@ static void e752x_check_hub_interface(struct e752x_error_info *info, | |||
550 | } | 550 | } |
551 | 551 | ||
552 | static void e752x_check_sysbus(struct e752x_error_info *info, | 552 | static void e752x_check_sysbus(struct e752x_error_info *info, |
553 | int *error_found, int handle_error) | 553 | int *error_found, int handle_error) |
554 | { | 554 | { |
555 | u32 stat32, error32; | 555 | u32 stat32, error32; |
556 | 556 | ||
@@ -577,7 +577,7 @@ static void e752x_check_sysbus(struct e752x_error_info *info, | |||
577 | } | 577 | } |
578 | 578 | ||
579 | static void e752x_check_membuf(struct e752x_error_info *info, | 579 | static void e752x_check_membuf(struct e752x_error_info *info, |
580 | int *error_found, int handle_error) | 580 | int *error_found, int handle_error) |
581 | { | 581 | { |
582 | u8 stat8; | 582 | u8 stat8; |
583 | 583 | ||
@@ -597,8 +597,8 @@ static void e752x_check_membuf(struct e752x_error_info *info, | |||
597 | } | 597 | } |
598 | 598 | ||
599 | static void e752x_check_dram(struct mem_ctl_info *mci, | 599 | static void e752x_check_dram(struct mem_ctl_info *mci, |
600 | struct e752x_error_info *info, int *error_found, | 600 | struct e752x_error_info *info, int *error_found, |
601 | int handle_error) | 601 | int handle_error) |
602 | { | 602 | { |
603 | u16 error_one, error_next; | 603 | u16 error_one, error_next; |
604 | 604 | ||
@@ -608,11 +608,11 @@ static void e752x_check_dram(struct mem_ctl_info *mci, | |||
608 | /* decode and report errors */ | 608 | /* decode and report errors */ |
609 | if (error_one & 0x0101) /* check first error correctable */ | 609 | if (error_one & 0x0101) /* check first error correctable */ |
610 | process_ce(mci, error_one, info->dram_sec1_add, | 610 | process_ce(mci, error_one, info->dram_sec1_add, |
611 | info->dram_sec1_syndrome, error_found, handle_error); | 611 | info->dram_sec1_syndrome, error_found, handle_error); |
612 | 612 | ||
613 | if (error_next & 0x0101) /* check next error correctable */ | 613 | if (error_next & 0x0101) /* check next error correctable */ |
614 | process_ce(mci, error_next, info->dram_sec2_add, | 614 | process_ce(mci, error_next, info->dram_sec2_add, |
615 | info->dram_sec2_syndrome, error_found, handle_error); | 615 | info->dram_sec2_syndrome, error_found, handle_error); |
616 | 616 | ||
617 | if (error_one & 0x4040) | 617 | if (error_one & 0x4040) |
618 | process_ue_no_info_wr(mci, error_found, handle_error); | 618 | process_ue_no_info_wr(mci, error_found, handle_error); |
@@ -622,26 +622,26 @@ static void e752x_check_dram(struct mem_ctl_info *mci, | |||
622 | 622 | ||
623 | if (error_one & 0x2020) | 623 | if (error_one & 0x2020) |
624 | process_ded_retry(mci, error_one, info->dram_retr_add, | 624 | process_ded_retry(mci, error_one, info->dram_retr_add, |
625 | error_found, handle_error); | 625 | error_found, handle_error); |
626 | 626 | ||
627 | if (error_next & 0x2020) | 627 | if (error_next & 0x2020) |
628 | process_ded_retry(mci, error_next, info->dram_retr_add, | 628 | process_ded_retry(mci, error_next, info->dram_retr_add, |
629 | error_found, handle_error); | 629 | error_found, handle_error); |
630 | 630 | ||
631 | if (error_one & 0x0808) | 631 | if (error_one & 0x0808) |
632 | process_threshold_ce(mci, error_one, error_found, handle_error); | 632 | process_threshold_ce(mci, error_one, error_found, handle_error); |
633 | 633 | ||
634 | if (error_next & 0x0808) | 634 | if (error_next & 0x0808) |
635 | process_threshold_ce(mci, error_next, error_found, | 635 | process_threshold_ce(mci, error_next, error_found, |
636 | handle_error); | 636 | handle_error); |
637 | 637 | ||
638 | if (error_one & 0x0606) | 638 | if (error_one & 0x0606) |
639 | process_ue(mci, error_one, info->dram_ded_add, | 639 | process_ue(mci, error_one, info->dram_ded_add, |
640 | info->dram_scrb_add, error_found, handle_error); | 640 | info->dram_scrb_add, error_found, handle_error); |
641 | 641 | ||
642 | if (error_next & 0x0606) | 642 | if (error_next & 0x0606) |
643 | process_ue(mci, error_next, info->dram_ded_add, | 643 | process_ue(mci, error_next, info->dram_ded_add, |
644 | info->dram_scrb_add, error_found, handle_error); | 644 | info->dram_scrb_add, error_found, handle_error); |
645 | } | 645 | } |
646 | 646 | ||
647 | static void e752x_get_error_info(struct mem_ctl_info *mci, | 647 | static void e752x_get_error_info(struct mem_ctl_info *mci, |
@@ -658,38 +658,38 @@ static void e752x_get_error_info(struct mem_ctl_info *mci, | |||
658 | if (info->ferr_global) { | 658 | if (info->ferr_global) { |
659 | pci_read_config_byte(dev, E752X_HI_FERR, &info->hi_ferr); | 659 | pci_read_config_byte(dev, E752X_HI_FERR, &info->hi_ferr); |
660 | pci_read_config_word(dev, E752X_SYSBUS_FERR, | 660 | pci_read_config_word(dev, E752X_SYSBUS_FERR, |
661 | &info->sysbus_ferr); | 661 | &info->sysbus_ferr); |
662 | pci_read_config_byte(dev, E752X_BUF_FERR, &info->buf_ferr); | 662 | pci_read_config_byte(dev, E752X_BUF_FERR, &info->buf_ferr); |
663 | pci_read_config_word(dev, E752X_DRAM_FERR, &info->dram_ferr); | 663 | pci_read_config_word(dev, E752X_DRAM_FERR, &info->dram_ferr); |
664 | pci_read_config_dword(dev, E752X_DRAM_SEC1_ADD, | 664 | pci_read_config_dword(dev, E752X_DRAM_SEC1_ADD, |
665 | &info->dram_sec1_add); | 665 | &info->dram_sec1_add); |
666 | pci_read_config_word(dev, E752X_DRAM_SEC1_SYNDROME, | 666 | pci_read_config_word(dev, E752X_DRAM_SEC1_SYNDROME, |
667 | &info->dram_sec1_syndrome); | 667 | &info->dram_sec1_syndrome); |
668 | pci_read_config_dword(dev, E752X_DRAM_DED_ADD, | 668 | pci_read_config_dword(dev, E752X_DRAM_DED_ADD, |
669 | &info->dram_ded_add); | 669 | &info->dram_ded_add); |
670 | pci_read_config_dword(dev, E752X_DRAM_SCRB_ADD, | 670 | pci_read_config_dword(dev, E752X_DRAM_SCRB_ADD, |
671 | &info->dram_scrb_add); | 671 | &info->dram_scrb_add); |
672 | pci_read_config_dword(dev, E752X_DRAM_RETR_ADD, | 672 | pci_read_config_dword(dev, E752X_DRAM_RETR_ADD, |
673 | &info->dram_retr_add); | 673 | &info->dram_retr_add); |
674 | 674 | ||
675 | if (info->hi_ferr & 0x7f) | 675 | if (info->hi_ferr & 0x7f) |
676 | pci_write_config_byte(dev, E752X_HI_FERR, | 676 | pci_write_config_byte(dev, E752X_HI_FERR, |
677 | info->hi_ferr); | 677 | info->hi_ferr); |
678 | 678 | ||
679 | if (info->sysbus_ferr) | 679 | if (info->sysbus_ferr) |
680 | pci_write_config_word(dev, E752X_SYSBUS_FERR, | 680 | pci_write_config_word(dev, E752X_SYSBUS_FERR, |
681 | info->sysbus_ferr); | 681 | info->sysbus_ferr); |
682 | 682 | ||
683 | if (info->buf_ferr & 0x0f) | 683 | if (info->buf_ferr & 0x0f) |
684 | pci_write_config_byte(dev, E752X_BUF_FERR, | 684 | pci_write_config_byte(dev, E752X_BUF_FERR, |
685 | info->buf_ferr); | 685 | info->buf_ferr); |
686 | 686 | ||
687 | if (info->dram_ferr) | 687 | if (info->dram_ferr) |
688 | pci_write_bits16(pvt->bridge_ck, E752X_DRAM_FERR, | 688 | pci_write_bits16(pvt->bridge_ck, E752X_DRAM_FERR, |
689 | info->dram_ferr, info->dram_ferr); | 689 | info->dram_ferr, info->dram_ferr); |
690 | 690 | ||
691 | pci_write_config_dword(dev, E752X_FERR_GLOBAL, | 691 | pci_write_config_dword(dev, E752X_FERR_GLOBAL, |
692 | info->ferr_global); | 692 | info->ferr_global); |
693 | } | 693 | } |
694 | 694 | ||
695 | pci_read_config_dword(dev, E752X_NERR_GLOBAL, &info->nerr_global); | 695 | pci_read_config_dword(dev, E752X_NERR_GLOBAL, &info->nerr_global); |
@@ -697,38 +697,38 @@ static void e752x_get_error_info(struct mem_ctl_info *mci, | |||
697 | if (info->nerr_global) { | 697 | if (info->nerr_global) { |
698 | pci_read_config_byte(dev, E752X_HI_NERR, &info->hi_nerr); | 698 | pci_read_config_byte(dev, E752X_HI_NERR, &info->hi_nerr); |
699 | pci_read_config_word(dev, E752X_SYSBUS_NERR, | 699 | pci_read_config_word(dev, E752X_SYSBUS_NERR, |
700 | &info->sysbus_nerr); | 700 | &info->sysbus_nerr); |
701 | pci_read_config_byte(dev, E752X_BUF_NERR, &info->buf_nerr); | 701 | pci_read_config_byte(dev, E752X_BUF_NERR, &info->buf_nerr); |
702 | pci_read_config_word(dev, E752X_DRAM_NERR, &info->dram_nerr); | 702 | pci_read_config_word(dev, E752X_DRAM_NERR, &info->dram_nerr); |
703 | pci_read_config_dword(dev, E752X_DRAM_SEC2_ADD, | 703 | pci_read_config_dword(dev, E752X_DRAM_SEC2_ADD, |
704 | &info->dram_sec2_add); | 704 | &info->dram_sec2_add); |
705 | pci_read_config_word(dev, E752X_DRAM_SEC2_SYNDROME, | 705 | pci_read_config_word(dev, E752X_DRAM_SEC2_SYNDROME, |
706 | &info->dram_sec2_syndrome); | 706 | &info->dram_sec2_syndrome); |
707 | 707 | ||
708 | if (info->hi_nerr & 0x7f) | 708 | if (info->hi_nerr & 0x7f) |
709 | pci_write_config_byte(dev, E752X_HI_NERR, | 709 | pci_write_config_byte(dev, E752X_HI_NERR, |
710 | info->hi_nerr); | 710 | info->hi_nerr); |
711 | 711 | ||
712 | if (info->sysbus_nerr) | 712 | if (info->sysbus_nerr) |
713 | pci_write_config_word(dev, E752X_SYSBUS_NERR, | 713 | pci_write_config_word(dev, E752X_SYSBUS_NERR, |
714 | info->sysbus_nerr); | 714 | info->sysbus_nerr); |
715 | 715 | ||
716 | if (info->buf_nerr & 0x0f) | 716 | if (info->buf_nerr & 0x0f) |
717 | pci_write_config_byte(dev, E752X_BUF_NERR, | 717 | pci_write_config_byte(dev, E752X_BUF_NERR, |
718 | info->buf_nerr); | 718 | info->buf_nerr); |
719 | 719 | ||
720 | if (info->dram_nerr) | 720 | if (info->dram_nerr) |
721 | pci_write_bits16(pvt->bridge_ck, E752X_DRAM_NERR, | 721 | pci_write_bits16(pvt->bridge_ck, E752X_DRAM_NERR, |
722 | info->dram_nerr, info->dram_nerr); | 722 | info->dram_nerr, info->dram_nerr); |
723 | 723 | ||
724 | pci_write_config_dword(dev, E752X_NERR_GLOBAL, | 724 | pci_write_config_dword(dev, E752X_NERR_GLOBAL, |
725 | info->nerr_global); | 725 | info->nerr_global); |
726 | } | 726 | } |
727 | } | 727 | } |
728 | 728 | ||
729 | static int e752x_process_error_info(struct mem_ctl_info *mci, | 729 | static int e752x_process_error_info(struct mem_ctl_info *mci, |
730 | struct e752x_error_info *info, | 730 | struct e752x_error_info *info, |
731 | int handle_errors) | 731 | int handle_errors) |
732 | { | 732 | { |
733 | u32 error32, stat32; | 733 | u32 error32, stat32; |
734 | int error_found; | 734 | int error_found; |
@@ -775,7 +775,7 @@ static inline int dual_channel_active(u16 ddrcsr) | |||
775 | } | 775 | } |
776 | 776 | ||
777 | static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | 777 | static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, |
778 | u16 ddrcsr) | 778 | u16 ddrcsr) |
779 | { | 779 | { |
780 | struct csrow_info *csrow; | 780 | struct csrow_info *csrow; |
781 | unsigned long last_cumul_size; | 781 | unsigned long last_cumul_size; |
@@ -841,7 +841,7 @@ static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
841 | } | 841 | } |
842 | 842 | ||
843 | static void e752x_init_mem_map_table(struct pci_dev *pdev, | 843 | static void e752x_init_mem_map_table(struct pci_dev *pdev, |
844 | struct e752x_pvt *pvt) | 844 | struct e752x_pvt *pvt) |
845 | { | 845 | { |
846 | int index; | 846 | int index; |
847 | u8 value, last, row, stat8; | 847 | u8 value, last, row, stat8; |
@@ -864,11 +864,11 @@ static void e752x_init_mem_map_table(struct pci_dev *pdev, | |||
864 | * sided | 864 | * sided |
865 | */ | 865 | */ |
866 | pci_read_config_byte(pdev, E752X_DRB + index + 1, | 866 | pci_read_config_byte(pdev, E752X_DRB + index + 1, |
867 | &value); | 867 | &value); |
868 | pvt->map[index + 1] = (value == last) ? 0xff : /* the dimm is single sided, | 868 | |
869 | so flag as empty */ | 869 | /* the dimm is single sided, so flag as empty */ |
870 | row; /* this is a double sided dimm | 870 | /* this is a double sided dimm to save the next row #*/ |
871 | to save the next row # */ | 871 | pvt->map[index + 1] = (value == last) ? 0xff : row; |
872 | row++; | 872 | row++; |
873 | last = value; | 873 | last = value; |
874 | } | 874 | } |
@@ -881,7 +881,7 @@ static void e752x_init_mem_map_table(struct pci_dev *pdev, | |||
881 | 881 | ||
882 | /* Return 0 on success or 1 on failure. */ | 882 | /* Return 0 on success or 1 on failure. */ |
883 | static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, | 883 | static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, |
884 | struct e752x_pvt *pvt) | 884 | struct e752x_pvt *pvt) |
885 | { | 885 | { |
886 | struct pci_dev *dev; | 886 | struct pci_dev *dev; |
887 | 887 | ||
@@ -894,13 +894,13 @@ static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, | |||
894 | 894 | ||
895 | if (pvt->bridge_ck == NULL) { | 895 | if (pvt->bridge_ck == NULL) { |
896 | e752x_printk(KERN_ERR, "error reporting device not found:" | 896 | e752x_printk(KERN_ERR, "error reporting device not found:" |
897 | "vendor %x device 0x%x (broken BIOS?)\n", | 897 | "vendor %x device 0x%x (broken BIOS?)\n", |
898 | PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].err_dev); | 898 | PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].err_dev); |
899 | return 1; | 899 | return 1; |
900 | } | 900 | } |
901 | 901 | ||
902 | dev = pci_get_device(PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].ctl_dev, | 902 | dev = pci_get_device(PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].ctl_dev, |
903 | NULL); | 903 | NULL); |
904 | 904 | ||
905 | if (dev == NULL) | 905 | if (dev == NULL) |
906 | goto fail; | 906 | goto fail; |
@@ -910,7 +910,7 @@ static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, | |||
910 | 910 | ||
911 | return 0; | 911 | return 0; |
912 | 912 | ||
913 | fail: | 913 | fail: |
914 | pci_dev_put(pvt->bridge_ck); | 914 | pci_dev_put(pvt->bridge_ck); |
915 | return 1; | 915 | return 1; |
916 | } | 916 | } |
@@ -961,7 +961,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
961 | pci_read_config_byte(pdev, E752X_DEVPRES1, &stat8); | 961 | pci_read_config_byte(pdev, E752X_DEVPRES1, &stat8); |
962 | if (!force_function_unhide && !(stat8 & (1 << 5))) { | 962 | if (!force_function_unhide && !(stat8 & (1 << 5))) { |
963 | printk(KERN_INFO "Contact your BIOS vendor to see if the " | 963 | printk(KERN_INFO "Contact your BIOS vendor to see if the " |
964 | "E752x error registers can be safely un-hidden\n"); | 964 | "E752x error registers can be safely un-hidden\n"); |
965 | return -ENOMEM; | 965 | return -ENOMEM; |
966 | } | 966 | } |
967 | stat8 |= (1 << 5); | 967 | stat8 |= (1 << 5); |
@@ -981,7 +981,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
981 | debugf3("%s(): init mci\n", __func__); | 981 | debugf3("%s(): init mci\n", __func__); |
982 | mci->mtype_cap = MEM_FLAG_RDDR; | 982 | mci->mtype_cap = MEM_FLAG_RDDR; |
983 | mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED | | 983 | mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED | |
984 | EDAC_FLAG_S4ECD4ED; | 984 | EDAC_FLAG_S4ECD4ED; |
985 | /* FIXME - what if different memory types are in different csrows? */ | 985 | /* FIXME - what if different memory types are in different csrows? */ |
986 | mci->mod_name = EDAC_MOD_STR; | 986 | mci->mod_name = EDAC_MOD_STR; |
987 | mci->mod_ver = E752X_REVISION; | 987 | mci->mod_ver = E752X_REVISION; |
@@ -1021,8 +1021,8 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1021 | pci_read_config_word(pdev, E752X_REMAPLIMIT, &pci_data); | 1021 | pci_read_config_word(pdev, E752X_REMAPLIMIT, &pci_data); |
1022 | pvt->remaplimit = ((u32) pci_data) << 14; | 1022 | pvt->remaplimit = ((u32) pci_data) << 14; |
1023 | e752x_printk(KERN_INFO, | 1023 | e752x_printk(KERN_INFO, |
1024 | "tolm = %x, remapbase = %x, remaplimit = %x\n", pvt->tolm, | 1024 | "tolm = %x, remapbase = %x, remaplimit = %x\n", |
1025 | pvt->remapbase, pvt->remaplimit); | 1025 | pvt->tolm, pvt->remapbase, pvt->remaplimit); |
1026 | 1026 | ||
1027 | /* Here we assume that we will never see multiple instances of this | 1027 | /* Here we assume that we will never see multiple instances of this |
1028 | * type of memory controller. The ID is therefore hardcoded to 0. | 1028 | * type of memory controller. The ID is therefore hardcoded to 0. |
@@ -1039,16 +1039,17 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1039 | e752x_pci = edac_pci_create_generic_ctl(&pdev->dev, EDAC_MOD_STR); | 1039 | e752x_pci = edac_pci_create_generic_ctl(&pdev->dev, EDAC_MOD_STR); |
1040 | if (!e752x_pci) { | 1040 | if (!e752x_pci) { |
1041 | printk(KERN_WARNING | 1041 | printk(KERN_WARNING |
1042 | "%s(): Unable to create PCI control\n", __func__); | 1042 | "%s(): Unable to create PCI control\n", __func__); |
1043 | printk(KERN_WARNING | 1043 | printk(KERN_WARNING |
1044 | "%s(): PCI error report via EDAC not setup\n", __func__); | 1044 | "%s(): PCI error report via EDAC not setup\n", |
1045 | __func__); | ||
1045 | } | 1046 | } |
1046 | 1047 | ||
1047 | /* get this far and it's successful */ | 1048 | /* get this far and it's successful */ |
1048 | debugf3("%s(): success\n", __func__); | 1049 | debugf3("%s(): success\n", __func__); |
1049 | return 0; | 1050 | return 0; |
1050 | 1051 | ||
1051 | fail: | 1052 | fail: |
1052 | pci_dev_put(pvt->dev_d0f0); | 1053 | pci_dev_put(pvt->dev_d0f0); |
1053 | pci_dev_put(pvt->dev_d0f1); | 1054 | pci_dev_put(pvt->dev_d0f1); |
1054 | pci_dev_put(pvt->bridge_ck); | 1055 | pci_dev_put(pvt->bridge_ck); |
@@ -1059,7 +1060,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1059 | 1060 | ||
1060 | /* returns count (>= 0), or negative on error */ | 1061 | /* returns count (>= 0), or negative on error */ |
1061 | static int __devinit e752x_init_one(struct pci_dev *pdev, | 1062 | static int __devinit e752x_init_one(struct pci_dev *pdev, |
1062 | const struct pci_device_id *ent) | 1063 | const struct pci_device_id *ent) |
1063 | { | 1064 | { |
1064 | debugf0("%s()\n", __func__); | 1065 | debugf0("%s()\n", __func__); |
1065 | 1066 | ||
diff --git a/drivers/edac/e7xxx_edac.c b/drivers/edac/e7xxx_edac.c index 453ba346b6ca..0601958421fb 100644 --- a/drivers/edac/e7xxx_edac.c +++ b/drivers/edac/e7xxx_edac.c | |||
@@ -148,17 +148,17 @@ static struct edac_pci_ctl_info *e7xxx_pci; | |||
148 | 148 | ||
149 | static const struct e7xxx_dev_info e7xxx_devs[] = { | 149 | static const struct e7xxx_dev_info e7xxx_devs[] = { |
150 | [E7500] = { | 150 | [E7500] = { |
151 | .err_dev = PCI_DEVICE_ID_INTEL_7500_1_ERR, | 151 | .err_dev = PCI_DEVICE_ID_INTEL_7500_1_ERR, |
152 | .ctl_name = "E7500"}, | 152 | .ctl_name = "E7500"}, |
153 | [E7501] = { | 153 | [E7501] = { |
154 | .err_dev = PCI_DEVICE_ID_INTEL_7501_1_ERR, | 154 | .err_dev = PCI_DEVICE_ID_INTEL_7501_1_ERR, |
155 | .ctl_name = "E7501"}, | 155 | .ctl_name = "E7501"}, |
156 | [E7505] = { | 156 | [E7505] = { |
157 | .err_dev = PCI_DEVICE_ID_INTEL_7505_1_ERR, | 157 | .err_dev = PCI_DEVICE_ID_INTEL_7505_1_ERR, |
158 | .ctl_name = "E7505"}, | 158 | .ctl_name = "E7505"}, |
159 | [E7205] = { | 159 | [E7205] = { |
160 | .err_dev = PCI_DEVICE_ID_INTEL_7205_1_ERR, | 160 | .err_dev = PCI_DEVICE_ID_INTEL_7205_1_ERR, |
161 | .ctl_name = "E7205"}, | 161 | .ctl_name = "E7205"}, |
162 | }; | 162 | }; |
163 | 163 | ||
164 | /* FIXME - is this valid for both SECDED and S4ECD4ED? */ | 164 | /* FIXME - is this valid for both SECDED and S4ECD4ED? */ |
@@ -179,7 +179,7 @@ static inline int e7xxx_find_channel(u16 syndrome) | |||
179 | } | 179 | } |
180 | 180 | ||
181 | static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci, | 181 | static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci, |
182 | unsigned long page) | 182 | unsigned long page) |
183 | { | 183 | { |
184 | u32 remap; | 184 | u32 remap; |
185 | struct e7xxx_pvt *pvt = (struct e7xxx_pvt *)mci->pvt_info; | 185 | struct e7xxx_pvt *pvt = (struct e7xxx_pvt *)mci->pvt_info; |
@@ -187,7 +187,7 @@ static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci, | |||
187 | debugf3("%s()\n", __func__); | 187 | debugf3("%s()\n", __func__); |
188 | 188 | ||
189 | if ((page < pvt->tolm) || | 189 | if ((page < pvt->tolm) || |
190 | ((page >= 0x100000) && (page < pvt->remapbase))) | 190 | ((page >= 0x100000) && (page < pvt->remapbase))) |
191 | return page; | 191 | return page; |
192 | 192 | ||
193 | remap = (page - pvt->tolm) + pvt->remapbase; | 193 | remap = (page - pvt->tolm) + pvt->remapbase; |
@@ -257,15 +257,15 @@ static void e7xxx_get_error_info(struct mem_ctl_info *mci, | |||
257 | 257 | ||
258 | if ((info->dram_ferr & 1) || (info->dram_nerr & 1)) { | 258 | if ((info->dram_ferr & 1) || (info->dram_nerr & 1)) { |
259 | pci_read_config_dword(pvt->bridge_ck, E7XXX_DRAM_CELOG_ADD, | 259 | pci_read_config_dword(pvt->bridge_ck, E7XXX_DRAM_CELOG_ADD, |
260 | &info->dram_celog_add); | 260 | &info->dram_celog_add); |
261 | pci_read_config_word(pvt->bridge_ck, | 261 | pci_read_config_word(pvt->bridge_ck, |
262 | E7XXX_DRAM_CELOG_SYNDROME, | 262 | E7XXX_DRAM_CELOG_SYNDROME, |
263 | &info->dram_celog_syndrome); | 263 | &info->dram_celog_syndrome); |
264 | } | 264 | } |
265 | 265 | ||
266 | if ((info->dram_ferr & 2) || (info->dram_nerr & 2)) | 266 | if ((info->dram_ferr & 2) || (info->dram_nerr & 2)) |
267 | pci_read_config_dword(pvt->bridge_ck, E7XXX_DRAM_UELOG_ADD, | 267 | pci_read_config_dword(pvt->bridge_ck, E7XXX_DRAM_UELOG_ADD, |
268 | &info->dram_uelog_add); | 268 | &info->dram_uelog_add); |
269 | 269 | ||
270 | if (info->dram_ferr & 3) | 270 | if (info->dram_ferr & 3) |
271 | pci_write_bits8(pvt->bridge_ck, E7XXX_DRAM_FERR, 0x03, 0x03); | 271 | pci_write_bits8(pvt->bridge_ck, E7XXX_DRAM_FERR, 0x03, 0x03); |
@@ -275,8 +275,8 @@ static void e7xxx_get_error_info(struct mem_ctl_info *mci, | |||
275 | } | 275 | } |
276 | 276 | ||
277 | static int e7xxx_process_error_info(struct mem_ctl_info *mci, | 277 | static int e7xxx_process_error_info(struct mem_ctl_info *mci, |
278 | struct e7xxx_error_info *info, | 278 | struct e7xxx_error_info *info, |
279 | int handle_errors) | 279 | int handle_errors) |
280 | { | 280 | { |
281 | int error_found; | 281 | int error_found; |
282 | 282 | ||
@@ -345,7 +345,7 @@ static inline int drb_granularity(u32 drc, int dev_idx) | |||
345 | } | 345 | } |
346 | 346 | ||
347 | static void e7xxx_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | 347 | static void e7xxx_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, |
348 | int dev_idx, u32 drc) | 348 | int dev_idx, u32 drc) |
349 | { | 349 | { |
350 | unsigned long last_cumul_size; | 350 | unsigned long last_cumul_size; |
351 | int index; | 351 | int index; |
@@ -435,7 +435,7 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx) | |||
435 | debugf3("%s(): init mci\n", __func__); | 435 | debugf3("%s(): init mci\n", __func__); |
436 | mci->mtype_cap = MEM_FLAG_RDDR; | 436 | mci->mtype_cap = MEM_FLAG_RDDR; |
437 | mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED | | 437 | mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED | |
438 | EDAC_FLAG_S4ECD4ED; | 438 | EDAC_FLAG_S4ECD4ED; |
439 | /* FIXME - what if different memory types are in different csrows? */ | 439 | /* FIXME - what if different memory types are in different csrows? */ |
440 | mci->mod_name = EDAC_MOD_STR; | 440 | mci->mod_name = EDAC_MOD_STR; |
441 | mci->mod_ver = E7XXX_REVISION; | 441 | mci->mod_ver = E7XXX_REVISION; |
@@ -448,8 +448,8 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx) | |||
448 | 448 | ||
449 | if (!pvt->bridge_ck) { | 449 | if (!pvt->bridge_ck) { |
450 | e7xxx_printk(KERN_ERR, "error reporting device not found:" | 450 | e7xxx_printk(KERN_ERR, "error reporting device not found:" |
451 | "vendor %x device 0x%x (broken BIOS?)\n", | 451 | "vendor %x device 0x%x (broken BIOS?)\n", |
452 | PCI_VENDOR_ID_INTEL, e7xxx_devs[dev_idx].err_dev); | 452 | PCI_VENDOR_ID_INTEL, e7xxx_devs[dev_idx].err_dev); |
453 | goto fail0; | 453 | goto fail0; |
454 | } | 454 | } |
455 | 455 | ||
@@ -469,8 +469,8 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx) | |||
469 | pci_read_config_word(pdev, E7XXX_REMAPLIMIT, &pci_data); | 469 | pci_read_config_word(pdev, E7XXX_REMAPLIMIT, &pci_data); |
470 | pvt->remaplimit = ((u32) pci_data) << 14; | 470 | pvt->remaplimit = ((u32) pci_data) << 14; |
471 | e7xxx_printk(KERN_INFO, | 471 | e7xxx_printk(KERN_INFO, |
472 | "tolm = %x, remapbase = %x, remaplimit = %x\n", pvt->tolm, | 472 | "tolm = %x, remapbase = %x, remaplimit = %x\n", pvt->tolm, |
473 | pvt->remapbase, pvt->remaplimit); | 473 | pvt->remapbase, pvt->remaplimit); |
474 | 474 | ||
475 | /* clear any pending errors, or initial state bits */ | 475 | /* clear any pending errors, or initial state bits */ |
476 | e7xxx_get_error_info(mci, &discard); | 476 | e7xxx_get_error_info(mci, &discard); |
@@ -498,10 +498,10 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx) | |||
498 | debugf3("%s(): success\n", __func__); | 498 | debugf3("%s(): success\n", __func__); |
499 | return 0; | 499 | return 0; |
500 | 500 | ||
501 | fail1: | 501 | fail1: |
502 | pci_dev_put(pvt->bridge_ck); | 502 | pci_dev_put(pvt->bridge_ck); |
503 | 503 | ||
504 | fail0: | 504 | fail0: |
505 | edac_mc_free(mci); | 505 | edac_mc_free(mci); |
506 | 506 | ||
507 | return -ENODEV; | 507 | return -ENODEV; |
@@ -509,13 +509,13 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx) | |||
509 | 509 | ||
510 | /* returns count (>= 0), or negative on error */ | 510 | /* returns count (>= 0), or negative on error */ |
511 | static int __devinit e7xxx_init_one(struct pci_dev *pdev, | 511 | static int __devinit e7xxx_init_one(struct pci_dev *pdev, |
512 | const struct pci_device_id *ent) | 512 | const struct pci_device_id *ent) |
513 | { | 513 | { |
514 | debugf0("%s()\n", __func__); | 514 | debugf0("%s()\n", __func__); |
515 | 515 | ||
516 | /* wake up and enable device */ | 516 | /* wake up and enable device */ |
517 | return pci_enable_device(pdev) ? | 517 | return pci_enable_device(pdev) ? |
518 | -EIO : e7xxx_probe1(pdev, ent->driver_data); | 518 | -EIO : e7xxx_probe1(pdev, ent->driver_data); |
519 | } | 519 | } |
520 | 520 | ||
521 | static void __devexit e7xxx_remove_one(struct pci_dev *pdev) | 521 | static void __devexit e7xxx_remove_one(struct pci_dev *pdev) |
@@ -578,7 +578,7 @@ module_exit(e7xxx_exit); | |||
578 | 578 | ||
579 | MODULE_LICENSE("GPL"); | 579 | MODULE_LICENSE("GPL"); |
580 | MODULE_AUTHOR("Linux Networx (http://lnxi.com) Thayne Harbaugh et al\n" | 580 | MODULE_AUTHOR("Linux Networx (http://lnxi.com) Thayne Harbaugh et al\n" |
581 | "Based on.work by Dan Hollis et al"); | 581 | "Based on.work by Dan Hollis et al"); |
582 | MODULE_DESCRIPTION("MC support for Intel e7xxx memory controllers"); | 582 | MODULE_DESCRIPTION("MC support for Intel e7xxx memory controllers"); |
583 | module_param(edac_op_state, int, 0444); | 583 | module_param(edac_op_state, int, 0444); |
584 | MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI"); | 584 | MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI"); |
diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index dfdfc4bbeba8..258e146efcbd 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c | |||
@@ -94,16 +94,16 @@ struct edac_device_ctl_info *edac_device_alloc_ctl_info( | |||
94 | 94 | ||
95 | /* Calc the 'end' offset past the ctl_info structure */ | 95 | /* Calc the 'end' offset past the ctl_info structure */ |
96 | dev_inst = (struct edac_device_instance *) | 96 | dev_inst = (struct edac_device_instance *) |
97 | edac_align_ptr(&dev_ctl[1], sizeof(*dev_inst)); | 97 | edac_align_ptr(&dev_ctl[1], sizeof(*dev_inst)); |
98 | 98 | ||
99 | /* Calc the 'end' offset past the instance array */ | 99 | /* Calc the 'end' offset past the instance array */ |
100 | dev_blk = (struct edac_device_block *) | 100 | dev_blk = (struct edac_device_block *) |
101 | edac_align_ptr(&dev_inst[nr_instances], sizeof(*dev_blk)); | 101 | edac_align_ptr(&dev_inst[nr_instances], sizeof(*dev_blk)); |
102 | 102 | ||
103 | /* Calc the 'end' offset past the dev_blk array */ | 103 | /* Calc the 'end' offset past the dev_blk array */ |
104 | count = nr_instances * nr_blocks; | 104 | count = nr_instances * nr_blocks; |
105 | dev_attrib = (struct edac_attrib *) | 105 | dev_attrib = (struct edac_attrib *) |
106 | edac_align_ptr(&dev_blk[count], sizeof(*dev_attrib)); | 106 | edac_align_ptr(&dev_blk[count], sizeof(*dev_attrib)); |
107 | 107 | ||
108 | /* Check for case of NO attributes specified */ | 108 | /* Check for case of NO attributes specified */ |
109 | if (nr_attribs > 0) | 109 | if (nr_attribs > 0) |
@@ -121,11 +121,11 @@ struct edac_device_ctl_info *edac_device_alloc_ctl_info( | |||
121 | * rather than an imaginary chunk of memory located at address 0. | 121 | * rather than an imaginary chunk of memory located at address 0. |
122 | */ | 122 | */ |
123 | dev_inst = (struct edac_device_instance *) | 123 | dev_inst = (struct edac_device_instance *) |
124 | (((char *)dev_ctl) + ((unsigned long)dev_inst)); | 124 | (((char *)dev_ctl) + ((unsigned long)dev_inst)); |
125 | dev_blk = (struct edac_device_block *) | 125 | dev_blk = (struct edac_device_block *) |
126 | (((char *)dev_ctl) + ((unsigned long)dev_blk)); | 126 | (((char *)dev_ctl) + ((unsigned long)dev_blk)); |
127 | dev_attrib = (struct edac_attrib *) | 127 | dev_attrib = (struct edac_attrib *) |
128 | (((char *)dev_ctl) + ((unsigned long)dev_attrib)); | 128 | (((char *)dev_ctl) + ((unsigned long)dev_attrib)); |
129 | pvt = sz_private ? (((char *)dev_ctl) + ((unsigned long)pvt)) : NULL; | 129 | pvt = sz_private ? (((char *)dev_ctl) + ((unsigned long)pvt)) : NULL; |
130 | 130 | ||
131 | memset(dev_ctl, 0, total_size); /* clear all fields */ | 131 | memset(dev_ctl, 0, total_size); /* clear all fields */ |
@@ -257,18 +257,18 @@ static int add_edac_dev_to_global_list(struct edac_device_ctl_info *edac_dev) | |||
257 | list_add_tail_rcu(&edac_dev->link, insert_before); | 257 | list_add_tail_rcu(&edac_dev->link, insert_before); |
258 | return 0; | 258 | return 0; |
259 | 259 | ||
260 | fail0: | 260 | fail0: |
261 | edac_printk(KERN_WARNING, EDAC_MC, | 261 | edac_printk(KERN_WARNING, EDAC_MC, |
262 | "%s (%s) %s %s already assigned %d\n", | 262 | "%s (%s) %s %s already assigned %d\n", |
263 | rover->dev->bus_id, dev_name(rover), | 263 | rover->dev->bus_id, dev_name(rover), |
264 | rover->mod_name, rover->ctl_name, rover->dev_idx); | 264 | rover->mod_name, rover->ctl_name, rover->dev_idx); |
265 | return 1; | 265 | return 1; |
266 | 266 | ||
267 | fail1: | 267 | fail1: |
268 | edac_printk(KERN_WARNING, EDAC_MC, | 268 | edac_printk(KERN_WARNING, EDAC_MC, |
269 | "bug in low-level driver: attempt to assign\n" | 269 | "bug in low-level driver: attempt to assign\n" |
270 | " duplicate dev_idx %d in %s()\n", rover->dev_idx, | 270 | " duplicate dev_idx %d in %s()\n", rover->dev_idx, |
271 | __func__); | 271 | __func__); |
272 | return 1; | 272 | return 1; |
273 | } | 273 | } |
274 | 274 | ||
@@ -288,7 +288,7 @@ static void complete_edac_device_list_del(struct rcu_head *head) | |||
288 | * del_edac_device_from_global_list | 288 | * del_edac_device_from_global_list |
289 | */ | 289 | */ |
290 | static void del_edac_device_from_global_list(struct edac_device_ctl_info | 290 | static void del_edac_device_from_global_list(struct edac_device_ctl_info |
291 | *edac_device) | 291 | *edac_device) |
292 | { | 292 | { |
293 | list_del_rcu(&edac_device->link); | 293 | list_del_rcu(&edac_device->link); |
294 | init_completion(&edac_device->complete); | 294 | init_completion(&edac_device->complete); |
@@ -342,8 +342,8 @@ static void edac_device_workq_function(struct work_struct *work_req) | |||
342 | 342 | ||
343 | /* Only poll controllers that are running polled and have a check */ | 343 | /* Only poll controllers that are running polled and have a check */ |
344 | if ((edac_dev->op_state == OP_RUNNING_POLL) && | 344 | if ((edac_dev->op_state == OP_RUNNING_POLL) && |
345 | (edac_dev->edac_check != NULL)) { | 345 | (edac_dev->edac_check != NULL)) { |
346 | edac_dev->edac_check(edac_dev); | 346 | edac_dev->edac_check(edac_dev); |
347 | } | 347 | } |
348 | 348 | ||
349 | unlock_device_list(); | 349 | unlock_device_list(); |
@@ -358,7 +358,7 @@ static void edac_device_workq_function(struct work_struct *work_req) | |||
358 | * passing in the new delay period in msec | 358 | * passing in the new delay period in msec |
359 | */ | 359 | */ |
360 | void edac_device_workq_setup(struct edac_device_ctl_info *edac_dev, | 360 | void edac_device_workq_setup(struct edac_device_ctl_info *edac_dev, |
361 | unsigned msec) | 361 | unsigned msec) |
362 | { | 362 | { |
363 | debugf0("%s()\n", __func__); | 363 | debugf0("%s()\n", __func__); |
364 | 364 | ||
@@ -389,7 +389,7 @@ void edac_device_workq_teardown(struct edac_device_ctl_info *edac_dev) | |||
389 | */ | 389 | */ |
390 | 390 | ||
391 | void edac_device_reset_delay_period(struct edac_device_ctl_info *edac_dev, | 391 | void edac_device_reset_delay_period(struct edac_device_ctl_info *edac_dev, |
392 | unsigned long value) | 392 | unsigned long value) |
393 | { | 393 | { |
394 | lock_device_list(); | 394 | lock_device_list(); |
395 | 395 | ||
@@ -434,7 +434,7 @@ int edac_device_add_device(struct edac_device_ctl_info *edac_dev, int edac_idx) | |||
434 | /* create this instance's sysfs entries */ | 434 | /* create this instance's sysfs entries */ |
435 | if (edac_device_create_sysfs(edac_dev)) { | 435 | if (edac_device_create_sysfs(edac_dev)) { |
436 | edac_device_printk(edac_dev, KERN_WARNING, | 436 | edac_device_printk(edac_dev, KERN_WARNING, |
437 | "failed to create sysfs device\n"); | 437 | "failed to create sysfs device\n"); |
438 | goto fail1; | 438 | goto fail1; |
439 | } | 439 | } |
440 | 440 | ||
@@ -454,21 +454,21 @@ int edac_device_add_device(struct edac_device_ctl_info *edac_dev, int edac_idx) | |||
454 | 454 | ||
455 | /* Report action taken */ | 455 | /* Report action taken */ |
456 | edac_device_printk(edac_dev, KERN_INFO, | 456 | edac_device_printk(edac_dev, KERN_INFO, |
457 | "Giving out device to module '%s' controller '%s': DEV '%s' (%s)\n", | 457 | "Giving out device to module '%s' controller " |
458 | edac_dev->mod_name, | 458 | "'%s': DEV '%s' (%s)\n", |
459 | edac_dev->ctl_name, | 459 | edac_dev->mod_name, |
460 | dev_name(edac_dev), | 460 | edac_dev->ctl_name, |
461 | edac_op_state_toString(edac_dev->op_state) | 461 | dev_name(edac_dev), |
462 | ); | 462 | edac_op_state_toString(edac_dev->op_state)); |
463 | 463 | ||
464 | unlock_device_list(); | 464 | unlock_device_list(); |
465 | return 0; | 465 | return 0; |
466 | 466 | ||
467 | fail1: | 467 | fail1: |
468 | /* Some error, so remove the entry from the lsit */ | 468 | /* Some error, so remove the entry from the lsit */ |
469 | del_edac_device_from_global_list(edac_dev); | 469 | del_edac_device_from_global_list(edac_dev); |
470 | 470 | ||
471 | fail0: | 471 | fail0: |
472 | unlock_device_list(); | 472 | unlock_device_list(); |
473 | return 1; | 473 | return 1; |
474 | } | 474 | } |
@@ -516,9 +516,9 @@ struct edac_device_ctl_info *edac_device_del_device(struct device *dev) | |||
516 | unlock_device_list(); | 516 | unlock_device_list(); |
517 | 517 | ||
518 | edac_printk(KERN_INFO, EDAC_MC, | 518 | edac_printk(KERN_INFO, EDAC_MC, |
519 | "Removed device %d for %s %s: DEV %s\n", | 519 | "Removed device %d for %s %s: DEV %s\n", |
520 | edac_dev->dev_idx, | 520 | edac_dev->dev_idx, |
521 | edac_dev->mod_name, edac_dev->ctl_name, dev_name(edac_dev)); | 521 | edac_dev->mod_name, edac_dev->ctl_name, dev_name(edac_dev)); |
522 | 522 | ||
523 | return edac_dev; | 523 | return edac_dev; |
524 | } | 524 | } |
@@ -536,7 +536,7 @@ static inline int edac_device_get_log_ue(struct edac_device_ctl_info *edac_dev) | |||
536 | } | 536 | } |
537 | 537 | ||
538 | static inline int edac_device_get_panic_on_ue(struct edac_device_ctl_info | 538 | static inline int edac_device_get_panic_on_ue(struct edac_device_ctl_info |
539 | *edac_dev) | 539 | *edac_dev) |
540 | { | 540 | { |
541 | return edac_dev->panic_on_ue; | 541 | return edac_dev->panic_on_ue; |
542 | } | 542 | } |
@@ -546,16 +546,16 @@ static inline int edac_device_get_panic_on_ue(struct edac_device_ctl_info | |||
546 | * perform a common output and handling of an 'edac_dev' CE event | 546 | * perform a common output and handling of an 'edac_dev' CE event |
547 | */ | 547 | */ |
548 | void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, | 548 | void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, |
549 | int inst_nr, int block_nr, const char *msg) | 549 | int inst_nr, int block_nr, const char *msg) |
550 | { | 550 | { |
551 | struct edac_device_instance *instance; | 551 | struct edac_device_instance *instance; |
552 | struct edac_device_block *block = NULL; | 552 | struct edac_device_block *block = NULL; |
553 | 553 | ||
554 | if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) { | 554 | if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) { |
555 | edac_device_printk(edac_dev, KERN_ERR, | 555 | edac_device_printk(edac_dev, KERN_ERR, |
556 | "INTERNAL ERROR: 'instance' out of range " | 556 | "INTERNAL ERROR: 'instance' out of range " |
557 | "(%d >= %d)\n", inst_nr, | 557 | "(%d >= %d)\n", inst_nr, |
558 | edac_dev->nr_instances); | 558 | edac_dev->nr_instances); |
559 | return; | 559 | return; |
560 | } | 560 | } |
561 | 561 | ||
@@ -563,9 +563,10 @@ void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, | |||
563 | 563 | ||
564 | if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) { | 564 | if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) { |
565 | edac_device_printk(edac_dev, KERN_ERR, | 565 | edac_device_printk(edac_dev, KERN_ERR, |
566 | "INTERNAL ERROR: instance %d 'block' out of range " | 566 | "INTERNAL ERROR: instance %d 'block' " |
567 | "(%d >= %d)\n", inst_nr, block_nr, | 567 | "out of range (%d >= %d)\n", |
568 | instance->nr_blocks); | 568 | inst_nr, block_nr, |
569 | instance->nr_blocks); | ||
569 | return; | 570 | return; |
570 | } | 571 | } |
571 | 572 | ||
@@ -580,9 +581,9 @@ void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, | |||
580 | 581 | ||
581 | if (edac_device_get_log_ce(edac_dev)) | 582 | if (edac_device_get_log_ce(edac_dev)) |
582 | edac_device_printk(edac_dev, KERN_WARNING, | 583 | edac_device_printk(edac_dev, KERN_WARNING, |
583 | "CE: %s instance: %s block: %s '%s'\n", | 584 | "CE: %s instance: %s block: %s '%s'\n", |
584 | edac_dev->ctl_name, instance->name, | 585 | edac_dev->ctl_name, instance->name, |
585 | block ? block->name : "N/A", msg); | 586 | block ? block->name : "N/A", msg); |
586 | } | 587 | } |
587 | 588 | ||
588 | EXPORT_SYMBOL_GPL(edac_device_handle_ce); | 589 | EXPORT_SYMBOL_GPL(edac_device_handle_ce); |
@@ -592,16 +593,16 @@ EXPORT_SYMBOL_GPL(edac_device_handle_ce); | |||
592 | * perform a common output and handling of an 'edac_dev' UE event | 593 | * perform a common output and handling of an 'edac_dev' UE event |
593 | */ | 594 | */ |
594 | void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, | 595 | void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, |
595 | int inst_nr, int block_nr, const char *msg) | 596 | int inst_nr, int block_nr, const char *msg) |
596 | { | 597 | { |
597 | struct edac_device_instance *instance; | 598 | struct edac_device_instance *instance; |
598 | struct edac_device_block *block = NULL; | 599 | struct edac_device_block *block = NULL; |
599 | 600 | ||
600 | if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) { | 601 | if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) { |
601 | edac_device_printk(edac_dev, KERN_ERR, | 602 | edac_device_printk(edac_dev, KERN_ERR, |
602 | "INTERNAL ERROR: 'instance' out of range " | 603 | "INTERNAL ERROR: 'instance' out of range " |
603 | "(%d >= %d)\n", inst_nr, | 604 | "(%d >= %d)\n", inst_nr, |
604 | edac_dev->nr_instances); | 605 | edac_dev->nr_instances); |
605 | return; | 606 | return; |
606 | } | 607 | } |
607 | 608 | ||
@@ -609,9 +610,10 @@ void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, | |||
609 | 610 | ||
610 | if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) { | 611 | if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) { |
611 | edac_device_printk(edac_dev, KERN_ERR, | 612 | edac_device_printk(edac_dev, KERN_ERR, |
612 | "INTERNAL ERROR: instance %d 'block' out of range " | 613 | "INTERNAL ERROR: instance %d 'block' " |
613 | "(%d >= %d)\n", inst_nr, block_nr, | 614 | "out of range (%d >= %d)\n", |
614 | instance->nr_blocks); | 615 | inst_nr, block_nr, |
616 | instance->nr_blocks); | ||
615 | return; | 617 | return; |
616 | } | 618 | } |
617 | 619 | ||
@@ -626,14 +628,14 @@ void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, | |||
626 | 628 | ||
627 | if (edac_device_get_log_ue(edac_dev)) | 629 | if (edac_device_get_log_ue(edac_dev)) |
628 | edac_device_printk(edac_dev, KERN_EMERG, | 630 | edac_device_printk(edac_dev, KERN_EMERG, |
629 | "UE: %s instance: %s block: %s '%s'\n", | 631 | "UE: %s instance: %s block: %s '%s'\n", |
630 | edac_dev->ctl_name, instance->name, | 632 | edac_dev->ctl_name, instance->name, |
631 | block ? block->name : "N/A", msg); | 633 | block ? block->name : "N/A", msg); |
632 | 634 | ||
633 | if (edac_device_get_panic_on_ue(edac_dev)) | 635 | if (edac_device_get_panic_on_ue(edac_dev)) |
634 | panic("EDAC %s: UE instance: %s block %s '%s'\n", | 636 | panic("EDAC %s: UE instance: %s block %s '%s'\n", |
635 | edac_dev->ctl_name, instance->name, | 637 | edac_dev->ctl_name, instance->name, |
636 | block ? block->name : "N/A", msg); | 638 | block ? block->name : "N/A", msg); |
637 | } | 639 | } |
638 | 640 | ||
639 | EXPORT_SYMBOL_GPL(edac_device_handle_ue); | 641 | EXPORT_SYMBOL_GPL(edac_device_handle_ue); |
diff --git a/drivers/edac/edac_device_sysfs.c b/drivers/edac/edac_device_sysfs.c index 32b2a8e53dc7..5bf7cbab27d4 100644 --- a/drivers/edac/edac_device_sysfs.c +++ b/drivers/edac/edac_device_sysfs.c | |||
@@ -27,14 +27,14 @@ | |||
27 | 27 | ||
28 | /* 'log_ue' */ | 28 | /* 'log_ue' */ |
29 | static ssize_t edac_device_ctl_log_ue_show(struct edac_device_ctl_info | 29 | static ssize_t edac_device_ctl_log_ue_show(struct edac_device_ctl_info |
30 | *ctl_info, char *data) | 30 | *ctl_info, char *data) |
31 | { | 31 | { |
32 | return sprintf(data, "%u\n", ctl_info->log_ue); | 32 | return sprintf(data, "%u\n", ctl_info->log_ue); |
33 | } | 33 | } |
34 | 34 | ||
35 | static ssize_t edac_device_ctl_log_ue_store(struct edac_device_ctl_info | 35 | static ssize_t edac_device_ctl_log_ue_store(struct edac_device_ctl_info |
36 | *ctl_info, const char *data, | 36 | *ctl_info, const char *data, |
37 | size_t count) | 37 | size_t count) |
38 | { | 38 | { |
39 | /* if parameter is zero, turn off flag, if non-zero turn on flag */ | 39 | /* if parameter is zero, turn off flag, if non-zero turn on flag */ |
40 | ctl_info->log_ue = (simple_strtoul(data, NULL, 0) != 0); | 40 | ctl_info->log_ue = (simple_strtoul(data, NULL, 0) != 0); |
@@ -44,14 +44,14 @@ static ssize_t edac_device_ctl_log_ue_store(struct edac_device_ctl_info | |||
44 | 44 | ||
45 | /* 'log_ce' */ | 45 | /* 'log_ce' */ |
46 | static ssize_t edac_device_ctl_log_ce_show(struct edac_device_ctl_info | 46 | static ssize_t edac_device_ctl_log_ce_show(struct edac_device_ctl_info |
47 | *ctl_info, char *data) | 47 | *ctl_info, char *data) |
48 | { | 48 | { |
49 | return sprintf(data, "%u\n", ctl_info->log_ce); | 49 | return sprintf(data, "%u\n", ctl_info->log_ce); |
50 | } | 50 | } |
51 | 51 | ||
52 | static ssize_t edac_device_ctl_log_ce_store(struct edac_device_ctl_info | 52 | static ssize_t edac_device_ctl_log_ce_store(struct edac_device_ctl_info |
53 | *ctl_info, const char *data, | 53 | *ctl_info, const char *data, |
54 | size_t count) | 54 | size_t count) |
55 | { | 55 | { |
56 | /* if parameter is zero, turn off flag, if non-zero turn on flag */ | 56 | /* if parameter is zero, turn off flag, if non-zero turn on flag */ |
57 | ctl_info->log_ce = (simple_strtoul(data, NULL, 0) != 0); | 57 | ctl_info->log_ce = (simple_strtoul(data, NULL, 0) != 0); |
@@ -78,14 +78,14 @@ static ssize_t edac_device_ctl_panic_on_ue_store(struct edac_device_ctl_info | |||
78 | 78 | ||
79 | /* 'poll_msec' show and store functions*/ | 79 | /* 'poll_msec' show and store functions*/ |
80 | static ssize_t edac_device_ctl_poll_msec_show(struct edac_device_ctl_info | 80 | static ssize_t edac_device_ctl_poll_msec_show(struct edac_device_ctl_info |
81 | *ctl_info, char *data) | 81 | *ctl_info, char *data) |
82 | { | 82 | { |
83 | return sprintf(data, "%u\n", ctl_info->poll_msec); | 83 | return sprintf(data, "%u\n", ctl_info->poll_msec); |
84 | } | 84 | } |
85 | 85 | ||
86 | static ssize_t edac_device_ctl_poll_msec_store(struct edac_device_ctl_info | 86 | static ssize_t edac_device_ctl_poll_msec_store(struct edac_device_ctl_info |
87 | *ctl_info, const char *data, | 87 | *ctl_info, const char *data, |
88 | size_t count) | 88 | size_t count) |
89 | { | 89 | { |
90 | unsigned long value; | 90 | unsigned long value; |
91 | 91 | ||
@@ -112,7 +112,7 @@ struct ctl_info_attribute { | |||
112 | 112 | ||
113 | /* Function to 'show' fields from the edac_dev 'ctl_info' structure */ | 113 | /* Function to 'show' fields from the edac_dev 'ctl_info' structure */ |
114 | static ssize_t edac_dev_ctl_info_show(struct kobject *kobj, | 114 | static ssize_t edac_dev_ctl_info_show(struct kobject *kobj, |
115 | struct attribute *attr, char *buffer) | 115 | struct attribute *attr, char *buffer) |
116 | { | 116 | { |
117 | struct edac_device_ctl_info *edac_dev = to_ctl_info(kobj); | 117 | struct edac_device_ctl_info *edac_dev = to_ctl_info(kobj); |
118 | struct ctl_info_attribute *ctl_info_attr = to_ctl_info_attr(attr); | 118 | struct ctl_info_attribute *ctl_info_attr = to_ctl_info_attr(attr); |
@@ -124,8 +124,8 @@ static ssize_t edac_dev_ctl_info_show(struct kobject *kobj, | |||
124 | 124 | ||
125 | /* Function to 'store' fields into the edac_dev 'ctl_info' structure */ | 125 | /* Function to 'store' fields into the edac_dev 'ctl_info' structure */ |
126 | static ssize_t edac_dev_ctl_info_store(struct kobject *kobj, | 126 | static ssize_t edac_dev_ctl_info_store(struct kobject *kobj, |
127 | struct attribute *attr, | 127 | struct attribute *attr, |
128 | const char *buffer, size_t count) | 128 | const char *buffer, size_t count) |
129 | { | 129 | { |
130 | struct edac_device_ctl_info *edac_dev = to_ctl_info(kobj); | 130 | struct edac_device_ctl_info *edac_dev = to_ctl_info(kobj); |
131 | struct ctl_info_attribute *ctl_info_attr = to_ctl_info_attr(attr); | 131 | struct ctl_info_attribute *ctl_info_attr = to_ctl_info_attr(attr); |
@@ -143,21 +143,21 @@ static struct sysfs_ops device_ctl_info_ops = { | |||
143 | 143 | ||
144 | #define CTL_INFO_ATTR(_name,_mode,_show,_store) \ | 144 | #define CTL_INFO_ATTR(_name,_mode,_show,_store) \ |
145 | static struct ctl_info_attribute attr_ctl_info_##_name = { \ | 145 | static struct ctl_info_attribute attr_ctl_info_##_name = { \ |
146 | .attr = {.name = __stringify(_name), .mode = _mode }, \ | 146 | .attr = {.name = __stringify(_name), .mode = _mode }, \ |
147 | .show = _show, \ | 147 | .show = _show, \ |
148 | .store = _store, \ | 148 | .store = _store, \ |
149 | }; | 149 | }; |
150 | 150 | ||
151 | /* Declare the various ctl_info attributes here and their respective ops */ | 151 | /* Declare the various ctl_info attributes here and their respective ops */ |
152 | CTL_INFO_ATTR(log_ue, S_IRUGO | S_IWUSR, | 152 | CTL_INFO_ATTR(log_ue, S_IRUGO | S_IWUSR, |
153 | edac_device_ctl_log_ue_show, edac_device_ctl_log_ue_store); | 153 | edac_device_ctl_log_ue_show, edac_device_ctl_log_ue_store); |
154 | CTL_INFO_ATTR(log_ce, S_IRUGO | S_IWUSR, | 154 | CTL_INFO_ATTR(log_ce, S_IRUGO | S_IWUSR, |
155 | edac_device_ctl_log_ce_show, edac_device_ctl_log_ce_store); | 155 | edac_device_ctl_log_ce_show, edac_device_ctl_log_ce_store); |
156 | CTL_INFO_ATTR(panic_on_ue, S_IRUGO | S_IWUSR, | 156 | CTL_INFO_ATTR(panic_on_ue, S_IRUGO | S_IWUSR, |
157 | edac_device_ctl_panic_on_ue_show, | 157 | edac_device_ctl_panic_on_ue_show, |
158 | edac_device_ctl_panic_on_ue_store); | 158 | edac_device_ctl_panic_on_ue_store); |
159 | CTL_INFO_ATTR(poll_msec, S_IRUGO | S_IWUSR, | 159 | CTL_INFO_ATTR(poll_msec, S_IRUGO | S_IWUSR, |
160 | edac_device_ctl_poll_msec_show, edac_device_ctl_poll_msec_store); | 160 | edac_device_ctl_poll_msec_show, edac_device_ctl_poll_msec_store); |
161 | 161 | ||
162 | /* Base Attributes of the EDAC_DEVICE ECC object */ | 162 | /* Base Attributes of the EDAC_DEVICE ECC object */ |
163 | static struct ctl_info_attribute *device_ctrl_attr[] = { | 163 | static struct ctl_info_attribute *device_ctrl_attr[] = { |
@@ -242,7 +242,7 @@ static int edac_device_register_main_kobj(struct edac_device_ctl_info *edac_dev) | |||
242 | * the '..../edac/<name>' kobject | 242 | * the '..../edac/<name>' kobject |
243 | */ | 243 | */ |
244 | static void edac_device_unregister_main_kobj(struct edac_device_ctl_info | 244 | static void edac_device_unregister_main_kobj(struct edac_device_ctl_info |
245 | *edac_dev) | 245 | *edac_dev) |
246 | { | 246 | { |
247 | debugf0("%s()\n", __func__); | 247 | debugf0("%s()\n", __func__); |
248 | debugf1("%s() name of kobject is: %s\n", | 248 | debugf1("%s() name of kobject is: %s\n", |
@@ -264,13 +264,13 @@ static void edac_device_unregister_main_kobj(struct edac_device_ctl_info | |||
264 | * Set of low-level instance attribute show functions | 264 | * Set of low-level instance attribute show functions |
265 | */ | 265 | */ |
266 | static ssize_t instance_ue_count_show(struct edac_device_instance *instance, | 266 | static ssize_t instance_ue_count_show(struct edac_device_instance *instance, |
267 | char *data) | 267 | char *data) |
268 | { | 268 | { |
269 | return sprintf(data, "%u\n", instance->counters.ue_count); | 269 | return sprintf(data, "%u\n", instance->counters.ue_count); |
270 | } | 270 | } |
271 | 271 | ||
272 | static ssize_t instance_ce_count_show(struct edac_device_instance *instance, | 272 | static ssize_t instance_ce_count_show(struct edac_device_instance *instance, |
273 | char *data) | 273 | char *data) |
274 | { | 274 | { |
275 | return sprintf(data, "%u\n", instance->counters.ce_count); | 275 | return sprintf(data, "%u\n", instance->counters.ce_count); |
276 | } | 276 | } |
@@ -298,7 +298,7 @@ struct instance_attribute { | |||
298 | 298 | ||
299 | /* Function to 'show' fields from the edac_dev 'instance' structure */ | 299 | /* Function to 'show' fields from the edac_dev 'instance' structure */ |
300 | static ssize_t edac_dev_instance_show(struct kobject *kobj, | 300 | static ssize_t edac_dev_instance_show(struct kobject *kobj, |
301 | struct attribute *attr, char *buffer) | 301 | struct attribute *attr, char *buffer) |
302 | { | 302 | { |
303 | struct edac_device_instance *instance = to_instance(kobj); | 303 | struct edac_device_instance *instance = to_instance(kobj); |
304 | struct instance_attribute *instance_attr = to_instance_attr(attr); | 304 | struct instance_attribute *instance_attr = to_instance_attr(attr); |
@@ -310,8 +310,8 @@ static ssize_t edac_dev_instance_show(struct kobject *kobj, | |||
310 | 310 | ||
311 | /* Function to 'store' fields into the edac_dev 'instance' structure */ | 311 | /* Function to 'store' fields into the edac_dev 'instance' structure */ |
312 | static ssize_t edac_dev_instance_store(struct kobject *kobj, | 312 | static ssize_t edac_dev_instance_store(struct kobject *kobj, |
313 | struct attribute *attr, | 313 | struct attribute *attr, |
314 | const char *buffer, size_t count) | 314 | const char *buffer, size_t count) |
315 | { | 315 | { |
316 | struct edac_device_instance *instance = to_instance(kobj); | 316 | struct edac_device_instance *instance = to_instance(kobj); |
317 | struct instance_attribute *instance_attr = to_instance_attr(attr); | 317 | struct instance_attribute *instance_attr = to_instance_attr(attr); |
@@ -329,9 +329,9 @@ static struct sysfs_ops device_instance_ops = { | |||
329 | 329 | ||
330 | #define INSTANCE_ATTR(_name,_mode,_show,_store) \ | 330 | #define INSTANCE_ATTR(_name,_mode,_show,_store) \ |
331 | static struct instance_attribute attr_instance_##_name = { \ | 331 | static struct instance_attribute attr_instance_##_name = { \ |
332 | .attr = {.name = __stringify(_name), .mode = _mode }, \ | 332 | .attr = {.name = __stringify(_name), .mode = _mode }, \ |
333 | .show = _show, \ | 333 | .show = _show, \ |
334 | .store = _store, \ | 334 | .store = _store, \ |
335 | }; | 335 | }; |
336 | 336 | ||
337 | /* | 337 | /* |
@@ -394,7 +394,7 @@ struct block_attribute { | |||
394 | 394 | ||
395 | /* Function to 'show' fields from the edac_dev 'block' structure */ | 395 | /* Function to 'show' fields from the edac_dev 'block' structure */ |
396 | static ssize_t edac_dev_block_show(struct kobject *kobj, | 396 | static ssize_t edac_dev_block_show(struct kobject *kobj, |
397 | struct attribute *attr, char *buffer) | 397 | struct attribute *attr, char *buffer) |
398 | { | 398 | { |
399 | struct edac_device_block *block = to_block(kobj); | 399 | struct edac_device_block *block = to_block(kobj); |
400 | struct block_attribute *block_attr = to_block_attr(attr); | 400 | struct block_attribute *block_attr = to_block_attr(attr); |
@@ -406,8 +406,8 @@ static ssize_t edac_dev_block_show(struct kobject *kobj, | |||
406 | 406 | ||
407 | /* Function to 'store' fields into the edac_dev 'block' structure */ | 407 | /* Function to 'store' fields into the edac_dev 'block' structure */ |
408 | static ssize_t edac_dev_block_store(struct kobject *kobj, | 408 | static ssize_t edac_dev_block_store(struct kobject *kobj, |
409 | struct attribute *attr, | 409 | struct attribute *attr, |
410 | const char *buffer, size_t count) | 410 | const char *buffer, size_t count) |
411 | { | 411 | { |
412 | struct edac_device_block *block = to_block(kobj); | 412 | struct edac_device_block *block = to_block(kobj); |
413 | struct block_attribute *block_attr = to_block_attr(attr); | 413 | struct block_attribute *block_attr = to_block_attr(attr); |
@@ -425,9 +425,9 @@ static struct sysfs_ops device_block_ops = { | |||
425 | 425 | ||
426 | #define BLOCK_ATTR(_name,_mode,_show,_store) \ | 426 | #define BLOCK_ATTR(_name,_mode,_show,_store) \ |
427 | static struct block_attribute attr_block_##_name = { \ | 427 | static struct block_attribute attr_block_##_name = { \ |
428 | .attr = {.name = __stringify(_name), .mode = _mode }, \ | 428 | .attr = {.name = __stringify(_name), .mode = _mode }, \ |
429 | .show = _show, \ | 429 | .show = _show, \ |
430 | .store = _store, \ | 430 | .store = _store, \ |
431 | }; | 431 | }; |
432 | 432 | ||
433 | BLOCK_ATTR(ce_count, S_IRUGO, block_ce_count_show, NULL); | 433 | BLOCK_ATTR(ce_count, S_IRUGO, block_ce_count_show, NULL); |
@@ -453,8 +453,8 @@ static struct kobj_type ktype_block_ctrl = { | |||
453 | * edac_device_create_block | 453 | * edac_device_create_block |
454 | */ | 454 | */ |
455 | static int edac_device_create_block(struct edac_device_ctl_info *edac_dev, | 455 | static int edac_device_create_block(struct edac_device_ctl_info *edac_dev, |
456 | struct edac_device_instance *instance, | 456 | struct edac_device_instance *instance, |
457 | int idx) | 457 | int idx) |
458 | { | 458 | { |
459 | int err; | 459 | int err; |
460 | struct edac_device_block *block; | 460 | struct edac_device_block *block; |
@@ -487,8 +487,8 @@ static int edac_device_create_block(struct edac_device_ctl_info *edac_dev, | |||
487 | * edac_device_delete_block(edac_dev,j); | 487 | * edac_device_delete_block(edac_dev,j); |
488 | */ | 488 | */ |
489 | static void edac_device_delete_block(struct edac_device_ctl_info *edac_dev, | 489 | static void edac_device_delete_block(struct edac_device_ctl_info *edac_dev, |
490 | struct edac_device_instance *instance, | 490 | struct edac_device_instance *instance, |
491 | int idx) | 491 | int idx) |
492 | { | 492 | { |
493 | struct edac_device_block *block; | 493 | struct edac_device_block *block; |
494 | 494 | ||
@@ -507,7 +507,7 @@ static void edac_device_delete_block(struct edac_device_ctl_info *edac_dev, | |||
507 | * create just one instance of an edac_device 'instance' | 507 | * create just one instance of an edac_device 'instance' |
508 | */ | 508 | */ |
509 | static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev, | 509 | static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev, |
510 | int idx) | 510 | int idx) |
511 | { | 511 | { |
512 | int i, j; | 512 | int i, j; |
513 | int err; | 513 | int err; |
@@ -627,22 +627,22 @@ static int edac_device_add_sysfs_attributes( | |||
627 | struct edac_device_ctl_info *edac_dev) | 627 | struct edac_device_ctl_info *edac_dev) |
628 | { | 628 | { |
629 | int err; | 629 | int err; |
630 | struct edac_dev_sysfs_attribute *sysfs_attrib; | 630 | struct edac_dev_sysfs_attribute *sysfs_attrib; |
631 | 631 | ||
632 | /* point to the start of the array and iterate over it | 632 | /* point to the start of the array and iterate over it |
633 | * adding each attribute listed to this mci instance's kobject | 633 | * adding each attribute listed to this mci instance's kobject |
634 | */ | 634 | */ |
635 | sysfs_attrib = edac_dev->sysfs_attributes; | 635 | sysfs_attrib = edac_dev->sysfs_attributes; |
636 | 636 | ||
637 | while (sysfs_attrib->attr.name != NULL) { | 637 | while (sysfs_attrib->attr.name != NULL) { |
638 | err = sysfs_create_file(&edac_dev->kobj, | 638 | err = sysfs_create_file(&edac_dev->kobj, |
639 | (struct attribute*) sysfs_attrib); | 639 | (struct attribute*) sysfs_attrib); |
640 | if (err) { | 640 | if (err) { |
641 | return err; | 641 | return err; |
642 | } | 642 | } |
643 | 643 | ||
644 | sysfs_attrib++; | 644 | sysfs_attrib++; |
645 | } | 645 | } |
646 | 646 | ||
647 | return 0; | 647 | return 0; |
648 | } | 648 | } |
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index ce12d9b5ab18..219e861eb3f9 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c | |||
@@ -129,7 +129,7 @@ char *edac_align_ptr(void *ptr, unsigned size) | |||
129 | * struct mem_ctl_info pointer | 129 | * struct mem_ctl_info pointer |
130 | */ | 130 | */ |
131 | struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows, | 131 | struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows, |
132 | unsigned nr_chans) | 132 | unsigned nr_chans) |
133 | { | 133 | { |
134 | struct mem_ctl_info *mci; | 134 | struct mem_ctl_info *mci; |
135 | struct csrow_info *csi, *csrow; | 135 | struct csrow_info *csi, *csrow; |
@@ -146,7 +146,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows, | |||
146 | mci = (struct mem_ctl_info *)0; | 146 | mci = (struct mem_ctl_info *)0; |
147 | csi = (struct csrow_info *)edac_align_ptr(&mci[1], sizeof(*csi)); | 147 | csi = (struct csrow_info *)edac_align_ptr(&mci[1], sizeof(*csi)); |
148 | chi = (struct channel_info *) | 148 | chi = (struct channel_info *) |
149 | edac_align_ptr(&csi[nr_csrows], sizeof(*chi)); | 149 | edac_align_ptr(&csi[nr_csrows], sizeof(*chi)); |
150 | pvt = edac_align_ptr(&chi[nr_chans * nr_csrows], sz_pvt); | 150 | pvt = edac_align_ptr(&chi[nr_chans * nr_csrows], sz_pvt); |
151 | size = ((unsigned long)pvt) + sz_pvt; | 151 | size = ((unsigned long)pvt) + sz_pvt; |
152 | 152 | ||
@@ -256,7 +256,7 @@ static void edac_mc_workq_function(struct work_struct *work_req) | |||
256 | 256 | ||
257 | /* Reschedule */ | 257 | /* Reschedule */ |
258 | queue_delayed_work(edac_workqueue, &mci->work, | 258 | queue_delayed_work(edac_workqueue, &mci->work, |
259 | msecs_to_jiffies(edac_mc_get_poll_msec())); | 259 | msecs_to_jiffies(edac_mc_get_poll_msec())); |
260 | } | 260 | } |
261 | 261 | ||
262 | /* | 262 | /* |
@@ -334,16 +334,16 @@ static int add_mc_to_global_list(struct mem_ctl_info *mci) | |||
334 | atomic_inc(&edac_handlers); | 334 | atomic_inc(&edac_handlers); |
335 | return 0; | 335 | return 0; |
336 | 336 | ||
337 | fail0: | 337 | fail0: |
338 | edac_printk(KERN_WARNING, EDAC_MC, | 338 | edac_printk(KERN_WARNING, EDAC_MC, |
339 | "%s (%s) %s %s already assigned %d\n", p->dev->bus_id, | 339 | "%s (%s) %s %s already assigned %d\n", p->dev->bus_id, |
340 | dev_name(mci), p->mod_name, p->ctl_name, p->mc_idx); | 340 | dev_name(mci), p->mod_name, p->ctl_name, p->mc_idx); |
341 | return 1; | 341 | return 1; |
342 | 342 | ||
343 | fail1: | 343 | fail1: |
344 | edac_printk(KERN_WARNING, EDAC_MC, | 344 | edac_printk(KERN_WARNING, EDAC_MC, |
345 | "bug in low-level driver: attempt to assign\n" | 345 | "bug in low-level driver: attempt to assign\n" |
346 | " duplicate mc_idx %d in %s()\n", p->mc_idx, __func__); | 346 | " duplicate mc_idx %d in %s()\n", p->mc_idx, __func__); |
347 | return 1; | 347 | return 1; |
348 | } | 348 | } |
349 | 349 | ||
@@ -423,7 +423,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx) | |||
423 | edac_mc_dump_csrow(&mci->csrows[i]); | 423 | edac_mc_dump_csrow(&mci->csrows[i]); |
424 | for (j = 0; j < mci->csrows[i].nr_channels; j++) | 424 | for (j = 0; j < mci->csrows[i].nr_channels; j++) |
425 | edac_mc_dump_channel(&mci->csrows[i]. | 425 | edac_mc_dump_channel(&mci->csrows[i]. |
426 | channels[j]); | 426 | channels[j]); |
427 | } | 427 | } |
428 | } | 428 | } |
429 | #endif | 429 | #endif |
@@ -437,7 +437,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx) | |||
437 | 437 | ||
438 | if (edac_create_sysfs_mci_device(mci)) { | 438 | if (edac_create_sysfs_mci_device(mci)) { |
439 | edac_mc_printk(mci, KERN_WARNING, | 439 | edac_mc_printk(mci, KERN_WARNING, |
440 | "failed to create sysfs device\n"); | 440 | "failed to create sysfs device\n"); |
441 | goto fail1; | 441 | goto fail1; |
442 | } | 442 | } |
443 | 443 | ||
@@ -453,15 +453,15 @@ int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx) | |||
453 | 453 | ||
454 | /* Report action taken */ | 454 | /* Report action taken */ |
455 | edac_mc_printk(mci, KERN_INFO, "Giving out device to %s %s: DEV %s\n", | 455 | edac_mc_printk(mci, KERN_INFO, "Giving out device to %s %s: DEV %s\n", |
456 | mci->mod_name, mci->ctl_name, dev_name(mci)); | 456 | mci->mod_name, mci->ctl_name, dev_name(mci)); |
457 | 457 | ||
458 | mutex_unlock(&mem_ctls_mutex); | 458 | mutex_unlock(&mem_ctls_mutex); |
459 | return 0; | 459 | return 0; |
460 | 460 | ||
461 | fail1: | 461 | fail1: |
462 | del_mc_from_global_list(mci); | 462 | del_mc_from_global_list(mci); |
463 | 463 | ||
464 | fail0: | 464 | fail0: |
465 | mutex_unlock(&mem_ctls_mutex); | 465 | mutex_unlock(&mem_ctls_mutex); |
466 | return 1; | 466 | return 1; |
467 | } | 467 | } |
@@ -497,8 +497,8 @@ struct mem_ctl_info *edac_mc_del_mc(struct device *dev) | |||
497 | del_mc_from_global_list(mci); | 497 | del_mc_from_global_list(mci); |
498 | mutex_unlock(&mem_ctls_mutex); | 498 | mutex_unlock(&mem_ctls_mutex); |
499 | edac_printk(KERN_INFO, EDAC_MC, | 499 | edac_printk(KERN_INFO, EDAC_MC, |
500 | "Removed device %d for %s %s: DEV %s\n", mci->mc_idx, | 500 | "Removed device %d for %s %s: DEV %s\n", mci->mc_idx, |
501 | mci->mod_name, mci->ctl_name, dev_name(mci)); | 501 | mci->mod_name, mci->ctl_name, dev_name(mci)); |
502 | return mci; | 502 | return mci; |
503 | } | 503 | } |
504 | 504 | ||
@@ -566,8 +566,8 @@ int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci, unsigned long page) | |||
566 | 566 | ||
567 | if (row == -1) | 567 | if (row == -1) |
568 | edac_mc_printk(mci, KERN_ERR, | 568 | edac_mc_printk(mci, KERN_ERR, |
569 | "could not look up page error address %lx\n", | 569 | "could not look up page error address %lx\n", |
570 | (unsigned long)page); | 570 | (unsigned long)page); |
571 | 571 | ||
572 | return row; | 572 | return row; |
573 | } | 573 | } |
@@ -577,9 +577,9 @@ EXPORT_SYMBOL_GPL(edac_mc_find_csrow_by_page); | |||
577 | /* FIXME - setable log (warning/emerg) levels */ | 577 | /* FIXME - setable log (warning/emerg) levels */ |
578 | /* FIXME - integrate with evlog: http://evlog.sourceforge.net/ */ | 578 | /* FIXME - integrate with evlog: http://evlog.sourceforge.net/ */ |
579 | void edac_mc_handle_ce(struct mem_ctl_info *mci, | 579 | void edac_mc_handle_ce(struct mem_ctl_info *mci, |
580 | unsigned long page_frame_number, | 580 | unsigned long page_frame_number, |
581 | unsigned long offset_in_page, unsigned long syndrome, | 581 | unsigned long offset_in_page, unsigned long syndrome, |
582 | int row, int channel, const char *msg) | 582 | int row, int channel, const char *msg) |
583 | { | 583 | { |
584 | unsigned long remapped_page; | 584 | unsigned long remapped_page; |
585 | 585 | ||
@@ -589,8 +589,8 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci, | |||
589 | if (row >= mci->nr_csrows || row < 0) { | 589 | if (row >= mci->nr_csrows || row < 0) { |
590 | /* something is wrong */ | 590 | /* something is wrong */ |
591 | edac_mc_printk(mci, KERN_ERR, | 591 | edac_mc_printk(mci, KERN_ERR, |
592 | "INTERNAL ERROR: row out of range " | 592 | "INTERNAL ERROR: row out of range " |
593 | "(%d >= %d)\n", row, mci->nr_csrows); | 593 | "(%d >= %d)\n", row, mci->nr_csrows); |
594 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); | 594 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); |
595 | return; | 595 | return; |
596 | } | 596 | } |
@@ -598,9 +598,9 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci, | |||
598 | if (channel >= mci->csrows[row].nr_channels || channel < 0) { | 598 | if (channel >= mci->csrows[row].nr_channels || channel < 0) { |
599 | /* something is wrong */ | 599 | /* something is wrong */ |
600 | edac_mc_printk(mci, KERN_ERR, | 600 | edac_mc_printk(mci, KERN_ERR, |
601 | "INTERNAL ERROR: channel out of range " | 601 | "INTERNAL ERROR: channel out of range " |
602 | "(%d >= %d)\n", channel, | 602 | "(%d >= %d)\n", channel, |
603 | mci->csrows[row].nr_channels); | 603 | mci->csrows[row].nr_channels); |
604 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); | 604 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); |
605 | return; | 605 | return; |
606 | } | 606 | } |
@@ -608,11 +608,11 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci, | |||
608 | if (edac_mc_get_log_ce()) | 608 | if (edac_mc_get_log_ce()) |
609 | /* FIXME - put in DIMM location */ | 609 | /* FIXME - put in DIMM location */ |
610 | edac_mc_printk(mci, KERN_WARNING, | 610 | edac_mc_printk(mci, KERN_WARNING, |
611 | "CE page 0x%lx, offset 0x%lx, grain %d, syndrome " | 611 | "CE page 0x%lx, offset 0x%lx, grain %d, syndrome " |
612 | "0x%lx, row %d, channel %d, label \"%s\": %s\n", | 612 | "0x%lx, row %d, channel %d, label \"%s\": %s\n", |
613 | page_frame_number, offset_in_page, | 613 | page_frame_number, offset_in_page, |
614 | mci->csrows[row].grain, syndrome, row, channel, | 614 | mci->csrows[row].grain, syndrome, row, channel, |
615 | mci->csrows[row].channels[channel].label, msg); | 615 | mci->csrows[row].channels[channel].label, msg); |
616 | 616 | ||
617 | mci->ce_count++; | 617 | mci->ce_count++; |
618 | mci->csrows[row].ce_count++; | 618 | mci->csrows[row].ce_count++; |
@@ -629,11 +629,11 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci, | |||
629 | * page - which can then be scrubbed. | 629 | * page - which can then be scrubbed. |
630 | */ | 630 | */ |
631 | remapped_page = mci->ctl_page_to_phys ? | 631 | remapped_page = mci->ctl_page_to_phys ? |
632 | mci->ctl_page_to_phys(mci, page_frame_number) : | 632 | mci->ctl_page_to_phys(mci, page_frame_number) : |
633 | page_frame_number; | 633 | page_frame_number; |
634 | 634 | ||
635 | edac_mc_scrub_block(remapped_page, offset_in_page, | 635 | edac_mc_scrub_block(remapped_page, offset_in_page, |
636 | mci->csrows[row].grain); | 636 | mci->csrows[row].grain); |
637 | } | 637 | } |
638 | } | 638 | } |
639 | 639 | ||
@@ -643,7 +643,7 @@ void edac_mc_handle_ce_no_info(struct mem_ctl_info *mci, const char *msg) | |||
643 | { | 643 | { |
644 | if (edac_mc_get_log_ce()) | 644 | if (edac_mc_get_log_ce()) |
645 | edac_mc_printk(mci, KERN_WARNING, | 645 | edac_mc_printk(mci, KERN_WARNING, |
646 | "CE - no information available: %s\n", msg); | 646 | "CE - no information available: %s\n", msg); |
647 | 647 | ||
648 | mci->ce_noinfo_count++; | 648 | mci->ce_noinfo_count++; |
649 | mci->ce_count++; | 649 | mci->ce_count++; |
@@ -652,8 +652,8 @@ void edac_mc_handle_ce_no_info(struct mem_ctl_info *mci, const char *msg) | |||
652 | EXPORT_SYMBOL_GPL(edac_mc_handle_ce_no_info); | 652 | EXPORT_SYMBOL_GPL(edac_mc_handle_ce_no_info); |
653 | 653 | ||
654 | void edac_mc_handle_ue(struct mem_ctl_info *mci, | 654 | void edac_mc_handle_ue(struct mem_ctl_info *mci, |
655 | unsigned long page_frame_number, | 655 | unsigned long page_frame_number, |
656 | unsigned long offset_in_page, int row, const char *msg) | 656 | unsigned long offset_in_page, int row, const char *msg) |
657 | { | 657 | { |
658 | int len = EDAC_MC_LABEL_LEN * 4; | 658 | int len = EDAC_MC_LABEL_LEN * 4; |
659 | char labels[len + 1]; | 659 | char labels[len + 1]; |
@@ -667,8 +667,8 @@ void edac_mc_handle_ue(struct mem_ctl_info *mci, | |||
667 | if (row >= mci->nr_csrows || row < 0) { | 667 | if (row >= mci->nr_csrows || row < 0) { |
668 | /* something is wrong */ | 668 | /* something is wrong */ |
669 | edac_mc_printk(mci, KERN_ERR, | 669 | edac_mc_printk(mci, KERN_ERR, |
670 | "INTERNAL ERROR: row out of range " | 670 | "INTERNAL ERROR: row out of range " |
671 | "(%d >= %d)\n", row, mci->nr_csrows); | 671 | "(%d >= %d)\n", row, mci->nr_csrows); |
672 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); | 672 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); |
673 | return; | 673 | return; |
674 | } | 674 | } |
@@ -679,7 +679,7 @@ void edac_mc_handle_ue(struct mem_ctl_info *mci, | |||
679 | pos += chars; | 679 | pos += chars; |
680 | 680 | ||
681 | for (chan = 1; (chan < mci->csrows[row].nr_channels) && (len > 0); | 681 | for (chan = 1; (chan < mci->csrows[row].nr_channels) && (len > 0); |
682 | chan++) { | 682 | chan++) { |
683 | chars = snprintf(pos, len + 1, ":%s", | 683 | chars = snprintf(pos, len + 1, ":%s", |
684 | mci->csrows[row].channels[chan].label); | 684 | mci->csrows[row].channels[chan].label); |
685 | len -= chars; | 685 | len -= chars; |
@@ -688,16 +688,16 @@ void edac_mc_handle_ue(struct mem_ctl_info *mci, | |||
688 | 688 | ||
689 | if (edac_mc_get_log_ue()) | 689 | if (edac_mc_get_log_ue()) |
690 | edac_mc_printk(mci, KERN_EMERG, | 690 | edac_mc_printk(mci, KERN_EMERG, |
691 | "UE page 0x%lx, offset 0x%lx, grain %d, row %d, " | 691 | "UE page 0x%lx, offset 0x%lx, grain %d, row %d, " |
692 | "labels \"%s\": %s\n", page_frame_number, | 692 | "labels \"%s\": %s\n", page_frame_number, |
693 | offset_in_page, mci->csrows[row].grain, row, | 693 | offset_in_page, mci->csrows[row].grain, row, |
694 | labels, msg); | 694 | labels, msg); |
695 | 695 | ||
696 | if (edac_mc_get_panic_on_ue()) | 696 | if (edac_mc_get_panic_on_ue()) |
697 | panic("EDAC MC%d: UE page 0x%lx, offset 0x%lx, grain %d, " | 697 | panic("EDAC MC%d: UE page 0x%lx, offset 0x%lx, grain %d, " |
698 | "row %d, labels \"%s\": %s\n", mci->mc_idx, | 698 | "row %d, labels \"%s\": %s\n", mci->mc_idx, |
699 | page_frame_number, offset_in_page, | 699 | page_frame_number, offset_in_page, |
700 | mci->csrows[row].grain, row, labels, msg); | 700 | mci->csrows[row].grain, row, labels, msg); |
701 | 701 | ||
702 | mci->ue_count++; | 702 | mci->ue_count++; |
703 | mci->csrows[row].ue_count++; | 703 | mci->csrows[row].ue_count++; |
@@ -712,7 +712,7 @@ void edac_mc_handle_ue_no_info(struct mem_ctl_info *mci, const char *msg) | |||
712 | 712 | ||
713 | if (edac_mc_get_log_ue()) | 713 | if (edac_mc_get_log_ue()) |
714 | edac_mc_printk(mci, KERN_WARNING, | 714 | edac_mc_printk(mci, KERN_WARNING, |
715 | "UE - no information available: %s\n", msg); | 715 | "UE - no information available: %s\n", msg); |
716 | mci->ue_noinfo_count++; | 716 | mci->ue_noinfo_count++; |
717 | mci->ue_count++; | 717 | mci->ue_count++; |
718 | } | 718 | } |
@@ -724,9 +724,9 @@ EXPORT_SYMBOL_GPL(edac_mc_handle_ue_no_info); | |||
724 | * called to process UE events | 724 | * called to process UE events |
725 | */ | 725 | */ |
726 | void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci, | 726 | void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci, |
727 | unsigned int csrow, | 727 | unsigned int csrow, |
728 | unsigned int channela, | 728 | unsigned int channela, |
729 | unsigned int channelb, char *msg) | 729 | unsigned int channelb, char *msg) |
730 | { | 730 | { |
731 | int len = EDAC_MC_LABEL_LEN * 4; | 731 | int len = EDAC_MC_LABEL_LEN * 4; |
732 | char labels[len + 1]; | 732 | char labels[len + 1]; |
@@ -736,8 +736,8 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci, | |||
736 | if (csrow >= mci->nr_csrows) { | 736 | if (csrow >= mci->nr_csrows) { |
737 | /* something is wrong */ | 737 | /* something is wrong */ |
738 | edac_mc_printk(mci, KERN_ERR, | 738 | edac_mc_printk(mci, KERN_ERR, |
739 | "INTERNAL ERROR: row out of range (%d >= %d)\n", | 739 | "INTERNAL ERROR: row out of range (%d >= %d)\n", |
740 | csrow, mci->nr_csrows); | 740 | csrow, mci->nr_csrows); |
741 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); | 741 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); |
742 | return; | 742 | return; |
743 | } | 743 | } |
@@ -745,9 +745,9 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci, | |||
745 | if (channela >= mci->csrows[csrow].nr_channels) { | 745 | if (channela >= mci->csrows[csrow].nr_channels) { |
746 | /* something is wrong */ | 746 | /* something is wrong */ |
747 | edac_mc_printk(mci, KERN_ERR, | 747 | edac_mc_printk(mci, KERN_ERR, |
748 | "INTERNAL ERROR: channel-a out of range " | 748 | "INTERNAL ERROR: channel-a out of range " |
749 | "(%d >= %d)\n", | 749 | "(%d >= %d)\n", |
750 | channela, mci->csrows[csrow].nr_channels); | 750 | channela, mci->csrows[csrow].nr_channels); |
751 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); | 751 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); |
752 | return; | 752 | return; |
753 | } | 753 | } |
@@ -755,9 +755,9 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci, | |||
755 | if (channelb >= mci->csrows[csrow].nr_channels) { | 755 | if (channelb >= mci->csrows[csrow].nr_channels) { |
756 | /* something is wrong */ | 756 | /* something is wrong */ |
757 | edac_mc_printk(mci, KERN_ERR, | 757 | edac_mc_printk(mci, KERN_ERR, |
758 | "INTERNAL ERROR: channel-b out of range " | 758 | "INTERNAL ERROR: channel-b out of range " |
759 | "(%d >= %d)\n", | 759 | "(%d >= %d)\n", |
760 | channelb, mci->csrows[csrow].nr_channels); | 760 | channelb, mci->csrows[csrow].nr_channels); |
761 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); | 761 | edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR"); |
762 | return; | 762 | return; |
763 | } | 763 | } |
@@ -775,14 +775,14 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci, | |||
775 | 775 | ||
776 | if (edac_mc_get_log_ue()) | 776 | if (edac_mc_get_log_ue()) |
777 | edac_mc_printk(mci, KERN_EMERG, | 777 | edac_mc_printk(mci, KERN_EMERG, |
778 | "UE row %d, channel-a= %d channel-b= %d " | 778 | "UE row %d, channel-a= %d channel-b= %d " |
779 | "labels \"%s\": %s\n", csrow, channela, channelb, | 779 | "labels \"%s\": %s\n", csrow, channela, channelb, |
780 | labels, msg); | 780 | labels, msg); |
781 | 781 | ||
782 | if (edac_mc_get_panic_on_ue()) | 782 | if (edac_mc_get_panic_on_ue()) |
783 | panic("UE row %d, channel-a= %d channel-b= %d " | 783 | panic("UE row %d, channel-a= %d channel-b= %d " |
784 | "labels \"%s\": %s\n", csrow, channela, | 784 | "labels \"%s\": %s\n", csrow, channela, |
785 | channelb, labels, msg); | 785 | channelb, labels, msg); |
786 | } | 786 | } |
787 | 787 | ||
788 | EXPORT_SYMBOL(edac_mc_handle_fbd_ue); | 788 | EXPORT_SYMBOL(edac_mc_handle_fbd_ue); |
@@ -792,23 +792,23 @@ EXPORT_SYMBOL(edac_mc_handle_fbd_ue); | |||
792 | * called to process CE events | 792 | * called to process CE events |
793 | */ | 793 | */ |
794 | void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci, | 794 | void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci, |
795 | unsigned int csrow, unsigned int channel, char *msg) | 795 | unsigned int csrow, unsigned int channel, char *msg) |
796 | { | 796 | { |
797 | 797 | ||
798 | /* Ensure boundary values */ | 798 | /* Ensure boundary values */ |
799 | if (csrow >= mci->nr_csrows) { | 799 | if (csrow >= mci->nr_csrows) { |
800 | /* something is wrong */ | 800 | /* something is wrong */ |
801 | edac_mc_printk(mci, KERN_ERR, | 801 | edac_mc_printk(mci, KERN_ERR, |
802 | "INTERNAL ERROR: row out of range (%d >= %d)\n", | 802 | "INTERNAL ERROR: row out of range (%d >= %d)\n", |
803 | csrow, mci->nr_csrows); | 803 | csrow, mci->nr_csrows); |
804 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); | 804 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); |
805 | return; | 805 | return; |
806 | } | 806 | } |
807 | if (channel >= mci->csrows[csrow].nr_channels) { | 807 | if (channel >= mci->csrows[csrow].nr_channels) { |
808 | /* something is wrong */ | 808 | /* something is wrong */ |
809 | edac_mc_printk(mci, KERN_ERR, | 809 | edac_mc_printk(mci, KERN_ERR, |
810 | "INTERNAL ERROR: channel out of range (%d >= %d)\n", | 810 | "INTERNAL ERROR: channel out of range (%d >= %d)\n", |
811 | channel, mci->csrows[csrow].nr_channels); | 811 | channel, mci->csrows[csrow].nr_channels); |
812 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); | 812 | edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR"); |
813 | return; | 813 | return; |
814 | } | 814 | } |
@@ -816,9 +816,9 @@ void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci, | |||
816 | if (edac_mc_get_log_ce()) | 816 | if (edac_mc_get_log_ce()) |
817 | /* FIXME - put in DIMM location */ | 817 | /* FIXME - put in DIMM location */ |
818 | edac_mc_printk(mci, KERN_WARNING, | 818 | edac_mc_printk(mci, KERN_WARNING, |
819 | "CE row %d, channel %d, label \"%s\": %s\n", | 819 | "CE row %d, channel %d, label \"%s\": %s\n", |
820 | csrow, channel, | 820 | csrow, channel, |
821 | mci->csrows[csrow].channels[channel].label, msg); | 821 | mci->csrows[csrow].channels[channel].label, msg); |
822 | 822 | ||
823 | mci->ce_count++; | 823 | mci->ce_count++; |
824 | mci->csrows[csrow].ce_count++; | 824 | mci->csrows[csrow].ce_count++; |
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 029ce8979a71..bbd845885d4f 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c | |||
@@ -183,16 +183,16 @@ static struct memctrl_dev_attribute attr_##_name = { \ | |||
183 | 183 | ||
184 | /* csrow<id> control files */ | 184 | /* csrow<id> control files */ |
185 | MEMCTRL_ATTR(edac_mc_panic_on_ue, | 185 | MEMCTRL_ATTR(edac_mc_panic_on_ue, |
186 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); | 186 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); |
187 | 187 | ||
188 | MEMCTRL_ATTR(edac_mc_log_ue, | 188 | MEMCTRL_ATTR(edac_mc_log_ue, |
189 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); | 189 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); |
190 | 190 | ||
191 | MEMCTRL_ATTR(edac_mc_log_ce, | 191 | MEMCTRL_ATTR(edac_mc_log_ce, |
192 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); | 192 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); |
193 | 193 | ||
194 | MEMCTRL_ATTR(edac_mc_poll_msec, | 194 | MEMCTRL_ATTR(edac_mc_poll_msec, |
195 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); | 195 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); |
196 | 196 | ||
197 | /* Base Attributes of the memory ECC object */ | 197 | /* Base Attributes of the memory ECC object */ |
198 | static struct memctrl_dev_attribute *memctrl_attr[] = { | 198 | static struct memctrl_dev_attribute *memctrl_attr[] = { |
@@ -281,44 +281,44 @@ void edac_sysfs_memctrl_teardown(void) | |||
281 | 281 | ||
282 | /* Set of more default csrow<id> attribute show/store functions */ | 282 | /* Set of more default csrow<id> attribute show/store functions */ |
283 | static ssize_t csrow_ue_count_show(struct csrow_info *csrow, char *data, | 283 | static ssize_t csrow_ue_count_show(struct csrow_info *csrow, char *data, |
284 | int private) | 284 | int private) |
285 | { | 285 | { |
286 | return sprintf(data, "%u\n", csrow->ue_count); | 286 | return sprintf(data, "%u\n", csrow->ue_count); |
287 | } | 287 | } |
288 | 288 | ||
289 | static ssize_t csrow_ce_count_show(struct csrow_info *csrow, char *data, | 289 | static ssize_t csrow_ce_count_show(struct csrow_info *csrow, char *data, |
290 | int private) | 290 | int private) |
291 | { | 291 | { |
292 | return sprintf(data, "%u\n", csrow->ce_count); | 292 | return sprintf(data, "%u\n", csrow->ce_count); |
293 | } | 293 | } |
294 | 294 | ||
295 | static ssize_t csrow_size_show(struct csrow_info *csrow, char *data, | 295 | static ssize_t csrow_size_show(struct csrow_info *csrow, char *data, |
296 | int private) | 296 | int private) |
297 | { | 297 | { |
298 | return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages)); | 298 | return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages)); |
299 | } | 299 | } |
300 | 300 | ||
301 | static ssize_t csrow_mem_type_show(struct csrow_info *csrow, char *data, | 301 | static ssize_t csrow_mem_type_show(struct csrow_info *csrow, char *data, |
302 | int private) | 302 | int private) |
303 | { | 303 | { |
304 | return sprintf(data, "%s\n", mem_types[csrow->mtype]); | 304 | return sprintf(data, "%s\n", mem_types[csrow->mtype]); |
305 | } | 305 | } |
306 | 306 | ||
307 | static ssize_t csrow_dev_type_show(struct csrow_info *csrow, char *data, | 307 | static ssize_t csrow_dev_type_show(struct csrow_info *csrow, char *data, |
308 | int private) | 308 | int private) |
309 | { | 309 | { |
310 | return sprintf(data, "%s\n", dev_types[csrow->dtype]); | 310 | return sprintf(data, "%s\n", dev_types[csrow->dtype]); |
311 | } | 311 | } |
312 | 312 | ||
313 | static ssize_t csrow_edac_mode_show(struct csrow_info *csrow, char *data, | 313 | static ssize_t csrow_edac_mode_show(struct csrow_info *csrow, char *data, |
314 | int private) | 314 | int private) |
315 | { | 315 | { |
316 | return sprintf(data, "%s\n", edac_caps[csrow->edac_mode]); | 316 | return sprintf(data, "%s\n", edac_caps[csrow->edac_mode]); |
317 | } | 317 | } |
318 | 318 | ||
319 | /* show/store functions for DIMM Label attributes */ | 319 | /* show/store functions for DIMM Label attributes */ |
320 | static ssize_t channel_dimm_label_show(struct csrow_info *csrow, | 320 | static ssize_t channel_dimm_label_show(struct csrow_info *csrow, |
321 | char *data, int channel) | 321 | char *data, int channel) |
322 | { | 322 | { |
323 | return snprintf(data, EDAC_MC_LABEL_LEN, "%s", | 323 | return snprintf(data, EDAC_MC_LABEL_LEN, "%s", |
324 | csrow->channels[channel].label); | 324 | csrow->channels[channel].label); |
@@ -339,7 +339,7 @@ static ssize_t channel_dimm_label_store(struct csrow_info *csrow, | |||
339 | 339 | ||
340 | /* show function for dynamic chX_ce_count attribute */ | 340 | /* show function for dynamic chX_ce_count attribute */ |
341 | static ssize_t channel_ce_count_show(struct csrow_info *csrow, | 341 | static ssize_t channel_ce_count_show(struct csrow_info *csrow, |
342 | char *data, int channel) | 342 | char *data, int channel) |
343 | { | 343 | { |
344 | return sprintf(data, "%u\n", csrow->channels[channel].ce_count); | 344 | return sprintf(data, "%u\n", csrow->channels[channel].ce_count); |
345 | } | 345 | } |
@@ -357,27 +357,27 @@ struct csrowdev_attribute { | |||
357 | 357 | ||
358 | /* Set of show/store higher level functions for default csrow attributes */ | 358 | /* Set of show/store higher level functions for default csrow attributes */ |
359 | static ssize_t csrowdev_show(struct kobject *kobj, | 359 | static ssize_t csrowdev_show(struct kobject *kobj, |
360 | struct attribute *attr, char *buffer) | 360 | struct attribute *attr, char *buffer) |
361 | { | 361 | { |
362 | struct csrow_info *csrow = to_csrow(kobj); | 362 | struct csrow_info *csrow = to_csrow(kobj); |
363 | struct csrowdev_attribute *csrowdev_attr = to_csrowdev_attr(attr); | 363 | struct csrowdev_attribute *csrowdev_attr = to_csrowdev_attr(attr); |
364 | 364 | ||
365 | if (csrowdev_attr->show) | 365 | if (csrowdev_attr->show) |
366 | return csrowdev_attr->show(csrow, | 366 | return csrowdev_attr->show(csrow, |
367 | buffer, csrowdev_attr->private); | 367 | buffer, csrowdev_attr->private); |
368 | return -EIO; | 368 | return -EIO; |
369 | } | 369 | } |
370 | 370 | ||
371 | static ssize_t csrowdev_store(struct kobject *kobj, struct attribute *attr, | 371 | static ssize_t csrowdev_store(struct kobject *kobj, struct attribute *attr, |
372 | const char *buffer, size_t count) | 372 | const char *buffer, size_t count) |
373 | { | 373 | { |
374 | struct csrow_info *csrow = to_csrow(kobj); | 374 | struct csrow_info *csrow = to_csrow(kobj); |
375 | struct csrowdev_attribute *csrowdev_attr = to_csrowdev_attr(attr); | 375 | struct csrowdev_attribute *csrowdev_attr = to_csrowdev_attr(attr); |
376 | 376 | ||
377 | if (csrowdev_attr->store) | 377 | if (csrowdev_attr->store) |
378 | return csrowdev_attr->store(csrow, | 378 | return csrowdev_attr->store(csrow, |
379 | buffer, | 379 | buffer, |
380 | count, csrowdev_attr->private); | 380 | count, csrowdev_attr->private); |
381 | return -EIO; | 381 | return -EIO; |
382 | } | 382 | } |
383 | 383 | ||
@@ -415,17 +415,17 @@ static struct csrowdev_attribute *default_csrow_attr[] = { | |||
415 | 415 | ||
416 | /* possible dynamic channel DIMM Label attribute files */ | 416 | /* possible dynamic channel DIMM Label attribute files */ |
417 | CSROWDEV_ATTR(ch0_dimm_label, S_IRUGO | S_IWUSR, | 417 | CSROWDEV_ATTR(ch0_dimm_label, S_IRUGO | S_IWUSR, |
418 | channel_dimm_label_show, channel_dimm_label_store, 0); | 418 | channel_dimm_label_show, channel_dimm_label_store, 0); |
419 | CSROWDEV_ATTR(ch1_dimm_label, S_IRUGO | S_IWUSR, | 419 | CSROWDEV_ATTR(ch1_dimm_label, S_IRUGO | S_IWUSR, |
420 | channel_dimm_label_show, channel_dimm_label_store, 1); | 420 | channel_dimm_label_show, channel_dimm_label_store, 1); |
421 | CSROWDEV_ATTR(ch2_dimm_label, S_IRUGO | S_IWUSR, | 421 | CSROWDEV_ATTR(ch2_dimm_label, S_IRUGO | S_IWUSR, |
422 | channel_dimm_label_show, channel_dimm_label_store, 2); | 422 | channel_dimm_label_show, channel_dimm_label_store, 2); |
423 | CSROWDEV_ATTR(ch3_dimm_label, S_IRUGO | S_IWUSR, | 423 | CSROWDEV_ATTR(ch3_dimm_label, S_IRUGO | S_IWUSR, |
424 | channel_dimm_label_show, channel_dimm_label_store, 3); | 424 | channel_dimm_label_show, channel_dimm_label_store, 3); |
425 | CSROWDEV_ATTR(ch4_dimm_label, S_IRUGO | S_IWUSR, | 425 | CSROWDEV_ATTR(ch4_dimm_label, S_IRUGO | S_IWUSR, |
426 | channel_dimm_label_show, channel_dimm_label_store, 4); | 426 | channel_dimm_label_show, channel_dimm_label_store, 4); |
427 | CSROWDEV_ATTR(ch5_dimm_label, S_IRUGO | S_IWUSR, | 427 | CSROWDEV_ATTR(ch5_dimm_label, S_IRUGO | S_IWUSR, |
428 | channel_dimm_label_show, channel_dimm_label_store, 5); | 428 | channel_dimm_label_show, channel_dimm_label_store, 5); |
429 | 429 | ||
430 | /* Total possible dynamic DIMM Label attribute file table */ | 430 | /* Total possible dynamic DIMM Label attribute file table */ |
431 | static struct csrowdev_attribute *dynamic_csrow_dimm_attr[] = { | 431 | static struct csrowdev_attribute *dynamic_csrow_dimm_attr[] = { |
@@ -501,7 +501,7 @@ static struct kobj_type ktype_csrow = { | |||
501 | 501 | ||
502 | /* Create a CSROW object under specifed edac_mc_device */ | 502 | /* Create a CSROW object under specifed edac_mc_device */ |
503 | static int edac_create_csrow_object(struct kobject *edac_mci_kobj, | 503 | static int edac_create_csrow_object(struct kobject *edac_mci_kobj, |
504 | struct csrow_info *csrow, int index) | 504 | struct csrow_info *csrow, int index) |
505 | { | 505 | { |
506 | int err = 0; | 506 | int err = 0; |
507 | int chan; | 507 | int chan; |
@@ -531,7 +531,7 @@ static int edac_create_csrow_object(struct kobject *edac_mci_kobj, | |||
531 | } | 531 | } |
532 | } | 532 | } |
533 | 533 | ||
534 | error_exit: | 534 | error_exit: |
535 | return err; | 535 | return err; |
536 | } | 536 | } |
537 | 537 | ||
@@ -563,7 +563,7 @@ static ssize_t mci_reset_counters_store(struct mem_ctl_info *mci, | |||
563 | 563 | ||
564 | /* memory scrubbing */ | 564 | /* memory scrubbing */ |
565 | static ssize_t mci_sdram_scrub_rate_store(struct mem_ctl_info *mci, | 565 | static ssize_t mci_sdram_scrub_rate_store(struct mem_ctl_info *mci, |
566 | const char *data, size_t count) | 566 | const char *data, size_t count) |
567 | { | 567 | { |
568 | u32 bandwidth = -1; | 568 | u32 bandwidth = -1; |
569 | 569 | ||
@@ -573,18 +573,18 @@ static ssize_t mci_sdram_scrub_rate_store(struct mem_ctl_info *mci, | |||
573 | 573 | ||
574 | if (!(*mci->set_sdram_scrub_rate) (mci, &bandwidth)) { | 574 | if (!(*mci->set_sdram_scrub_rate) (mci, &bandwidth)) { |
575 | edac_printk(KERN_DEBUG, EDAC_MC, | 575 | edac_printk(KERN_DEBUG, EDAC_MC, |
576 | "Scrub rate set successfully, applied: %d\n", | 576 | "Scrub rate set successfully, applied: %d\n", |
577 | bandwidth); | 577 | bandwidth); |
578 | } else { | 578 | } else { |
579 | /* FIXME: error codes maybe? */ | 579 | /* FIXME: error codes maybe? */ |
580 | edac_printk(KERN_DEBUG, EDAC_MC, | 580 | edac_printk(KERN_DEBUG, EDAC_MC, |
581 | "Scrub rate set FAILED, could not apply: %d\n", | 581 | "Scrub rate set FAILED, could not apply: %d\n", |
582 | bandwidth); | 582 | bandwidth); |
583 | } | 583 | } |
584 | } else { | 584 | } else { |
585 | /* FIXME: produce "not implemented" ERROR for user-side. */ | 585 | /* FIXME: produce "not implemented" ERROR for user-side. */ |
586 | edac_printk(KERN_WARNING, EDAC_MC, | 586 | edac_printk(KERN_WARNING, EDAC_MC, |
587 | "Memory scrubbing 'set'control is not implemented!\n"); | 587 | "Memory scrubbing 'set'control is not implemented!\n"); |
588 | } | 588 | } |
589 | return count; | 589 | return count; |
590 | } | 590 | } |
@@ -596,18 +596,18 @@ static ssize_t mci_sdram_scrub_rate_show(struct mem_ctl_info *mci, char *data) | |||
596 | if (mci->get_sdram_scrub_rate) { | 596 | if (mci->get_sdram_scrub_rate) { |
597 | if (!(*mci->get_sdram_scrub_rate) (mci, &bandwidth)) { | 597 | if (!(*mci->get_sdram_scrub_rate) (mci, &bandwidth)) { |
598 | edac_printk(KERN_DEBUG, EDAC_MC, | 598 | edac_printk(KERN_DEBUG, EDAC_MC, |
599 | "Scrub rate successfully, fetched: %d\n", | 599 | "Scrub rate successfully, fetched: %d\n", |
600 | bandwidth); | 600 | bandwidth); |
601 | } else { | 601 | } else { |
602 | /* FIXME: error codes maybe? */ | 602 | /* FIXME: error codes maybe? */ |
603 | edac_printk(KERN_DEBUG, EDAC_MC, | 603 | edac_printk(KERN_DEBUG, EDAC_MC, |
604 | "Scrub rate fetch FAILED, got: %d\n", | 604 | "Scrub rate fetch FAILED, got: %d\n", |
605 | bandwidth); | 605 | bandwidth); |
606 | } | 606 | } |
607 | } else { | 607 | } else { |
608 | /* FIXME: produce "not implemented" ERROR for user-side. */ | 608 | /* FIXME: produce "not implemented" ERROR for user-side. */ |
609 | edac_printk(KERN_WARNING, EDAC_MC, | 609 | edac_printk(KERN_WARNING, EDAC_MC, |
610 | "Memory scrubbing 'get' control is not implemented\n"); | 610 | "Memory scrubbing 'get' control is not implemented\n"); |
611 | } | 611 | } |
612 | return sprintf(data, "%d\n", bandwidth); | 612 | return sprintf(data, "%d\n", bandwidth); |
613 | } | 613 | } |
@@ -648,7 +648,7 @@ static ssize_t mci_size_mb_show(struct mem_ctl_info *mci, char *data) | |||
648 | int total_pages, csrow_idx; | 648 | int total_pages, csrow_idx; |
649 | 649 | ||
650 | for (total_pages = csrow_idx = 0; csrow_idx < mci->nr_csrows; | 650 | for (total_pages = csrow_idx = 0; csrow_idx < mci->nr_csrows; |
651 | csrow_idx++) { | 651 | csrow_idx++) { |
652 | struct csrow_info *csrow = &mci->csrows[csrow_idx]; | 652 | struct csrow_info *csrow = &mci->csrows[csrow_idx]; |
653 | 653 | ||
654 | if (!csrow->nr_pages) | 654 | if (!csrow->nr_pages) |
@@ -665,7 +665,7 @@ static ssize_t mci_size_mb_show(struct mem_ctl_info *mci, char *data) | |||
665 | 665 | ||
666 | /* MCI show/store functions for top most object */ | 666 | /* MCI show/store functions for top most object */ |
667 | static ssize_t mcidev_show(struct kobject *kobj, struct attribute *attr, | 667 | static ssize_t mcidev_show(struct kobject *kobj, struct attribute *attr, |
668 | char *buffer) | 668 | char *buffer) |
669 | { | 669 | { |
670 | struct mem_ctl_info *mem_ctl_info = to_mci(kobj); | 670 | struct mem_ctl_info *mem_ctl_info = to_mci(kobj); |
671 | struct mcidev_sysfs_attribute *mcidev_attr = to_mcidev_attr(attr); | 671 | struct mcidev_sysfs_attribute *mcidev_attr = to_mcidev_attr(attr); |
@@ -677,7 +677,7 @@ static ssize_t mcidev_show(struct kobject *kobj, struct attribute *attr, | |||
677 | } | 677 | } |
678 | 678 | ||
679 | static ssize_t mcidev_store(struct kobject *kobj, struct attribute *attr, | 679 | static ssize_t mcidev_store(struct kobject *kobj, struct attribute *attr, |
680 | const char *buffer, size_t count) | 680 | const char *buffer, size_t count) |
681 | { | 681 | { |
682 | struct mem_ctl_info *mem_ctl_info = to_mci(kobj); | 682 | struct mem_ctl_info *mem_ctl_info = to_mci(kobj); |
683 | struct mcidev_sysfs_attribute *mcidev_attr = to_mcidev_attr(attr); | 683 | struct mcidev_sysfs_attribute *mcidev_attr = to_mcidev_attr(attr); |
@@ -714,7 +714,7 @@ MCIDEV_ATTR(ce_count, S_IRUGO, mci_ce_count_show, NULL); | |||
714 | 714 | ||
715 | /* memory scrubber attribute file */ | 715 | /* memory scrubber attribute file */ |
716 | MCIDEV_ATTR(sdram_scrub_rate, S_IRUGO | S_IWUSR, mci_sdram_scrub_rate_show, | 716 | MCIDEV_ATTR(sdram_scrub_rate, S_IRUGO | S_IWUSR, mci_sdram_scrub_rate_show, |
717 | mci_sdram_scrub_rate_store); | 717 | mci_sdram_scrub_rate_store); |
718 | 718 | ||
719 | static struct mcidev_sysfs_attribute *mci_attr[] = { | 719 | static struct mcidev_sysfs_attribute *mci_attr[] = { |
720 | &mci_attr_reset_counters, | 720 | &mci_attr_reset_counters, |
@@ -841,7 +841,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) | |||
841 | return 0; | 841 | return 0; |
842 | 842 | ||
843 | /* CSROW error: backout what has already been registered, */ | 843 | /* CSROW error: backout what has already been registered, */ |
844 | fail1: | 844 | fail1: |
845 | for (i--; i >= 0; i--) { | 845 | for (i--; i >= 0; i--) { |
846 | if (csrow->nr_pages > 0) { | 846 | if (csrow->nr_pages > 0) { |
847 | init_completion(&csrow->kobj_complete); | 847 | init_completion(&csrow->kobj_complete); |
@@ -850,7 +850,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) | |||
850 | } | 850 | } |
851 | } | 851 | } |
852 | 852 | ||
853 | fail0: | 853 | fail0: |
854 | init_completion(&mci->kobj_complete); | 854 | init_completion(&mci->kobj_complete); |
855 | kobject_unregister(edac_mci_kobj); | 855 | kobject_unregister(edac_mci_kobj); |
856 | wait_for_completion(&mci->kobj_complete); | 856 | wait_for_completion(&mci->kobj_complete); |
diff --git a/drivers/edac/edac_module.c b/drivers/edac/edac_module.c index 687d2ef2bbed..d43f9ddc5c49 100644 --- a/drivers/edac/edac_module.c +++ b/drivers/edac/edac_module.c | |||
@@ -157,7 +157,7 @@ static int __init edac_init(void) | |||
157 | */ | 157 | */ |
158 | if (edac_register_sysfs_edac_name()) { | 158 | if (edac_register_sysfs_edac_name()) { |
159 | edac_printk(KERN_ERR, EDAC_MC, | 159 | edac_printk(KERN_ERR, EDAC_MC, |
160 | "Error initializing 'edac' kobject\n"); | 160 | "Error initializing 'edac' kobject\n"); |
161 | err = -ENODEV; | 161 | err = -ENODEV; |
162 | goto error; | 162 | goto error; |
163 | } | 163 | } |
@@ -166,7 +166,7 @@ static int __init edac_init(void) | |||
166 | */ | 166 | */ |
167 | if (edac_sysfs_memctrl_setup()) { | 167 | if (edac_sysfs_memctrl_setup()) { |
168 | edac_printk(KERN_ERR, EDAC_MC, | 168 | edac_printk(KERN_ERR, EDAC_MC, |
169 | "Error initializing sysfs code\n"); | 169 | "Error initializing sysfs code\n"); |
170 | err = -ENODEV; | 170 | err = -ENODEV; |
171 | goto error_sysfs; | 171 | goto error_sysfs; |
172 | } | 172 | } |
@@ -181,11 +181,11 @@ static int __init edac_init(void) | |||
181 | return 0; | 181 | return 0; |
182 | 182 | ||
183 | /* Error teardown stack */ | 183 | /* Error teardown stack */ |
184 | error_mem: | 184 | error_mem: |
185 | edac_sysfs_memctrl_teardown(); | 185 | edac_sysfs_memctrl_teardown(); |
186 | error_sysfs: | 186 | error_sysfs: |
187 | edac_unregister_sysfs_edac_name(); | 187 | edac_unregister_sysfs_edac_name(); |
188 | error: | 188 | error: |
189 | return err; | 189 | return err; |
190 | } | 190 | } |
191 | 191 | ||
diff --git a/drivers/edac/edac_pci.c b/drivers/edac/edac_pci.c index ac16b434a3c5..f4f718c764db 100644 --- a/drivers/edac/edac_pci.c +++ b/drivers/edac/edac_pci.c | |||
@@ -47,7 +47,7 @@ static inline void edac_unlock_pci_list(void) | |||
47 | * edac_pci it is going to control/register with the EDAC CORE. | 47 | * edac_pci it is going to control/register with the EDAC CORE. |
48 | */ | 48 | */ |
49 | struct edac_pci_ctl_info *edac_pci_alloc_ctl_info(unsigned int sz_pvt, | 49 | struct edac_pci_ctl_info *edac_pci_alloc_ctl_info(unsigned int sz_pvt, |
50 | const char *edac_pci_name) | 50 | const char *edac_pci_name) |
51 | { | 51 | { |
52 | struct edac_pci_ctl_info *pci; | 52 | struct edac_pci_ctl_info *pci; |
53 | void *pvt; | 53 | void *pvt; |
@@ -140,18 +140,18 @@ static int add_edac_pci_to_global_list(struct edac_pci_ctl_info *pci) | |||
140 | list_add_tail_rcu(&pci->link, insert_before); | 140 | list_add_tail_rcu(&pci->link, insert_before); |
141 | return 0; | 141 | return 0; |
142 | 142 | ||
143 | fail0: | 143 | fail0: |
144 | edac_printk(KERN_WARNING, EDAC_PCI, | 144 | edac_printk(KERN_WARNING, EDAC_PCI, |
145 | "%s (%s) %s %s already assigned %d\n", | 145 | "%s (%s) %s %s already assigned %d\n", |
146 | rover->dev->bus_id, dev_name(rover), | 146 | rover->dev->bus_id, dev_name(rover), |
147 | rover->mod_name, rover->ctl_name, rover->pci_idx); | 147 | rover->mod_name, rover->ctl_name, rover->pci_idx); |
148 | return 1; | 148 | return 1; |
149 | 149 | ||
150 | fail1: | 150 | fail1: |
151 | edac_printk(KERN_WARNING, EDAC_PCI, | 151 | edac_printk(KERN_WARNING, EDAC_PCI, |
152 | "but in low-level driver: attempt to assign\n" | 152 | "but in low-level driver: attempt to assign\n" |
153 | "\tduplicate pci_idx %d in %s()\n", rover->pci_idx, | 153 | "\tduplicate pci_idx %d in %s()\n", rover->pci_idx, |
154 | __func__); | 154 | __func__); |
155 | return 1; | 155 | return 1; |
156 | } | 156 | } |
157 | 157 | ||
@@ -222,14 +222,14 @@ static void edac_pci_workq_function(struct work_struct *work_req) | |||
222 | edac_lock_pci_list(); | 222 | edac_lock_pci_list(); |
223 | 223 | ||
224 | if ((pci->op_state == OP_RUNNING_POLL) && | 224 | if ((pci->op_state == OP_RUNNING_POLL) && |
225 | (pci->edac_check != NULL) && (edac_pci_get_check_errors())) | 225 | (pci->edac_check != NULL) && (edac_pci_get_check_errors())) |
226 | pci->edac_check(pci); | 226 | pci->edac_check(pci); |
227 | 227 | ||
228 | edac_unlock_pci_list(); | 228 | edac_unlock_pci_list(); |
229 | 229 | ||
230 | /* Reschedule */ | 230 | /* Reschedule */ |
231 | queue_delayed_work(edac_workqueue, &pci->work, | 231 | queue_delayed_work(edac_workqueue, &pci->work, |
232 | msecs_to_jiffies(edac_pci_get_poll_msec())); | 232 | msecs_to_jiffies(edac_pci_get_poll_msec())); |
233 | } | 233 | } |
234 | 234 | ||
235 | /* | 235 | /* |
@@ -244,7 +244,7 @@ static void edac_pci_workq_setup(struct edac_pci_ctl_info *pci, | |||
244 | 244 | ||
245 | INIT_DELAYED_WORK(&pci->work, edac_pci_workq_function); | 245 | INIT_DELAYED_WORK(&pci->work, edac_pci_workq_function); |
246 | queue_delayed_work(edac_workqueue, &pci->work, | 246 | queue_delayed_work(edac_workqueue, &pci->work, |
247 | msecs_to_jiffies(edac_pci_get_poll_msec())); | 247 | msecs_to_jiffies(edac_pci_get_poll_msec())); |
248 | } | 248 | } |
249 | 249 | ||
250 | /* | 250 | /* |
@@ -326,9 +326,9 @@ int edac_pci_add_device(struct edac_pci_ctl_info *pci, int edac_idx) | |||
326 | edac_unlock_pci_list(); | 326 | edac_unlock_pci_list(); |
327 | return 0; | 327 | return 0; |
328 | 328 | ||
329 | fail1: | 329 | fail1: |
330 | del_edac_pci_from_global_list(pci); | 330 | del_edac_pci_from_global_list(pci); |
331 | fail0: | 331 | fail0: |
332 | edac_unlock_pci_list(); | 332 | edac_unlock_pci_list(); |
333 | return 1; | 333 | return 1; |
334 | } | 334 | } |
@@ -372,8 +372,8 @@ struct edac_pci_ctl_info *edac_pci_del_device(struct device *dev) | |||
372 | edac_unlock_pci_list(); | 372 | edac_unlock_pci_list(); |
373 | 373 | ||
374 | edac_printk(KERN_INFO, EDAC_PCI, | 374 | edac_printk(KERN_INFO, EDAC_PCI, |
375 | "Removed device %d for %s %s: DEV %s\n", | 375 | "Removed device %d for %s %s: DEV %s\n", |
376 | pci->pci_idx, pci->mod_name, pci->ctl_name, dev_name(pci)); | 376 | pci->pci_idx, pci->mod_name, pci->ctl_name, dev_name(pci)); |
377 | 377 | ||
378 | return pci; | 378 | return pci; |
379 | } | 379 | } |
@@ -393,7 +393,7 @@ struct edac_pci_gen_data { | |||
393 | }; | 393 | }; |
394 | 394 | ||
395 | struct edac_pci_ctl_info *edac_pci_create_generic_ctl(struct device *dev, | 395 | struct edac_pci_ctl_info *edac_pci_create_generic_ctl(struct device *dev, |
396 | const char *mod_name) | 396 | const char *mod_name) |
397 | { | 397 | { |
398 | struct edac_pci_ctl_info *pci; | 398 | struct edac_pci_ctl_info *pci; |
399 | struct edac_pci_gen_data *pdata; | 399 | struct edac_pci_gen_data *pdata; |
diff --git a/drivers/edac/edac_pci_sysfs.c b/drivers/edac/edac_pci_sysfs.c index f471659a1c35..804833ce0fef 100644 --- a/drivers/edac/edac_pci_sysfs.c +++ b/drivers/edac/edac_pci_sysfs.c | |||
@@ -61,7 +61,7 @@ static ssize_t instance_pe_count_show(struct edac_pci_ctl_info *pci, char *data) | |||
61 | } | 61 | } |
62 | 62 | ||
63 | static ssize_t instance_npe_count_show(struct edac_pci_ctl_info *pci, | 63 | static ssize_t instance_npe_count_show(struct edac_pci_ctl_info *pci, |
64 | char *data) | 64 | char *data) |
65 | { | 65 | { |
66 | return sprintf(data, "%u\n", atomic_read(&pci->counters.npe_count)); | 66 | return sprintf(data, "%u\n", atomic_read(&pci->counters.npe_count)); |
67 | } | 67 | } |
@@ -89,7 +89,7 @@ struct instance_attribute { | |||
89 | 89 | ||
90 | /* Function to 'show' fields from the edac_pci 'instance' structure */ | 90 | /* Function to 'show' fields from the edac_pci 'instance' structure */ |
91 | static ssize_t edac_pci_instance_show(struct kobject *kobj, | 91 | static ssize_t edac_pci_instance_show(struct kobject *kobj, |
92 | struct attribute *attr, char *buffer) | 92 | struct attribute *attr, char *buffer) |
93 | { | 93 | { |
94 | struct edac_pci_ctl_info *pci = to_instance(kobj); | 94 | struct edac_pci_ctl_info *pci = to_instance(kobj); |
95 | struct instance_attribute *instance_attr = to_instance_attr(attr); | 95 | struct instance_attribute *instance_attr = to_instance_attr(attr); |
@@ -101,8 +101,8 @@ static ssize_t edac_pci_instance_show(struct kobject *kobj, | |||
101 | 101 | ||
102 | /* Function to 'store' fields into the edac_pci 'instance' structure */ | 102 | /* Function to 'store' fields into the edac_pci 'instance' structure */ |
103 | static ssize_t edac_pci_instance_store(struct kobject *kobj, | 103 | static ssize_t edac_pci_instance_store(struct kobject *kobj, |
104 | struct attribute *attr, | 104 | struct attribute *attr, |
105 | const char *buffer, size_t count) | 105 | const char *buffer, size_t count) |
106 | { | 106 | { |
107 | struct edac_pci_ctl_info *pci = to_instance(kobj); | 107 | struct edac_pci_ctl_info *pci = to_instance(kobj); |
108 | struct instance_attribute *instance_attr = to_instance_attr(attr); | 108 | struct instance_attribute *instance_attr = to_instance_attr(attr); |
@@ -212,8 +212,8 @@ static ssize_t edac_pci_dev_show(struct kobject *kobj, struct attribute *attr, | |||
212 | } | 212 | } |
213 | 213 | ||
214 | static ssize_t edac_pci_dev_store(struct kobject *kobj, | 214 | static ssize_t edac_pci_dev_store(struct kobject *kobj, |
215 | struct attribute *attr, const char *buffer, | 215 | struct attribute *attr, const char *buffer, |
216 | size_t count) | 216 | size_t count) |
217 | { | 217 | { |
218 | struct edac_pci_dev_attribute *edac_pci_dev; | 218 | struct edac_pci_dev_attribute *edac_pci_dev; |
219 | edac_pci_dev = (struct edac_pci_dev_attribute *)attr; | 219 | edac_pci_dev = (struct edac_pci_dev_attribute *)attr; |
@@ -246,13 +246,13 @@ static struct edac_pci_dev_attribute edac_pci_attr_##_name = { \ | |||
246 | 246 | ||
247 | /* PCI Parity control files */ | 247 | /* PCI Parity control files */ |
248 | EDAC_PCI_ATTR(check_pci_errors, S_IRUGO | S_IWUSR, edac_pci_int_show, | 248 | EDAC_PCI_ATTR(check_pci_errors, S_IRUGO | S_IWUSR, edac_pci_int_show, |
249 | edac_pci_int_store); | 249 | edac_pci_int_store); |
250 | EDAC_PCI_ATTR(edac_pci_log_pe, S_IRUGO | S_IWUSR, edac_pci_int_show, | 250 | EDAC_PCI_ATTR(edac_pci_log_pe, S_IRUGO | S_IWUSR, edac_pci_int_show, |
251 | edac_pci_int_store); | 251 | edac_pci_int_store); |
252 | EDAC_PCI_ATTR(edac_pci_log_npe, S_IRUGO | S_IWUSR, edac_pci_int_show, | 252 | EDAC_PCI_ATTR(edac_pci_log_npe, S_IRUGO | S_IWUSR, edac_pci_int_show, |
253 | edac_pci_int_store); | 253 | edac_pci_int_store); |
254 | EDAC_PCI_ATTR(edac_pci_panic_on_pe, S_IRUGO | S_IWUSR, edac_pci_int_show, | 254 | EDAC_PCI_ATTR(edac_pci_panic_on_pe, S_IRUGO | S_IWUSR, edac_pci_int_show, |
255 | edac_pci_int_store); | 255 | edac_pci_int_store); |
256 | EDAC_PCI_ATTR(pci_parity_count, S_IRUGO, edac_pci_int_show, NULL); | 256 | EDAC_PCI_ATTR(pci_parity_count, S_IRUGO, edac_pci_int_show, NULL); |
257 | EDAC_PCI_ATTR(pci_nonparity_count, S_IRUGO, edac_pci_int_show, NULL); | 257 | EDAC_PCI_ATTR(pci_nonparity_count, S_IRUGO, edac_pci_int_show, NULL); |
258 | 258 | ||
@@ -405,7 +405,7 @@ static u16 get_pci_parity_status(struct pci_dev *dev, int secondary) | |||
405 | } | 405 | } |
406 | 406 | ||
407 | status &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR | | 407 | status &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR | |
408 | PCI_STATUS_PARITY; | 408 | PCI_STATUS_PARITY; |
409 | 409 | ||
410 | if (status) | 410 | if (status) |
411 | /* reset only the bits we are interested in */ | 411 | /* reset only the bits we are interested in */ |
@@ -449,23 +449,23 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) | |||
449 | if (status) { | 449 | if (status) { |
450 | if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) { | 450 | if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) { |
451 | edac_printk(KERN_CRIT, EDAC_PCI, | 451 | edac_printk(KERN_CRIT, EDAC_PCI, |
452 | "Signaled System Error on %s\n", | 452 | "Signaled System Error on %s\n", |
453 | pci_name(dev)); | 453 | pci_name(dev)); |
454 | atomic_inc(&pci_nonparity_count); | 454 | atomic_inc(&pci_nonparity_count); |
455 | } | 455 | } |
456 | 456 | ||
457 | if (status & (PCI_STATUS_PARITY)) { | 457 | if (status & (PCI_STATUS_PARITY)) { |
458 | edac_printk(KERN_CRIT, EDAC_PCI, | 458 | edac_printk(KERN_CRIT, EDAC_PCI, |
459 | "Master Data Parity Error on %s\n", | 459 | "Master Data Parity Error on %s\n", |
460 | pci_name(dev)); | 460 | pci_name(dev)); |
461 | 461 | ||
462 | atomic_inc(&pci_parity_count); | 462 | atomic_inc(&pci_parity_count); |
463 | } | 463 | } |
464 | 464 | ||
465 | if (status & (PCI_STATUS_DETECTED_PARITY)) { | 465 | if (status & (PCI_STATUS_DETECTED_PARITY)) { |
466 | edac_printk(KERN_CRIT, EDAC_PCI, | 466 | edac_printk(KERN_CRIT, EDAC_PCI, |
467 | "Detected Parity Error on %s\n", | 467 | "Detected Parity Error on %s\n", |
468 | pci_name(dev)); | 468 | pci_name(dev)); |
469 | 469 | ||
470 | atomic_inc(&pci_parity_count); | 470 | atomic_inc(&pci_parity_count); |
471 | } | 471 | } |
@@ -486,23 +486,23 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) | |||
486 | if (status) { | 486 | if (status) { |
487 | if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) { | 487 | if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) { |
488 | edac_printk(KERN_CRIT, EDAC_PCI, "Bridge " | 488 | edac_printk(KERN_CRIT, EDAC_PCI, "Bridge " |
489 | "Signaled System Error on %s\n", | 489 | "Signaled System Error on %s\n", |
490 | pci_name(dev)); | 490 | pci_name(dev)); |
491 | atomic_inc(&pci_nonparity_count); | 491 | atomic_inc(&pci_nonparity_count); |
492 | } | 492 | } |
493 | 493 | ||
494 | if (status & (PCI_STATUS_PARITY)) { | 494 | if (status & (PCI_STATUS_PARITY)) { |
495 | edac_printk(KERN_CRIT, EDAC_PCI, "Bridge " | 495 | edac_printk(KERN_CRIT, EDAC_PCI, "Bridge " |
496 | "Master Data Parity Error on " | 496 | "Master Data Parity Error on " |
497 | "%s\n", pci_name(dev)); | 497 | "%s\n", pci_name(dev)); |
498 | 498 | ||
499 | atomic_inc(&pci_parity_count); | 499 | atomic_inc(&pci_parity_count); |
500 | } | 500 | } |
501 | 501 | ||
502 | if (status & (PCI_STATUS_DETECTED_PARITY)) { | 502 | if (status & (PCI_STATUS_DETECTED_PARITY)) { |
503 | edac_printk(KERN_CRIT, EDAC_PCI, "Bridge " | 503 | edac_printk(KERN_CRIT, EDAC_PCI, "Bridge " |
504 | "Detected Parity Error on %s\n", | 504 | "Detected Parity Error on %s\n", |
505 | pci_name(dev)); | 505 | pci_name(dev)); |
506 | 506 | ||
507 | atomic_inc(&pci_parity_count); | 507 | atomic_inc(&pci_parity_count); |
508 | } | 508 | } |
diff --git a/drivers/edac/i3000_edac.c b/drivers/edac/i3000_edac.c index fa4c4d48756f..d410bf7c4463 100644 --- a/drivers/edac/i3000_edac.c +++ b/drivers/edac/i3000_edac.c | |||
@@ -148,7 +148,7 @@ struct i3000_error_info { | |||
148 | 148 | ||
149 | static const struct i3000_dev_info i3000_devs[] = { | 149 | static const struct i3000_dev_info i3000_devs[] = { |
150 | [I3000] = { | 150 | [I3000] = { |
151 | .ctl_name = "i3000"}, | 151 | .ctl_name = "i3000"}, |
152 | }; | 152 | }; |
153 | 153 | ||
154 | static struct pci_dev *mci_pdev = NULL; | 154 | static struct pci_dev *mci_pdev = NULL; |
@@ -195,8 +195,8 @@ static void i3000_get_error_info(struct mem_ctl_info *mci, | |||
195 | } | 195 | } |
196 | 196 | ||
197 | static int i3000_process_error_info(struct mem_ctl_info *mci, | 197 | static int i3000_process_error_info(struct mem_ctl_info *mci, |
198 | struct i3000_error_info *info, | 198 | struct i3000_error_info *info, |
199 | int handle_errors) | 199 | int handle_errors) |
200 | { | 200 | { |
201 | int row, multi_chan; | 201 | int row, multi_chan; |
202 | int pfn, offset, channel; | 202 | int pfn, offset, channel; |
@@ -224,7 +224,7 @@ static int i3000_process_error_info(struct mem_ctl_info *mci, | |||
224 | edac_mc_handle_ue(mci, pfn, offset, row, "i3000 UE"); | 224 | edac_mc_handle_ue(mci, pfn, offset, row, "i3000 UE"); |
225 | else | 225 | else |
226 | edac_mc_handle_ce(mci, pfn, offset, info->derrsyn, row, | 226 | edac_mc_handle_ce(mci, pfn, offset, info->derrsyn, row, |
227 | multi_chan ? channel : 0, "i3000 CE"); | 227 | multi_chan ? channel : 0, "i3000 CE"); |
228 | 228 | ||
229 | return 1; | 229 | return 1; |
230 | } | 230 | } |
@@ -250,7 +250,8 @@ static int i3000_is_interleaved(const unsigned char *c0dra, | |||
250 | */ | 250 | */ |
251 | for (i = 0; i < I3000_RANKS_PER_CHANNEL / 2; i++) | 251 | for (i = 0; i < I3000_RANKS_PER_CHANNEL / 2; i++) |
252 | if (ODD_RANK_ATTRIB(c0dra[i]) != ODD_RANK_ATTRIB(c1dra[i]) || | 252 | if (ODD_RANK_ATTRIB(c0dra[i]) != ODD_RANK_ATTRIB(c1dra[i]) || |
253 | EVEN_RANK_ATTRIB(c0dra[i]) != EVEN_RANK_ATTRIB(c1dra[i])) | 253 | EVEN_RANK_ATTRIB(c0dra[i]) != |
254 | EVEN_RANK_ATTRIB(c1dra[i])) | ||
254 | return 0; | 255 | return 0; |
255 | 256 | ||
256 | /* If the rank boundaries for the two channels are different | 257 | /* If the rank boundaries for the two channels are different |
@@ -283,7 +284,7 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) | |||
283 | window = ioremap_nocache(mchbar, I3000_MMR_WINDOW_SIZE); | 284 | window = ioremap_nocache(mchbar, I3000_MMR_WINDOW_SIZE); |
284 | if (!window) { | 285 | if (!window) { |
285 | printk(KERN_ERR "i3000: cannot map mmio space at 0x%lx\n", | 286 | printk(KERN_ERR "i3000: cannot map mmio space at 0x%lx\n", |
286 | mchbar); | 287 | mchbar); |
287 | return -ENODEV; | 288 | return -ENODEV; |
288 | } | 289 | } |
289 | 290 | ||
@@ -398,7 +399,7 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) | |||
398 | 399 | ||
399 | /* returns count (>= 0), or negative on error */ | 400 | /* returns count (>= 0), or negative on error */ |
400 | static int __devinit i3000_init_one(struct pci_dev *pdev, | 401 | static int __devinit i3000_init_one(struct pci_dev *pdev, |
401 | const struct pci_device_id *ent) | 402 | const struct pci_device_id *ent) |
402 | { | 403 | { |
403 | int rc; | 404 | int rc; |
404 | 405 | ||
@@ -459,7 +460,7 @@ static int __init i3000_init(void) | |||
459 | if (mci_pdev == NULL) { | 460 | if (mci_pdev == NULL) { |
460 | i3000_registered = 0; | 461 | i3000_registered = 0; |
461 | mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 462 | mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
462 | PCI_DEVICE_ID_INTEL_3000_HB, NULL); | 463 | PCI_DEVICE_ID_INTEL_3000_HB, NULL); |
463 | if (!mci_pdev) { | 464 | if (!mci_pdev) { |
464 | debugf0("i3000 pci_get_device fail\n"); | 465 | debugf0("i3000 pci_get_device fail\n"); |
465 | pci_rc = -ENODEV; | 466 | pci_rc = -ENODEV; |
@@ -476,10 +477,10 @@ static int __init i3000_init(void) | |||
476 | 477 | ||
477 | return 0; | 478 | return 0; |
478 | 479 | ||
479 | fail1: | 480 | fail1: |
480 | pci_unregister_driver(&i3000_driver); | 481 | pci_unregister_driver(&i3000_driver); |
481 | 482 | ||
482 | fail0: | 483 | fail0: |
483 | if (mci_pdev) | 484 | if (mci_pdev) |
484 | pci_dev_put(mci_pdev); | 485 | pci_dev_put(mci_pdev); |
485 | 486 | ||
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c index 4b4ec978df2c..efc8853a205b 100644 --- a/drivers/edac/i5000_edac.c +++ b/drivers/edac/i5000_edac.c | |||
@@ -77,7 +77,7 @@ | |||
77 | #define FERR_FAT_M3ERR 0x00000004 | 77 | #define FERR_FAT_M3ERR 0x00000004 |
78 | #define FERR_FAT_M2ERR 0x00000002 | 78 | #define FERR_FAT_M2ERR 0x00000002 |
79 | #define FERR_FAT_M1ERR 0x00000001 | 79 | #define FERR_FAT_M1ERR 0x00000001 |
80 | #define FERR_FAT_MASK (FERR_FAT_M1ERR | \ | 80 | #define FERR_FAT_MASK (FERR_FAT_M1ERR | \ |
81 | FERR_FAT_M2ERR | \ | 81 | FERR_FAT_M2ERR | \ |
82 | FERR_FAT_M3ERR) | 82 | FERR_FAT_M3ERR) |
83 | 83 | ||
@@ -119,7 +119,7 @@ | |||
119 | #define FERR_NF_UNCORRECTABLE (FERR_NF_M12ERR | \ | 119 | #define FERR_NF_UNCORRECTABLE (FERR_NF_M12ERR | \ |
120 | FERR_NF_M11ERR | \ | 120 | FERR_NF_M11ERR | \ |
121 | FERR_NF_M10ERR | \ | 121 | FERR_NF_M10ERR | \ |
122 | FERR_NF_M8ERR | \ | 122 | FERR_NF_M8ERR | \ |
123 | FERR_NF_M7ERR | \ | 123 | FERR_NF_M7ERR | \ |
124 | FERR_NF_M6ERR | \ | 124 | FERR_NF_M6ERR | \ |
125 | FERR_NF_M5ERR | \ | 125 | FERR_NF_M5ERR | \ |
@@ -131,7 +131,7 @@ | |||
131 | #define FERR_NF_DIMM_SPARE (FERR_NF_M27ERR | \ | 131 | #define FERR_NF_DIMM_SPARE (FERR_NF_M27ERR | \ |
132 | FERR_NF_M28ERR) | 132 | FERR_NF_M28ERR) |
133 | #define FERR_NF_THERMAL (FERR_NF_M26ERR | \ | 133 | #define FERR_NF_THERMAL (FERR_NF_M26ERR | \ |
134 | FERR_NF_M25ERR | \ | 134 | FERR_NF_M25ERR | \ |
135 | FERR_NF_M24ERR | \ | 135 | FERR_NF_M24ERR | \ |
136 | FERR_NF_M23ERR) | 136 | FERR_NF_M23ERR) |
137 | #define FERR_NF_SPD_PROTOCOL (FERR_NF_M22ERR) | 137 | #define FERR_NF_SPD_PROTOCOL (FERR_NF_M22ERR) |
@@ -317,9 +317,9 @@ struct i5000_dev_info { | |||
317 | /* Table of devices attributes supported by this driver */ | 317 | /* Table of devices attributes supported by this driver */ |
318 | static const struct i5000_dev_info i5000_devs[] = { | 318 | static const struct i5000_dev_info i5000_devs[] = { |
319 | [I5000P] = { | 319 | [I5000P] = { |
320 | .ctl_name = "I5000", | 320 | .ctl_name = "I5000", |
321 | .fsb_mapping_errors = PCI_DEVICE_ID_INTEL_I5000_DEV16, | 321 | .fsb_mapping_errors = PCI_DEVICE_ID_INTEL_I5000_DEV16, |
322 | }, | 322 | }, |
323 | }; | 323 | }; |
324 | 324 | ||
325 | struct i5000_dimm_info { | 325 | struct i5000_dimm_info { |
@@ -411,15 +411,15 @@ static void i5000_get_error_info(struct mem_ctl_info *mci, | |||
411 | 411 | ||
412 | /* harvest the various error data we need */ | 412 | /* harvest the various error data we need */ |
413 | pci_read_config_dword(pvt->branchmap_werrors, | 413 | pci_read_config_dword(pvt->branchmap_werrors, |
414 | NERR_FAT_FBD, &info->nerr_fat_fbd); | 414 | NERR_FAT_FBD, &info->nerr_fat_fbd); |
415 | pci_read_config_word(pvt->branchmap_werrors, | 415 | pci_read_config_word(pvt->branchmap_werrors, |
416 | NRECMEMA, &info->nrecmema); | 416 | NRECMEMA, &info->nrecmema); |
417 | pci_read_config_word(pvt->branchmap_werrors, | 417 | pci_read_config_word(pvt->branchmap_werrors, |
418 | NRECMEMB, &info->nrecmemb); | 418 | NRECMEMB, &info->nrecmemb); |
419 | 419 | ||
420 | /* Clear the error bits, by writing them back */ | 420 | /* Clear the error bits, by writing them back */ |
421 | pci_write_config_dword(pvt->branchmap_werrors, | 421 | pci_write_config_dword(pvt->branchmap_werrors, |
422 | FERR_FAT_FBD, value); | 422 | FERR_FAT_FBD, value); |
423 | } else { | 423 | } else { |
424 | info->ferr_fat_fbd = 0; | 424 | info->ferr_fat_fbd = 0; |
425 | info->nerr_fat_fbd = 0; | 425 | info->nerr_fat_fbd = 0; |
@@ -437,17 +437,17 @@ static void i5000_get_error_info(struct mem_ctl_info *mci, | |||
437 | 437 | ||
438 | /* harvest the various error data we need */ | 438 | /* harvest the various error data we need */ |
439 | pci_read_config_dword(pvt->branchmap_werrors, | 439 | pci_read_config_dword(pvt->branchmap_werrors, |
440 | NERR_NF_FBD, &info->nerr_nf_fbd); | 440 | NERR_NF_FBD, &info->nerr_nf_fbd); |
441 | pci_read_config_word(pvt->branchmap_werrors, | 441 | pci_read_config_word(pvt->branchmap_werrors, |
442 | RECMEMA, &info->recmema); | 442 | RECMEMA, &info->recmema); |
443 | pci_read_config_dword(pvt->branchmap_werrors, | 443 | pci_read_config_dword(pvt->branchmap_werrors, |
444 | RECMEMB, &info->recmemb); | 444 | RECMEMB, &info->recmemb); |
445 | pci_read_config_dword(pvt->branchmap_werrors, | 445 | pci_read_config_dword(pvt->branchmap_werrors, |
446 | REDMEMB, &info->redmemb); | 446 | REDMEMB, &info->redmemb); |
447 | 447 | ||
448 | /* Clear the error bits, by writing them back */ | 448 | /* Clear the error bits, by writing them back */ |
449 | pci_write_config_dword(pvt->branchmap_werrors, | 449 | pci_write_config_dword(pvt->branchmap_werrors, |
450 | FERR_NF_FBD, value); | 450 | FERR_NF_FBD, value); |
451 | } else { | 451 | } else { |
452 | info->ferr_nf_fbd = 0; | 452 | info->ferr_nf_fbd = 0; |
453 | info->nerr_nf_fbd = 0; | 453 | info->nerr_nf_fbd = 0; |
@@ -465,8 +465,8 @@ static void i5000_get_error_info(struct mem_ctl_info *mci, | |||
465 | * handle the Intel FATAL errors, if any | 465 | * handle the Intel FATAL errors, if any |
466 | */ | 466 | */ |
467 | static void i5000_process_fatal_error_info(struct mem_ctl_info *mci, | 467 | static void i5000_process_fatal_error_info(struct mem_ctl_info *mci, |
468 | struct i5000_error_info * info, | 468 | struct i5000_error_info * info, |
469 | int handle_errors) | 469 | int handle_errors) |
470 | { | 470 | { |
471 | char msg[EDAC_MC_LABEL_LEN + 1 + 90]; | 471 | char msg[EDAC_MC_LABEL_LEN + 1 + 90]; |
472 | u32 allErrors; | 472 | u32 allErrors; |
@@ -532,14 +532,14 @@ static void i5000_process_fatal_error_info(struct mem_ctl_info *mci, | |||
532 | 532 | ||
533 | /****************************************************************************** | 533 | /****************************************************************************** |
534 | * i5000_process_fatal_error_info(struct mem_ctl_info *mci, | 534 | * i5000_process_fatal_error_info(struct mem_ctl_info *mci, |
535 | * struct i5000_error_info *info, | 535 | * struct i5000_error_info *info, |
536 | * int handle_errors); | 536 | * int handle_errors); |
537 | * | 537 | * |
538 | * handle the Intel NON-FATAL errors, if any | 538 | * handle the Intel NON-FATAL errors, if any |
539 | */ | 539 | */ |
540 | static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, | 540 | static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, |
541 | struct i5000_error_info * info, | 541 | struct i5000_error_info * info, |
542 | int handle_errors) | 542 | int handle_errors) |
543 | { | 543 | { |
544 | char msg[EDAC_MC_LABEL_LEN + 1 + 90]; | 544 | char msg[EDAC_MC_LABEL_LEN + 1 + 90]; |
545 | u32 allErrors; | 545 | u32 allErrors; |
@@ -576,10 +576,10 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, | |||
576 | cas = NREC_CAS(info->nrecmemb); | 576 | cas = NREC_CAS(info->nrecmemb); |
577 | 577 | ||
578 | debugf0 | 578 | debugf0 |
579 | ("\t\tCSROW= %d Channels= %d,%d (Branch= %d " | 579 | ("\t\tCSROW= %d Channels= %d,%d (Branch= %d " |
580 | "DRAM Bank= %d rdwr= %s ras= %d cas= %d)\n", | 580 | "DRAM Bank= %d rdwr= %s ras= %d cas= %d)\n", |
581 | rank, channel, channel + 1, branch >> 1, bank, | 581 | rank, channel, channel + 1, branch >> 1, bank, |
582 | rdwr ? "Write" : "Read", ras, cas); | 582 | rdwr ? "Write" : "Read", ras, cas); |
583 | 583 | ||
584 | /* Form out message */ | 584 | /* Form out message */ |
585 | snprintf(msg, sizeof(msg), | 585 | snprintf(msg, sizeof(msg), |
@@ -632,37 +632,37 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, | |||
632 | misc_errors = allErrors & FERR_NF_THERMAL; | 632 | misc_errors = allErrors & FERR_NF_THERMAL; |
633 | if (misc_errors) { | 633 | if (misc_errors) { |
634 | i5000_printk(KERN_WARNING, "\tTHERMAL Error, bits= 0x%x\n", | 634 | i5000_printk(KERN_WARNING, "\tTHERMAL Error, bits= 0x%x\n", |
635 | misc_errors); | 635 | misc_errors); |
636 | } | 636 | } |
637 | 637 | ||
638 | /* See if any of the thermal errors have fired */ | 638 | /* See if any of the thermal errors have fired */ |
639 | misc_errors = allErrors & FERR_NF_NON_RETRY; | 639 | misc_errors = allErrors & FERR_NF_NON_RETRY; |
640 | if (misc_errors) { | 640 | if (misc_errors) { |
641 | i5000_printk(KERN_WARNING, "\tNON-Retry Errors, bits= 0x%x\n", | 641 | i5000_printk(KERN_WARNING, "\tNON-Retry Errors, bits= 0x%x\n", |
642 | misc_errors); | 642 | misc_errors); |
643 | } | 643 | } |
644 | 644 | ||
645 | /* See if any of the thermal errors have fired */ | 645 | /* See if any of the thermal errors have fired */ |
646 | misc_errors = allErrors & FERR_NF_NORTH_CRC; | 646 | misc_errors = allErrors & FERR_NF_NORTH_CRC; |
647 | if (misc_errors) { | 647 | if (misc_errors) { |
648 | i5000_printk(KERN_WARNING, | 648 | i5000_printk(KERN_WARNING, |
649 | "\tNORTHBOUND CRC Error, bits= 0x%x\n", | 649 | "\tNORTHBOUND CRC Error, bits= 0x%x\n", |
650 | misc_errors); | 650 | misc_errors); |
651 | } | 651 | } |
652 | 652 | ||
653 | /* See if any of the thermal errors have fired */ | 653 | /* See if any of the thermal errors have fired */ |
654 | misc_errors = allErrors & FERR_NF_SPD_PROTOCOL; | 654 | misc_errors = allErrors & FERR_NF_SPD_PROTOCOL; |
655 | if (misc_errors) { | 655 | if (misc_errors) { |
656 | i5000_printk(KERN_WARNING, | 656 | i5000_printk(KERN_WARNING, |
657 | "\tSPD Protocol Error, bits= 0x%x\n", | 657 | "\tSPD Protocol Error, bits= 0x%x\n", |
658 | misc_errors); | 658 | misc_errors); |
659 | } | 659 | } |
660 | 660 | ||
661 | /* See if any of the thermal errors have fired */ | 661 | /* See if any of the thermal errors have fired */ |
662 | misc_errors = allErrors & FERR_NF_DIMM_SPARE; | 662 | misc_errors = allErrors & FERR_NF_DIMM_SPARE; |
663 | if (misc_errors) { | 663 | if (misc_errors) { |
664 | i5000_printk(KERN_WARNING, "\tDIMM-Spare Error, bits= 0x%x\n", | 664 | i5000_printk(KERN_WARNING, "\tDIMM-Spare Error, bits= 0x%x\n", |
665 | misc_errors); | 665 | misc_errors); |
666 | } | 666 | } |
667 | } | 667 | } |
668 | 668 | ||
@@ -671,8 +671,8 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, | |||
671 | * in the 'info' structure, previously retrieved from hardware | 671 | * in the 'info' structure, previously retrieved from hardware |
672 | */ | 672 | */ |
673 | static void i5000_process_error_info(struct mem_ctl_info *mci, | 673 | static void i5000_process_error_info(struct mem_ctl_info *mci, |
674 | struct i5000_error_info * info, | 674 | struct i5000_error_info * info, |
675 | int handle_errors) | 675 | int handle_errors) |
676 | { | 676 | { |
677 | /* First handle any fatal errors that occurred */ | 677 | /* First handle any fatal errors that occurred */ |
678 | i5000_process_fatal_error_info(mci, info, handle_errors); | 678 | i5000_process_fatal_error_info(mci, info, handle_errors); |
@@ -724,17 +724,17 @@ static int i5000_get_devices(struct mem_ctl_info *mci, int dev_idx) | |||
724 | pdev = NULL; | 724 | pdev = NULL; |
725 | while (1) { | 725 | while (1) { |
726 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 726 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
727 | PCI_DEVICE_ID_INTEL_I5000_DEV16, pdev); | 727 | PCI_DEVICE_ID_INTEL_I5000_DEV16, pdev); |
728 | 728 | ||
729 | /* End of list, leave */ | 729 | /* End of list, leave */ |
730 | if (pdev == NULL) { | 730 | if (pdev == NULL) { |
731 | i5000_printk(KERN_ERR, | 731 | i5000_printk(KERN_ERR, |
732 | "'system address,Process Bus' " | 732 | "'system address,Process Bus' " |
733 | "device not found:" | 733 | "device not found:" |
734 | "vendor 0x%x device 0x%x FUNC 1 " | 734 | "vendor 0x%x device 0x%x FUNC 1 " |
735 | "(broken BIOS?)\n", | 735 | "(broken BIOS?)\n", |
736 | PCI_VENDOR_ID_INTEL, | 736 | PCI_VENDOR_ID_INTEL, |
737 | PCI_DEVICE_ID_INTEL_I5000_DEV16); | 737 | PCI_DEVICE_ID_INTEL_I5000_DEV16); |
738 | 738 | ||
739 | return 1; | 739 | return 1; |
740 | } | 740 | } |
@@ -750,16 +750,16 @@ static int i5000_get_devices(struct mem_ctl_info *mci, int dev_idx) | |||
750 | pdev = NULL; | 750 | pdev = NULL; |
751 | while (1) { | 751 | while (1) { |
752 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 752 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
753 | PCI_DEVICE_ID_INTEL_I5000_DEV16, pdev); | 753 | PCI_DEVICE_ID_INTEL_I5000_DEV16, pdev); |
754 | 754 | ||
755 | if (pdev == NULL) { | 755 | if (pdev == NULL) { |
756 | i5000_printk(KERN_ERR, | 756 | i5000_printk(KERN_ERR, |
757 | "MC: 'branchmap,control,errors' " | 757 | "MC: 'branchmap,control,errors' " |
758 | "device not found:" | 758 | "device not found:" |
759 | "vendor 0x%x device 0x%x Func 2 " | 759 | "vendor 0x%x device 0x%x Func 2 " |
760 | "(broken BIOS?)\n", | 760 | "(broken BIOS?)\n", |
761 | PCI_VENDOR_ID_INTEL, | 761 | PCI_VENDOR_ID_INTEL, |
762 | PCI_DEVICE_ID_INTEL_I5000_DEV16); | 762 | PCI_DEVICE_ID_INTEL_I5000_DEV16); |
763 | 763 | ||
764 | pci_dev_put(pvt->branchmap_werrors); | 764 | pci_dev_put(pvt->branchmap_werrors); |
765 | return 1; | 765 | return 1; |
@@ -784,13 +784,13 @@ static int i5000_get_devices(struct mem_ctl_info *mci, int dev_idx) | |||
784 | 784 | ||
785 | pdev = NULL; | 785 | pdev = NULL; |
786 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 786 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
787 | PCI_DEVICE_ID_I5000_BRANCH_0, pdev); | 787 | PCI_DEVICE_ID_I5000_BRANCH_0, pdev); |
788 | 788 | ||
789 | if (pdev == NULL) { | 789 | if (pdev == NULL) { |
790 | i5000_printk(KERN_ERR, | 790 | i5000_printk(KERN_ERR, |
791 | "MC: 'BRANCH 0' device not found:" | 791 | "MC: 'BRANCH 0' device not found:" |
792 | "vendor 0x%x device 0x%x Func 0 (broken BIOS?)\n", | 792 | "vendor 0x%x device 0x%x Func 0 (broken BIOS?)\n", |
793 | PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_I5000_BRANCH_0); | 793 | PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_I5000_BRANCH_0); |
794 | 794 | ||
795 | pci_dev_put(pvt->branchmap_werrors); | 795 | pci_dev_put(pvt->branchmap_werrors); |
796 | pci_dev_put(pvt->fsb_error_regs); | 796 | pci_dev_put(pvt->fsb_error_regs); |
@@ -805,15 +805,15 @@ static int i5000_get_devices(struct mem_ctl_info *mci, int dev_idx) | |||
805 | if (pvt->maxch >= CHANNELS_PER_BRANCH) { | 805 | if (pvt->maxch >= CHANNELS_PER_BRANCH) { |
806 | pdev = NULL; | 806 | pdev = NULL; |
807 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 807 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
808 | PCI_DEVICE_ID_I5000_BRANCH_1, pdev); | 808 | PCI_DEVICE_ID_I5000_BRANCH_1, pdev); |
809 | 809 | ||
810 | if (pdev == NULL) { | 810 | if (pdev == NULL) { |
811 | i5000_printk(KERN_ERR, | 811 | i5000_printk(KERN_ERR, |
812 | "MC: 'BRANCH 1' device not found:" | 812 | "MC: 'BRANCH 1' device not found:" |
813 | "vendor 0x%x device 0x%x Func 0 " | 813 | "vendor 0x%x device 0x%x Func 0 " |
814 | "(broken BIOS?)\n", | 814 | "(broken BIOS?)\n", |
815 | PCI_VENDOR_ID_INTEL, | 815 | PCI_VENDOR_ID_INTEL, |
816 | PCI_DEVICE_ID_I5000_BRANCH_1); | 816 | PCI_DEVICE_ID_I5000_BRANCH_1); |
817 | 817 | ||
818 | pci_dev_put(pvt->branchmap_werrors); | 818 | pci_dev_put(pvt->branchmap_werrors); |
819 | pci_dev_put(pvt->fsb_error_regs); | 819 | pci_dev_put(pvt->fsb_error_regs); |
@@ -917,7 +917,7 @@ static void decode_mtr(int slot_row, u16 mtr) | |||
917 | } | 917 | } |
918 | 918 | ||
919 | static void handle_channel(struct i5000_pvt *pvt, int csrow, int channel, | 919 | static void handle_channel(struct i5000_pvt *pvt, int csrow, int channel, |
920 | struct i5000_dimm_info *dinfo) | 920 | struct i5000_dimm_info *dinfo) |
921 | { | 921 | { |
922 | int mtr; | 922 | int mtr; |
923 | int amb_present_reg; | 923 | int amb_present_reg; |
@@ -932,7 +932,7 @@ static void handle_channel(struct i5000_pvt *pvt, int csrow, int channel, | |||
932 | dinfo->dual_rank = MTR_DIMM_RANK(mtr); | 932 | dinfo->dual_rank = MTR_DIMM_RANK(mtr); |
933 | 933 | ||
934 | if (!((dinfo->dual_rank == 0) && | 934 | if (!((dinfo->dual_rank == 0) && |
935 | ((csrow & 0x1) == 0x1))) { | 935 | ((csrow & 0x1) == 0x1))) { |
936 | /* Start with the number of bits for a Bank | 936 | /* Start with the number of bits for a Bank |
937 | * on the DRAM */ | 937 | * on the DRAM */ |
938 | addrBits = MTR_DRAM_BANKS_ADDR_BITS(mtr); | 938 | addrBits = MTR_DRAM_BANKS_ADDR_BITS(mtr); |
@@ -970,7 +970,7 @@ static void calculate_dimm_size(struct i5000_pvt *pvt) | |||
970 | mem_buffer = p = kmalloc(space, GFP_KERNEL); | 970 | mem_buffer = p = kmalloc(space, GFP_KERNEL); |
971 | if (p == NULL) { | 971 | if (p == NULL) { |
972 | i5000_printk(KERN_ERR, "MC: %s:%s() kmalloc() failed\n", | 972 | i5000_printk(KERN_ERR, "MC: %s:%s() kmalloc() failed\n", |
973 | __FILE__, __func__); | 973 | __FILE__, __func__); |
974 | return; | 974 | return; |
975 | } | 975 | } |
976 | 976 | ||
@@ -990,7 +990,7 @@ static void calculate_dimm_size(struct i5000_pvt *pvt) | |||
990 | * then reset the message buffer */ | 990 | * then reset the message buffer */ |
991 | if (csrow & 0x1) { | 991 | if (csrow & 0x1) { |
992 | n = snprintf(p, space, "---------------------------" | 992 | n = snprintf(p, space, "---------------------------" |
993 | "--------------------------------"); | 993 | "--------------------------------"); |
994 | p += n; | 994 | p += n; |
995 | space -= n; | 995 | space -= n; |
996 | debugf2("%s\n", mem_buffer); | 996 | debugf2("%s\n", mem_buffer); |
@@ -1015,7 +1015,7 @@ static void calculate_dimm_size(struct i5000_pvt *pvt) | |||
1015 | 1015 | ||
1016 | /* Output the last bottom 'boundary' marker */ | 1016 | /* Output the last bottom 'boundary' marker */ |
1017 | n = snprintf(p, space, "---------------------------" | 1017 | n = snprintf(p, space, "---------------------------" |
1018 | "--------------------------------\n"); | 1018 | "--------------------------------\n"); |
1019 | p += n; | 1019 | p += n; |
1020 | space -= n; | 1020 | space -= n; |
1021 | 1021 | ||
@@ -1056,9 +1056,9 @@ static void i5000_get_mc_regs(struct mem_ctl_info *mci) | |||
1056 | pvt = (struct i5000_pvt *)mci->pvt_info; | 1056 | pvt = (struct i5000_pvt *)mci->pvt_info; |
1057 | 1057 | ||
1058 | pci_read_config_dword(pvt->system_address, AMBASE, | 1058 | pci_read_config_dword(pvt->system_address, AMBASE, |
1059 | (u32 *) & pvt->ambase); | 1059 | (u32 *) & pvt->ambase); |
1060 | pci_read_config_dword(pvt->system_address, AMBASE + sizeof(u32), | 1060 | pci_read_config_dword(pvt->system_address, AMBASE + sizeof(u32), |
1061 | ((u32 *) & pvt->ambase) + sizeof(u32)); | 1061 | ((u32 *) & pvt->ambase) + sizeof(u32)); |
1062 | 1062 | ||
1063 | maxdimmperch = pvt->maxdimmperch; | 1063 | maxdimmperch = pvt->maxdimmperch; |
1064 | maxch = pvt->maxch; | 1064 | maxch = pvt->maxch; |
@@ -1098,14 +1098,14 @@ static void i5000_get_mc_regs(struct mem_ctl_info *mci) | |||
1098 | int where = MTR0 + (slot_row * sizeof(u32)); | 1098 | int where = MTR0 + (slot_row * sizeof(u32)); |
1099 | 1099 | ||
1100 | pci_read_config_word(pvt->branch_0, where, | 1100 | pci_read_config_word(pvt->branch_0, where, |
1101 | &pvt->b0_mtr[slot_row]); | 1101 | &pvt->b0_mtr[slot_row]); |
1102 | 1102 | ||
1103 | debugf2("MTR%d where=0x%x B0 value=0x%x\n", slot_row, where, | 1103 | debugf2("MTR%d where=0x%x B0 value=0x%x\n", slot_row, where, |
1104 | pvt->b0_mtr[slot_row]); | 1104 | pvt->b0_mtr[slot_row]); |
1105 | 1105 | ||
1106 | if (pvt->maxch >= CHANNELS_PER_BRANCH) { | 1106 | if (pvt->maxch >= CHANNELS_PER_BRANCH) { |
1107 | pci_read_config_word(pvt->branch_1, where, | 1107 | pci_read_config_word(pvt->branch_1, where, |
1108 | &pvt->b1_mtr[slot_row]); | 1108 | &pvt->b1_mtr[slot_row]); |
1109 | debugf2("MTR%d where=0x%x B1 value=0x%x\n", slot_row, | 1109 | debugf2("MTR%d where=0x%x B1 value=0x%x\n", slot_row, |
1110 | where, pvt->b0_mtr[slot_row]); | 1110 | where, pvt->b0_mtr[slot_row]); |
1111 | } else { | 1111 | } else { |
@@ -1120,10 +1120,10 @@ static void i5000_get_mc_regs(struct mem_ctl_info *mci) | |||
1120 | decode_mtr(slot_row, pvt->b0_mtr[slot_row]); | 1120 | decode_mtr(slot_row, pvt->b0_mtr[slot_row]); |
1121 | } | 1121 | } |
1122 | pci_read_config_word(pvt->branch_0, AMB_PRESENT_0, | 1122 | pci_read_config_word(pvt->branch_0, AMB_PRESENT_0, |
1123 | &pvt->b0_ambpresent0); | 1123 | &pvt->b0_ambpresent0); |
1124 | debugf2("\t\tAMB-Branch 0-present0 0x%x:\n", pvt->b0_ambpresent0); | 1124 | debugf2("\t\tAMB-Branch 0-present0 0x%x:\n", pvt->b0_ambpresent0); |
1125 | pci_read_config_word(pvt->branch_0, AMB_PRESENT_1, | 1125 | pci_read_config_word(pvt->branch_0, AMB_PRESENT_1, |
1126 | &pvt->b0_ambpresent1); | 1126 | &pvt->b0_ambpresent1); |
1127 | debugf2("\t\tAMB-Branch 0-present1 0x%x:\n", pvt->b0_ambpresent1); | 1127 | debugf2("\t\tAMB-Branch 0-present1 0x%x:\n", pvt->b0_ambpresent1); |
1128 | 1128 | ||
1129 | /* Only if we have 2 branchs (4 channels) */ | 1129 | /* Only if we have 2 branchs (4 channels) */ |
@@ -1137,11 +1137,11 @@ static void i5000_get_mc_regs(struct mem_ctl_info *mci) | |||
1137 | decode_mtr(slot_row, pvt->b1_mtr[slot_row]); | 1137 | decode_mtr(slot_row, pvt->b1_mtr[slot_row]); |
1138 | } | 1138 | } |
1139 | pci_read_config_word(pvt->branch_1, AMB_PRESENT_0, | 1139 | pci_read_config_word(pvt->branch_1, AMB_PRESENT_0, |
1140 | &pvt->b1_ambpresent0); | 1140 | &pvt->b1_ambpresent0); |
1141 | debugf2("\t\tAMB-Branch 1-present0 0x%x:\n", | 1141 | debugf2("\t\tAMB-Branch 1-present0 0x%x:\n", |
1142 | pvt->b1_ambpresent0); | 1142 | pvt->b1_ambpresent0); |
1143 | pci_read_config_word(pvt->branch_1, AMB_PRESENT_1, | 1143 | pci_read_config_word(pvt->branch_1, AMB_PRESENT_1, |
1144 | &pvt->b1_ambpresent1); | 1144 | &pvt->b1_ambpresent1); |
1145 | debugf2("\t\tAMB-Branch 1-present1 0x%x:\n", | 1145 | debugf2("\t\tAMB-Branch 1-present1 0x%x:\n", |
1146 | pvt->b1_ambpresent1); | 1146 | pvt->b1_ambpresent1); |
1147 | } | 1147 | } |
@@ -1234,13 +1234,13 @@ static void i5000_enable_error_reporting(struct mem_ctl_info *mci) | |||
1234 | 1234 | ||
1235 | /* Read the FBD Error Mask Register */ | 1235 | /* Read the FBD Error Mask Register */ |
1236 | pci_read_config_dword(pvt->branchmap_werrors, EMASK_FBD, | 1236 | pci_read_config_dword(pvt->branchmap_werrors, EMASK_FBD, |
1237 | &fbd_error_mask); | 1237 | &fbd_error_mask); |
1238 | 1238 | ||
1239 | /* Enable with a '0' */ | 1239 | /* Enable with a '0' */ |
1240 | fbd_error_mask &= ~(ENABLE_EMASK_ALL); | 1240 | fbd_error_mask &= ~(ENABLE_EMASK_ALL); |
1241 | 1241 | ||
1242 | pci_write_config_dword(pvt->branchmap_werrors, EMASK_FBD, | 1242 | pci_write_config_dword(pvt->branchmap_werrors, EMASK_FBD, |
1243 | fbd_error_mask); | 1243 | fbd_error_mask); |
1244 | } | 1244 | } |
1245 | 1245 | ||
1246 | /****************************************************************************** | 1246 | /****************************************************************************** |
@@ -1250,8 +1250,8 @@ static void i5000_enable_error_reporting(struct mem_ctl_info *mci) | |||
1250 | * as well | 1250 | * as well |
1251 | */ | 1251 | */ |
1252 | static void i5000_get_dimm_and_channel_counts(struct pci_dev *pdev, | 1252 | static void i5000_get_dimm_and_channel_counts(struct pci_dev *pdev, |
1253 | int *num_dimms_per_channel, | 1253 | int *num_dimms_per_channel, |
1254 | int *num_channels) | 1254 | int *num_channels) |
1255 | { | 1255 | { |
1256 | u8 value; | 1256 | u8 value; |
1257 | 1257 | ||
@@ -1313,7 +1313,7 @@ static int i5000_probe1(struct pci_dev *pdev, int dev_idx) | |||
1313 | * some fancy mobo determination. | 1313 | * some fancy mobo determination. |
1314 | */ | 1314 | */ |
1315 | i5000_get_dimm_and_channel_counts(pdev, &num_dimms_per_channel, | 1315 | i5000_get_dimm_and_channel_counts(pdev, &num_dimms_per_channel, |
1316 | &num_channels); | 1316 | &num_channels); |
1317 | num_csrows = num_dimms_per_channel * 2; | 1317 | num_csrows = num_dimms_per_channel * 2; |
1318 | 1318 | ||
1319 | debugf0("MC: %s(): Number of - Channels= %d DIMMS= %d CSROWS= %d\n", | 1319 | debugf0("MC: %s(): Number of - Channels= %d DIMMS= %d CSROWS= %d\n", |
@@ -1392,11 +1392,11 @@ static int i5000_probe1(struct pci_dev *pdev, int dev_idx) | |||
1392 | return 0; | 1392 | return 0; |
1393 | 1393 | ||
1394 | /* Error exit unwinding stack */ | 1394 | /* Error exit unwinding stack */ |
1395 | fail1: | 1395 | fail1: |
1396 | 1396 | ||
1397 | i5000_put_devices(mci); | 1397 | i5000_put_devices(mci); |
1398 | 1398 | ||
1399 | fail0: | 1399 | fail0: |
1400 | edac_mc_free(mci); | 1400 | edac_mc_free(mci); |
1401 | return -ENODEV; | 1401 | return -ENODEV; |
1402 | } | 1402 | } |
@@ -1409,7 +1409,7 @@ static int i5000_probe1(struct pci_dev *pdev, int dev_idx) | |||
1409 | * count (>= 0) | 1409 | * count (>= 0) |
1410 | */ | 1410 | */ |
1411 | static int __devinit i5000_init_one(struct pci_dev *pdev, | 1411 | static int __devinit i5000_init_one(struct pci_dev *pdev, |
1412 | const struct pci_device_id *id) | 1412 | const struct pci_device_id *id) |
1413 | { | 1413 | { |
1414 | int rc; | 1414 | int rc; |
1415 | 1415 | ||
@@ -1503,6 +1503,6 @@ MODULE_LICENSE("GPL"); | |||
1503 | MODULE_AUTHOR | 1503 | MODULE_AUTHOR |
1504 | ("Linux Networx (http://lnxi.com) Doug Thompson <norsk5@xmission.com>"); | 1504 | ("Linux Networx (http://lnxi.com) Doug Thompson <norsk5@xmission.com>"); |
1505 | MODULE_DESCRIPTION("MC Driver for Intel I5000 memory controllers - " | 1505 | MODULE_DESCRIPTION("MC Driver for Intel I5000 memory controllers - " |
1506 | I5000_REVISION); | 1506 | I5000_REVISION); |
1507 | module_param(edac_op_state, int, 0444); | 1507 | module_param(edac_op_state, int, 0444); |
1508 | MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI"); | 1508 | MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI"); |
diff --git a/drivers/edac/i82443bxgx_edac.c b/drivers/edac/i82443bxgx_edac.c index d190104081ca..445ed56558f1 100644 --- a/drivers/edac/i82443bxgx_edac.c +++ b/drivers/edac/i82443bxgx_edac.c | |||
@@ -114,8 +114,8 @@ struct i82443bxgx_edacmc_error_info { | |||
114 | static struct edac_pci_ctl_info *i82443bxgx_pci; | 114 | static struct edac_pci_ctl_info *i82443bxgx_pci; |
115 | 115 | ||
116 | static void i82443bxgx_edacmc_get_error_info(struct mem_ctl_info *mci, | 116 | static void i82443bxgx_edacmc_get_error_info(struct mem_ctl_info *mci, |
117 | struct i82443bxgx_edacmc_error_info | 117 | struct i82443bxgx_edacmc_error_info |
118 | *info) | 118 | *info) |
119 | { | 119 | { |
120 | struct pci_dev *pdev; | 120 | struct pci_dev *pdev; |
121 | pdev = to_pci_dev(mci->dev); | 121 | pdev = to_pci_dev(mci->dev); |
@@ -151,17 +151,18 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci, | |||
151 | error_found = 1; | 151 | error_found = 1; |
152 | if (handle_errors) | 152 | if (handle_errors) |
153 | edac_mc_handle_ce(mci, page, pageoffset, | 153 | edac_mc_handle_ce(mci, page, pageoffset, |
154 | /* 440BX/GX don't make syndrome information available */ | 154 | /* 440BX/GX don't make syndrome information |
155 | 0, edac_mc_find_csrow_by_page(mci, page), 0, /* channel */ | 155 | * available */ |
156 | mci->ctl_name); | 156 | 0, edac_mc_find_csrow_by_page(mci, page), 0, |
157 | mci->ctl_name); | ||
157 | } | 158 | } |
158 | 159 | ||
159 | if (info->eap & I82443BXGX_EAP_OFFSET_MBE) { | 160 | if (info->eap & I82443BXGX_EAP_OFFSET_MBE) { |
160 | error_found = 1; | 161 | error_found = 1; |
161 | if (handle_errors) | 162 | if (handle_errors) |
162 | edac_mc_handle_ue(mci, page, pageoffset, | 163 | edac_mc_handle_ue(mci, page, pageoffset, |
163 | edac_mc_find_csrow_by_page(mci, page), | 164 | edac_mc_find_csrow_by_page(mci, page), |
164 | mci->ctl_name); | 165 | mci->ctl_name); |
165 | } | 166 | } |
166 | 167 | ||
167 | return error_found; | 168 | return error_found; |
@@ -177,9 +178,9 @@ static void i82443bxgx_edacmc_check(struct mem_ctl_info *mci) | |||
177 | } | 178 | } |
178 | 179 | ||
179 | static void i82443bxgx_init_csrows(struct mem_ctl_info *mci, | 180 | static void i82443bxgx_init_csrows(struct mem_ctl_info *mci, |
180 | struct pci_dev *pdev, | 181 | struct pci_dev *pdev, |
181 | enum edac_type edac_mode, | 182 | enum edac_type edac_mode, |
182 | enum mem_type mtype) | 183 | enum mem_type mtype) |
183 | { | 184 | { |
184 | struct csrow_info *csrow; | 185 | struct csrow_info *csrow; |
185 | int index; | 186 | int index; |
@@ -233,7 +234,8 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx) | |||
233 | debugf0("MC: " __FILE__ ": %s()\n", __func__); | 234 | debugf0("MC: " __FILE__ ": %s()\n", __func__); |
234 | 235 | ||
235 | /* Something is really hosed if PCI config space reads from | 236 | /* Something is really hosed if PCI config space reads from |
236 | the MC aren't working. */ | 237 | * the MC aren't working. |
238 | */ | ||
237 | if (pci_read_config_dword(pdev, I82443BXGX_NBXCFG, &nbxcfg)) | 239 | if (pci_read_config_dword(pdev, I82443BXGX_NBXCFG, &nbxcfg)) |
238 | return -EIO; | 240 | return -EIO; |
239 | 241 | ||
@@ -258,8 +260,8 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx) | |||
258 | mtype = MEM_RDR; | 260 | mtype = MEM_RDR; |
259 | break; | 261 | break; |
260 | default: | 262 | default: |
261 | debugf0 | 263 | debugf0("Unknown/reserved DRAM type value " |
262 | ("Unknown/reserved DRAM type value in DRAMC register!\n"); | 264 | "in DRAMC register!\n"); |
263 | mtype = -MEM_UNKNOWN; | 265 | mtype = -MEM_UNKNOWN; |
264 | } | 266 | } |
265 | 267 | ||
@@ -271,10 +273,10 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx) | |||
271 | mci->scrub_cap = SCRUB_FLAG_HW_SRC; | 273 | mci->scrub_cap = SCRUB_FLAG_HW_SRC; |
272 | pci_read_config_dword(pdev, I82443BXGX_NBXCFG, &nbxcfg); | 274 | pci_read_config_dword(pdev, I82443BXGX_NBXCFG, &nbxcfg); |
273 | ecc_mode = ((nbxcfg >> I82443BXGX_NBXCFG_OFFSET_DRAM_INTEGRITY) & | 275 | ecc_mode = ((nbxcfg >> I82443BXGX_NBXCFG_OFFSET_DRAM_INTEGRITY) & |
274 | (BIT(0) | BIT(1))); | 276 | (BIT(0) | BIT(1))); |
275 | 277 | ||
276 | mci->scrub_mode = (ecc_mode == I82443BXGX_NBXCFG_INTEGRITY_SCRUB) | 278 | mci->scrub_mode = (ecc_mode == I82443BXGX_NBXCFG_INTEGRITY_SCRUB) |
277 | ? SCRUB_HW_SRC : SCRUB_NONE; | 279 | ? SCRUB_HW_SRC : SCRUB_NONE; |
278 | 280 | ||
279 | switch (ecc_mode) { | 281 | switch (ecc_mode) { |
280 | case I82443BXGX_NBXCFG_INTEGRITY_NONE: | 282 | case I82443BXGX_NBXCFG_INTEGRITY_NONE: |
@@ -288,9 +290,8 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx) | |||
288 | edac_mode = EDAC_SECDED; | 290 | edac_mode = EDAC_SECDED; |
289 | break; | 291 | break; |
290 | default: | 292 | default: |
291 | debugf0 | 293 | debugf0("%s(): Unknown/reserved ECC state " |
292 | ("%s(): Unknown/reserved ECC state in NBXCFG register!\n", | 294 | "in NBXCFG register!\n", __func__); |
293 | __func__); | ||
294 | edac_mode = EDAC_UNKNOWN; | 295 | edac_mode = EDAC_UNKNOWN; |
295 | break; | 296 | break; |
296 | } | 297 | } |
@@ -301,10 +302,10 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx) | |||
301 | * here, or we get "phantom" errors occuring at module-load | 302 | * here, or we get "phantom" errors occuring at module-load |
302 | * time. */ | 303 | * time. */ |
303 | pci_write_bits32(pdev, I82443BXGX_EAP, | 304 | pci_write_bits32(pdev, I82443BXGX_EAP, |
304 | (I82443BXGX_EAP_OFFSET_SBE | | 305 | (I82443BXGX_EAP_OFFSET_SBE | |
305 | I82443BXGX_EAP_OFFSET_MBE), | 306 | I82443BXGX_EAP_OFFSET_MBE), |
306 | (I82443BXGX_EAP_OFFSET_SBE | | 307 | (I82443BXGX_EAP_OFFSET_SBE | |
307 | I82443BXGX_EAP_OFFSET_MBE)); | 308 | I82443BXGX_EAP_OFFSET_MBE)); |
308 | 309 | ||
309 | mci->mod_name = EDAC_MOD_STR; | 310 | mci->mod_name = EDAC_MOD_STR; |
310 | mci->mod_ver = I82443_REVISION; | 311 | mci->mod_ver = I82443_REVISION; |
@@ -332,7 +333,7 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx) | |||
332 | debugf3("MC: " __FILE__ ": %s(): success\n", __func__); | 333 | debugf3("MC: " __FILE__ ": %s(): success\n", __func__); |
333 | return 0; | 334 | return 0; |
334 | 335 | ||
335 | fail: | 336 | fail: |
336 | edac_mc_free(mci); | 337 | edac_mc_free(mci); |
337 | return -ENODEV; | 338 | return -ENODEV; |
338 | } | 339 | } |
diff --git a/drivers/edac/i82860_edac.c b/drivers/edac/i82860_edac.c index db8a864f16f6..9fdd76e157f8 100644 --- a/drivers/edac/i82860_edac.c +++ b/drivers/edac/i82860_edac.c | |||
@@ -54,7 +54,7 @@ struct i82860_error_info { | |||
54 | 54 | ||
55 | static const struct i82860_dev_info i82860_devs[] = { | 55 | static const struct i82860_dev_info i82860_devs[] = { |
56 | [I82860] = { | 56 | [I82860] = { |
57 | .ctl_name = "i82860"}, | 57 | .ctl_name = "i82860"}, |
58 | }; | 58 | }; |
59 | 59 | ||
60 | static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code | 60 | static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code |
@@ -63,7 +63,7 @@ static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code | |||
63 | static struct edac_pci_ctl_info *i82860_pci; | 63 | static struct edac_pci_ctl_info *i82860_pci; |
64 | 64 | ||
65 | static void i82860_get_error_info(struct mem_ctl_info *mci, | 65 | static void i82860_get_error_info(struct mem_ctl_info *mci, |
66 | struct i82860_error_info *info) | 66 | struct i82860_error_info *info) |
67 | { | 67 | { |
68 | struct pci_dev *pdev; | 68 | struct pci_dev *pdev; |
69 | 69 | ||
@@ -96,8 +96,8 @@ static void i82860_get_error_info(struct mem_ctl_info *mci, | |||
96 | } | 96 | } |
97 | 97 | ||
98 | static int i82860_process_error_info(struct mem_ctl_info *mci, | 98 | static int i82860_process_error_info(struct mem_ctl_info *mci, |
99 | struct i82860_error_info *info, | 99 | struct i82860_error_info *info, |
100 | int handle_errors) | 100 | int handle_errors) |
101 | { | 101 | { |
102 | int row; | 102 | int row; |
103 | 103 | ||
@@ -119,7 +119,7 @@ static int i82860_process_error_info(struct mem_ctl_info *mci, | |||
119 | edac_mc_handle_ue(mci, info->eap, 0, row, "i82860 UE"); | 119 | edac_mc_handle_ue(mci, info->eap, 0, row, "i82860 UE"); |
120 | else | 120 | else |
121 | edac_mc_handle_ce(mci, info->eap, 0, info->derrsyn, row, 0, | 121 | edac_mc_handle_ce(mci, info->eap, 0, info->derrsyn, row, 0, |
122 | "i82860 UE"); | 122 | "i82860 UE"); |
123 | 123 | ||
124 | return 1; | 124 | return 1; |
125 | } | 125 | } |
@@ -155,7 +155,7 @@ static void i82860_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev) | |||
155 | csrow = &mci->csrows[index]; | 155 | csrow = &mci->csrows[index]; |
156 | pci_read_config_word(pdev, I82860_GBA + index * 2, &value); | 156 | pci_read_config_word(pdev, I82860_GBA + index * 2, &value); |
157 | cumul_size = (value & I82860_GBA_MASK) << | 157 | cumul_size = (value & I82860_GBA_MASK) << |
158 | (I82860_GBA_SHIFT - PAGE_SHIFT); | 158 | (I82860_GBA_SHIFT - PAGE_SHIFT); |
159 | debugf3("%s(): (%d) cumul_size 0x%x\n", __func__, index, | 159 | debugf3("%s(): (%d) cumul_size 0x%x\n", __func__, index, |
160 | cumul_size); | 160 | cumul_size); |
161 | 161 | ||
@@ -230,14 +230,14 @@ static int i82860_probe1(struct pci_dev *pdev, int dev_idx) | |||
230 | 230 | ||
231 | return 0; | 231 | return 0; |
232 | 232 | ||
233 | fail: | 233 | fail: |
234 | edac_mc_free(mci); | 234 | edac_mc_free(mci); |
235 | return -ENODEV; | 235 | return -ENODEV; |
236 | } | 236 | } |
237 | 237 | ||
238 | /* returns count (>= 0), or negative on error */ | 238 | /* returns count (>= 0), or negative on error */ |
239 | static int __devinit i82860_init_one(struct pci_dev *pdev, | 239 | static int __devinit i82860_init_one(struct pci_dev *pdev, |
240 | const struct pci_device_id *ent) | 240 | const struct pci_device_id *ent) |
241 | { | 241 | { |
242 | int rc; | 242 | int rc; |
243 | 243 | ||
@@ -299,7 +299,7 @@ static int __init i82860_init(void) | |||
299 | 299 | ||
300 | if (!mci_pdev) { | 300 | if (!mci_pdev) { |
301 | mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 301 | mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
302 | PCI_DEVICE_ID_INTEL_82860_0, NULL); | 302 | PCI_DEVICE_ID_INTEL_82860_0, NULL); |
303 | 303 | ||
304 | if (mci_pdev == NULL) { | 304 | if (mci_pdev == NULL) { |
305 | debugf0("860 pci_get_device fail\n"); | 305 | debugf0("860 pci_get_device fail\n"); |
@@ -318,10 +318,10 @@ static int __init i82860_init(void) | |||
318 | 318 | ||
319 | return 0; | 319 | return 0; |
320 | 320 | ||
321 | fail1: | 321 | fail1: |
322 | pci_unregister_driver(&i82860_driver); | 322 | pci_unregister_driver(&i82860_driver); |
323 | 323 | ||
324 | fail0: | 324 | fail0: |
325 | if (mci_pdev != NULL) | 325 | if (mci_pdev != NULL) |
326 | pci_dev_put(mci_pdev); | 326 | pci_dev_put(mci_pdev); |
327 | 327 | ||
@@ -343,5 +343,5 @@ module_exit(i82860_exit); | |||
343 | 343 | ||
344 | MODULE_LICENSE("GPL"); | 344 | MODULE_LICENSE("GPL"); |
345 | MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com) " | 345 | MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com) " |
346 | "Ben Woodard <woodard@redhat.com>"); | 346 | "Ben Woodard <woodard@redhat.com>"); |
347 | MODULE_DESCRIPTION("ECC support for Intel 82860 memory hub controllers"); | 347 | MODULE_DESCRIPTION("ECC support for Intel 82860 memory hub controllers"); |
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c index 214112b5e52a..c9aed70fec8e 100644 --- a/drivers/edac/i82875p_edac.c +++ b/drivers/edac/i82875p_edac.c | |||
@@ -174,7 +174,7 @@ struct i82875p_error_info { | |||
174 | 174 | ||
175 | static const struct i82875p_dev_info i82875p_devs[] = { | 175 | static const struct i82875p_dev_info i82875p_devs[] = { |
176 | [I82875P] = { | 176 | [I82875P] = { |
177 | .ctl_name = "i82875p"}, | 177 | .ctl_name = "i82875p"}, |
178 | }; | 178 | }; |
179 | 179 | ||
180 | static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code has | 180 | static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code has |
@@ -186,7 +186,7 @@ static int i82875p_registered = 1; | |||
186 | static struct edac_pci_ctl_info *i82875p_pci; | 186 | static struct edac_pci_ctl_info *i82875p_pci; |
187 | 187 | ||
188 | static void i82875p_get_error_info(struct mem_ctl_info *mci, | 188 | static void i82875p_get_error_info(struct mem_ctl_info *mci, |
189 | struct i82875p_error_info *info) | 189 | struct i82875p_error_info *info) |
190 | { | 190 | { |
191 | struct pci_dev *pdev; | 191 | struct pci_dev *pdev; |
192 | 192 | ||
@@ -222,8 +222,8 @@ static void i82875p_get_error_info(struct mem_ctl_info *mci, | |||
222 | } | 222 | } |
223 | 223 | ||
224 | static int i82875p_process_error_info(struct mem_ctl_info *mci, | 224 | static int i82875p_process_error_info(struct mem_ctl_info *mci, |
225 | struct i82875p_error_info *info, | 225 | struct i82875p_error_info *info, |
226 | int handle_errors) | 226 | int handle_errors) |
227 | { | 227 | { |
228 | int row, multi_chan; | 228 | int row, multi_chan; |
229 | 229 | ||
@@ -247,8 +247,8 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci, | |||
247 | edac_mc_handle_ue(mci, info->eap, 0, row, "i82875p UE"); | 247 | edac_mc_handle_ue(mci, info->eap, 0, row, "i82875p UE"); |
248 | else | 248 | else |
249 | edac_mc_handle_ce(mci, info->eap, 0, info->derrsyn, row, | 249 | edac_mc_handle_ce(mci, info->eap, 0, info->derrsyn, row, |
250 | multi_chan ? (info->des & 0x1) : 0, | 250 | multi_chan ? (info->des & 0x1) : 0, |
251 | "i82875p CE"); | 251 | "i82875p CE"); |
252 | 252 | ||
253 | return 1; | 253 | return 1; |
254 | } | 254 | } |
@@ -264,8 +264,8 @@ static void i82875p_check(struct mem_ctl_info *mci) | |||
264 | 264 | ||
265 | /* Return 0 on success or 1 on failure. */ | 265 | /* Return 0 on success or 1 on failure. */ |
266 | static int i82875p_setup_overfl_dev(struct pci_dev *pdev, | 266 | static int i82875p_setup_overfl_dev(struct pci_dev *pdev, |
267 | struct pci_dev **ovrfl_pdev, | 267 | struct pci_dev **ovrfl_pdev, |
268 | void __iomem ** ovrfl_window) | 268 | void __iomem **ovrfl_window) |
269 | { | 269 | { |
270 | struct pci_dev *dev; | 270 | struct pci_dev *dev; |
271 | void __iomem *window; | 271 | void __iomem *window; |
@@ -293,7 +293,7 @@ static int i82875p_setup_overfl_dev(struct pci_dev *pdev, | |||
293 | 293 | ||
294 | if (pci_enable_device(dev)) { | 294 | if (pci_enable_device(dev)) { |
295 | i82875p_printk(KERN_ERR, "%s(): Failed to enable overflow " | 295 | i82875p_printk(KERN_ERR, "%s(): Failed to enable overflow " |
296 | "device\n", __func__); | 296 | "device\n", __func__); |
297 | return 1; | 297 | return 1; |
298 | } | 298 | } |
299 | 299 | ||
@@ -309,18 +309,18 @@ static int i82875p_setup_overfl_dev(struct pci_dev *pdev, | |||
309 | 309 | ||
310 | if (window == NULL) { | 310 | if (window == NULL) { |
311 | i82875p_printk(KERN_ERR, "%s(): Failed to ioremap bar6\n", | 311 | i82875p_printk(KERN_ERR, "%s(): Failed to ioremap bar6\n", |
312 | __func__); | 312 | __func__); |
313 | goto fail1; | 313 | goto fail1; |
314 | } | 314 | } |
315 | 315 | ||
316 | *ovrfl_window = window; | 316 | *ovrfl_window = window; |
317 | return 0; | 317 | return 0; |
318 | 318 | ||
319 | fail1: | 319 | fail1: |
320 | pci_release_regions(dev); | 320 | pci_release_regions(dev); |
321 | 321 | ||
322 | #ifdef CORRECT_BIOS | 322 | #ifdef CORRECT_BIOS |
323 | fail0: | 323 | fail0: |
324 | pci_disable_device(dev); | 324 | pci_disable_device(dev); |
325 | #endif | 325 | #endif |
326 | /* NOTE: the ovrfl proc entry and pci_dev are intentionally left */ | 326 | /* NOTE: the ovrfl proc entry and pci_dev are intentionally left */ |
@@ -393,7 +393,7 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
393 | drc = readl(ovrfl_window + I82875P_DRC); | 393 | drc = readl(ovrfl_window + I82875P_DRC); |
394 | nr_chans = dual_channel_active(drc) + 1; | 394 | nr_chans = dual_channel_active(drc) + 1; |
395 | mci = edac_mc_alloc(sizeof(*pvt), I82875P_NR_CSROWS(nr_chans), | 395 | mci = edac_mc_alloc(sizeof(*pvt), I82875P_NR_CSROWS(nr_chans), |
396 | nr_chans); | 396 | nr_chans); |
397 | 397 | ||
398 | if (!mci) { | 398 | if (!mci) { |
399 | rc = -ENOMEM; | 399 | rc = -ENOMEM; |
@@ -441,10 +441,10 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
441 | debugf3("%s(): success\n", __func__); | 441 | debugf3("%s(): success\n", __func__); |
442 | return 0; | 442 | return 0; |
443 | 443 | ||
444 | fail1: | 444 | fail1: |
445 | edac_mc_free(mci); | 445 | edac_mc_free(mci); |
446 | 446 | ||
447 | fail0: | 447 | fail0: |
448 | iounmap(ovrfl_window); | 448 | iounmap(ovrfl_window); |
449 | pci_release_regions(ovrfl_pdev); | 449 | pci_release_regions(ovrfl_pdev); |
450 | 450 | ||
@@ -455,7 +455,7 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
455 | 455 | ||
456 | /* returns count (>= 0), or negative on error */ | 456 | /* returns count (>= 0), or negative on error */ |
457 | static int __devinit i82875p_init_one(struct pci_dev *pdev, | 457 | static int __devinit i82875p_init_one(struct pci_dev *pdev, |
458 | const struct pci_device_id *ent) | 458 | const struct pci_device_id *ent) |
459 | { | 459 | { |
460 | int rc; | 460 | int rc; |
461 | 461 | ||
@@ -532,7 +532,7 @@ static int __init i82875p_init(void) | |||
532 | 532 | ||
533 | if (mci_pdev == NULL) { | 533 | if (mci_pdev == NULL) { |
534 | mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 534 | mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
535 | PCI_DEVICE_ID_INTEL_82875_0, NULL); | 535 | PCI_DEVICE_ID_INTEL_82875_0, NULL); |
536 | 536 | ||
537 | if (!mci_pdev) { | 537 | if (!mci_pdev) { |
538 | debugf0("875p pci_get_device fail\n"); | 538 | debugf0("875p pci_get_device fail\n"); |
@@ -551,10 +551,10 @@ static int __init i82875p_init(void) | |||
551 | 551 | ||
552 | return 0; | 552 | return 0; |
553 | 553 | ||
554 | fail1: | 554 | fail1: |
555 | pci_unregister_driver(&i82875p_driver); | 555 | pci_unregister_driver(&i82875p_driver); |
556 | 556 | ||
557 | fail0: | 557 | fail0: |
558 | if (mci_pdev != NULL) | 558 | if (mci_pdev != NULL) |
559 | pci_dev_put(mci_pdev); | 559 | pci_dev_put(mci_pdev); |
560 | 560 | ||
diff --git a/drivers/edac/r82600_edac.c b/drivers/edac/r82600_edac.c index 8097f2faaa8c..0a971ebdccec 100644 --- a/drivers/edac/r82600_edac.c +++ b/drivers/edac/r82600_edac.c | |||
@@ -136,7 +136,7 @@ static unsigned int disable_hardware_scrub = 0; | |||
136 | static struct edac_pci_ctl_info *r82600_pci; | 136 | static struct edac_pci_ctl_info *r82600_pci; |
137 | 137 | ||
138 | static void r82600_get_error_info(struct mem_ctl_info *mci, | 138 | static void r82600_get_error_info(struct mem_ctl_info *mci, |
139 | struct r82600_error_info *info) | 139 | struct r82600_error_info *info) |
140 | { | 140 | { |
141 | struct pci_dev *pdev; | 141 | struct pci_dev *pdev; |
142 | 142 | ||
@@ -157,8 +157,8 @@ static void r82600_get_error_info(struct mem_ctl_info *mci, | |||
157 | } | 157 | } |
158 | 158 | ||
159 | static int r82600_process_error_info(struct mem_ctl_info *mci, | 159 | static int r82600_process_error_info(struct mem_ctl_info *mci, |
160 | struct r82600_error_info *info, | 160 | struct r82600_error_info *info, |
161 | int handle_errors) | 161 | int handle_errors) |
162 | { | 162 | { |
163 | int error_found; | 163 | int error_found; |
164 | u32 eapaddr, page; | 164 | u32 eapaddr, page; |
@@ -180,8 +180,9 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, | |||
180 | 180 | ||
181 | if (handle_errors) | 181 | if (handle_errors) |
182 | edac_mc_handle_ce(mci, page, 0, /* not avail */ | 182 | edac_mc_handle_ce(mci, page, 0, /* not avail */ |
183 | syndrome, edac_mc_find_csrow_by_page(mci, page), 0, /* channel */ | 183 | syndrome, |
184 | mci->ctl_name); | 184 | edac_mc_find_csrow_by_page(mci, page), |
185 | 0, mci->ctl_name); | ||
185 | } | 186 | } |
186 | 187 | ||
187 | if (info->eapr & BIT(1)) { /* UE? */ | 188 | if (info->eapr & BIT(1)) { /* UE? */ |
@@ -190,8 +191,8 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, | |||
190 | if (handle_errors) | 191 | if (handle_errors) |
191 | /* 82600 doesn't give enough info */ | 192 | /* 82600 doesn't give enough info */ |
192 | edac_mc_handle_ue(mci, page, 0, | 193 | edac_mc_handle_ue(mci, page, 0, |
193 | edac_mc_find_csrow_by_page(mci, page), | 194 | edac_mc_find_csrow_by_page(mci, page), |
194 | mci->ctl_name); | 195 | mci->ctl_name); |
195 | } | 196 | } |
196 | 197 | ||
197 | return error_found; | 198 | return error_found; |
@@ -212,7 +213,7 @@ static inline int ecc_enabled(u8 dramcr) | |||
212 | } | 213 | } |
213 | 214 | ||
214 | static void r82600_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | 215 | static void r82600_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, |
215 | u8 dramcr) | 216 | u8 dramcr) |
216 | { | 217 | { |
217 | struct csrow_info *csrow; | 218 | struct csrow_info *csrow; |
218 | int index; | 219 | int index; |
@@ -342,14 +343,14 @@ static int r82600_probe1(struct pci_dev *pdev, int dev_idx) | |||
342 | debugf3("%s(): success\n", __func__); | 343 | debugf3("%s(): success\n", __func__); |
343 | return 0; | 344 | return 0; |
344 | 345 | ||
345 | fail: | 346 | fail: |
346 | edac_mc_free(mci); | 347 | edac_mc_free(mci); |
347 | return -ENODEV; | 348 | return -ENODEV; |
348 | } | 349 | } |
349 | 350 | ||
350 | /* returns count (>= 0), or negative on error */ | 351 | /* returns count (>= 0), or negative on error */ |
351 | static int __devinit r82600_init_one(struct pci_dev *pdev, | 352 | static int __devinit r82600_init_one(struct pci_dev *pdev, |
352 | const struct pci_device_id *ent) | 353 | const struct pci_device_id *ent) |
353 | { | 354 | { |
354 | debugf0("%s()\n", __func__); | 355 | debugf0("%s()\n", __func__); |
355 | 356 | ||
@@ -405,7 +406,7 @@ module_exit(r82600_exit); | |||
405 | 406 | ||
406 | MODULE_LICENSE("GPL"); | 407 | MODULE_LICENSE("GPL"); |
407 | MODULE_AUTHOR("Tim Small <tim@buttersideup.com> - WPAD Ltd. " | 408 | MODULE_AUTHOR("Tim Small <tim@buttersideup.com> - WPAD Ltd. " |
408 | "on behalf of EADS Astrium"); | 409 | "on behalf of EADS Astrium"); |
409 | MODULE_DESCRIPTION("MC support for Radisys 82600 memory controllers"); | 410 | MODULE_DESCRIPTION("MC support for Radisys 82600 memory controllers"); |
410 | 411 | ||
411 | module_param(disable_hardware_scrub, bool, 0644); | 412 | module_param(disable_hardware_scrub, bool, 0644); |