igen6_edac.c 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Driver for Intel client SoC with integrated memory controller using IBECC
  4. *
  5. * Copyright (C) 2020 Intel Corporation
  6. *
  7. * The In-Band ECC (IBECC) IP provides ECC protection to all or specific
  8. * regions of the physical memory space. It's used for memory controllers
  9. * that don't support the out-of-band ECC which often needs an additional
  10. * storage device to each channel for storing ECC data.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/init.h>
  14. #include <linux/pci.h>
  15. #include <linux/slab.h>
  16. #include <linux/irq_work.h>
  17. #include <linux/llist.h>
  18. #include <linux/genalloc.h>
  19. #include <linux/edac.h>
  20. #include <linux/bits.h>
  21. #include <linux/bitfield.h>
  22. #include <linux/io.h>
  23. #include <asm/mach_traps.h>
  24. #include <asm/nmi.h>
  25. #include <asm/mce.h>
  26. #include "edac_mc.h"
  27. #include "edac_module.h"
  28. #define IGEN6_REVISION "v2.5.1"
  29. #define EDAC_MOD_STR "igen6_edac"
  30. #define IGEN6_NMI_NAME "igen6_ibecc"
  31. /* Debug macros */
  32. #define igen6_printk(level, fmt, arg...) \
  33. edac_printk(level, "igen6", fmt, ##arg)
  34. #define igen6_mc_printk(mci, level, fmt, arg...) \
  35. edac_mc_chipset_printk(mci, level, "igen6", fmt, ##arg)
  36. #define GET_BITFIELD(v, lo, hi) (((v) & GENMASK_ULL(hi, lo)) >> (lo))
  37. #define NUM_IMC 2 /* Max memory controllers */
  38. #define NUM_CHANNELS 2 /* Max channels */
  39. #define NUM_DIMMS 2 /* Max DIMMs per channel */
  40. #define _4GB BIT_ULL(32)
  41. /* Size of physical memory */
  42. #define TOM_OFFSET 0xa0
  43. /* Top of low usable DRAM */
  44. #define TOLUD_OFFSET 0xbc
  45. /* Capability register C */
  46. #define CAPID_C_OFFSET 0xec
  47. #define CAPID_C_IBECC BIT(15)
  48. /* Capability register E */
  49. #define CAPID_E_OFFSET 0xf0
  50. #define CAPID_E_IBECC BIT(12)
  51. #define CAPID_E_IBECC_BIT18 BIT(18)
  52. /* Error Status */
  53. #define ERRSTS_OFFSET 0xc8
  54. #define ERRSTS_CE BIT_ULL(6)
  55. #define ERRSTS_UE BIT_ULL(7)
  56. /* Error Command */
  57. #define ERRCMD_OFFSET 0xca
  58. #define ERRCMD_CE BIT_ULL(6)
  59. #define ERRCMD_UE BIT_ULL(7)
  60. /* IBECC MMIO base address */
  61. #define IBECC_BASE (res_cfg->ibecc_base)
  62. #define IBECC_ACTIVATE_OFFSET IBECC_BASE
  63. #define IBECC_ACTIVATE_EN BIT(0)
  64. /* IBECC error log */
  65. #define ECC_ERROR_LOG_OFFSET (IBECC_BASE + res_cfg->ibecc_error_log_offset)
  66. #define ECC_ERROR_LOG_CE BIT_ULL(62)
  67. #define ECC_ERROR_LOG_UE BIT_ULL(63)
  68. #define ECC_ERROR_LOG_SYND(v) GET_BITFIELD(v, 46, 61)
  69. /* Host MMIO base address */
  70. #define MCHBAR_OFFSET 0x48
  71. #define MCHBAR_EN BIT_ULL(0)
  72. #define MCHBAR_SIZE 0x10000
  73. /* Parameters for the channel decode stage */
  74. #define IMC_BASE (res_cfg->imc_base)
  75. #define MAD_INTER_CHANNEL_OFFSET IMC_BASE
  76. #define MAD_INTER_CHANNEL_DDR_TYPE(v) GET_BITFIELD(v, 0, 2)
  77. #define MAD_INTER_CHANNEL_ECHM(v) GET_BITFIELD(v, 3, 3)
  78. #define MAD_INTER_CHANNEL_CH_L_MAP(v) GET_BITFIELD(v, 4, 4)
  79. #define MAD_INTER_CHANNEL_CH_S_SIZE(v) ((u64)GET_BITFIELD(v, 12, 19) << 29)
  80. /* Parameters for DRAM decode stage */
  81. #define MAD_INTRA_CH0_OFFSET (IMC_BASE + 4)
  82. #define MAD_INTRA_CH_DIMM_L_MAP(v) GET_BITFIELD(v, 0, 0)
  83. /* DIMM characteristics */
  84. #define MAD_DIMM_CH0_OFFSET (IMC_BASE + 0xc)
  85. #define MAD_DIMM_CH_DIMM_L_SIZE(v) ((u64)GET_BITFIELD(v, 0, 6) << 29)
  86. #define MAD_DIMM_CH_DLW(v) GET_BITFIELD(v, 7, 8)
  87. #define MAD_DIMM_CH_DIMM_S_SIZE(v) ((u64)GET_BITFIELD(v, 16, 22) << 29)
  88. #define MAD_DIMM_CH_DSW(v) GET_BITFIELD(v, 24, 25)
  89. /* Hash for memory controller selection */
  90. #define MAD_MC_HASH_OFFSET (IMC_BASE + 0x1b8)
  91. #define MAC_MC_HASH_LSB(v) GET_BITFIELD(v, 1, 3)
  92. /* Hash for channel selection */
  93. #define CHANNEL_HASH_OFFSET (IMC_BASE + 0x24)
  94. /* Hash for enhanced channel selection */
  95. #define CHANNEL_EHASH_OFFSET (IMC_BASE + 0x28)
  96. #define CHANNEL_HASH_MASK(v) (GET_BITFIELD(v, 6, 19) << 6)
  97. #define CHANNEL_HASH_LSB_MASK_BIT(v) GET_BITFIELD(v, 24, 26)
  98. #define CHANNEL_HASH_MODE(v) GET_BITFIELD(v, 28, 28)
  99. /* Parameters for memory slice decode stage */
  100. #define MEM_SLICE_HASH_MASK(v) (GET_BITFIELD(v, 6, 19) << 6)
  101. #define MEM_SLICE_HASH_LSB_MASK_BIT(v) GET_BITFIELD(v, 24, 26)
  102. static struct res_config {
  103. bool machine_check;
  104. /* The number of present memory controllers. */
  105. int num_imc;
  106. /* Host MMIO configuration */
  107. u64 reg_mchbar_mask;
  108. /* Top of memory */
  109. u64 reg_tom_mask;
  110. /* Top of upper usable DRAM */
  111. u64 reg_touud_mask;
  112. /* IBECC error log */
  113. u64 reg_eccerrlog_addr_mask;
  114. u32 imc_base;
  115. u32 cmf_base;
  116. u32 cmf_size;
  117. u32 ms_hash_offset;
  118. u32 ibecc_base;
  119. u32 ibecc_error_log_offset;
  120. bool (*ibecc_available)(struct pci_dev *pdev);
  121. /* Extract error address logged in IBECC */
  122. u64 (*err_addr)(u64 ecclog);
  123. /* Convert error address logged in IBECC to system physical address */
  124. u64 (*err_addr_to_sys_addr)(u64 eaddr, int mc);
  125. /* Convert error address logged in IBECC to integrated memory controller address */
  126. u64 (*err_addr_to_imc_addr)(u64 eaddr, int mc);
  127. } *res_cfg;
  128. struct igen6_imc {
  129. int mc;
  130. struct mem_ctl_info *mci;
  131. struct pci_dev *pdev;
  132. struct device dev;
  133. void __iomem *window;
  134. u64 size;
  135. u64 ch_s_size;
  136. int ch_l_map;
  137. u64 dimm_s_size[NUM_CHANNELS];
  138. u64 dimm_l_size[NUM_CHANNELS];
  139. int dimm_l_map[NUM_CHANNELS];
  140. };
  141. static struct igen6_pvt {
  142. struct igen6_imc imc[NUM_IMC];
  143. u64 ms_hash;
  144. u64 ms_s_size;
  145. int ms_l_map;
  146. } *igen6_pvt;
  147. /* The top of low usable DRAM */
  148. static u32 igen6_tolud;
  149. /* The size of physical memory */
  150. static u64 igen6_tom;
  151. struct decoded_addr {
  152. int mc;
  153. u64 imc_addr;
  154. u64 sys_addr;
  155. int channel_idx;
  156. u64 channel_addr;
  157. int sub_channel_idx;
  158. u64 sub_channel_addr;
  159. };
  160. struct ecclog_node {
  161. struct llist_node llnode;
  162. int mc;
  163. u64 ecclog;
  164. };
  165. /*
  166. * In the NMI handler, the driver uses the lock-less memory allocator
  167. * to allocate memory to store the IBECC error logs and links the logs
  168. * to the lock-less list. Delay printk() and the work of error reporting
  169. * to EDAC core in a worker.
  170. */
  171. #define ECCLOG_POOL_SIZE PAGE_SIZE
  172. static LLIST_HEAD(ecclog_llist);
  173. static struct gen_pool *ecclog_pool;
  174. static char ecclog_buf[ECCLOG_POOL_SIZE];
  175. static struct irq_work ecclog_irq_work;
  176. static struct work_struct ecclog_work;
  177. /* Compute die IDs for Elkhart Lake with IBECC */
  178. #define DID_EHL_SKU5 0x4514
  179. #define DID_EHL_SKU6 0x4528
  180. #define DID_EHL_SKU7 0x452a
  181. #define DID_EHL_SKU8 0x4516
  182. #define DID_EHL_SKU9 0x452c
  183. #define DID_EHL_SKU10 0x452e
  184. #define DID_EHL_SKU11 0x4532
  185. #define DID_EHL_SKU12 0x4518
  186. #define DID_EHL_SKU13 0x451a
  187. #define DID_EHL_SKU14 0x4534
  188. #define DID_EHL_SKU15 0x4536
  189. /* Compute die IDs for ICL-NNPI with IBECC */
  190. #define DID_ICL_SKU8 0x4581
  191. #define DID_ICL_SKU10 0x4585
  192. #define DID_ICL_SKU11 0x4589
  193. #define DID_ICL_SKU12 0x458d
  194. /* Compute die IDs for Tiger Lake with IBECC */
  195. #define DID_TGL_SKU 0x9a14
  196. /* Compute die IDs for Alder Lake with IBECC */
  197. #define DID_ADL_SKU1 0x4601
  198. #define DID_ADL_SKU2 0x4602
  199. #define DID_ADL_SKU3 0x4621
  200. #define DID_ADL_SKU4 0x4641
  201. /* Compute die IDs for Alder Lake-N with IBECC */
  202. #define DID_ADL_N_SKU1 0x4614
  203. #define DID_ADL_N_SKU2 0x4617
  204. #define DID_ADL_N_SKU3 0x461b
  205. #define DID_ADL_N_SKU4 0x461c
  206. #define DID_ADL_N_SKU5 0x4673
  207. #define DID_ADL_N_SKU6 0x4674
  208. #define DID_ADL_N_SKU7 0x4675
  209. #define DID_ADL_N_SKU8 0x4677
  210. #define DID_ADL_N_SKU9 0x4678
  211. #define DID_ADL_N_SKU10 0x4679
  212. #define DID_ADL_N_SKU11 0x467c
  213. #define DID_ADL_N_SKU12 0x4632
  214. /* Compute die IDs for Arizona Beach with IBECC */
  215. #define DID_AZB_SKU1 0x4676
  216. /* Compute did IDs for Amston Lake with IBECC */
  217. #define DID_ASL_SKU1 0x464a
  218. #define DID_ASL_SKU2 0x4646
  219. #define DID_ASL_SKU3 0x4652
  220. /* Compute die IDs for Raptor Lake-P with IBECC */
  221. #define DID_RPL_P_SKU1 0xa706
  222. #define DID_RPL_P_SKU2 0xa707
  223. #define DID_RPL_P_SKU3 0xa708
  224. #define DID_RPL_P_SKU4 0xa716
  225. #define DID_RPL_P_SKU5 0xa718
  226. /* Compute die IDs for Meteor Lake-PS with IBECC */
  227. #define DID_MTL_PS_SKU1 0x7d21
  228. #define DID_MTL_PS_SKU2 0x7d22
  229. #define DID_MTL_PS_SKU3 0x7d23
  230. #define DID_MTL_PS_SKU4 0x7d24
  231. /* Compute die IDs for Meteor Lake-P with IBECC */
  232. #define DID_MTL_P_SKU1 0x7d01
  233. #define DID_MTL_P_SKU2 0x7d02
  234. #define DID_MTL_P_SKU3 0x7d14
  235. /* Compute die IDs for Arrow Lake-UH with IBECC */
  236. #define DID_ARL_UH_SKU1 0x7d06
  237. #define DID_ARL_UH_SKU2 0x7d20
  238. #define DID_ARL_UH_SKU3 0x7d30
  239. /* Compute die IDs for Panther Lake-H with IBECC */
  240. #define DID_PTL_H_SKU1 0xb000
  241. #define DID_PTL_H_SKU2 0xb001
  242. #define DID_PTL_H_SKU3 0xb002
  243. #define DID_PTL_H_SKU4 0xb003
  244. #define DID_PTL_H_SKU5 0xb004
  245. #define DID_PTL_H_SKU6 0xb005
  246. #define DID_PTL_H_SKU7 0xb008
  247. #define DID_PTL_H_SKU8 0xb011
  248. #define DID_PTL_H_SKU9 0xb014
  249. #define DID_PTL_H_SKU10 0xb015
  250. #define DID_PTL_H_SKU11 0xb028
  251. #define DID_PTL_H_SKU12 0xb029
  252. #define DID_PTL_H_SKU13 0xb02a
  253. /* Compute die IDs for Wildcat Lake with IBECC */
  254. #define DID_WCL_SKU1 0xfd00
  255. static int get_mchbar(struct pci_dev *pdev, u64 *mchbar)
  256. {
  257. union {
  258. u64 v;
  259. struct {
  260. u32 v_lo;
  261. u32 v_hi;
  262. };
  263. } u;
  264. if (pci_read_config_dword(pdev, MCHBAR_OFFSET, &u.v_lo)) {
  265. igen6_printk(KERN_ERR, "Failed to read lower MCHBAR\n");
  266. return -ENODEV;
  267. }
  268. if (pci_read_config_dword(pdev, MCHBAR_OFFSET + 4, &u.v_hi)) {
  269. igen6_printk(KERN_ERR, "Failed to read upper MCHBAR\n");
  270. return -ENODEV;
  271. }
  272. if (!(u.v & MCHBAR_EN)) {
  273. igen6_printk(KERN_ERR, "MCHBAR is disabled\n");
  274. return -ENODEV;
  275. }
  276. *mchbar = u.v & res_cfg->reg_mchbar_mask;
  277. edac_dbg(2, "MCHBAR 0x%llx (reg 0x%llx)\n", *mchbar, u.v);
  278. return 0;
  279. }
  280. static bool ehl_ibecc_available(struct pci_dev *pdev)
  281. {
  282. u32 v;
  283. if (pci_read_config_dword(pdev, CAPID_C_OFFSET, &v))
  284. return false;
  285. return !!(CAPID_C_IBECC & v);
  286. }
  287. static u64 ehl_err_addr_to_sys_addr(u64 eaddr, int mc)
  288. {
  289. return eaddr;
  290. }
  291. static u64 ehl_err_addr_to_imc_addr(u64 eaddr, int mc)
  292. {
  293. if (eaddr < igen6_tolud)
  294. return eaddr;
  295. if (igen6_tom <= _4GB)
  296. return eaddr + igen6_tolud - _4GB;
  297. if (eaddr >= igen6_tom)
  298. return eaddr + igen6_tolud - igen6_tom;
  299. return eaddr;
  300. }
  301. static bool icl_ibecc_available(struct pci_dev *pdev)
  302. {
  303. u32 v;
  304. if (pci_read_config_dword(pdev, CAPID_C_OFFSET, &v))
  305. return false;
  306. return !(CAPID_C_IBECC & v) &&
  307. (boot_cpu_data.x86_stepping >= 1);
  308. }
  309. static bool tgl_ibecc_available(struct pci_dev *pdev)
  310. {
  311. u32 v;
  312. if (pci_read_config_dword(pdev, CAPID_E_OFFSET, &v))
  313. return false;
  314. return !(CAPID_E_IBECC & v);
  315. }
  316. static bool mtl_p_ibecc_available(struct pci_dev *pdev)
  317. {
  318. u32 v;
  319. if (pci_read_config_dword(pdev, CAPID_E_OFFSET, &v))
  320. return false;
  321. return !(CAPID_E_IBECC_BIT18 & v);
  322. }
  323. static bool mtl_ps_ibecc_available(struct pci_dev *pdev)
  324. {
  325. #define MCHBAR_MEMSS_IBECCDIS 0x13c00
  326. void __iomem *window;
  327. u64 mchbar;
  328. u32 val;
  329. if (get_mchbar(pdev, &mchbar))
  330. return false;
  331. window = ioremap(mchbar, MCHBAR_SIZE * 2);
  332. if (!window) {
  333. igen6_printk(KERN_ERR, "Failed to ioremap 0x%llx\n", mchbar);
  334. return false;
  335. }
  336. val = readl(window + MCHBAR_MEMSS_IBECCDIS);
  337. iounmap(window);
  338. /* Bit6: 1 - IBECC is disabled, 0 - IBECC isn't disabled */
  339. return !GET_BITFIELD(val, 6, 6);
  340. }
  341. static u64 mem_addr_to_sys_addr(u64 maddr)
  342. {
  343. if (maddr < igen6_tolud)
  344. return maddr;
  345. if (igen6_tom <= _4GB)
  346. return maddr - igen6_tolud + _4GB;
  347. if (maddr < _4GB)
  348. return maddr - igen6_tolud + igen6_tom;
  349. return maddr;
  350. }
  351. static u64 mem_slice_hash(u64 addr, u64 mask, u64 hash_init, int intlv_bit)
  352. {
  353. u64 hash_addr = addr & mask, hash = hash_init;
  354. u64 intlv = (addr >> intlv_bit) & 1;
  355. int i;
  356. for (i = 6; i < 20; i++)
  357. hash ^= (hash_addr >> i) & 1;
  358. return hash ^ intlv;
  359. }
  360. static u64 tgl_err_addr_to_mem_addr(u64 eaddr, int mc)
  361. {
  362. u64 maddr, hash, mask, ms_s_size;
  363. int intlv_bit;
  364. u32 ms_hash;
  365. ms_s_size = igen6_pvt->ms_s_size;
  366. if (eaddr >= ms_s_size)
  367. return eaddr + ms_s_size;
  368. ms_hash = igen6_pvt->ms_hash;
  369. mask = MEM_SLICE_HASH_MASK(ms_hash);
  370. intlv_bit = MEM_SLICE_HASH_LSB_MASK_BIT(ms_hash) + 6;
  371. maddr = GET_BITFIELD(eaddr, intlv_bit, 63) << (intlv_bit + 1) |
  372. GET_BITFIELD(eaddr, 0, intlv_bit - 1);
  373. hash = mem_slice_hash(maddr, mask, mc, intlv_bit);
  374. return maddr | (hash << intlv_bit);
  375. }
  376. static u64 tgl_err_addr_to_sys_addr(u64 eaddr, int mc)
  377. {
  378. u64 maddr = tgl_err_addr_to_mem_addr(eaddr, mc);
  379. return mem_addr_to_sys_addr(maddr);
  380. }
  381. static u64 tgl_err_addr_to_imc_addr(u64 eaddr, int mc)
  382. {
  383. return eaddr;
  384. }
  385. static u64 adl_err_addr_to_sys_addr(u64 eaddr, int mc)
  386. {
  387. return mem_addr_to_sys_addr(eaddr);
  388. }
  389. static u64 adl_err_addr_to_imc_addr(u64 eaddr, int mc)
  390. {
  391. u64 imc_addr, ms_s_size = igen6_pvt->ms_s_size;
  392. struct igen6_imc *imc = &igen6_pvt->imc[mc];
  393. int intlv_bit;
  394. u32 mc_hash;
  395. if (eaddr >= 2 * ms_s_size)
  396. return eaddr - ms_s_size;
  397. mc_hash = readl(imc->window + MAD_MC_HASH_OFFSET);
  398. intlv_bit = MAC_MC_HASH_LSB(mc_hash) + 6;
  399. imc_addr = GET_BITFIELD(eaddr, intlv_bit + 1, 63) << intlv_bit |
  400. GET_BITFIELD(eaddr, 0, intlv_bit - 1);
  401. return imc_addr;
  402. }
  403. static u64 rpl_p_err_addr(u64 ecclog)
  404. {
  405. return field_get(res_cfg->reg_eccerrlog_addr_mask, ecclog);
  406. }
  407. static struct res_config ehl_cfg = {
  408. .num_imc = 1,
  409. .reg_mchbar_mask = GENMASK_ULL(38, 16),
  410. .reg_tom_mask = GENMASK_ULL(38, 20),
  411. .reg_touud_mask = GENMASK_ULL(38, 20),
  412. .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
  413. .imc_base = 0x5000,
  414. .ibecc_base = 0xdc00,
  415. .ibecc_available = ehl_ibecc_available,
  416. .ibecc_error_log_offset = 0x170,
  417. .err_addr_to_sys_addr = ehl_err_addr_to_sys_addr,
  418. .err_addr_to_imc_addr = ehl_err_addr_to_imc_addr,
  419. };
  420. static struct res_config icl_cfg = {
  421. .num_imc = 1,
  422. .reg_mchbar_mask = GENMASK_ULL(38, 16),
  423. .reg_tom_mask = GENMASK_ULL(38, 20),
  424. .reg_touud_mask = GENMASK_ULL(38, 20),
  425. .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
  426. .imc_base = 0x5000,
  427. .ibecc_base = 0xd800,
  428. .ibecc_error_log_offset = 0x170,
  429. .ibecc_available = icl_ibecc_available,
  430. .err_addr_to_sys_addr = ehl_err_addr_to_sys_addr,
  431. .err_addr_to_imc_addr = ehl_err_addr_to_imc_addr,
  432. };
  433. static struct res_config tgl_cfg = {
  434. .machine_check = true,
  435. .num_imc = 2,
  436. .reg_mchbar_mask = GENMASK_ULL(38, 17),
  437. .reg_tom_mask = GENMASK_ULL(38, 20),
  438. .reg_touud_mask = GENMASK_ULL(38, 20),
  439. .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
  440. .imc_base = 0x5000,
  441. .cmf_base = 0x11000,
  442. .cmf_size = 0x800,
  443. .ms_hash_offset = 0xac,
  444. .ibecc_base = 0xd400,
  445. .ibecc_error_log_offset = 0x170,
  446. .ibecc_available = tgl_ibecc_available,
  447. .err_addr_to_sys_addr = tgl_err_addr_to_sys_addr,
  448. .err_addr_to_imc_addr = tgl_err_addr_to_imc_addr,
  449. };
  450. static struct res_config adl_cfg = {
  451. .machine_check = true,
  452. .num_imc = 2,
  453. .reg_mchbar_mask = GENMASK_ULL(41, 17),
  454. .reg_tom_mask = GENMASK_ULL(41, 20),
  455. .reg_touud_mask = GENMASK_ULL(41, 20),
  456. .reg_eccerrlog_addr_mask = GENMASK_ULL(45, 5),
  457. .imc_base = 0xd800,
  458. .ibecc_base = 0xd400,
  459. .ibecc_error_log_offset = 0x68,
  460. .ibecc_available = tgl_ibecc_available,
  461. .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
  462. .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
  463. };
  464. static struct res_config adl_n_cfg = {
  465. .machine_check = true,
  466. .num_imc = 1,
  467. .reg_mchbar_mask = GENMASK_ULL(41, 17),
  468. .reg_tom_mask = GENMASK_ULL(41, 20),
  469. .reg_touud_mask = GENMASK_ULL(41, 20),
  470. .reg_eccerrlog_addr_mask = GENMASK_ULL(45, 5),
  471. .imc_base = 0xd800,
  472. .ibecc_base = 0xd400,
  473. .ibecc_error_log_offset = 0x68,
  474. .ibecc_available = tgl_ibecc_available,
  475. .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
  476. .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
  477. };
  478. static struct res_config rpl_p_cfg = {
  479. .machine_check = true,
  480. .num_imc = 2,
  481. .reg_mchbar_mask = GENMASK_ULL(41, 17),
  482. .reg_tom_mask = GENMASK_ULL(41, 20),
  483. .reg_touud_mask = GENMASK_ULL(41, 20),
  484. .reg_eccerrlog_addr_mask = GENMASK_ULL(45, 5),
  485. .imc_base = 0xd800,
  486. .ibecc_base = 0xd400,
  487. .ibecc_error_log_offset = 0x68,
  488. .ibecc_available = tgl_ibecc_available,
  489. .err_addr = rpl_p_err_addr,
  490. .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
  491. .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
  492. };
  493. static struct res_config mtl_ps_cfg = {
  494. .machine_check = true,
  495. .num_imc = 2,
  496. .reg_mchbar_mask = GENMASK_ULL(41, 17),
  497. .reg_tom_mask = GENMASK_ULL(41, 20),
  498. .reg_touud_mask = GENMASK_ULL(41, 20),
  499. .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
  500. .imc_base = 0xd800,
  501. .ibecc_base = 0xd400,
  502. .ibecc_error_log_offset = 0x170,
  503. .ibecc_available = mtl_ps_ibecc_available,
  504. .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
  505. .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
  506. };
  507. static struct res_config mtl_p_cfg = {
  508. .machine_check = true,
  509. .num_imc = 2,
  510. .reg_mchbar_mask = GENMASK_ULL(41, 17),
  511. .reg_tom_mask = GENMASK_ULL(41, 20),
  512. .reg_touud_mask = GENMASK_ULL(41, 20),
  513. .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
  514. .imc_base = 0xd800,
  515. .ibecc_base = 0xd400,
  516. .ibecc_error_log_offset = 0x170,
  517. .ibecc_available = mtl_p_ibecc_available,
  518. .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
  519. .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
  520. };
  521. static struct res_config wcl_cfg = {
  522. .machine_check = true,
  523. .num_imc = 1,
  524. .reg_mchbar_mask = GENMASK_ULL(41, 17),
  525. .reg_tom_mask = GENMASK_ULL(41, 20),
  526. .reg_touud_mask = GENMASK_ULL(41, 20),
  527. .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
  528. .imc_base = 0xd800,
  529. .ibecc_base = 0xd400,
  530. .ibecc_error_log_offset = 0x170,
  531. .ibecc_available = mtl_p_ibecc_available,
  532. .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
  533. .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
  534. };
  535. static struct pci_device_id igen6_pci_tbl[] = {
  536. { PCI_VDEVICE(INTEL, DID_EHL_SKU5), (kernel_ulong_t)&ehl_cfg },
  537. { PCI_VDEVICE(INTEL, DID_EHL_SKU6), (kernel_ulong_t)&ehl_cfg },
  538. { PCI_VDEVICE(INTEL, DID_EHL_SKU7), (kernel_ulong_t)&ehl_cfg },
  539. { PCI_VDEVICE(INTEL, DID_EHL_SKU8), (kernel_ulong_t)&ehl_cfg },
  540. { PCI_VDEVICE(INTEL, DID_EHL_SKU9), (kernel_ulong_t)&ehl_cfg },
  541. { PCI_VDEVICE(INTEL, DID_EHL_SKU10), (kernel_ulong_t)&ehl_cfg },
  542. { PCI_VDEVICE(INTEL, DID_EHL_SKU11), (kernel_ulong_t)&ehl_cfg },
  543. { PCI_VDEVICE(INTEL, DID_EHL_SKU12), (kernel_ulong_t)&ehl_cfg },
  544. { PCI_VDEVICE(INTEL, DID_EHL_SKU13), (kernel_ulong_t)&ehl_cfg },
  545. { PCI_VDEVICE(INTEL, DID_EHL_SKU14), (kernel_ulong_t)&ehl_cfg },
  546. { PCI_VDEVICE(INTEL, DID_EHL_SKU15), (kernel_ulong_t)&ehl_cfg },
  547. { PCI_VDEVICE(INTEL, DID_ICL_SKU8), (kernel_ulong_t)&icl_cfg },
  548. { PCI_VDEVICE(INTEL, DID_ICL_SKU10), (kernel_ulong_t)&icl_cfg },
  549. { PCI_VDEVICE(INTEL, DID_ICL_SKU11), (kernel_ulong_t)&icl_cfg },
  550. { PCI_VDEVICE(INTEL, DID_ICL_SKU12), (kernel_ulong_t)&icl_cfg },
  551. { PCI_VDEVICE(INTEL, DID_TGL_SKU), (kernel_ulong_t)&tgl_cfg },
  552. { PCI_VDEVICE(INTEL, DID_ADL_SKU1), (kernel_ulong_t)&adl_cfg },
  553. { PCI_VDEVICE(INTEL, DID_ADL_SKU2), (kernel_ulong_t)&adl_cfg },
  554. { PCI_VDEVICE(INTEL, DID_ADL_SKU3), (kernel_ulong_t)&adl_cfg },
  555. { PCI_VDEVICE(INTEL, DID_ADL_SKU4), (kernel_ulong_t)&adl_cfg },
  556. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU1), (kernel_ulong_t)&adl_n_cfg },
  557. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU2), (kernel_ulong_t)&adl_n_cfg },
  558. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU3), (kernel_ulong_t)&adl_n_cfg },
  559. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU4), (kernel_ulong_t)&adl_n_cfg },
  560. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU5), (kernel_ulong_t)&adl_n_cfg },
  561. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU6), (kernel_ulong_t)&adl_n_cfg },
  562. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU7), (kernel_ulong_t)&adl_n_cfg },
  563. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU8), (kernel_ulong_t)&adl_n_cfg },
  564. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU9), (kernel_ulong_t)&adl_n_cfg },
  565. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU10), (kernel_ulong_t)&adl_n_cfg },
  566. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU11), (kernel_ulong_t)&adl_n_cfg },
  567. { PCI_VDEVICE(INTEL, DID_ADL_N_SKU12), (kernel_ulong_t)&adl_n_cfg },
  568. { PCI_VDEVICE(INTEL, DID_AZB_SKU1), (kernel_ulong_t)&adl_n_cfg },
  569. { PCI_VDEVICE(INTEL, DID_ASL_SKU1), (kernel_ulong_t)&adl_n_cfg },
  570. { PCI_VDEVICE(INTEL, DID_ASL_SKU2), (kernel_ulong_t)&adl_n_cfg },
  571. { PCI_VDEVICE(INTEL, DID_ASL_SKU3), (kernel_ulong_t)&adl_n_cfg },
  572. { PCI_VDEVICE(INTEL, DID_RPL_P_SKU1), (kernel_ulong_t)&rpl_p_cfg },
  573. { PCI_VDEVICE(INTEL, DID_RPL_P_SKU2), (kernel_ulong_t)&rpl_p_cfg },
  574. { PCI_VDEVICE(INTEL, DID_RPL_P_SKU3), (kernel_ulong_t)&rpl_p_cfg },
  575. { PCI_VDEVICE(INTEL, DID_RPL_P_SKU4), (kernel_ulong_t)&rpl_p_cfg },
  576. { PCI_VDEVICE(INTEL, DID_RPL_P_SKU5), (kernel_ulong_t)&rpl_p_cfg },
  577. { PCI_VDEVICE(INTEL, DID_MTL_PS_SKU1), (kernel_ulong_t)&mtl_ps_cfg },
  578. { PCI_VDEVICE(INTEL, DID_MTL_PS_SKU2), (kernel_ulong_t)&mtl_ps_cfg },
  579. { PCI_VDEVICE(INTEL, DID_MTL_PS_SKU3), (kernel_ulong_t)&mtl_ps_cfg },
  580. { PCI_VDEVICE(INTEL, DID_MTL_PS_SKU4), (kernel_ulong_t)&mtl_ps_cfg },
  581. { PCI_VDEVICE(INTEL, DID_MTL_P_SKU1), (kernel_ulong_t)&mtl_p_cfg },
  582. { PCI_VDEVICE(INTEL, DID_MTL_P_SKU2), (kernel_ulong_t)&mtl_p_cfg },
  583. { PCI_VDEVICE(INTEL, DID_MTL_P_SKU3), (kernel_ulong_t)&mtl_p_cfg },
  584. { PCI_VDEVICE(INTEL, DID_ARL_UH_SKU1), (kernel_ulong_t)&mtl_p_cfg },
  585. { PCI_VDEVICE(INTEL, DID_ARL_UH_SKU2), (kernel_ulong_t)&mtl_p_cfg },
  586. { PCI_VDEVICE(INTEL, DID_ARL_UH_SKU3), (kernel_ulong_t)&mtl_p_cfg },
  587. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU1), (kernel_ulong_t)&mtl_p_cfg },
  588. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU2), (kernel_ulong_t)&mtl_p_cfg },
  589. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU3), (kernel_ulong_t)&mtl_p_cfg },
  590. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU4), (kernel_ulong_t)&mtl_p_cfg },
  591. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU5), (kernel_ulong_t)&mtl_p_cfg },
  592. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU6), (kernel_ulong_t)&mtl_p_cfg },
  593. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU7), (kernel_ulong_t)&mtl_p_cfg },
  594. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU8), (kernel_ulong_t)&mtl_p_cfg },
  595. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU9), (kernel_ulong_t)&mtl_p_cfg },
  596. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU10), (kernel_ulong_t)&mtl_p_cfg },
  597. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU11), (kernel_ulong_t)&mtl_p_cfg },
  598. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU12), (kernel_ulong_t)&mtl_p_cfg },
  599. { PCI_VDEVICE(INTEL, DID_PTL_H_SKU13), (kernel_ulong_t)&mtl_p_cfg },
  600. { PCI_VDEVICE(INTEL, DID_WCL_SKU1), (kernel_ulong_t)&wcl_cfg },
  601. { },
  602. };
  603. MODULE_DEVICE_TABLE(pci, igen6_pci_tbl);
  604. static enum dev_type get_width(int dimm_l, u32 mad_dimm)
  605. {
  606. u32 w = dimm_l ? MAD_DIMM_CH_DLW(mad_dimm) :
  607. MAD_DIMM_CH_DSW(mad_dimm);
  608. switch (w) {
  609. case 0:
  610. return DEV_X8;
  611. case 1:
  612. return DEV_X16;
  613. case 2:
  614. return DEV_X32;
  615. default:
  616. return DEV_UNKNOWN;
  617. }
  618. }
  619. static enum mem_type get_memory_type(u32 mad_inter)
  620. {
  621. u32 t = MAD_INTER_CHANNEL_DDR_TYPE(mad_inter);
  622. switch (t) {
  623. case 0:
  624. return MEM_DDR4;
  625. case 1:
  626. return MEM_DDR3;
  627. case 2:
  628. return MEM_LPDDR3;
  629. case 3:
  630. return MEM_LPDDR4;
  631. case 4:
  632. return MEM_WIO2;
  633. default:
  634. return MEM_UNKNOWN;
  635. }
  636. }
  637. static int decode_chan_idx(u64 addr, u64 mask, int intlv_bit)
  638. {
  639. u64 hash_addr = addr & mask, hash = 0;
  640. u64 intlv = (addr >> intlv_bit) & 1;
  641. int i;
  642. for (i = 6; i < 20; i++)
  643. hash ^= (hash_addr >> i) & 1;
  644. return (int)hash ^ intlv;
  645. }
  646. static u64 decode_channel_addr(u64 addr, int intlv_bit)
  647. {
  648. u64 channel_addr;
  649. /* Remove the interleave bit and shift upper part down to fill gap */
  650. channel_addr = GET_BITFIELD(addr, intlv_bit + 1, 63) << intlv_bit;
  651. channel_addr |= GET_BITFIELD(addr, 0, intlv_bit - 1);
  652. return channel_addr;
  653. }
  654. static void decode_addr(u64 addr, u32 hash, u64 s_size, int l_map,
  655. int *idx, u64 *sub_addr)
  656. {
  657. int intlv_bit = CHANNEL_HASH_LSB_MASK_BIT(hash) + 6;
  658. if (addr > 2 * s_size) {
  659. *sub_addr = addr - s_size;
  660. *idx = l_map;
  661. return;
  662. }
  663. if (CHANNEL_HASH_MODE(hash)) {
  664. *sub_addr = decode_channel_addr(addr, intlv_bit);
  665. *idx = decode_chan_idx(addr, CHANNEL_HASH_MASK(hash), intlv_bit);
  666. } else {
  667. *sub_addr = decode_channel_addr(addr, 6);
  668. *idx = GET_BITFIELD(addr, 6, 6);
  669. }
  670. }
  671. static int igen6_decode(struct decoded_addr *res)
  672. {
  673. struct igen6_imc *imc = &igen6_pvt->imc[res->mc];
  674. u64 addr = res->imc_addr, sub_addr, s_size;
  675. int idx, l_map;
  676. u32 hash;
  677. if (addr >= igen6_tom) {
  678. edac_dbg(0, "Address 0x%llx out of range\n", addr);
  679. return -EINVAL;
  680. }
  681. /* Decode channel */
  682. hash = readl(imc->window + CHANNEL_HASH_OFFSET);
  683. s_size = imc->ch_s_size;
  684. l_map = imc->ch_l_map;
  685. decode_addr(addr, hash, s_size, l_map, &idx, &sub_addr);
  686. res->channel_idx = idx;
  687. res->channel_addr = sub_addr;
  688. /* Decode sub-channel/DIMM */
  689. hash = readl(imc->window + CHANNEL_EHASH_OFFSET);
  690. s_size = imc->dimm_s_size[idx];
  691. l_map = imc->dimm_l_map[idx];
  692. decode_addr(res->channel_addr, hash, s_size, l_map, &idx, &sub_addr);
  693. res->sub_channel_idx = idx;
  694. res->sub_channel_addr = sub_addr;
  695. return 0;
  696. }
  697. static void igen6_output_error(struct decoded_addr *res,
  698. struct mem_ctl_info *mci, u64 ecclog)
  699. {
  700. enum hw_event_mc_err_type type = ecclog & ECC_ERROR_LOG_UE ?
  701. HW_EVENT_ERR_UNCORRECTED :
  702. HW_EVENT_ERR_CORRECTED;
  703. edac_mc_handle_error(type, mci, 1,
  704. res->sys_addr >> PAGE_SHIFT,
  705. res->sys_addr & ~PAGE_MASK,
  706. ECC_ERROR_LOG_SYND(ecclog),
  707. res->channel_idx, res->sub_channel_idx,
  708. -1, "", "");
  709. }
  710. static struct gen_pool *ecclog_gen_pool_create(void)
  711. {
  712. struct gen_pool *pool;
  713. pool = gen_pool_create(ilog2(sizeof(struct ecclog_node)), -1);
  714. if (!pool)
  715. return NULL;
  716. if (gen_pool_add(pool, (unsigned long)ecclog_buf, ECCLOG_POOL_SIZE, -1)) {
  717. gen_pool_destroy(pool);
  718. return NULL;
  719. }
  720. return pool;
  721. }
  722. static int ecclog_gen_pool_add(int mc, u64 ecclog)
  723. {
  724. struct ecclog_node *node;
  725. node = (void *)gen_pool_alloc(ecclog_pool, sizeof(*node));
  726. if (!node)
  727. return -ENOMEM;
  728. node->mc = mc;
  729. node->ecclog = ecclog;
  730. llist_add(&node->llnode, &ecclog_llist);
  731. return 0;
  732. }
  733. /*
  734. * Either the memory-mapped I/O status register ECC_ERROR_LOG or the PCI
  735. * configuration space status register ERRSTS can indicate whether a
  736. * correctable error or an uncorrectable error occurred. We only use the
  737. * ECC_ERROR_LOG register to check error type, but need to clear both
  738. * registers to enable future error events.
  739. */
  740. static u64 ecclog_read_and_clear(struct igen6_imc *imc)
  741. {
  742. u64 ecclog = readq(imc->window + ECC_ERROR_LOG_OFFSET);
  743. /*
  744. * Quirk: The ECC_ERROR_LOG register of certain SoCs may contain
  745. * the invalid value ~0. This will result in a flood of invalid
  746. * error reports in polling mode. Skip it.
  747. */
  748. if (ecclog == ~0)
  749. return 0;
  750. /* Neither a CE nor a UE. Skip it.*/
  751. if (!(ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)))
  752. return 0;
  753. /* Clear CE/UE bits by writing 1s */
  754. writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
  755. return ecclog;
  756. }
  757. static void errsts_clear(struct igen6_imc *imc)
  758. {
  759. u16 errsts;
  760. if (pci_read_config_word(imc->pdev, ERRSTS_OFFSET, &errsts)) {
  761. igen6_printk(KERN_ERR, "Failed to read ERRSTS\n");
  762. return;
  763. }
  764. /* Clear CE/UE bits by writing 1s */
  765. if (errsts & (ERRSTS_CE | ERRSTS_UE))
  766. pci_write_config_word(imc->pdev, ERRSTS_OFFSET, errsts);
  767. }
  768. static int errcmd_enable_error_reporting(bool enable)
  769. {
  770. struct igen6_imc *imc = &igen6_pvt->imc[0];
  771. u16 errcmd;
  772. int rc;
  773. rc = pci_read_config_word(imc->pdev, ERRCMD_OFFSET, &errcmd);
  774. if (rc)
  775. return pcibios_err_to_errno(rc);
  776. if (enable)
  777. errcmd |= ERRCMD_CE | ERRSTS_UE;
  778. else
  779. errcmd &= ~(ERRCMD_CE | ERRSTS_UE);
  780. rc = pci_write_config_word(imc->pdev, ERRCMD_OFFSET, errcmd);
  781. if (rc)
  782. return pcibios_err_to_errno(rc);
  783. return 0;
  784. }
  785. static int ecclog_handler(void)
  786. {
  787. struct igen6_imc *imc;
  788. int i, n = 0;
  789. u64 ecclog;
  790. for (i = 0; i < res_cfg->num_imc; i++) {
  791. imc = &igen6_pvt->imc[i];
  792. /* errsts_clear() isn't NMI-safe. Delay it in the IRQ context */
  793. ecclog = ecclog_read_and_clear(imc);
  794. if (!ecclog)
  795. continue;
  796. if (!ecclog_gen_pool_add(i, ecclog))
  797. irq_work_queue(&ecclog_irq_work);
  798. n++;
  799. }
  800. return n;
  801. }
  802. static void ecclog_work_cb(struct work_struct *work)
  803. {
  804. struct ecclog_node *node, *tmp;
  805. struct mem_ctl_info *mci;
  806. struct llist_node *head;
  807. struct decoded_addr res;
  808. u64 eaddr;
  809. head = llist_del_all(&ecclog_llist);
  810. if (!head)
  811. return;
  812. llist_for_each_entry_safe(node, tmp, head, llnode) {
  813. memset(&res, 0, sizeof(res));
  814. if (res_cfg->err_addr)
  815. eaddr = res_cfg->err_addr(node->ecclog);
  816. else
  817. eaddr = node->ecclog & res_cfg->reg_eccerrlog_addr_mask;
  818. res.mc = node->mc;
  819. res.sys_addr = res_cfg->err_addr_to_sys_addr(eaddr, res.mc);
  820. res.imc_addr = res_cfg->err_addr_to_imc_addr(eaddr, res.mc);
  821. mci = igen6_pvt->imc[res.mc].mci;
  822. edac_dbg(2, "MC %d, ecclog = 0x%llx\n", node->mc, node->ecclog);
  823. igen6_mc_printk(mci, KERN_DEBUG, "HANDLING IBECC MEMORY ERROR\n");
  824. igen6_mc_printk(mci, KERN_DEBUG, "ADDR 0x%llx ", res.sys_addr);
  825. if (!igen6_decode(&res))
  826. igen6_output_error(&res, mci, node->ecclog);
  827. gen_pool_free(ecclog_pool, (unsigned long)node, sizeof(*node));
  828. }
  829. }
  830. static void ecclog_irq_work_cb(struct irq_work *irq_work)
  831. {
  832. int i;
  833. for (i = 0; i < res_cfg->num_imc; i++)
  834. errsts_clear(&igen6_pvt->imc[i]);
  835. if (!llist_empty(&ecclog_llist))
  836. schedule_work(&ecclog_work);
  837. }
  838. static int ecclog_nmi_handler(unsigned int cmd, struct pt_regs *regs)
  839. {
  840. unsigned char reason;
  841. if (!ecclog_handler())
  842. return NMI_DONE;
  843. /*
  844. * Both In-Band ECC correctable error and uncorrectable error are
  845. * reported by SERR# NMI. The NMI generic code (see pci_serr_error())
  846. * doesn't clear the bit NMI_REASON_CLEAR_SERR (in port 0x61) to
  847. * re-enable the SERR# NMI after NMI handling. So clear this bit here
  848. * to re-enable SERR# NMI for receiving future In-Band ECC errors.
  849. */
  850. reason = x86_platform.get_nmi_reason() & NMI_REASON_CLEAR_MASK;
  851. reason |= NMI_REASON_CLEAR_SERR;
  852. outb(reason, NMI_REASON_PORT);
  853. reason &= ~NMI_REASON_CLEAR_SERR;
  854. outb(reason, NMI_REASON_PORT);
  855. return NMI_HANDLED;
  856. }
  857. static int ecclog_mce_handler(struct notifier_block *nb, unsigned long val,
  858. void *data)
  859. {
  860. struct mce *mce = (struct mce *)data;
  861. char *type;
  862. if (mce->kflags & MCE_HANDLED_CEC)
  863. return NOTIFY_DONE;
  864. /*
  865. * Ignore unless this is a memory related error.
  866. * We don't check the bit MCI_STATUS_ADDRV of MCi_STATUS here,
  867. * since this bit isn't set on some CPU (e.g., Tiger Lake UP3).
  868. */
  869. if ((mce->status & 0xefff) >> 7 != 1)
  870. return NOTIFY_DONE;
  871. if (mce->mcgstatus & MCG_STATUS_MCIP)
  872. type = "Exception";
  873. else
  874. type = "Event";
  875. edac_dbg(0, "CPU %d: Machine Check %s: 0x%llx Bank %d: 0x%llx\n",
  876. mce->extcpu, type, mce->mcgstatus,
  877. mce->bank, mce->status);
  878. edac_dbg(0, "TSC 0x%llx\n", mce->tsc);
  879. edac_dbg(0, "ADDR 0x%llx\n", mce->addr);
  880. edac_dbg(0, "MISC 0x%llx\n", mce->misc);
  881. edac_dbg(0, "PROCESSOR %u:0x%x TIME %llu SOCKET %u APIC 0x%x\n",
  882. mce->cpuvendor, mce->cpuid, mce->time,
  883. mce->socketid, mce->apicid);
  884. /*
  885. * We just use the Machine Check for the memory error notification.
  886. * Each memory controller is associated with an IBECC instance.
  887. * Directly read and clear the error information(error address and
  888. * error type) on all the IBECC instances so that we know on which
  889. * memory controller the memory error(s) occurred.
  890. */
  891. if (!ecclog_handler())
  892. return NOTIFY_DONE;
  893. mce->kflags |= MCE_HANDLED_EDAC;
  894. return NOTIFY_DONE;
  895. }
  896. static struct notifier_block ecclog_mce_dec = {
  897. .notifier_call = ecclog_mce_handler,
  898. .priority = MCE_PRIO_EDAC,
  899. };
  900. static bool igen6_check_ecc(struct igen6_imc *imc)
  901. {
  902. u32 activate = readl(imc->window + IBECC_ACTIVATE_OFFSET);
  903. return !!(activate & IBECC_ACTIVATE_EN);
  904. }
  905. static int igen6_get_dimm_config(struct mem_ctl_info *mci)
  906. {
  907. struct igen6_imc *imc = mci->pvt_info;
  908. u32 mad_inter, mad_intra, mad_dimm;
  909. int i, j, ndimms, mc = imc->mc;
  910. struct dimm_info *dimm;
  911. enum mem_type mtype;
  912. enum dev_type dtype;
  913. u64 dsize;
  914. bool ecc;
  915. edac_dbg(2, "\n");
  916. mad_inter = readl(imc->window + MAD_INTER_CHANNEL_OFFSET);
  917. mtype = get_memory_type(mad_inter);
  918. ecc = igen6_check_ecc(imc);
  919. imc->ch_s_size = MAD_INTER_CHANNEL_CH_S_SIZE(mad_inter);
  920. imc->ch_l_map = MAD_INTER_CHANNEL_CH_L_MAP(mad_inter);
  921. for (i = 0; i < NUM_CHANNELS; i++) {
  922. mad_intra = readl(imc->window + MAD_INTRA_CH0_OFFSET + i * 4);
  923. mad_dimm = readl(imc->window + MAD_DIMM_CH0_OFFSET + i * 4);
  924. imc->dimm_l_size[i] = MAD_DIMM_CH_DIMM_L_SIZE(mad_dimm);
  925. imc->dimm_s_size[i] = MAD_DIMM_CH_DIMM_S_SIZE(mad_dimm);
  926. imc->dimm_l_map[i] = MAD_INTRA_CH_DIMM_L_MAP(mad_intra);
  927. imc->size += imc->dimm_s_size[i];
  928. imc->size += imc->dimm_l_size[i];
  929. ndimms = 0;
  930. for (j = 0; j < NUM_DIMMS; j++) {
  931. dimm = edac_get_dimm(mci, i, j, 0);
  932. if (j ^ imc->dimm_l_map[i]) {
  933. dtype = get_width(0, mad_dimm);
  934. dsize = imc->dimm_s_size[i];
  935. } else {
  936. dtype = get_width(1, mad_dimm);
  937. dsize = imc->dimm_l_size[i];
  938. }
  939. if (!dsize)
  940. continue;
  941. dimm->grain = 64;
  942. dimm->mtype = mtype;
  943. dimm->dtype = dtype;
  944. dimm->nr_pages = MiB_TO_PAGES(dsize >> 20);
  945. dimm->edac_mode = EDAC_SECDED;
  946. snprintf(dimm->label, sizeof(dimm->label),
  947. "MC#%d_Chan#%d_DIMM#%d", mc, i, j);
  948. edac_dbg(0, "MC %d, Channel %d, DIMM %d, Size %llu MiB (%u pages)\n",
  949. mc, i, j, dsize >> 20, dimm->nr_pages);
  950. ndimms++;
  951. }
  952. if (ndimms && !ecc) {
  953. igen6_printk(KERN_ERR, "MC%d In-Band ECC is disabled\n", mc);
  954. return -ENODEV;
  955. }
  956. }
  957. edac_dbg(0, "MC %d, total size %llu MiB\n", mc, imc->size >> 20);
  958. return 0;
  959. }
  960. #ifdef CONFIG_EDAC_DEBUG
  961. /* Top of upper usable DRAM */
  962. static u64 igen6_touud;
  963. #define TOUUD_OFFSET 0xa8
  964. static void igen6_reg_dump(struct igen6_imc *imc)
  965. {
  966. int i;
  967. edac_dbg(2, "CHANNEL_HASH : 0x%x\n",
  968. readl(imc->window + CHANNEL_HASH_OFFSET));
  969. edac_dbg(2, "CHANNEL_EHASH : 0x%x\n",
  970. readl(imc->window + CHANNEL_EHASH_OFFSET));
  971. edac_dbg(2, "MAD_INTER_CHANNEL: 0x%x\n",
  972. readl(imc->window + MAD_INTER_CHANNEL_OFFSET));
  973. edac_dbg(2, "ECC_ERROR_LOG : 0x%llx\n",
  974. readq(imc->window + ECC_ERROR_LOG_OFFSET));
  975. for (i = 0; i < NUM_CHANNELS; i++) {
  976. edac_dbg(2, "MAD_INTRA_CH%d : 0x%x\n", i,
  977. readl(imc->window + MAD_INTRA_CH0_OFFSET + i * 4));
  978. edac_dbg(2, "MAD_DIMM_CH%d : 0x%x\n", i,
  979. readl(imc->window + MAD_DIMM_CH0_OFFSET + i * 4));
  980. }
  981. edac_dbg(2, "TOLUD : 0x%x", igen6_tolud);
  982. edac_dbg(2, "TOUUD : 0x%llx", igen6_touud);
  983. edac_dbg(2, "TOM : 0x%llx", igen6_tom);
  984. }
  985. static struct dentry *igen6_test;
  986. static int debugfs_u64_set(void *data, u64 val)
  987. {
  988. u64 ecclog;
  989. if ((val >= igen6_tolud && val < _4GB) || val >= igen6_touud) {
  990. edac_dbg(0, "Address 0x%llx out of range\n", val);
  991. return 0;
  992. }
  993. pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
  994. ecclog = (val & res_cfg->reg_eccerrlog_addr_mask) | ECC_ERROR_LOG_CE;
  995. if (!ecclog_gen_pool_add(0, ecclog))
  996. irq_work_queue(&ecclog_irq_work);
  997. return 0;
  998. }
  999. DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
  1000. static void igen6_debug_setup(void)
  1001. {
  1002. igen6_test = edac_debugfs_create_dir("igen6_test");
  1003. if (!igen6_test)
  1004. return;
  1005. if (!edac_debugfs_create_file("addr", 0200, igen6_test,
  1006. NULL, &fops_u64_wo)) {
  1007. debugfs_remove(igen6_test);
  1008. igen6_test = NULL;
  1009. }
  1010. }
  1011. static void igen6_debug_teardown(void)
  1012. {
  1013. debugfs_remove_recursive(igen6_test);
  1014. }
  1015. #else
  1016. static void igen6_reg_dump(struct igen6_imc *imc) {}
  1017. static void igen6_debug_setup(void) {}
  1018. static void igen6_debug_teardown(void) {}
  1019. #endif
  1020. static int igen6_pci_setup(struct pci_dev *pdev, u64 *mchbar)
  1021. {
  1022. union {
  1023. u64 v;
  1024. struct {
  1025. u32 v_lo;
  1026. u32 v_hi;
  1027. };
  1028. } u;
  1029. edac_dbg(2, "\n");
  1030. if (!res_cfg->ibecc_available(pdev)) {
  1031. edac_dbg(2, "No In-Band ECC IP\n");
  1032. goto fail;
  1033. }
  1034. if (pci_read_config_dword(pdev, TOLUD_OFFSET, &igen6_tolud)) {
  1035. igen6_printk(KERN_ERR, "Failed to read TOLUD\n");
  1036. goto fail;
  1037. }
  1038. igen6_tolud &= GENMASK(31, 20);
  1039. if (pci_read_config_dword(pdev, TOM_OFFSET, &u.v_lo)) {
  1040. igen6_printk(KERN_ERR, "Failed to read lower TOM\n");
  1041. goto fail;
  1042. }
  1043. if (pci_read_config_dword(pdev, TOM_OFFSET + 4, &u.v_hi)) {
  1044. igen6_printk(KERN_ERR, "Failed to read upper TOM\n");
  1045. goto fail;
  1046. }
  1047. igen6_tom = u.v & res_cfg->reg_tom_mask;
  1048. if (get_mchbar(pdev, mchbar))
  1049. goto fail;
  1050. #ifdef CONFIG_EDAC_DEBUG
  1051. if (pci_read_config_dword(pdev, TOUUD_OFFSET, &u.v_lo))
  1052. edac_dbg(2, "Failed to read lower TOUUD\n");
  1053. else if (pci_read_config_dword(pdev, TOUUD_OFFSET + 4, &u.v_hi))
  1054. edac_dbg(2, "Failed to read upper TOUUD\n");
  1055. else
  1056. igen6_touud = u.v & res_cfg->reg_touud_mask;
  1057. #endif
  1058. return 0;
  1059. fail:
  1060. return -ENODEV;
  1061. }
  1062. static void igen6_check(struct mem_ctl_info *mci)
  1063. {
  1064. struct igen6_imc *imc = mci->pvt_info;
  1065. u64 ecclog;
  1066. /* errsts_clear() isn't NMI-safe. Delay it in the IRQ context */
  1067. ecclog = ecclog_read_and_clear(imc);
  1068. if (!ecclog)
  1069. return;
  1070. if (!ecclog_gen_pool_add(imc->mc, ecclog))
  1071. irq_work_queue(&ecclog_irq_work);
  1072. }
  1073. /* Check whether the memory controller is absent. */
  1074. static bool igen6_imc_absent(void __iomem *window)
  1075. {
  1076. return readl(window + MAD_INTER_CHANNEL_OFFSET) == ~0;
  1077. }
  1078. static int igen6_register_mci(int mc, void __iomem *window, struct pci_dev *pdev)
  1079. {
  1080. struct edac_mc_layer layers[2];
  1081. struct mem_ctl_info *mci;
  1082. struct igen6_imc *imc;
  1083. int rc;
  1084. edac_dbg(2, "\n");
  1085. layers[0].type = EDAC_MC_LAYER_CHANNEL;
  1086. layers[0].size = NUM_CHANNELS;
  1087. layers[0].is_virt_csrow = false;
  1088. layers[1].type = EDAC_MC_LAYER_SLOT;
  1089. layers[1].size = NUM_DIMMS;
  1090. layers[1].is_virt_csrow = true;
  1091. mci = edac_mc_alloc(mc, ARRAY_SIZE(layers), layers, 0);
  1092. if (!mci) {
  1093. rc = -ENOMEM;
  1094. goto fail;
  1095. }
  1096. mci->ctl_name = kasprintf(GFP_KERNEL, "Intel_client_SoC MC#%d", mc);
  1097. if (!mci->ctl_name) {
  1098. rc = -ENOMEM;
  1099. goto fail2;
  1100. }
  1101. mci->mtype_cap = MEM_FLAG_LPDDR4 | MEM_FLAG_DDR4;
  1102. mci->edac_ctl_cap = EDAC_FLAG_SECDED;
  1103. mci->edac_cap = EDAC_FLAG_SECDED;
  1104. mci->mod_name = EDAC_MOD_STR;
  1105. mci->dev_name = pci_name(pdev);
  1106. if (edac_op_state == EDAC_OPSTATE_POLL)
  1107. mci->edac_check = igen6_check;
  1108. mci->pvt_info = &igen6_pvt->imc[mc];
  1109. imc = mci->pvt_info;
  1110. device_initialize(&imc->dev);
  1111. /*
  1112. * EDAC core uses mci->pdev(pointer of structure device) as
  1113. * memory controller ID. The client SoCs attach one or more
  1114. * memory controllers to single pci_dev (single pci_dev->dev
  1115. * can be for multiple memory controllers).
  1116. *
  1117. * To make mci->pdev unique, assign pci_dev->dev to mci->pdev
  1118. * for the first memory controller and assign a unique imc->dev
  1119. * to mci->pdev for each non-first memory controller.
  1120. */
  1121. mci->pdev = mc ? &imc->dev : &pdev->dev;
  1122. imc->mc = mc;
  1123. imc->pdev = pdev;
  1124. imc->window = window;
  1125. igen6_reg_dump(imc);
  1126. rc = igen6_get_dimm_config(mci);
  1127. if (rc)
  1128. goto fail3;
  1129. rc = edac_mc_add_mc(mci);
  1130. if (rc) {
  1131. igen6_printk(KERN_ERR, "Failed to register mci#%d\n", mc);
  1132. goto fail3;
  1133. }
  1134. imc->mci = mci;
  1135. return 0;
  1136. fail3:
  1137. put_device(&imc->dev);
  1138. mci->pvt_info = NULL;
  1139. kfree(mci->ctl_name);
  1140. fail2:
  1141. edac_mc_free(mci);
  1142. fail:
  1143. return rc;
  1144. }
  1145. static void igen6_unregister_mcis(void)
  1146. {
  1147. struct mem_ctl_info *mci;
  1148. struct igen6_imc *imc;
  1149. int i;
  1150. edac_dbg(2, "\n");
  1151. for (i = 0; i < res_cfg->num_imc; i++) {
  1152. imc = &igen6_pvt->imc[i];
  1153. mci = imc->mci;
  1154. if (!mci)
  1155. continue;
  1156. edac_mc_del_mc(mci->pdev);
  1157. kfree(mci->ctl_name);
  1158. mci->pvt_info = NULL;
  1159. edac_mc_free(mci);
  1160. put_device(&imc->dev);
  1161. iounmap(imc->window);
  1162. }
  1163. }
  1164. static int igen6_register_mcis(struct pci_dev *pdev, u64 mchbar)
  1165. {
  1166. void __iomem *window;
  1167. int lmc, pmc, rc;
  1168. u64 base;
  1169. for (lmc = 0, pmc = 0; pmc < NUM_IMC; pmc++) {
  1170. base = mchbar + pmc * MCHBAR_SIZE;
  1171. window = ioremap(base, MCHBAR_SIZE);
  1172. if (!window) {
  1173. igen6_printk(KERN_ERR, "Failed to ioremap 0x%llx for mc%d\n", base, pmc);
  1174. rc = -ENOMEM;
  1175. goto out_unregister_mcis;
  1176. }
  1177. if (igen6_imc_absent(window)) {
  1178. iounmap(window);
  1179. edac_dbg(2, "Skip absent mc%d\n", pmc);
  1180. continue;
  1181. }
  1182. rc = igen6_register_mci(lmc, window, pdev);
  1183. if (rc)
  1184. goto out_iounmap;
  1185. /* Done, if all present MCs are detected and registered. */
  1186. if (++lmc >= res_cfg->num_imc)
  1187. break;
  1188. }
  1189. if (!lmc) {
  1190. igen6_printk(KERN_ERR, "No mc found.\n");
  1191. return -ENODEV;
  1192. }
  1193. if (lmc < res_cfg->num_imc) {
  1194. igen6_printk(KERN_DEBUG, "Expected %d mcs, but only %d detected.",
  1195. res_cfg->num_imc, lmc);
  1196. res_cfg->num_imc = lmc;
  1197. }
  1198. return 0;
  1199. out_iounmap:
  1200. iounmap(window);
  1201. out_unregister_mcis:
  1202. igen6_unregister_mcis();
  1203. return rc;
  1204. }
  1205. static int igen6_mem_slice_setup(u64 mchbar)
  1206. {
  1207. struct igen6_imc *imc = &igen6_pvt->imc[0];
  1208. u64 base = mchbar + res_cfg->cmf_base;
  1209. u32 offset = res_cfg->ms_hash_offset;
  1210. u32 size = res_cfg->cmf_size;
  1211. u64 ms_s_size, ms_hash;
  1212. void __iomem *cmf;
  1213. int ms_l_map;
  1214. edac_dbg(2, "\n");
  1215. if (imc[0].size < imc[1].size) {
  1216. ms_s_size = imc[0].size;
  1217. ms_l_map = 1;
  1218. } else {
  1219. ms_s_size = imc[1].size;
  1220. ms_l_map = 0;
  1221. }
  1222. igen6_pvt->ms_s_size = ms_s_size;
  1223. igen6_pvt->ms_l_map = ms_l_map;
  1224. edac_dbg(0, "ms_s_size: %llu MiB, ms_l_map %d\n",
  1225. ms_s_size >> 20, ms_l_map);
  1226. if (!size)
  1227. return 0;
  1228. cmf = ioremap(base, size);
  1229. if (!cmf) {
  1230. igen6_printk(KERN_ERR, "Failed to ioremap cmf 0x%llx\n", base);
  1231. return -ENODEV;
  1232. }
  1233. ms_hash = readq(cmf + offset);
  1234. igen6_pvt->ms_hash = ms_hash;
  1235. edac_dbg(0, "MEM_SLICE_HASH: 0x%llx\n", ms_hash);
  1236. iounmap(cmf);
  1237. return 0;
  1238. }
  1239. static int register_err_handler(void)
  1240. {
  1241. int rc;
  1242. if (res_cfg->machine_check) {
  1243. mce_register_decode_chain(&ecclog_mce_dec);
  1244. return 0;
  1245. }
  1246. rc = register_nmi_handler(NMI_SERR, ecclog_nmi_handler,
  1247. 0, IGEN6_NMI_NAME);
  1248. if (rc) {
  1249. igen6_printk(KERN_ERR, "Failed to register NMI handler\n");
  1250. return rc;
  1251. }
  1252. return 0;
  1253. }
  1254. static void unregister_err_handler(void)
  1255. {
  1256. if (res_cfg->machine_check) {
  1257. mce_unregister_decode_chain(&ecclog_mce_dec);
  1258. return;
  1259. }
  1260. unregister_nmi_handler(NMI_SERR, IGEN6_NMI_NAME);
  1261. }
  1262. static void opstate_set(const struct res_config *cfg, const struct pci_device_id *ent)
  1263. {
  1264. /*
  1265. * Quirk: Certain SoCs' error reporting interrupts don't work.
  1266. * Force polling mode for them to ensure that memory error
  1267. * events can be handled.
  1268. */
  1269. if (ent->device == DID_ADL_N_SKU4) {
  1270. edac_op_state = EDAC_OPSTATE_POLL;
  1271. return;
  1272. }
  1273. /* Set the mode according to the configuration data. */
  1274. if (cfg->machine_check)
  1275. edac_op_state = EDAC_OPSTATE_INT;
  1276. else
  1277. edac_op_state = EDAC_OPSTATE_NMI;
  1278. }
  1279. static int igen6_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  1280. {
  1281. u64 mchbar;
  1282. int rc;
  1283. edac_dbg(2, "\n");
  1284. igen6_pvt = kzalloc_obj(*igen6_pvt);
  1285. if (!igen6_pvt)
  1286. return -ENOMEM;
  1287. res_cfg = (struct res_config *)ent->driver_data;
  1288. rc = igen6_pci_setup(pdev, &mchbar);
  1289. if (rc)
  1290. goto fail;
  1291. opstate_set(res_cfg, ent);
  1292. rc = igen6_register_mcis(pdev, mchbar);
  1293. if (rc)
  1294. goto fail;
  1295. if (res_cfg->num_imc > 1) {
  1296. rc = igen6_mem_slice_setup(mchbar);
  1297. if (rc)
  1298. goto fail2;
  1299. }
  1300. ecclog_pool = ecclog_gen_pool_create();
  1301. if (!ecclog_pool) {
  1302. rc = -ENOMEM;
  1303. goto fail2;
  1304. }
  1305. INIT_WORK(&ecclog_work, ecclog_work_cb);
  1306. init_irq_work(&ecclog_irq_work, ecclog_irq_work_cb);
  1307. rc = register_err_handler();
  1308. if (rc)
  1309. goto fail3;
  1310. /* Enable error reporting */
  1311. rc = errcmd_enable_error_reporting(true);
  1312. if (rc) {
  1313. igen6_printk(KERN_ERR, "Failed to enable error reporting\n");
  1314. goto fail4;
  1315. }
  1316. /* Check if any pending errors before/during the registration of the error handler */
  1317. ecclog_handler();
  1318. igen6_debug_setup();
  1319. return 0;
  1320. fail4:
  1321. unregister_nmi_handler(NMI_SERR, IGEN6_NMI_NAME);
  1322. fail3:
  1323. gen_pool_destroy(ecclog_pool);
  1324. fail2:
  1325. igen6_unregister_mcis();
  1326. fail:
  1327. kfree(igen6_pvt);
  1328. return rc;
  1329. }
  1330. static void igen6_remove(struct pci_dev *pdev)
  1331. {
  1332. edac_dbg(2, "\n");
  1333. igen6_debug_teardown();
  1334. errcmd_enable_error_reporting(false);
  1335. unregister_err_handler();
  1336. irq_work_sync(&ecclog_irq_work);
  1337. flush_work(&ecclog_work);
  1338. gen_pool_destroy(ecclog_pool);
  1339. igen6_unregister_mcis();
  1340. kfree(igen6_pvt);
  1341. }
  1342. static struct pci_driver igen6_driver = {
  1343. .name = EDAC_MOD_STR,
  1344. .probe = igen6_probe,
  1345. .remove = igen6_remove,
  1346. .id_table = igen6_pci_tbl,
  1347. };
  1348. static int __init igen6_init(void)
  1349. {
  1350. const char *owner;
  1351. int rc;
  1352. edac_dbg(2, "\n");
  1353. if (ghes_get_devices())
  1354. return -EBUSY;
  1355. owner = edac_get_owner();
  1356. if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
  1357. return -EBUSY;
  1358. rc = pci_register_driver(&igen6_driver);
  1359. if (rc)
  1360. return rc;
  1361. igen6_printk(KERN_INFO, "%s\n", IGEN6_REVISION);
  1362. return 0;
  1363. }
  1364. static void __exit igen6_exit(void)
  1365. {
  1366. edac_dbg(2, "\n");
  1367. pci_unregister_driver(&igen6_driver);
  1368. }
  1369. module_init(igen6_init);
  1370. module_exit(igen6_exit);
  1371. MODULE_LICENSE("GPL v2");
  1372. MODULE_AUTHOR("Qiuxu Zhuo");
  1373. MODULE_DESCRIPTION("MC Driver for Intel client SoC using In-Band ECC");