mpc85xx_edac.c 27 KB

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