mpc85xx_edac.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311
  1. /*
  2. * Freescale MPC85xx Memory Controller kernel module
  3. *
  4. * Parts Copyrighted (c) 2013 by Freescale Semiconductor, Inc.
  5. *
  6. * Author: Dave Jiang <djiang@mvista.com>
  7. *
  8. * 2006-2007 (c) MontaVista Software, Inc. This file is licensed under
  9. * the terms of the GNU General Public License version 2. This program
  10. * is licensed "as is" without any warranty of any kind, whether express
  11. * or implied.
  12. *
  13. */
  14. #include <linux/module.h>
  15. #include <linux/init.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/ctype.h>
  18. #include <linux/io.h>
  19. #include <linux/mod_devicetable.h>
  20. #include <linux/edac.h>
  21. #include <linux/smp.h>
  22. #include <linux/gfp.h>
  23. #include <linux/fsl/edac.h>
  24. #include <linux/of_platform.h>
  25. #include <linux/of_device.h>
  26. #include "edac_module.h"
  27. #include "edac_core.h"
  28. #include "mpc85xx_edac.h"
  29. static int edac_dev_idx;
  30. #ifdef CONFIG_PCI
  31. static int edac_pci_idx;
  32. #endif
  33. static int edac_mc_idx;
  34. static u32 orig_ddr_err_disable;
  35. static u32 orig_ddr_err_sbe;
  36. /*
  37. * PCI Err defines
  38. */
  39. #ifdef CONFIG_PCI
  40. static u32 orig_pci_err_cap_dr;
  41. static u32 orig_pci_err_en;
  42. #endif
  43. static u32 orig_l2_err_disable;
  44. #ifdef CONFIG_FSL_SOC_BOOKE
  45. static u32 orig_hid1[2];
  46. #endif
  47. /************************ MC SYSFS parts ***********************************/
  48. #define to_mci(k) container_of(k, struct mem_ctl_info, dev)
  49. static ssize_t mpc85xx_mc_inject_data_hi_show(struct device *dev,
  50. struct device_attribute *mattr,
  51. char *data)
  52. {
  53. struct mem_ctl_info *mci = to_mci(dev);
  54. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  55. return sprintf(data, "0x%08x",
  56. in_be32(pdata->mc_vbase +
  57. MPC85XX_MC_DATA_ERR_INJECT_HI));
  58. }
  59. static ssize_t mpc85xx_mc_inject_data_lo_show(struct device *dev,
  60. struct device_attribute *mattr,
  61. char *data)
  62. {
  63. struct mem_ctl_info *mci = to_mci(dev);
  64. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  65. return sprintf(data, "0x%08x",
  66. in_be32(pdata->mc_vbase +
  67. MPC85XX_MC_DATA_ERR_INJECT_LO));
  68. }
  69. static ssize_t mpc85xx_mc_inject_ctrl_show(struct device *dev,
  70. struct device_attribute *mattr,
  71. char *data)
  72. {
  73. struct mem_ctl_info *mci = to_mci(dev);
  74. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  75. return sprintf(data, "0x%08x",
  76. in_be32(pdata->mc_vbase + MPC85XX_MC_ECC_ERR_INJECT));
  77. }
  78. static ssize_t mpc85xx_mc_inject_data_hi_store(struct device *dev,
  79. struct device_attribute *mattr,
  80. const char *data, size_t count)
  81. {
  82. struct mem_ctl_info *mci = to_mci(dev);
  83. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  84. if (isdigit(*data)) {
  85. out_be32(pdata->mc_vbase + MPC85XX_MC_DATA_ERR_INJECT_HI,
  86. simple_strtoul(data, NULL, 0));
  87. return count;
  88. }
  89. return 0;
  90. }
  91. static ssize_t mpc85xx_mc_inject_data_lo_store(struct device *dev,
  92. struct device_attribute *mattr,
  93. const char *data, size_t count)
  94. {
  95. struct mem_ctl_info *mci = to_mci(dev);
  96. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  97. if (isdigit(*data)) {
  98. out_be32(pdata->mc_vbase + MPC85XX_MC_DATA_ERR_INJECT_LO,
  99. simple_strtoul(data, NULL, 0));
  100. return count;
  101. }
  102. return 0;
  103. }
  104. static ssize_t mpc85xx_mc_inject_ctrl_store(struct device *dev,
  105. struct device_attribute *mattr,
  106. const char *data, size_t count)
  107. {
  108. struct mem_ctl_info *mci = to_mci(dev);
  109. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  110. if (isdigit(*data)) {
  111. out_be32(pdata->mc_vbase + MPC85XX_MC_ECC_ERR_INJECT,
  112. simple_strtoul(data, NULL, 0));
  113. return count;
  114. }
  115. return 0;
  116. }
  117. DEVICE_ATTR(inject_data_hi, S_IRUGO | S_IWUSR,
  118. mpc85xx_mc_inject_data_hi_show, mpc85xx_mc_inject_data_hi_store);
  119. DEVICE_ATTR(inject_data_lo, S_IRUGO | S_IWUSR,
  120. mpc85xx_mc_inject_data_lo_show, mpc85xx_mc_inject_data_lo_store);
  121. DEVICE_ATTR(inject_ctrl, S_IRUGO | S_IWUSR,
  122. mpc85xx_mc_inject_ctrl_show, mpc85xx_mc_inject_ctrl_store);
  123. static struct attribute *mpc85xx_dev_attrs[] = {
  124. &dev_attr_inject_data_hi.attr,
  125. &dev_attr_inject_data_lo.attr,
  126. &dev_attr_inject_ctrl.attr,
  127. NULL
  128. };
  129. ATTRIBUTE_GROUPS(mpc85xx_dev);
  130. /**************************** PCI Err device ***************************/
  131. #ifdef CONFIG_PCI
  132. static void mpc85xx_pci_check(struct edac_pci_ctl_info *pci)
  133. {
  134. struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
  135. u32 err_detect;
  136. err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR);
  137. /* master aborts can happen during PCI config cycles */
  138. if (!(err_detect & ~(PCI_EDE_MULTI_ERR | PCI_EDE_MST_ABRT))) {
  139. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect);
  140. return;
  141. }
  142. printk(KERN_ERR "PCI error(s) detected\n");
  143. printk(KERN_ERR "PCI/X ERR_DR register: %#08x\n", err_detect);
  144. printk(KERN_ERR "PCI/X ERR_ATTRIB register: %#08x\n",
  145. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ATTRIB));
  146. printk(KERN_ERR "PCI/X ERR_ADDR register: %#08x\n",
  147. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR));
  148. printk(KERN_ERR "PCI/X ERR_EXT_ADDR register: %#08x\n",
  149. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EXT_ADDR));
  150. printk(KERN_ERR "PCI/X ERR_DL register: %#08x\n",
  151. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DL));
  152. printk(KERN_ERR "PCI/X ERR_DH register: %#08x\n",
  153. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DH));
  154. /* clear error bits */
  155. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect);
  156. if (err_detect & PCI_EDE_PERR_MASK)
  157. edac_pci_handle_pe(pci, pci->ctl_name);
  158. if ((err_detect & ~PCI_EDE_MULTI_ERR) & ~PCI_EDE_PERR_MASK)
  159. edac_pci_handle_npe(pci, pci->ctl_name);
  160. }
  161. static void mpc85xx_pcie_check(struct edac_pci_ctl_info *pci)
  162. {
  163. struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
  164. u32 err_detect;
  165. err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR);
  166. pr_err("PCIe error(s) detected\n");
  167. pr_err("PCIe ERR_DR register: 0x%08x\n", err_detect);
  168. pr_err("PCIe ERR_CAP_STAT register: 0x%08x\n",
  169. in_be32(pdata->pci_vbase + MPC85XX_PCI_GAS_TIMR));
  170. pr_err("PCIe ERR_CAP_R0 register: 0x%08x\n",
  171. in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R0));
  172. pr_err("PCIe ERR_CAP_R1 register: 0x%08x\n",
  173. in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R1));
  174. pr_err("PCIe ERR_CAP_R2 register: 0x%08x\n",
  175. in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R2));
  176. pr_err("PCIe ERR_CAP_R3 register: 0x%08x\n",
  177. in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R3));
  178. /* clear error bits */
  179. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect);
  180. }
  181. static int mpc85xx_pcie_find_capability(struct device_node *np)
  182. {
  183. struct pci_controller *hose;
  184. if (!np)
  185. return -EINVAL;
  186. hose = pci_find_hose_for_OF_device(np);
  187. return early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP);
  188. }
  189. static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id)
  190. {
  191. struct edac_pci_ctl_info *pci = dev_id;
  192. struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
  193. u32 err_detect;
  194. err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR);
  195. if (!err_detect)
  196. return IRQ_NONE;
  197. if (pdata->is_pcie)
  198. mpc85xx_pcie_check(pci);
  199. else
  200. mpc85xx_pci_check(pci);
  201. return IRQ_HANDLED;
  202. }
  203. static int mpc85xx_pci_err_probe(struct platform_device *op)
  204. {
  205. struct edac_pci_ctl_info *pci;
  206. struct mpc85xx_pci_pdata *pdata;
  207. struct mpc85xx_edac_pci_plat_data *plat_data;
  208. struct device_node *of_node;
  209. struct resource r;
  210. int res = 0;
  211. if (!devres_open_group(&op->dev, mpc85xx_pci_err_probe, GFP_KERNEL))
  212. return -ENOMEM;
  213. pci = edac_pci_alloc_ctl_info(sizeof(*pdata), "mpc85xx_pci_err");
  214. if (!pci)
  215. return -ENOMEM;
  216. /* make sure error reporting method is sane */
  217. switch (edac_op_state) {
  218. case EDAC_OPSTATE_POLL:
  219. case EDAC_OPSTATE_INT:
  220. break;
  221. default:
  222. edac_op_state = EDAC_OPSTATE_INT;
  223. break;
  224. }
  225. pdata = pci->pvt_info;
  226. pdata->name = "mpc85xx_pci_err";
  227. pdata->irq = NO_IRQ;
  228. plat_data = op->dev.platform_data;
  229. if (!plat_data) {
  230. dev_err(&op->dev, "no platform data");
  231. res = -ENXIO;
  232. goto err;
  233. }
  234. of_node = plat_data->of_node;
  235. if (mpc85xx_pcie_find_capability(of_node) > 0)
  236. pdata->is_pcie = true;
  237. dev_set_drvdata(&op->dev, pci);
  238. pci->dev = &op->dev;
  239. pci->mod_name = EDAC_MOD_STR;
  240. pci->ctl_name = pdata->name;
  241. pci->dev_name = dev_name(&op->dev);
  242. if (edac_op_state == EDAC_OPSTATE_POLL) {
  243. if (pdata->is_pcie)
  244. pci->edac_check = mpc85xx_pcie_check;
  245. else
  246. pci->edac_check = mpc85xx_pci_check;
  247. }
  248. pdata->edac_idx = edac_pci_idx++;
  249. res = of_address_to_resource(of_node, 0, &r);
  250. if (res) {
  251. printk(KERN_ERR "%s: Unable to get resource for "
  252. "PCI err regs\n", __func__);
  253. goto err;
  254. }
  255. /* we only need the error registers */
  256. r.start += 0xe00;
  257. if (!devm_request_mem_region(&op->dev, r.start, resource_size(&r),
  258. pdata->name)) {
  259. printk(KERN_ERR "%s: Error while requesting mem region\n",
  260. __func__);
  261. res = -EBUSY;
  262. goto err;
  263. }
  264. pdata->pci_vbase = devm_ioremap(&op->dev, r.start, resource_size(&r));
  265. if (!pdata->pci_vbase) {
  266. printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__);
  267. res = -ENOMEM;
  268. goto err;
  269. }
  270. if (pdata->is_pcie) {
  271. orig_pci_err_cap_dr =
  272. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR);
  273. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR, ~0);
  274. orig_pci_err_en =
  275. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN);
  276. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, 0);
  277. } else {
  278. orig_pci_err_cap_dr =
  279. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR);
  280. /* PCI master abort is expected during config cycles */
  281. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR, 0x40);
  282. orig_pci_err_en =
  283. in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN);
  284. /* disable master abort reporting */
  285. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, ~0x40);
  286. }
  287. /* clear error bits */
  288. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, ~0);
  289. if (edac_pci_add_device(pci, pdata->edac_idx) > 0) {
  290. edac_dbg(3, "failed edac_pci_add_device()\n");
  291. goto err;
  292. }
  293. if (edac_op_state == EDAC_OPSTATE_INT) {
  294. pdata->irq = irq_of_parse_and_map(of_node, 0);
  295. res = devm_request_irq(&op->dev, pdata->irq,
  296. mpc85xx_pci_isr,
  297. IRQF_SHARED,
  298. "[EDAC] PCI err", pci);
  299. if (res < 0) {
  300. printk(KERN_ERR
  301. "%s: Unable to request irq %d for "
  302. "MPC85xx PCI err\n", __func__, pdata->irq);
  303. irq_dispose_mapping(pdata->irq);
  304. res = -ENODEV;
  305. goto err2;
  306. }
  307. printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for PCI Err\n",
  308. pdata->irq);
  309. }
  310. if (pdata->is_pcie) {
  311. /*
  312. * Enable all PCIe error interrupt & error detect except invalid
  313. * PEX_CONFIG_ADDR/PEX_CONFIG_DATA access interrupt generation
  314. * enable bit and invalid PEX_CONFIG_ADDR/PEX_CONFIG_DATA access
  315. * detection enable bit. Because PCIe bus code to initialize and
  316. * configure these PCIe devices on booting will use some invalid
  317. * PEX_CONFIG_ADDR/PEX_CONFIG_DATA, edac driver prints the much
  318. * notice information. So disable this detect to fix ugly print.
  319. */
  320. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, ~0
  321. & ~PEX_ERR_ICCAIE_EN_BIT);
  322. out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR, 0
  323. | PEX_ERR_ICCAD_DISR_BIT);
  324. }
  325. devres_remove_group(&op->dev, mpc85xx_pci_err_probe);
  326. edac_dbg(3, "success\n");
  327. printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n");
  328. return 0;
  329. err2:
  330. edac_pci_del_device(&op->dev);
  331. err:
  332. edac_pci_free_ctl_info(pci);
  333. devres_release_group(&op->dev, mpc85xx_pci_err_probe);
  334. return res;
  335. }
  336. static const struct platform_device_id mpc85xx_pci_err_match[] = {
  337. {
  338. .name = "mpc85xx-pci-edac"
  339. },
  340. {}
  341. };
  342. static struct platform_driver mpc85xx_pci_err_driver = {
  343. .probe = mpc85xx_pci_err_probe,
  344. .id_table = mpc85xx_pci_err_match,
  345. .driver = {
  346. .name = "mpc85xx_pci_err",
  347. .suppress_bind_attrs = true,
  348. },
  349. };
  350. #endif /* CONFIG_PCI */
  351. /**************************** L2 Err device ***************************/
  352. /************************ L2 SYSFS parts ***********************************/
  353. static ssize_t mpc85xx_l2_inject_data_hi_show(struct edac_device_ctl_info
  354. *edac_dev, char *data)
  355. {
  356. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  357. return sprintf(data, "0x%08x",
  358. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJHI));
  359. }
  360. static ssize_t mpc85xx_l2_inject_data_lo_show(struct edac_device_ctl_info
  361. *edac_dev, char *data)
  362. {
  363. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  364. return sprintf(data, "0x%08x",
  365. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJLO));
  366. }
  367. static ssize_t mpc85xx_l2_inject_ctrl_show(struct edac_device_ctl_info
  368. *edac_dev, char *data)
  369. {
  370. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  371. return sprintf(data, "0x%08x",
  372. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJCTL));
  373. }
  374. static ssize_t mpc85xx_l2_inject_data_hi_store(struct edac_device_ctl_info
  375. *edac_dev, const char *data,
  376. size_t count)
  377. {
  378. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  379. if (isdigit(*data)) {
  380. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJHI,
  381. simple_strtoul(data, NULL, 0));
  382. return count;
  383. }
  384. return 0;
  385. }
  386. static ssize_t mpc85xx_l2_inject_data_lo_store(struct edac_device_ctl_info
  387. *edac_dev, const char *data,
  388. size_t count)
  389. {
  390. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  391. if (isdigit(*data)) {
  392. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJLO,
  393. simple_strtoul(data, NULL, 0));
  394. return count;
  395. }
  396. return 0;
  397. }
  398. static ssize_t mpc85xx_l2_inject_ctrl_store(struct edac_device_ctl_info
  399. *edac_dev, const char *data,
  400. size_t count)
  401. {
  402. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  403. if (isdigit(*data)) {
  404. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJCTL,
  405. simple_strtoul(data, NULL, 0));
  406. return count;
  407. }
  408. return 0;
  409. }
  410. static struct edac_dev_sysfs_attribute mpc85xx_l2_sysfs_attributes[] = {
  411. {
  412. .attr = {
  413. .name = "inject_data_hi",
  414. .mode = (S_IRUGO | S_IWUSR)
  415. },
  416. .show = mpc85xx_l2_inject_data_hi_show,
  417. .store = mpc85xx_l2_inject_data_hi_store},
  418. {
  419. .attr = {
  420. .name = "inject_data_lo",
  421. .mode = (S_IRUGO | S_IWUSR)
  422. },
  423. .show = mpc85xx_l2_inject_data_lo_show,
  424. .store = mpc85xx_l2_inject_data_lo_store},
  425. {
  426. .attr = {
  427. .name = "inject_ctrl",
  428. .mode = (S_IRUGO | S_IWUSR)
  429. },
  430. .show = mpc85xx_l2_inject_ctrl_show,
  431. .store = mpc85xx_l2_inject_ctrl_store},
  432. /* End of list */
  433. {
  434. .attr = {.name = NULL}
  435. }
  436. };
  437. static void mpc85xx_set_l2_sysfs_attributes(struct edac_device_ctl_info
  438. *edac_dev)
  439. {
  440. edac_dev->sysfs_attributes = mpc85xx_l2_sysfs_attributes;
  441. }
  442. /***************************** L2 ops ***********************************/
  443. static void mpc85xx_l2_check(struct edac_device_ctl_info *edac_dev)
  444. {
  445. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  446. u32 err_detect;
  447. err_detect = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET);
  448. if (!(err_detect & L2_EDE_MASK))
  449. return;
  450. printk(KERN_ERR "ECC Error in CPU L2 cache\n");
  451. printk(KERN_ERR "L2 Error Detect Register: 0x%08x\n", err_detect);
  452. printk(KERN_ERR "L2 Error Capture Data High Register: 0x%08x\n",
  453. in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTDATAHI));
  454. printk(KERN_ERR "L2 Error Capture Data Lo Register: 0x%08x\n",
  455. in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTDATALO));
  456. printk(KERN_ERR "L2 Error Syndrome Register: 0x%08x\n",
  457. in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTECC));
  458. printk(KERN_ERR "L2 Error Attributes Capture Register: 0x%08x\n",
  459. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRATTR));
  460. printk(KERN_ERR "L2 Error Address Capture Register: 0x%08x\n",
  461. in_be32(pdata->l2_vbase + MPC85XX_L2_ERRADDR));
  462. /* clear error detect register */
  463. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET, err_detect);
  464. if (err_detect & L2_EDE_CE_MASK)
  465. edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
  466. if (err_detect & L2_EDE_UE_MASK)
  467. edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
  468. }
  469. static irqreturn_t mpc85xx_l2_isr(int irq, void *dev_id)
  470. {
  471. struct edac_device_ctl_info *edac_dev = dev_id;
  472. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  473. u32 err_detect;
  474. err_detect = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET);
  475. if (!(err_detect & L2_EDE_MASK))
  476. return IRQ_NONE;
  477. mpc85xx_l2_check(edac_dev);
  478. return IRQ_HANDLED;
  479. }
  480. static int mpc85xx_l2_err_probe(struct platform_device *op)
  481. {
  482. struct edac_device_ctl_info *edac_dev;
  483. struct mpc85xx_l2_pdata *pdata;
  484. struct resource r;
  485. int res;
  486. if (!devres_open_group(&op->dev, mpc85xx_l2_err_probe, GFP_KERNEL))
  487. return -ENOMEM;
  488. edac_dev = edac_device_alloc_ctl_info(sizeof(*pdata),
  489. "cpu", 1, "L", 1, 2, NULL, 0,
  490. edac_dev_idx);
  491. if (!edac_dev) {
  492. devres_release_group(&op->dev, mpc85xx_l2_err_probe);
  493. return -ENOMEM;
  494. }
  495. pdata = edac_dev->pvt_info;
  496. pdata->name = "mpc85xx_l2_err";
  497. pdata->irq = NO_IRQ;
  498. edac_dev->dev = &op->dev;
  499. dev_set_drvdata(edac_dev->dev, edac_dev);
  500. edac_dev->ctl_name = pdata->name;
  501. edac_dev->dev_name = pdata->name;
  502. res = of_address_to_resource(op->dev.of_node, 0, &r);
  503. if (res) {
  504. printk(KERN_ERR "%s: Unable to get resource for "
  505. "L2 err regs\n", __func__);
  506. goto err;
  507. }
  508. /* we only need the error registers */
  509. r.start += 0xe00;
  510. if (!devm_request_mem_region(&op->dev, r.start, resource_size(&r),
  511. pdata->name)) {
  512. printk(KERN_ERR "%s: Error while requesting mem region\n",
  513. __func__);
  514. res = -EBUSY;
  515. goto err;
  516. }
  517. pdata->l2_vbase = devm_ioremap(&op->dev, r.start, resource_size(&r));
  518. if (!pdata->l2_vbase) {
  519. printk(KERN_ERR "%s: Unable to setup L2 err regs\n", __func__);
  520. res = -ENOMEM;
  521. goto err;
  522. }
  523. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET, ~0);
  524. orig_l2_err_disable = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS);
  525. /* clear the err_dis */
  526. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS, 0);
  527. edac_dev->mod_name = EDAC_MOD_STR;
  528. if (edac_op_state == EDAC_OPSTATE_POLL)
  529. edac_dev->edac_check = mpc85xx_l2_check;
  530. mpc85xx_set_l2_sysfs_attributes(edac_dev);
  531. pdata->edac_idx = edac_dev_idx++;
  532. if (edac_device_add_device(edac_dev) > 0) {
  533. edac_dbg(3, "failed edac_device_add_device()\n");
  534. goto err;
  535. }
  536. if (edac_op_state == EDAC_OPSTATE_INT) {
  537. pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0);
  538. res = devm_request_irq(&op->dev, pdata->irq,
  539. mpc85xx_l2_isr, IRQF_SHARED,
  540. "[EDAC] L2 err", edac_dev);
  541. if (res < 0) {
  542. printk(KERN_ERR
  543. "%s: Unable to request irq %d for "
  544. "MPC85xx L2 err\n", __func__, pdata->irq);
  545. irq_dispose_mapping(pdata->irq);
  546. res = -ENODEV;
  547. goto err2;
  548. }
  549. printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for L2 Err\n",
  550. pdata->irq);
  551. edac_dev->op_state = OP_RUNNING_INTERRUPT;
  552. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINTEN, L2_EIE_MASK);
  553. }
  554. devres_remove_group(&op->dev, mpc85xx_l2_err_probe);
  555. edac_dbg(3, "success\n");
  556. printk(KERN_INFO EDAC_MOD_STR " L2 err registered\n");
  557. return 0;
  558. err2:
  559. edac_device_del_device(&op->dev);
  560. err:
  561. devres_release_group(&op->dev, mpc85xx_l2_err_probe);
  562. edac_device_free_ctl_info(edac_dev);
  563. return res;
  564. }
  565. static int mpc85xx_l2_err_remove(struct platform_device *op)
  566. {
  567. struct edac_device_ctl_info *edac_dev = dev_get_drvdata(&op->dev);
  568. struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
  569. edac_dbg(0, "\n");
  570. if (edac_op_state == EDAC_OPSTATE_INT) {
  571. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINTEN, 0);
  572. irq_dispose_mapping(pdata->irq);
  573. }
  574. out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS, orig_l2_err_disable);
  575. edac_device_del_device(&op->dev);
  576. edac_device_free_ctl_info(edac_dev);
  577. return 0;
  578. }
  579. static const struct of_device_id mpc85xx_l2_err_of_match[] = {
  580. /* deprecate the fsl,85.. forms in the future, 2.6.30? */
  581. { .compatible = "fsl,8540-l2-cache-controller", },
  582. { .compatible = "fsl,8541-l2-cache-controller", },
  583. { .compatible = "fsl,8544-l2-cache-controller", },
  584. { .compatible = "fsl,8548-l2-cache-controller", },
  585. { .compatible = "fsl,8555-l2-cache-controller", },
  586. { .compatible = "fsl,8568-l2-cache-controller", },
  587. { .compatible = "fsl,mpc8536-l2-cache-controller", },
  588. { .compatible = "fsl,mpc8540-l2-cache-controller", },
  589. { .compatible = "fsl,mpc8541-l2-cache-controller", },
  590. { .compatible = "fsl,mpc8544-l2-cache-controller", },
  591. { .compatible = "fsl,mpc8548-l2-cache-controller", },
  592. { .compatible = "fsl,mpc8555-l2-cache-controller", },
  593. { .compatible = "fsl,mpc8560-l2-cache-controller", },
  594. { .compatible = "fsl,mpc8568-l2-cache-controller", },
  595. { .compatible = "fsl,mpc8569-l2-cache-controller", },
  596. { .compatible = "fsl,mpc8572-l2-cache-controller", },
  597. { .compatible = "fsl,p1020-l2-cache-controller", },
  598. { .compatible = "fsl,p1021-l2-cache-controller", },
  599. { .compatible = "fsl,p2020-l2-cache-controller", },
  600. {},
  601. };
  602. MODULE_DEVICE_TABLE(of, mpc85xx_l2_err_of_match);
  603. static struct platform_driver mpc85xx_l2_err_driver = {
  604. .probe = mpc85xx_l2_err_probe,
  605. .remove = mpc85xx_l2_err_remove,
  606. .driver = {
  607. .name = "mpc85xx_l2_err",
  608. .of_match_table = mpc85xx_l2_err_of_match,
  609. },
  610. };
  611. /**************************** MC Err device ***************************/
  612. /*
  613. * Taken from table 8-55 in the MPC8641 User's Manual and/or 9-61 in the
  614. * MPC8572 User's Manual. Each line represents a syndrome bit column as a
  615. * 64-bit value, but split into an upper and lower 32-bit chunk. The labels
  616. * below correspond to Freescale's manuals.
  617. */
  618. static unsigned int ecc_table[16] = {
  619. /* MSB LSB */
  620. /* [0:31] [32:63] */
  621. 0xf00fe11e, 0xc33c0ff7, /* Syndrome bit 7 */
  622. 0x00ff00ff, 0x00fff0ff,
  623. 0x0f0f0f0f, 0x0f0fff00,
  624. 0x11113333, 0x7777000f,
  625. 0x22224444, 0x8888222f,
  626. 0x44448888, 0xffff4441,
  627. 0x8888ffff, 0x11118882,
  628. 0xffff1111, 0x22221114, /* Syndrome bit 0 */
  629. };
  630. /*
  631. * Calculate the correct ECC value for a 64-bit value specified by high:low
  632. */
  633. static u8 calculate_ecc(u32 high, u32 low)
  634. {
  635. u32 mask_low;
  636. u32 mask_high;
  637. int bit_cnt;
  638. u8 ecc = 0;
  639. int i;
  640. int j;
  641. for (i = 0; i < 8; i++) {
  642. mask_high = ecc_table[i * 2];
  643. mask_low = ecc_table[i * 2 + 1];
  644. bit_cnt = 0;
  645. for (j = 0; j < 32; j++) {
  646. if ((mask_high >> j) & 1)
  647. bit_cnt ^= (high >> j) & 1;
  648. if ((mask_low >> j) & 1)
  649. bit_cnt ^= (low >> j) & 1;
  650. }
  651. ecc |= bit_cnt << i;
  652. }
  653. return ecc;
  654. }
  655. /*
  656. * Create the syndrome code which is generated if the data line specified by
  657. * 'bit' failed. Eg generate an 8-bit codes seen in Table 8-55 in the MPC8641
  658. * User's Manual and 9-61 in the MPC8572 User's Manual.
  659. */
  660. static u8 syndrome_from_bit(unsigned int bit) {
  661. int i;
  662. u8 syndrome = 0;
  663. /*
  664. * Cycle through the upper or lower 32-bit portion of each value in
  665. * ecc_table depending on if 'bit' is in the upper or lower half of
  666. * 64-bit data.
  667. */
  668. for (i = bit < 32; i < 16; i += 2)
  669. syndrome |= ((ecc_table[i] >> (bit % 32)) & 1) << (i / 2);
  670. return syndrome;
  671. }
  672. /*
  673. * Decode data and ecc syndrome to determine what went wrong
  674. * Note: This can only decode single-bit errors
  675. */
  676. static void sbe_ecc_decode(u32 cap_high, u32 cap_low, u32 cap_ecc,
  677. int *bad_data_bit, int *bad_ecc_bit)
  678. {
  679. int i;
  680. u8 syndrome;
  681. *bad_data_bit = -1;
  682. *bad_ecc_bit = -1;
  683. /*
  684. * Calculate the ECC of the captured data and XOR it with the captured
  685. * ECC to find an ECC syndrome value we can search for
  686. */
  687. syndrome = calculate_ecc(cap_high, cap_low) ^ cap_ecc;
  688. /* Check if a data line is stuck... */
  689. for (i = 0; i < 64; i++) {
  690. if (syndrome == syndrome_from_bit(i)) {
  691. *bad_data_bit = i;
  692. return;
  693. }
  694. }
  695. /* If data is correct, check ECC bits for errors... */
  696. for (i = 0; i < 8; i++) {
  697. if ((syndrome >> i) & 0x1) {
  698. *bad_ecc_bit = i;
  699. return;
  700. }
  701. }
  702. }
  703. #define make64(high, low) (((u64)(high) << 32) | (low))
  704. static void mpc85xx_mc_check(struct mem_ctl_info *mci)
  705. {
  706. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  707. struct csrow_info *csrow;
  708. u32 bus_width;
  709. u32 err_detect;
  710. u32 syndrome;
  711. u64 err_addr;
  712. u32 pfn;
  713. int row_index;
  714. u32 cap_high;
  715. u32 cap_low;
  716. int bad_data_bit;
  717. int bad_ecc_bit;
  718. err_detect = in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT);
  719. if (!err_detect)
  720. return;
  721. mpc85xx_mc_printk(mci, KERN_ERR, "Err Detect Register: %#8.8x\n",
  722. err_detect);
  723. /* no more processing if not ECC bit errors */
  724. if (!(err_detect & (DDR_EDE_SBE | DDR_EDE_MBE))) {
  725. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect);
  726. return;
  727. }
  728. syndrome = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ECC);
  729. /* Mask off appropriate bits of syndrome based on bus width */
  730. bus_width = (in_be32(pdata->mc_vbase + MPC85XX_MC_DDR_SDRAM_CFG) &
  731. DSC_DBW_MASK) ? 32 : 64;
  732. if (bus_width == 64)
  733. syndrome &= 0xff;
  734. else
  735. syndrome &= 0xffff;
  736. err_addr = make64(
  737. in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_EXT_ADDRESS),
  738. in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ADDRESS));
  739. pfn = err_addr >> PAGE_SHIFT;
  740. for (row_index = 0; row_index < mci->nr_csrows; row_index++) {
  741. csrow = mci->csrows[row_index];
  742. if ((pfn >= csrow->first_page) && (pfn <= csrow->last_page))
  743. break;
  744. }
  745. cap_high = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_DATA_HI);
  746. cap_low = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_DATA_LO);
  747. /*
  748. * Analyze single-bit errors on 64-bit wide buses
  749. * TODO: Add support for 32-bit wide buses
  750. */
  751. if ((err_detect & DDR_EDE_SBE) && (bus_width == 64)) {
  752. sbe_ecc_decode(cap_high, cap_low, syndrome,
  753. &bad_data_bit, &bad_ecc_bit);
  754. if (bad_data_bit != -1)
  755. mpc85xx_mc_printk(mci, KERN_ERR,
  756. "Faulty Data bit: %d\n", bad_data_bit);
  757. if (bad_ecc_bit != -1)
  758. mpc85xx_mc_printk(mci, KERN_ERR,
  759. "Faulty ECC bit: %d\n", bad_ecc_bit);
  760. mpc85xx_mc_printk(mci, KERN_ERR,
  761. "Expected Data / ECC:\t%#8.8x_%08x / %#2.2x\n",
  762. cap_high ^ (1 << (bad_data_bit - 32)),
  763. cap_low ^ (1 << bad_data_bit),
  764. syndrome ^ (1 << bad_ecc_bit));
  765. }
  766. mpc85xx_mc_printk(mci, KERN_ERR,
  767. "Captured Data / ECC:\t%#8.8x_%08x / %#2.2x\n",
  768. cap_high, cap_low, syndrome);
  769. mpc85xx_mc_printk(mci, KERN_ERR, "Err addr: %#8.8llx\n", err_addr);
  770. mpc85xx_mc_printk(mci, KERN_ERR, "PFN: %#8.8x\n", pfn);
  771. /* we are out of range */
  772. if (row_index == mci->nr_csrows)
  773. mpc85xx_mc_printk(mci, KERN_ERR, "PFN out of range!\n");
  774. if (err_detect & DDR_EDE_SBE)
  775. edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
  776. pfn, err_addr & ~PAGE_MASK, syndrome,
  777. row_index, 0, -1,
  778. mci->ctl_name, "");
  779. if (err_detect & DDR_EDE_MBE)
  780. edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
  781. pfn, err_addr & ~PAGE_MASK, syndrome,
  782. row_index, 0, -1,
  783. mci->ctl_name, "");
  784. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect);
  785. }
  786. static irqreturn_t mpc85xx_mc_isr(int irq, void *dev_id)
  787. {
  788. struct mem_ctl_info *mci = dev_id;
  789. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  790. u32 err_detect;
  791. err_detect = in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT);
  792. if (!err_detect)
  793. return IRQ_NONE;
  794. mpc85xx_mc_check(mci);
  795. return IRQ_HANDLED;
  796. }
  797. static void mpc85xx_init_csrows(struct mem_ctl_info *mci)
  798. {
  799. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  800. struct csrow_info *csrow;
  801. struct dimm_info *dimm;
  802. u32 sdram_ctl;
  803. u32 sdtype;
  804. enum mem_type mtype;
  805. u32 cs_bnds;
  806. int index;
  807. sdram_ctl = in_be32(pdata->mc_vbase + MPC85XX_MC_DDR_SDRAM_CFG);
  808. sdtype = sdram_ctl & DSC_SDTYPE_MASK;
  809. if (sdram_ctl & DSC_RD_EN) {
  810. switch (sdtype) {
  811. case DSC_SDTYPE_DDR:
  812. mtype = MEM_RDDR;
  813. break;
  814. case DSC_SDTYPE_DDR2:
  815. mtype = MEM_RDDR2;
  816. break;
  817. case DSC_SDTYPE_DDR3:
  818. mtype = MEM_RDDR3;
  819. break;
  820. default:
  821. mtype = MEM_UNKNOWN;
  822. break;
  823. }
  824. } else {
  825. switch (sdtype) {
  826. case DSC_SDTYPE_DDR:
  827. mtype = MEM_DDR;
  828. break;
  829. case DSC_SDTYPE_DDR2:
  830. mtype = MEM_DDR2;
  831. break;
  832. case DSC_SDTYPE_DDR3:
  833. mtype = MEM_DDR3;
  834. break;
  835. default:
  836. mtype = MEM_UNKNOWN;
  837. break;
  838. }
  839. }
  840. for (index = 0; index < mci->nr_csrows; index++) {
  841. u32 start;
  842. u32 end;
  843. csrow = mci->csrows[index];
  844. dimm = csrow->channels[0]->dimm;
  845. cs_bnds = in_be32(pdata->mc_vbase + MPC85XX_MC_CS_BNDS_0 +
  846. (index * MPC85XX_MC_CS_BNDS_OFS));
  847. start = (cs_bnds & 0xffff0000) >> 16;
  848. end = (cs_bnds & 0x0000ffff);
  849. if (start == end)
  850. continue; /* not populated */
  851. start <<= (24 - PAGE_SHIFT);
  852. end <<= (24 - PAGE_SHIFT);
  853. end |= (1 << (24 - PAGE_SHIFT)) - 1;
  854. csrow->first_page = start;
  855. csrow->last_page = end;
  856. dimm->nr_pages = end + 1 - start;
  857. dimm->grain = 8;
  858. dimm->mtype = mtype;
  859. dimm->dtype = DEV_UNKNOWN;
  860. if (sdram_ctl & DSC_X32_EN)
  861. dimm->dtype = DEV_X32;
  862. dimm->edac_mode = EDAC_SECDED;
  863. }
  864. }
  865. static int mpc85xx_mc_err_probe(struct platform_device *op)
  866. {
  867. struct mem_ctl_info *mci;
  868. struct edac_mc_layer layers[2];
  869. struct mpc85xx_mc_pdata *pdata;
  870. struct resource r;
  871. u32 sdram_ctl;
  872. int res;
  873. if (!devres_open_group(&op->dev, mpc85xx_mc_err_probe, GFP_KERNEL))
  874. return -ENOMEM;
  875. layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
  876. layers[0].size = 4;
  877. layers[0].is_virt_csrow = true;
  878. layers[1].type = EDAC_MC_LAYER_CHANNEL;
  879. layers[1].size = 1;
  880. layers[1].is_virt_csrow = false;
  881. mci = edac_mc_alloc(edac_mc_idx, ARRAY_SIZE(layers), layers,
  882. sizeof(*pdata));
  883. if (!mci) {
  884. devres_release_group(&op->dev, mpc85xx_mc_err_probe);
  885. return -ENOMEM;
  886. }
  887. pdata = mci->pvt_info;
  888. pdata->name = "mpc85xx_mc_err";
  889. pdata->irq = NO_IRQ;
  890. mci->pdev = &op->dev;
  891. pdata->edac_idx = edac_mc_idx++;
  892. dev_set_drvdata(mci->pdev, mci);
  893. mci->ctl_name = pdata->name;
  894. mci->dev_name = pdata->name;
  895. res = of_address_to_resource(op->dev.of_node, 0, &r);
  896. if (res) {
  897. printk(KERN_ERR "%s: Unable to get resource for MC err regs\n",
  898. __func__);
  899. goto err;
  900. }
  901. if (!devm_request_mem_region(&op->dev, r.start, resource_size(&r),
  902. pdata->name)) {
  903. printk(KERN_ERR "%s: Error while requesting mem region\n",
  904. __func__);
  905. res = -EBUSY;
  906. goto err;
  907. }
  908. pdata->mc_vbase = devm_ioremap(&op->dev, r.start, resource_size(&r));
  909. if (!pdata->mc_vbase) {
  910. printk(KERN_ERR "%s: Unable to setup MC err regs\n", __func__);
  911. res = -ENOMEM;
  912. goto err;
  913. }
  914. sdram_ctl = in_be32(pdata->mc_vbase + MPC85XX_MC_DDR_SDRAM_CFG);
  915. if (!(sdram_ctl & DSC_ECC_EN)) {
  916. /* no ECC */
  917. printk(KERN_WARNING "%s: No ECC DIMMs discovered\n", __func__);
  918. res = -ENODEV;
  919. goto err;
  920. }
  921. edac_dbg(3, "init mci\n");
  922. mci->mtype_cap = MEM_FLAG_RDDR | MEM_FLAG_RDDR2 |
  923. MEM_FLAG_DDR | MEM_FLAG_DDR2;
  924. mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
  925. mci->edac_cap = EDAC_FLAG_SECDED;
  926. mci->mod_name = EDAC_MOD_STR;
  927. mci->mod_ver = MPC85XX_REVISION;
  928. if (edac_op_state == EDAC_OPSTATE_POLL)
  929. mci->edac_check = mpc85xx_mc_check;
  930. mci->ctl_page_to_phys = NULL;
  931. mci->scrub_mode = SCRUB_SW_SRC;
  932. mpc85xx_init_csrows(mci);
  933. /* store the original error disable bits */
  934. orig_ddr_err_disable =
  935. in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE);
  936. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE, 0);
  937. /* clear all error bits */
  938. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, ~0);
  939. if (edac_mc_add_mc_with_groups(mci, mpc85xx_dev_groups)) {
  940. edac_dbg(3, "failed edac_mc_add_mc()\n");
  941. goto err;
  942. }
  943. if (edac_op_state == EDAC_OPSTATE_INT) {
  944. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_INT_EN,
  945. DDR_EIE_MBEE | DDR_EIE_SBEE);
  946. /* store the original error management threshold */
  947. orig_ddr_err_sbe = in_be32(pdata->mc_vbase +
  948. MPC85XX_MC_ERR_SBE) & 0xff0000;
  949. /* set threshold to 1 error per interrupt */
  950. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, 0x10000);
  951. /* register interrupts */
  952. pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0);
  953. res = devm_request_irq(&op->dev, pdata->irq,
  954. mpc85xx_mc_isr,
  955. IRQF_SHARED,
  956. "[EDAC] MC err", mci);
  957. if (res < 0) {
  958. printk(KERN_ERR "%s: Unable to request irq %d for "
  959. "MPC85xx DRAM ERR\n", __func__, pdata->irq);
  960. irq_dispose_mapping(pdata->irq);
  961. res = -ENODEV;
  962. goto err2;
  963. }
  964. printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for MC\n",
  965. pdata->irq);
  966. }
  967. devres_remove_group(&op->dev, mpc85xx_mc_err_probe);
  968. edac_dbg(3, "success\n");
  969. printk(KERN_INFO EDAC_MOD_STR " MC err registered\n");
  970. return 0;
  971. err2:
  972. edac_mc_del_mc(&op->dev);
  973. err:
  974. devres_release_group(&op->dev, mpc85xx_mc_err_probe);
  975. edac_mc_free(mci);
  976. return res;
  977. }
  978. static int mpc85xx_mc_err_remove(struct platform_device *op)
  979. {
  980. struct mem_ctl_info *mci = dev_get_drvdata(&op->dev);
  981. struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
  982. edac_dbg(0, "\n");
  983. if (edac_op_state == EDAC_OPSTATE_INT) {
  984. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_INT_EN, 0);
  985. irq_dispose_mapping(pdata->irq);
  986. }
  987. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE,
  988. orig_ddr_err_disable);
  989. out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, orig_ddr_err_sbe);
  990. edac_mc_del_mc(&op->dev);
  991. edac_mc_free(mci);
  992. return 0;
  993. }
  994. static const struct of_device_id mpc85xx_mc_err_of_match[] = {
  995. /* deprecate the fsl,85.. forms in the future, 2.6.30? */
  996. { .compatible = "fsl,8540-memory-controller", },
  997. { .compatible = "fsl,8541-memory-controller", },
  998. { .compatible = "fsl,8544-memory-controller", },
  999. { .compatible = "fsl,8548-memory-controller", },
  1000. { .compatible = "fsl,8555-memory-controller", },
  1001. { .compatible = "fsl,8568-memory-controller", },
  1002. { .compatible = "fsl,mpc8536-memory-controller", },
  1003. { .compatible = "fsl,mpc8540-memory-controller", },
  1004. { .compatible = "fsl,mpc8541-memory-controller", },
  1005. { .compatible = "fsl,mpc8544-memory-controller", },
  1006. { .compatible = "fsl,mpc8548-memory-controller", },
  1007. { .compatible = "fsl,mpc8555-memory-controller", },
  1008. { .compatible = "fsl,mpc8560-memory-controller", },
  1009. { .compatible = "fsl,mpc8568-memory-controller", },
  1010. { .compatible = "fsl,mpc8569-memory-controller", },
  1011. { .compatible = "fsl,mpc8572-memory-controller", },
  1012. { .compatible = "fsl,mpc8349-memory-controller", },
  1013. { .compatible = "fsl,p1020-memory-controller", },
  1014. { .compatible = "fsl,p1021-memory-controller", },
  1015. { .compatible = "fsl,p2020-memory-controller", },
  1016. { .compatible = "fsl,qoriq-memory-controller", },
  1017. {},
  1018. };
  1019. MODULE_DEVICE_TABLE(of, mpc85xx_mc_err_of_match);
  1020. static struct platform_driver mpc85xx_mc_err_driver = {
  1021. .probe = mpc85xx_mc_err_probe,
  1022. .remove = mpc85xx_mc_err_remove,
  1023. .driver = {
  1024. .name = "mpc85xx_mc_err",
  1025. .of_match_table = mpc85xx_mc_err_of_match,
  1026. },
  1027. };
  1028. #ifdef CONFIG_FSL_SOC_BOOKE
  1029. static void __init mpc85xx_mc_clear_rfxe(void *data)
  1030. {
  1031. orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1);
  1032. mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~HID1_RFXE));
  1033. }
  1034. #endif
  1035. static struct platform_driver * const drivers[] = {
  1036. &mpc85xx_mc_err_driver,
  1037. &mpc85xx_l2_err_driver,
  1038. #ifdef CONFIG_PCI
  1039. &mpc85xx_pci_err_driver,
  1040. #endif
  1041. };
  1042. static int __init mpc85xx_mc_init(void)
  1043. {
  1044. int res = 0;
  1045. u32 __maybe_unused pvr = 0;
  1046. printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, "
  1047. "(C) 2006 Montavista Software\n");
  1048. /* make sure error reporting method is sane */
  1049. switch (edac_op_state) {
  1050. case EDAC_OPSTATE_POLL:
  1051. case EDAC_OPSTATE_INT:
  1052. break;
  1053. default:
  1054. edac_op_state = EDAC_OPSTATE_INT;
  1055. break;
  1056. }
  1057. res = platform_register_drivers(drivers, ARRAY_SIZE(drivers));
  1058. if (res)
  1059. printk(KERN_WARNING EDAC_MOD_STR "drivers fail to register\n");
  1060. #ifdef CONFIG_FSL_SOC_BOOKE
  1061. pvr = mfspr(SPRN_PVR);
  1062. if ((PVR_VER(pvr) == PVR_VER_E500V1) ||
  1063. (PVR_VER(pvr) == PVR_VER_E500V2)) {
  1064. /*
  1065. * need to clear HID1[RFXE] to disable machine check int
  1066. * so we can catch it
  1067. */
  1068. if (edac_op_state == EDAC_OPSTATE_INT)
  1069. on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0);
  1070. }
  1071. #endif
  1072. return 0;
  1073. }
  1074. module_init(mpc85xx_mc_init);
  1075. #ifdef CONFIG_FSL_SOC_BOOKE
  1076. static void __exit mpc85xx_mc_restore_hid1(void *data)
  1077. {
  1078. mtspr(SPRN_HID1, orig_hid1[smp_processor_id()]);
  1079. }
  1080. #endif
  1081. static void __exit mpc85xx_mc_exit(void)
  1082. {
  1083. #ifdef CONFIG_FSL_SOC_BOOKE
  1084. u32 pvr = mfspr(SPRN_PVR);
  1085. if ((PVR_VER(pvr) == PVR_VER_E500V1) ||
  1086. (PVR_VER(pvr) == PVR_VER_E500V2)) {
  1087. on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0);
  1088. }
  1089. #endif
  1090. platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
  1091. }
  1092. module_exit(mpc85xx_mc_exit);
  1093. MODULE_LICENSE("GPL");
  1094. MODULE_AUTHOR("Montavista Software, Inc.");
  1095. module_param(edac_op_state, int, 0444);
  1096. MODULE_PARM_DESC(edac_op_state,
  1097. "EDAC Error Reporting state: 0=Poll, 2=Interrupt");