mpc85xx_edac.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043
  1. /*
  2. * Freescale MPC85xx Memory Controller kenel module
  3. *
  4. * Author: Dave Jiang <djiang@mvista.com>
  5. *
  6. * 2006-2007 (c) MontaVista Software, Inc. This file is licensed under
  7. * the terms of the GNU General Public License version 2. This program
  8. * is licensed "as is" without any warranty of any kind, whether express
  9. * or implied.
  10. *
  11. */
  12. #include <linux/module.h>
  13. #include <linux/init.h>
  14. #include <linux/slab.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/ctype.h>
  17. #include <linux/io.h>
  18. #include <linux/mod_devicetable.h>
  19. #include <linux/edac.h>
  20. #include <linux/of_platform.h>
  21. #include <linux/of_device.h>
  22. #include <asm/mpc85xx.h>
  23. #include "edac_module.h"
  24. #include "edac_core.h"
  25. #include "mpc85xx_edac.h"
  26. static int edac_dev_idx;
  27. static int edac_pci_idx;
  28. static int edac_mc_idx;
  29. static u32 orig_ddr_err_disable;
  30. static u32 orig_ddr_err_sbe;
  31. /*
  32. * PCI Err defines
  33. */
  34. #ifdef CONFIG_PCI
  35. static u32 orig_pci_err_cap_dr;
  36. static u32 orig_pci_err_en;
  37. #endif
  38. static u32 orig_l2_err_disable;
  39. static u32 orig_hid1;
  40. static const char *mpc85xx_ctl_name = "MPC85xx";
  41. /************************ MC SYSFS parts ***********************************/
  42. static ssize_t mpc85xx_mc_inject_data_hi_show(struct mem_ctl_info *mci,
  43. char *data)
  44. {
  45. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  46. return sprintf(data, "0x%08x",
  47. in_be32(pdata->mc_vbase +
  48. MPC85XX_MC_DATA_ERR_INJECT_HI));
  49. }
  50. static ssize_t mpc85xx_mc_inject_data_lo_show(struct mem_ctl_info *mci,
  51. char *data)
  52. {
  53. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  54. return sprintf(data, "0x%08x",
  55. in_be32(pdata->mc_vbase +
  56. MPC85XX_MC_DATA_ERR_INJECT_LO));
  57. }
  58. static ssize_t mpc85xx_mc_inject_ctrl_show(struct mem_ctl_info *mci, char *data)
  59. {
  60. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  61. return sprintf(data, "0x%08x",
  62. in_be32(pdata->mc_vbase + MPC85XX_MC_ECC_ERR_INJECT));
  63. }
  64. static ssize_t mpc85xx_mc_inject_data_hi_store(struct mem_ctl_info *mci,
  65. const char *data, size_t count)
  66. {
  67. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  68. if (isdigit(*data)) {
  69. out_be32(pdata->mc_vbase + MPC85XX_MC_DATA_ERR_INJECT_HI,
  70. simple_strtoul(data, NULL, 0));
  71. return count;
  72. }
  73. return 0;
  74. }
  75. static ssize_t mpc85xx_mc_inject_data_lo_store(struct mem_ctl_info *mci,
  76. const char *data, size_t count)
  77. {
  78. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  79. if (isdigit(*data)) {
  80. out_be32(pdata->mc_vbase + MPC85XX_MC_DATA_ERR_INJECT_LO,
  81. simple_strtoul(data, NULL, 0));
  82. return count;
  83. }
  84. return 0;
  85. }
  86. static ssize_t mpc85xx_mc_inject_ctrl_store(struct mem_ctl_info *mci,
  87. const char *data, size_t count)
  88. {
  89. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  90. if (isdigit(*data)) {
  91. out_be32(pdata->mc_vbase + MPC85XX_MC_ECC_ERR_INJECT,
  92. simple_strtoul(data, NULL, 0));
  93. return count;
  94. }
  95. return 0;
  96. }
  97. static struct mcidev_sysfs_attribute mpc85xx_mc_sysfs_attributes[] = {
  98. {
  99. .attr = {
  100. .name = "inject_data_hi",
  101. .mode = (S_IRUGO | S_IWUSR)
  102. },
  103. .show = mpc85xx_mc_inject_data_hi_show,
  104. .store = mpc85xx_mc_inject_data_hi_store},
  105. {
  106. .attr = {
  107. .name = "inject_data_lo",
  108. .mode = (S_IRUGO | S_IWUSR)
  109. },
  110. .show = mpc85xx_mc_inject_data_lo_show,
  111. .store = mpc85xx_mc_inject_data_lo_store},
  112. {
  113. .attr = {
  114. .name = "inject_ctrl",
  115. .mode = (S_IRUGO | S_IWUSR)
  116. },
  117. .show = mpc85xx_mc_inject_ctrl_show,
  118. .store = mpc85xx_mc_inject_ctrl_store},
  119. /* End of list */
  120. {
  121. .attr = {.name = NULL}
  122. }
  123. };
  124. static void mpc85xx_set_mc_sysfs_attributes(struct mem_ctl_info *mci)
  125. {
  126. mci->mc_driver_sysfs_attributes = mpc85xx_mc_sysfs_attributes;
  127. }
  128. /**************************** PCI Err device ***************************/
  129. #ifdef CONFIG_PCI
  130. static void mpc85xx_pci_check(struct edac_pci_ctl_info *pci)
  131. {
  132. struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
  133. u32 err_detect;
  134. err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR);
  135. /* master aborts can happen during PCI config cycles */
  136. if (!(err_detect & ~(PCI_EDE_MULTI_ERR | PCI_EDE_MST_ABRT))) {
  137. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect);
  138. return;
  139. }
  140. printk(KERN_ERR "PCI error(s) detected\n");
  141. printk(KERN_ERR "PCI/X ERR_DR register: %#08x\n", err_detect);
  142. printk(KERN_ERR "PCI/X ERR_ATTRIB register: %#08x\n",
  143. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ATTRIB));
  144. printk(KERN_ERR "PCI/X ERR_ADDR register: %#08x\n",
  145. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR));
  146. printk(KERN_ERR "PCI/X ERR_EXT_ADDR register: %#08x\n",
  147. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EXT_ADDR));
  148. printk(KERN_ERR "PCI/X ERR_DL register: %#08x\n",
  149. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DL));
  150. printk(KERN_ERR "PCI/X ERR_DH register: %#08x\n",
  151. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DH));
  152. /* clear error bits */
  153. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect);
  154. if (err_detect & PCI_EDE_PERR_MASK)
  155. edac_pci_handle_pe(pci, pci->ctl_name);
  156. if ((err_detect & ~PCI_EDE_MULTI_ERR) & ~PCI_EDE_PERR_MASK)
  157. edac_pci_handle_npe(pci, pci->ctl_name);
  158. }
  159. static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id)
  160. {
  161. struct edac_pci_ctl_info *pci = dev_id;
  162. struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
  163. u32 err_detect;
  164. err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR);
  165. if (!err_detect)
  166. return IRQ_NONE;
  167. mpc85xx_pci_check(pci);
  168. return IRQ_HANDLED;
  169. }
  170. static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev)
  171. {
  172. struct edac_pci_ctl_info *pci;
  173. struct mpc85xx_pci_pdata *pdata;
  174. struct resource *r;
  175. int res = 0;
  176. if (!devres_open_group(&pdev->dev, mpc85xx_pci_err_probe, GFP_KERNEL))
  177. return -ENOMEM;
  178. pci = edac_pci_alloc_ctl_info(sizeof(*pdata), "mpc85xx_pci_err");
  179. if (!pci)
  180. return -ENOMEM;
  181. pdata = pci->pvt_info;
  182. pdata->name = "mpc85xx_pci_err";
  183. pdata->irq = NO_IRQ;
  184. platform_set_drvdata(pdev, pci);
  185. pci->dev = &pdev->dev;
  186. pci->mod_name = EDAC_MOD_STR;
  187. pci->ctl_name = pdata->name;
  188. pci->dev_name = pdev->dev.bus_id;
  189. if (edac_op_state == EDAC_OPSTATE_POLL)
  190. pci->edac_check = mpc85xx_pci_check;
  191. pdata->edac_idx = edac_pci_idx++;
  192. r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  193. if (!r) {
  194. printk(KERN_ERR "%s: Unable to get resource for "
  195. "PCI err regs\n", __func__);
  196. goto err;
  197. }
  198. if (!devm_request_mem_region(&pdev->dev, r->start,
  199. r->end - r->start + 1, pdata->name)) {
  200. printk(KERN_ERR "%s: Error while requesting mem region\n",
  201. __func__);
  202. res = -EBUSY;
  203. goto err;
  204. }
  205. pdata->pci_vbase = devm_ioremap(&pdev->dev, r->start,
  206. r->end - r->start + 1);
  207. if (!pdata->pci_vbase) {
  208. printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__);
  209. res = -ENOMEM;
  210. goto err;
  211. }
  212. orig_pci_err_cap_dr =
  213. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR);
  214. /* PCI master abort is expected during config cycles */
  215. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR, 0x40);
  216. orig_pci_err_en = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN);
  217. /* disable master abort reporting */
  218. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, ~0x40);
  219. /* clear error bits */
  220. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, ~0);
  221. if (edac_pci_add_device(pci, pdata->edac_idx) > 0) {
  222. debugf3("%s(): failed edac_pci_add_device()\n", __func__);
  223. goto err;
  224. }
  225. if (edac_op_state == EDAC_OPSTATE_INT) {
  226. pdata->irq = platform_get_irq(pdev, 0);
  227. res = devm_request_irq(&pdev->dev, pdata->irq,
  228. mpc85xx_pci_isr, IRQF_DISABLED,
  229. "[EDAC] PCI err", pci);
  230. if (res < 0) {
  231. printk(KERN_ERR
  232. "%s: Unable to requiest irq %d for "
  233. "MPC85xx PCI err\n", __func__, pdata->irq);
  234. res = -ENODEV;
  235. goto err2;
  236. }
  237. printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for PCI Err\n",
  238. pdata->irq);
  239. }
  240. devres_remove_group(&pdev->dev, mpc85xx_pci_err_probe);
  241. debugf3("%s(): success\n", __func__);
  242. printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n");
  243. return 0;
  244. err2:
  245. edac_pci_del_device(&pdev->dev);
  246. err:
  247. edac_pci_free_ctl_info(pci);
  248. devres_release_group(&pdev->dev, mpc85xx_pci_err_probe);
  249. return res;
  250. }
  251. static int mpc85xx_pci_err_remove(struct platform_device *pdev)
  252. {
  253. struct edac_pci_ctl_info *pci = platform_get_drvdata(pdev);
  254. struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
  255. debugf0("%s()\n", __func__);
  256. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR,
  257. orig_pci_err_cap_dr);
  258. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, orig_pci_err_en);
  259. edac_pci_del_device(pci->dev);
  260. if (edac_op_state == EDAC_OPSTATE_INT)
  261. irq_dispose_mapping(pdata->irq);
  262. edac_pci_free_ctl_info(pci);
  263. return 0;
  264. }
  265. static struct platform_driver mpc85xx_pci_err_driver = {
  266. .probe = mpc85xx_pci_err_probe,
  267. .remove = __devexit_p(mpc85xx_pci_err_remove),
  268. .driver = {
  269. .name = "mpc85xx_pci_err",
  270. }
  271. };
  272. #endif /* CONFIG_PCI */
  273. /**************************** L2 Err device ***************************/
  274. /************************ L2 SYSFS parts ***********************************/
  275. static ssize_t mpc85xx_l2_inject_data_hi_show(struct edac_device_ctl_info
  276. *edac_dev, char *data)
  277. {
  278. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  279. return sprintf(data, "0x%08x",
  280. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJHI));
  281. }
  282. static ssize_t mpc85xx_l2_inject_data_lo_show(struct edac_device_ctl_info
  283. *edac_dev, char *data)
  284. {
  285. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  286. return sprintf(data, "0x%08x",
  287. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJLO));
  288. }
  289. static ssize_t mpc85xx_l2_inject_ctrl_show(struct edac_device_ctl_info
  290. *edac_dev, char *data)
  291. {
  292. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  293. return sprintf(data, "0x%08x",
  294. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJCTL));
  295. }
  296. static ssize_t mpc85xx_l2_inject_data_hi_store(struct edac_device_ctl_info
  297. *edac_dev, const char *data,
  298. size_t count)
  299. {
  300. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  301. if (isdigit(*data)) {
  302. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJHI,
  303. simple_strtoul(data, NULL, 0));
  304. return count;
  305. }
  306. return 0;
  307. }
  308. static ssize_t mpc85xx_l2_inject_data_lo_store(struct edac_device_ctl_info
  309. *edac_dev, const char *data,
  310. size_t count)
  311. {
  312. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  313. if (isdigit(*data)) {
  314. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJLO,
  315. simple_strtoul(data, NULL, 0));
  316. return count;
  317. }
  318. return 0;
  319. }
  320. static ssize_t mpc85xx_l2_inject_ctrl_store(struct edac_device_ctl_info
  321. *edac_dev, const char *data,
  322. size_t count)
  323. {
  324. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  325. if (isdigit(*data)) {
  326. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJCTL,
  327. simple_strtoul(data, NULL, 0));
  328. return count;
  329. }
  330. return 0;
  331. }
  332. static struct edac_dev_sysfs_attribute mpc85xx_l2_sysfs_attributes[] = {
  333. {
  334. .attr = {
  335. .name = "inject_data_hi",
  336. .mode = (S_IRUGO | S_IWUSR)
  337. },
  338. .show = mpc85xx_l2_inject_data_hi_show,
  339. .store = mpc85xx_l2_inject_data_hi_store},
  340. {
  341. .attr = {
  342. .name = "inject_data_lo",
  343. .mode = (S_IRUGO | S_IWUSR)
  344. },
  345. .show = mpc85xx_l2_inject_data_lo_show,
  346. .store = mpc85xx_l2_inject_data_lo_store},
  347. {
  348. .attr = {
  349. .name = "inject_ctrl",
  350. .mode = (S_IRUGO | S_IWUSR)
  351. },
  352. .show = mpc85xx_l2_inject_ctrl_show,
  353. .store = mpc85xx_l2_inject_ctrl_store},
  354. /* End of list */
  355. {
  356. .attr = {.name = NULL}
  357. }
  358. };
  359. static void mpc85xx_set_l2_sysfs_attributes(struct edac_device_ctl_info
  360. *edac_dev)
  361. {
  362. edac_dev->sysfs_attributes = mpc85xx_l2_sysfs_attributes;
  363. }
  364. /***************************** L2 ops ***********************************/
  365. static void mpc85xx_l2_check(struct edac_device_ctl_info *edac_dev)
  366. {
  367. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  368. u32 err_detect;
  369. err_detect = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET);
  370. if (!(err_detect & L2_EDE_MASK))
  371. return;
  372. printk(KERN_ERR "ECC Error in CPU L2 cache\n");
  373. printk(KERN_ERR "L2 Error Detect Register: 0x%08x\n", err_detect);
  374. printk(KERN_ERR "L2 Error Capture Data High Register: 0x%08x\n",
  375. in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTDATAHI));
  376. printk(KERN_ERR "L2 Error Capture Data Lo Register: 0x%08x\n",
  377. in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTDATALO));
  378. printk(KERN_ERR "L2 Error Syndrome Register: 0x%08x\n",
  379. in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTECC));
  380. printk(KERN_ERR "L2 Error Attributes Capture Register: 0x%08x\n",
  381. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRATTR));
  382. printk(KERN_ERR "L2 Error Address Capture Register: 0x%08x\n",
  383. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRADDR));
  384. /* clear error detect register */
  385. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET, err_detect);
  386. if (err_detect & L2_EDE_CE_MASK)
  387. edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
  388. if (err_detect & L2_EDE_UE_MASK)
  389. edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
  390. }
  391. static irqreturn_t mpc85xx_l2_isr(int irq, void *dev_id)
  392. {
  393. struct edac_device_ctl_info *edac_dev = dev_id;
  394. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  395. u32 err_detect;
  396. err_detect = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET);
  397. if (!(err_detect & L2_EDE_MASK))
  398. return IRQ_NONE;
  399. mpc85xx_l2_check(edac_dev);
  400. return IRQ_HANDLED;
  401. }
  402. static int __devinit mpc85xx_l2_err_probe(struct of_device *op,
  403. const struct of_device_id *match)
  404. {
  405. struct edac_device_ctl_info *edac_dev;
  406. struct mpc85xx_l2_pdata *pdata;
  407. struct resource r;
  408. int res;
  409. if (!devres_open_group(&op->dev, mpc85xx_l2_err_probe, GFP_KERNEL))
  410. return -ENOMEM;
  411. edac_dev = edac_device_alloc_ctl_info(sizeof(*pdata),
  412. "cpu", 1, "L", 1, 2, NULL, 0,
  413. edac_dev_idx);
  414. if (!edac_dev) {
  415. devres_release_group(&op->dev, mpc85xx_l2_err_probe);
  416. return -ENOMEM;
  417. }
  418. pdata = edac_dev->pvt_info;
  419. pdata->name = "mpc85xx_l2_err";
  420. pdata->irq = NO_IRQ;
  421. edac_dev->dev = &op->dev;
  422. dev_set_drvdata(edac_dev->dev, edac_dev);
  423. edac_dev->ctl_name = pdata->name;
  424. edac_dev->dev_name = pdata->name;
  425. res = of_address_to_resource(op->node, 0, &r);
  426. if (res) {
  427. printk(KERN_ERR "%s: Unable to get resource for "
  428. "L2 err regs\n", __func__);
  429. goto err;
  430. }
  431. /* we only need the error registers */
  432. r.start += 0xe00;
  433. if (!devm_request_mem_region(&op->dev, r.start,
  434. r.end - r.start + 1, pdata->name)) {
  435. printk(KERN_ERR "%s: Error while requesting mem region\n",
  436. __func__);
  437. res = -EBUSY;
  438. goto err;
  439. }
  440. pdata->l2_vbase = devm_ioremap(&op->dev, r.start, r.end - r.start + 1);
  441. if (!pdata->l2_vbase) {
  442. printk(KERN_ERR "%s: Unable to setup L2 err regs\n", __func__);
  443. res = -ENOMEM;
  444. goto err;
  445. }
  446. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET, ~0);
  447. orig_l2_err_disable = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS);
  448. /* clear the err_dis */
  449. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS, 0);
  450. edac_dev->mod_name = EDAC_MOD_STR;
  451. if (edac_op_state == EDAC_OPSTATE_POLL)
  452. edac_dev->edac_check = mpc85xx_l2_check;
  453. mpc85xx_set_l2_sysfs_attributes(edac_dev);
  454. pdata->edac_idx = edac_dev_idx++;
  455. if (edac_device_add_device(edac_dev) > 0) {
  456. debugf3("%s(): failed edac_device_add_device()\n", __func__);
  457. goto err;
  458. }
  459. if (edac_op_state == EDAC_OPSTATE_INT) {
  460. pdata->irq = irq_of_parse_and_map(op->node, 0);
  461. res = devm_request_irq(&op->dev, pdata->irq,
  462. mpc85xx_l2_isr, IRQF_DISABLED,
  463. "[EDAC] L2 err", edac_dev);
  464. if (res < 0) {
  465. printk(KERN_ERR
  466. "%s: Unable to requiest irq %d for "
  467. "MPC85xx L2 err\n", __func__, pdata->irq);
  468. irq_dispose_mapping(pdata->irq);
  469. res = -ENODEV;
  470. goto err2;
  471. }
  472. printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for L2 Err\n",
  473. pdata->irq);
  474. edac_dev->op_state = OP_RUNNING_INTERRUPT;
  475. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINTEN, L2_EIE_MASK);
  476. }
  477. devres_remove_group(&op->dev, mpc85xx_l2_err_probe);
  478. debugf3("%s(): success\n", __func__);
  479. printk(KERN_INFO EDAC_MOD_STR " L2 err registered\n");
  480. return 0;
  481. err2:
  482. edac_device_del_device(&op->dev);
  483. err:
  484. devres_release_group(&op->dev, mpc85xx_l2_err_probe);
  485. edac_device_free_ctl_info(edac_dev);
  486. return res;
  487. }
  488. static int mpc85xx_l2_err_remove(struct of_device *op)
  489. {
  490. struct edac_device_ctl_info *edac_dev = dev_get_drvdata(&op->dev);
  491. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  492. debugf0("%s()\n", __func__);
  493. if (edac_op_state == EDAC_OPSTATE_INT) {
  494. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINTEN, 0);
  495. irq_dispose_mapping(pdata->irq);
  496. }
  497. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS, orig_l2_err_disable);
  498. edac_device_del_device(&op->dev);
  499. edac_device_free_ctl_info(edac_dev);
  500. return 0;
  501. }
  502. static struct of_device_id mpc85xx_l2_err_of_match[] = {
  503. {
  504. .compatible = "fsl,8540-l2-cache-controller",
  505. },
  506. {
  507. .compatible = "fsl,8541-l2-cache-controller",
  508. },
  509. {
  510. .compatible = "fsl,8544-l2-cache-controller",
  511. },
  512. {
  513. .compatible = "fsl,8548-l2-cache-controller",
  514. },
  515. {
  516. .compatible = "fsl,8555-l2-cache-controller",
  517. },
  518. {
  519. .compatible = "fsl,8568-l2-cache-controller",
  520. },
  521. {},
  522. };
  523. static struct of_platform_driver mpc85xx_l2_err_driver = {
  524. .owner = THIS_MODULE,
  525. .name = "mpc85xx_l2_err",
  526. .match_table = mpc85xx_l2_err_of_match,
  527. .probe = mpc85xx_l2_err_probe,
  528. .remove = mpc85xx_l2_err_remove,
  529. .driver = {
  530. .name = "mpc85xx_l2_err",
  531. .owner = THIS_MODULE,
  532. },
  533. };
  534. /**************************** MC Err device ***************************/
  535. static void mpc85xx_mc_check(struct mem_ctl_info *mci)
  536. {
  537. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  538. struct csrow_info *csrow;
  539. u32 err_detect;
  540. u32 syndrome;
  541. u32 err_addr;
  542. u32 pfn;
  543. int row_index;
  544. err_detect = in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT);
  545. if (err_detect)
  546. return;
  547. mpc85xx_mc_printk(mci, KERN_ERR, "Err Detect Register: %#8.8x\n",
  548. err_detect);
  549. /* no more processing if not ECC bit errors */
  550. if (!(err_detect & (DDR_EDE_SBE | DDR_EDE_MBE))) {
  551. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect);
  552. return;
  553. }
  554. syndrome = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ECC);
  555. err_addr = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ADDRESS);
  556. pfn = err_addr >> PAGE_SHIFT;
  557. for (row_index = 0; row_index < mci->nr_csrows; row_index++) {
  558. csrow = &mci->csrows[row_index];
  559. if ((pfn >= csrow->first_page) && (pfn <= csrow->last_page))
  560. break;
  561. }
  562. mpc85xx_mc_printk(mci, KERN_ERR, "Capture Data High: %#8.8x\n",
  563. in_be32(pdata->mc_vbase +
  564. MPC85XX_MC_CAPTURE_DATA_HI));
  565. mpc85xx_mc_printk(mci, KERN_ERR, "Capture Data Low: %#8.8x\n",
  566. in_be32(pdata->mc_vbase +
  567. MPC85XX_MC_CAPTURE_DATA_LO));
  568. mpc85xx_mc_printk(mci, KERN_ERR, "syndrome: %#8.8x\n", syndrome);
  569. mpc85xx_mc_printk(mci, KERN_ERR, "err addr: %#8.8x\n", err_addr);
  570. mpc85xx_mc_printk(mci, KERN_ERR, "PFN: %#8.8x\n", pfn);
  571. /* we are out of range */
  572. if (row_index == mci->nr_csrows)
  573. mpc85xx_mc_printk(mci, KERN_ERR, "PFN out of range!\n");
  574. if (err_detect & DDR_EDE_SBE)
  575. edac_mc_handle_ce(mci, pfn, err_addr & PAGE_MASK,
  576. syndrome, row_index, 0, mci->ctl_name);
  577. if (err_detect & DDR_EDE_MBE)
  578. edac_mc_handle_ue(mci, pfn, err_addr & PAGE_MASK,
  579. row_index, mci->ctl_name);
  580. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect);
  581. }
  582. static irqreturn_t mpc85xx_mc_isr(int irq, void *dev_id)
  583. {
  584. struct mem_ctl_info *mci = dev_id;
  585. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  586. u32 err_detect;
  587. err_detect = in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT);
  588. if (!err_detect)
  589. return IRQ_NONE;
  590. mpc85xx_mc_check(mci);
  591. return IRQ_HANDLED;
  592. }
  593. static void __devinit mpc85xx_init_csrows(struct mem_ctl_info *mci)
  594. {
  595. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  596. struct csrow_info *csrow;
  597. u32 sdram_ctl;
  598. u32 sdtype;
  599. enum mem_type mtype;
  600. u32 cs_bnds;
  601. int index;
  602. sdram_ctl = in_be32(pdata->mc_vbase + MPC85XX_MC_DDR_SDRAM_CFG);
  603. sdtype = sdram_ctl & DSC_SDTYPE_MASK;
  604. if (sdram_ctl & DSC_RD_EN) {
  605. switch (sdtype) {
  606. case DSC_SDTYPE_DDR:
  607. mtype = MEM_RDDR;
  608. break;
  609. case DSC_SDTYPE_DDR2:
  610. mtype = MEM_RDDR2;
  611. break;
  612. default:
  613. mtype = MEM_UNKNOWN;
  614. break;
  615. }
  616. } else {
  617. switch (sdtype) {
  618. case DSC_SDTYPE_DDR:
  619. mtype = MEM_DDR;
  620. break;
  621. case DSC_SDTYPE_DDR2:
  622. mtype = MEM_DDR2;
  623. break;
  624. default:
  625. mtype = MEM_UNKNOWN;
  626. break;
  627. }
  628. }
  629. for (index = 0; index < mci->nr_csrows; index++) {
  630. u32 start;
  631. u32 end;
  632. csrow = &mci->csrows[index];
  633. cs_bnds = in_be32(pdata->mc_vbase + MPC85XX_MC_CS_BNDS_0 +
  634. (index * MPC85XX_MC_CS_BNDS_OFS));
  635. start = (cs_bnds & 0xfff0000) << 4;
  636. end = ((cs_bnds & 0xfff) << 20);
  637. if (start)
  638. start |= 0xfffff;
  639. if (end)
  640. end |= 0xfffff;
  641. if (start == end)
  642. continue; /* not populated */
  643. csrow->first_page = start >> PAGE_SHIFT;
  644. csrow->last_page = end >> PAGE_SHIFT;
  645. csrow->nr_pages = csrow->last_page + 1 - csrow->first_page;
  646. csrow->grain = 8;
  647. csrow->mtype = mtype;
  648. csrow->dtype = DEV_UNKNOWN;
  649. if (sdram_ctl & DSC_X32_EN)
  650. csrow->dtype = DEV_X32;
  651. csrow->edac_mode = EDAC_SECDED;
  652. }
  653. }
  654. static int __devinit mpc85xx_mc_err_probe(struct of_device *op,
  655. const struct of_device_id *match)
  656. {
  657. struct mem_ctl_info *mci;
  658. struct mpc85xx_mc_pdata *pdata;
  659. struct resource r;
  660. u32 sdram_ctl;
  661. int res;
  662. if (!devres_open_group(&op->dev, mpc85xx_mc_err_probe, GFP_KERNEL))
  663. return -ENOMEM;
  664. mci = edac_mc_alloc(sizeof(*pdata), 4, 1, edac_mc_idx);
  665. if (!mci) {
  666. devres_release_group(&op->dev, mpc85xx_mc_err_probe);
  667. return -ENOMEM;
  668. }
  669. pdata = mci->pvt_info;
  670. pdata->name = "mpc85xx_mc_err";
  671. pdata->irq = NO_IRQ;
  672. mci->dev = &op->dev;
  673. pdata->edac_idx = edac_mc_idx++;
  674. dev_set_drvdata(mci->dev, mci);
  675. mci->ctl_name = pdata->name;
  676. mci->dev_name = pdata->name;
  677. res = of_address_to_resource(op->node, 0, &r);
  678. if (res) {
  679. printk(KERN_ERR "%s: Unable to get resource for MC err regs\n",
  680. __func__);
  681. goto err;
  682. }
  683. if (!devm_request_mem_region(&op->dev, r.start,
  684. r.end - r.start + 1, pdata->name)) {
  685. printk(KERN_ERR "%s: Error while requesting mem region\n",
  686. __func__);
  687. res = -EBUSY;
  688. goto err;
  689. }
  690. pdata->mc_vbase = devm_ioremap(&op->dev, r.start, r.end - r.start + 1);
  691. if (!pdata->mc_vbase) {
  692. printk(KERN_ERR "%s: Unable to setup MC err regs\n", __func__);
  693. res = -ENOMEM;
  694. goto err;
  695. }
  696. sdram_ctl = in_be32(pdata->mc_vbase + MPC85XX_MC_DDR_SDRAM_CFG);
  697. if (!(sdram_ctl & DSC_ECC_EN)) {
  698. /* no ECC */
  699. printk(KERN_WARNING "%s: No ECC DIMMs discovered\n", __func__);
  700. res = -ENODEV;
  701. goto err;
  702. }
  703. debugf3("%s(): init mci\n", __func__);
  704. mci->mtype_cap = MEM_FLAG_RDDR | MEM_FLAG_RDDR2 |
  705. MEM_FLAG_DDR | MEM_FLAG_DDR2;
  706. mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
  707. mci->edac_cap = EDAC_FLAG_SECDED;
  708. mci->mod_name = EDAC_MOD_STR;
  709. mci->mod_ver = MPC85XX_REVISION;
  710. if (edac_op_state == EDAC_OPSTATE_POLL)
  711. mci->edac_check = mpc85xx_mc_check;
  712. mci->ctl_page_to_phys = NULL;
  713. mci->scrub_mode = SCRUB_SW_SRC;
  714. mpc85xx_set_mc_sysfs_attributes(mci);
  715. mpc85xx_init_csrows(mci);
  716. #ifdef CONFIG_EDAC_DEBUG
  717. edac_mc_register_mcidev_debug((struct attribute **)debug_attr);
  718. #endif
  719. /* store the original error disable bits */
  720. orig_ddr_err_disable =
  721. in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE);
  722. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE, 0);
  723. /* clear all error bits */
  724. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, ~0);
  725. if (edac_mc_add_mc(mci)) {
  726. debugf3("%s(): failed edac_mc_add_mc()\n", __func__);
  727. goto err;
  728. }
  729. if (edac_op_state == EDAC_OPSTATE_INT) {
  730. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_INT_EN,
  731. DDR_EIE_MBEE | DDR_EIE_SBEE);
  732. /* store the original error management threshold */
  733. orig_ddr_err_sbe = in_be32(pdata->mc_vbase +
  734. MPC85XX_MC_ERR_SBE) & 0xff0000;
  735. /* set threshold to 1 error per interrupt */
  736. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, 0x10000);
  737. /* register interrupts */
  738. pdata->irq = irq_of_parse_and_map(op->node, 0);
  739. res = devm_request_irq(&op->dev, pdata->irq,
  740. mpc85xx_mc_isr, IRQF_DISABLED,
  741. "[EDAC] MC err", mci);
  742. if (res < 0) {
  743. printk(KERN_ERR "%s: Unable to request irq %d for "
  744. "MPC85xx DRAM ERR\n", __func__, pdata->irq);
  745. irq_dispose_mapping(pdata->irq);
  746. res = -ENODEV;
  747. goto err2;
  748. }
  749. printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for MC\n",
  750. pdata->irq);
  751. }
  752. devres_remove_group(&op->dev, mpc85xx_mc_err_probe);
  753. debugf3("%s(): success\n", __func__);
  754. printk(KERN_INFO EDAC_MOD_STR " MC err registered\n");
  755. return 0;
  756. err2:
  757. edac_mc_del_mc(&op->dev);
  758. err:
  759. devres_release_group(&op->dev, mpc85xx_mc_err_probe);
  760. edac_mc_free(mci);
  761. return res;
  762. }
  763. static int mpc85xx_mc_err_remove(struct of_device *op)
  764. {
  765. struct mem_ctl_info *mci = dev_get_drvdata(&op->dev);
  766. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  767. debugf0("%s()\n", __func__);
  768. if (edac_op_state == EDAC_OPSTATE_INT) {
  769. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_INT_EN, 0);
  770. irq_dispose_mapping(pdata->irq);
  771. }
  772. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE,
  773. orig_ddr_err_disable);
  774. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, orig_ddr_err_sbe);
  775. edac_mc_del_mc(&op->dev);
  776. edac_mc_free(mci);
  777. return 0;
  778. }
  779. static struct of_device_id mpc85xx_mc_err_of_match[] = {
  780. {
  781. .compatible = "fsl,8540-memory-controller",
  782. },
  783. {
  784. .compatible = "fsl,8541-memory-controller",
  785. },
  786. {
  787. .compatible = "fsl,8544-memory-controller",
  788. },
  789. {
  790. .compatible = "fsl,8548-memory-controller",
  791. },
  792. {
  793. .compatible = "fsl,8555-memory-controller",
  794. },
  795. {
  796. .compatible = "fsl,8568-memory-controller",
  797. },
  798. {},
  799. };
  800. static struct of_platform_driver mpc85xx_mc_err_driver = {
  801. .owner = THIS_MODULE,
  802. .name = "mpc85xx_mc_err",
  803. .match_table = mpc85xx_mc_err_of_match,
  804. .probe = mpc85xx_mc_err_probe,
  805. .remove = mpc85xx_mc_err_remove,
  806. .driver = {
  807. .name = "mpc85xx_mc_err",
  808. .owner = THIS_MODULE,
  809. },
  810. };
  811. static int __init mpc85xx_mc_init(void)
  812. {
  813. int res = 0;
  814. printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, "
  815. "(C) 2006 Montavista Software\n");
  816. /* make sure error reporting method is sane */
  817. switch (edac_op_state) {
  818. case EDAC_OPSTATE_POLL:
  819. case EDAC_OPSTATE_INT:
  820. break;
  821. default:
  822. edac_op_state = EDAC_OPSTATE_INT;
  823. break;
  824. }
  825. res = of_register_platform_driver(&mpc85xx_mc_err_driver);
  826. if (res)
  827. printk(KERN_WARNING EDAC_MOD_STR "MC fails to register\n");
  828. res = of_register_platform_driver(&mpc85xx_l2_err_driver);
  829. if (res)
  830. printk(KERN_WARNING EDAC_MOD_STR "L2 fails to register\n");
  831. #ifdef CONFIG_PCI
  832. res = platform_driver_register(&mpc85xx_pci_err_driver);
  833. if (res)
  834. printk(KERN_WARNING EDAC_MOD_STR "PCI fails to register\n");
  835. #endif
  836. /*
  837. * need to clear HID1[RFXE] to disable machine check int
  838. * so we can catch it
  839. */
  840. if (edac_op_state == EDAC_OPSTATE_INT) {
  841. orig_hid1 = mfspr(SPRN_HID1);
  842. mtspr(SPRN_HID1, (orig_hid1 & ~0x20000));
  843. }
  844. return 0;
  845. }
  846. module_init(mpc85xx_mc_init);
  847. static void __exit mpc85xx_mc_exit(void)
  848. {
  849. mtspr(SPRN_HID1, orig_hid1);
  850. #ifdef CONFIG_PCI
  851. platform_driver_unregister(&mpc85xx_pci_err_driver);
  852. #endif
  853. of_unregister_platform_driver(&mpc85xx_l2_err_driver);
  854. of_unregister_platform_driver(&mpc85xx_mc_err_driver);
  855. }
  856. module_exit(mpc85xx_mc_exit);
  857. MODULE_LICENSE("GPL");
  858. MODULE_AUTHOR("Montavista Software, Inc.");
  859. module_param(edac_op_state, int, 0444);
  860. MODULE_PARM_DESC(edac_op_state,
  861. "EDAC Error Reporting state: 0=Poll, 2=Interrupt");