pnd2_edac.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613
  1. /*
  2. * Driver for Pondicherry2 memory controller.
  3. *
  4. * Copyright (c) 2016, Intel Corporation.
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms and conditions of the GNU General Public License,
  8. * version 2, as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. * [Derived from sb_edac.c]
  16. *
  17. * Translation of system physical addresses to DIMM addresses
  18. * is a two stage process:
  19. *
  20. * First the Pondicherry 2 memory controller handles slice and channel interleaving
  21. * in "sys2pmi()". This is (almost) completley common between platforms.
  22. *
  23. * Then a platform specific dunit (DIMM unit) completes the process to provide DIMM,
  24. * rank, bank, row and column using the appropriate "dunit_ops" functions/parameters.
  25. */
  26. #include <linux/module.h>
  27. #include <linux/init.h>
  28. #include <linux/pci.h>
  29. #include <linux/pci_ids.h>
  30. #include <linux/slab.h>
  31. #include <linux/delay.h>
  32. #include <linux/edac.h>
  33. #include <linux/mmzone.h>
  34. #include <linux/smp.h>
  35. #include <linux/bitmap.h>
  36. #include <linux/math64.h>
  37. #include <linux/mod_devicetable.h>
  38. #include <asm/cpu_device_id.h>
  39. #include <asm/intel-family.h>
  40. #include <asm/processor.h>
  41. #include <asm/mce.h>
  42. #include "edac_mc.h"
  43. #include "edac_module.h"
  44. #include "pnd2_edac.h"
  45. #define EDAC_MOD_STR "pnd2_edac"
  46. #define APL_NUM_CHANNELS 4
  47. #define DNV_NUM_CHANNELS 2
  48. #define DNV_MAX_DIMMS 2 /* Max DIMMs per channel */
  49. enum type {
  50. APL,
  51. DNV, /* All requests go to PMI CH0 on each slice (CH1 disabled) */
  52. };
  53. struct dram_addr {
  54. int chan;
  55. int dimm;
  56. int rank;
  57. int bank;
  58. int row;
  59. int col;
  60. };
  61. struct pnd2_pvt {
  62. int dimm_geom[APL_NUM_CHANNELS];
  63. u64 tolm, tohm;
  64. };
  65. /*
  66. * System address space is divided into multiple regions with
  67. * different interleave rules in each. The as0/as1 regions
  68. * have no interleaving at all. The as2 region is interleaved
  69. * between two channels. The mot region is magic and may overlap
  70. * other regions, with its interleave rules taking precedence.
  71. * Addresses not in any of these regions are interleaved across
  72. * all four channels.
  73. */
  74. static struct region {
  75. u64 base;
  76. u64 limit;
  77. u8 enabled;
  78. } mot, as0, as1, as2;
  79. static struct dunit_ops {
  80. char *name;
  81. enum type type;
  82. int pmiaddr_shift;
  83. int pmiidx_shift;
  84. int channels;
  85. int dimms_per_channel;
  86. int (*rd_reg)(int port, int off, int op, void *data, size_t sz, char *name);
  87. int (*get_registers)(void);
  88. int (*check_ecc)(void);
  89. void (*mk_region)(char *name, struct region *rp, void *asym);
  90. void (*get_dimm_config)(struct mem_ctl_info *mci);
  91. int (*pmi2mem)(struct mem_ctl_info *mci, u64 pmiaddr, u32 pmiidx,
  92. struct dram_addr *daddr, char *msg);
  93. } *ops;
  94. static struct mem_ctl_info *pnd2_mci;
  95. #define PND2_MSG_SIZE 256
  96. /* Debug macros */
  97. #define pnd2_printk(level, fmt, arg...) \
  98. edac_printk(level, "pnd2", fmt, ##arg)
  99. #define pnd2_mc_printk(mci, level, fmt, arg...) \
  100. edac_mc_chipset_printk(mci, level, "pnd2", fmt, ##arg)
  101. #define MOT_CHAN_INTLV_BIT_1SLC_2CH 12
  102. #define MOT_CHAN_INTLV_BIT_2SLC_2CH 13
  103. #define SELECTOR_DISABLED (-1)
  104. #define _4GB (1ul << 32)
  105. #define PMI_ADDRESS_WIDTH 31
  106. #define PND_MAX_PHYS_BIT 39
  107. #define APL_ASYMSHIFT 28
  108. #define DNV_ASYMSHIFT 31
  109. #define CH_HASH_MASK_LSB 6
  110. #define SLICE_HASH_MASK_LSB 6
  111. #define MOT_SLC_INTLV_BIT 12
  112. #define LOG2_PMI_ADDR_GRANULARITY 5
  113. #define MOT_SHIFT 24
  114. #define GET_BITFIELD(v, lo, hi) (((v) & GENMASK_ULL(hi, lo)) >> (lo))
  115. #define U64_LSHIFT(val, s) ((u64)(val) << (s))
  116. /*
  117. * On Apollo Lake we access memory controller registers via a
  118. * side-band mailbox style interface in a hidden PCI device
  119. * configuration space.
  120. */
  121. static struct pci_bus *p2sb_bus;
  122. #define P2SB_DEVFN PCI_DEVFN(0xd, 0)
  123. #define P2SB_ADDR_OFF 0xd0
  124. #define P2SB_DATA_OFF 0xd4
  125. #define P2SB_STAT_OFF 0xd8
  126. #define P2SB_ROUT_OFF 0xda
  127. #define P2SB_EADD_OFF 0xdc
  128. #define P2SB_HIDE_OFF 0xe1
  129. #define P2SB_BUSY 1
  130. #define P2SB_READ(size, off, ptr) \
  131. pci_bus_read_config_##size(p2sb_bus, P2SB_DEVFN, off, ptr)
  132. #define P2SB_WRITE(size, off, val) \
  133. pci_bus_write_config_##size(p2sb_bus, P2SB_DEVFN, off, val)
  134. static bool p2sb_is_busy(u16 *status)
  135. {
  136. P2SB_READ(word, P2SB_STAT_OFF, status);
  137. return !!(*status & P2SB_BUSY);
  138. }
  139. static int _apl_rd_reg(int port, int off, int op, u32 *data)
  140. {
  141. int retries = 0xff, ret;
  142. u16 status;
  143. u8 hidden;
  144. /* Unhide the P2SB device, if it's hidden */
  145. P2SB_READ(byte, P2SB_HIDE_OFF, &hidden);
  146. if (hidden)
  147. P2SB_WRITE(byte, P2SB_HIDE_OFF, 0);
  148. if (p2sb_is_busy(&status)) {
  149. ret = -EAGAIN;
  150. goto out;
  151. }
  152. P2SB_WRITE(dword, P2SB_ADDR_OFF, (port << 24) | off);
  153. P2SB_WRITE(dword, P2SB_DATA_OFF, 0);
  154. P2SB_WRITE(dword, P2SB_EADD_OFF, 0);
  155. P2SB_WRITE(word, P2SB_ROUT_OFF, 0);
  156. P2SB_WRITE(word, P2SB_STAT_OFF, (op << 8) | P2SB_BUSY);
  157. while (p2sb_is_busy(&status)) {
  158. if (retries-- == 0) {
  159. ret = -EBUSY;
  160. goto out;
  161. }
  162. }
  163. P2SB_READ(dword, P2SB_DATA_OFF, data);
  164. ret = (status >> 1) & 0x3;
  165. out:
  166. /* Hide the P2SB device, if it was hidden before */
  167. if (hidden)
  168. P2SB_WRITE(byte, P2SB_HIDE_OFF, hidden);
  169. return ret;
  170. }
  171. static int apl_rd_reg(int port, int off, int op, void *data, size_t sz, char *name)
  172. {
  173. int ret = 0;
  174. edac_dbg(2, "Read %s port=%x off=%x op=%x\n", name, port, off, op);
  175. switch (sz) {
  176. case 8:
  177. ret = _apl_rd_reg(port, off + 4, op, (u32 *)(data + 4));
  178. /* fall through */
  179. case 4:
  180. ret |= _apl_rd_reg(port, off, op, (u32 *)data);
  181. pnd2_printk(KERN_DEBUG, "%s=%x%08x ret=%d\n", name,
  182. sz == 8 ? *((u32 *)(data + 4)) : 0, *((u32 *)data), ret);
  183. break;
  184. }
  185. return ret;
  186. }
  187. static u64 get_mem_ctrl_hub_base_addr(void)
  188. {
  189. struct b_cr_mchbar_lo_pci lo;
  190. struct b_cr_mchbar_hi_pci hi;
  191. struct pci_dev *pdev;
  192. pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x1980, NULL);
  193. if (pdev) {
  194. pci_read_config_dword(pdev, 0x48, (u32 *)&lo);
  195. pci_read_config_dword(pdev, 0x4c, (u32 *)&hi);
  196. pci_dev_put(pdev);
  197. } else {
  198. return 0;
  199. }
  200. if (!lo.enable) {
  201. edac_dbg(2, "MMIO via memory controller hub base address is disabled!\n");
  202. return 0;
  203. }
  204. return U64_LSHIFT(hi.base, 32) | U64_LSHIFT(lo.base, 15);
  205. }
  206. static u64 get_sideband_reg_base_addr(void)
  207. {
  208. struct pci_dev *pdev;
  209. u32 hi, lo;
  210. u8 hidden;
  211. pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x19dd, NULL);
  212. if (pdev) {
  213. /* Unhide the P2SB device, if it's hidden */
  214. pci_read_config_byte(pdev, 0xe1, &hidden);
  215. if (hidden)
  216. pci_write_config_byte(pdev, 0xe1, 0);
  217. pci_read_config_dword(pdev, 0x10, &lo);
  218. pci_read_config_dword(pdev, 0x14, &hi);
  219. lo &= 0xfffffff0;
  220. /* Hide the P2SB device, if it was hidden before */
  221. if (hidden)
  222. pci_write_config_byte(pdev, 0xe1, hidden);
  223. pci_dev_put(pdev);
  224. return (U64_LSHIFT(hi, 32) | U64_LSHIFT(lo, 0));
  225. } else {
  226. return 0xfd000000;
  227. }
  228. }
  229. #define DNV_MCHBAR_SIZE 0x8000
  230. #define DNV_SB_PORT_SIZE 0x10000
  231. static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *name)
  232. {
  233. struct pci_dev *pdev;
  234. char *base;
  235. u64 addr;
  236. unsigned long size;
  237. if (op == 4) {
  238. pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x1980, NULL);
  239. if (!pdev)
  240. return -ENODEV;
  241. pci_read_config_dword(pdev, off, data);
  242. pci_dev_put(pdev);
  243. } else {
  244. /* MMIO via memory controller hub base address */
  245. if (op == 0 && port == 0x4c) {
  246. addr = get_mem_ctrl_hub_base_addr();
  247. if (!addr)
  248. return -ENODEV;
  249. size = DNV_MCHBAR_SIZE;
  250. } else {
  251. /* MMIO via sideband register base address */
  252. addr = get_sideband_reg_base_addr();
  253. if (!addr)
  254. return -ENODEV;
  255. addr += (port << 16);
  256. size = DNV_SB_PORT_SIZE;
  257. }
  258. base = ioremap((resource_size_t)addr, size);
  259. if (!base)
  260. return -ENODEV;
  261. if (sz == 8)
  262. *(u32 *)(data + 4) = *(u32 *)(base + off + 4);
  263. *(u32 *)data = *(u32 *)(base + off);
  264. iounmap(base);
  265. }
  266. edac_dbg(2, "Read %s=%.8x_%.8x\n", name,
  267. (sz == 8) ? *(u32 *)(data + 4) : 0, *(u32 *)data);
  268. return 0;
  269. }
  270. #define RD_REGP(regp, regname, port) \
  271. ops->rd_reg(port, \
  272. regname##_offset, \
  273. regname##_r_opcode, \
  274. regp, sizeof(struct regname), \
  275. #regname)
  276. #define RD_REG(regp, regname) \
  277. ops->rd_reg(regname ## _port, \
  278. regname##_offset, \
  279. regname##_r_opcode, \
  280. regp, sizeof(struct regname), \
  281. #regname)
  282. static u64 top_lm, top_hm;
  283. static bool two_slices;
  284. static bool two_channels; /* Both PMI channels in one slice enabled */
  285. static u8 sym_chan_mask;
  286. static u8 asym_chan_mask;
  287. static u8 chan_mask;
  288. static int slice_selector = -1;
  289. static int chan_selector = -1;
  290. static u64 slice_hash_mask;
  291. static u64 chan_hash_mask;
  292. static void mk_region(char *name, struct region *rp, u64 base, u64 limit)
  293. {
  294. rp->enabled = 1;
  295. rp->base = base;
  296. rp->limit = limit;
  297. edac_dbg(2, "Region:%s [%llx, %llx]\n", name, base, limit);
  298. }
  299. static void mk_region_mask(char *name, struct region *rp, u64 base, u64 mask)
  300. {
  301. if (mask == 0) {
  302. pr_info(FW_BUG "MOT mask cannot be zero\n");
  303. return;
  304. }
  305. if (mask != GENMASK_ULL(PND_MAX_PHYS_BIT, __ffs(mask))) {
  306. pr_info(FW_BUG "MOT mask not power of two\n");
  307. return;
  308. }
  309. if (base & ~mask) {
  310. pr_info(FW_BUG "MOT region base/mask alignment error\n");
  311. return;
  312. }
  313. rp->base = base;
  314. rp->limit = (base | ~mask) & GENMASK_ULL(PND_MAX_PHYS_BIT, 0);
  315. rp->enabled = 1;
  316. edac_dbg(2, "Region:%s [%llx, %llx]\n", name, base, rp->limit);
  317. }
  318. static bool in_region(struct region *rp, u64 addr)
  319. {
  320. if (!rp->enabled)
  321. return false;
  322. return rp->base <= addr && addr <= rp->limit;
  323. }
  324. static int gen_sym_mask(struct b_cr_slice_channel_hash *p)
  325. {
  326. int mask = 0;
  327. if (!p->slice_0_mem_disabled)
  328. mask |= p->sym_slice0_channel_enabled;
  329. if (!p->slice_1_disabled)
  330. mask |= p->sym_slice1_channel_enabled << 2;
  331. if (p->ch_1_disabled || p->enable_pmi_dual_data_mode)
  332. mask &= 0x5;
  333. return mask;
  334. }
  335. static int gen_asym_mask(struct b_cr_slice_channel_hash *p,
  336. struct b_cr_asym_mem_region0_mchbar *as0,
  337. struct b_cr_asym_mem_region1_mchbar *as1,
  338. struct b_cr_asym_2way_mem_region_mchbar *as2way)
  339. {
  340. const int intlv[] = { 0x5, 0xA, 0x3, 0xC };
  341. int mask = 0;
  342. if (as2way->asym_2way_interleave_enable)
  343. mask = intlv[as2way->asym_2way_intlv_mode];
  344. if (as0->slice0_asym_enable)
  345. mask |= (1 << as0->slice0_asym_channel_select);
  346. if (as1->slice1_asym_enable)
  347. mask |= (4 << as1->slice1_asym_channel_select);
  348. if (p->slice_0_mem_disabled)
  349. mask &= 0xc;
  350. if (p->slice_1_disabled)
  351. mask &= 0x3;
  352. if (p->ch_1_disabled || p->enable_pmi_dual_data_mode)
  353. mask &= 0x5;
  354. return mask;
  355. }
  356. static struct b_cr_tolud_pci tolud;
  357. static struct b_cr_touud_lo_pci touud_lo;
  358. static struct b_cr_touud_hi_pci touud_hi;
  359. static struct b_cr_asym_mem_region0_mchbar asym0;
  360. static struct b_cr_asym_mem_region1_mchbar asym1;
  361. static struct b_cr_asym_2way_mem_region_mchbar asym_2way;
  362. static struct b_cr_mot_out_base_mchbar mot_base;
  363. static struct b_cr_mot_out_mask_mchbar mot_mask;
  364. static struct b_cr_slice_channel_hash chash;
  365. /* Apollo Lake dunit */
  366. /*
  367. * Validated on board with just two DIMMs in the [0] and [2] positions
  368. * in this array. Other port number matches documentation, but caution
  369. * advised.
  370. */
  371. static const int apl_dports[APL_NUM_CHANNELS] = { 0x18, 0x10, 0x11, 0x19 };
  372. static struct d_cr_drp0 drp0[APL_NUM_CHANNELS];
  373. /* Denverton dunit */
  374. static const int dnv_dports[DNV_NUM_CHANNELS] = { 0x10, 0x12 };
  375. static struct d_cr_dsch dsch;
  376. static struct d_cr_ecc_ctrl ecc_ctrl[DNV_NUM_CHANNELS];
  377. static struct d_cr_drp drp[DNV_NUM_CHANNELS];
  378. static struct d_cr_dmap dmap[DNV_NUM_CHANNELS];
  379. static struct d_cr_dmap1 dmap1[DNV_NUM_CHANNELS];
  380. static struct d_cr_dmap2 dmap2[DNV_NUM_CHANNELS];
  381. static struct d_cr_dmap3 dmap3[DNV_NUM_CHANNELS];
  382. static struct d_cr_dmap4 dmap4[DNV_NUM_CHANNELS];
  383. static struct d_cr_dmap5 dmap5[DNV_NUM_CHANNELS];
  384. static void apl_mk_region(char *name, struct region *rp, void *asym)
  385. {
  386. struct b_cr_asym_mem_region0_mchbar *a = asym;
  387. mk_region(name, rp,
  388. U64_LSHIFT(a->slice0_asym_base, APL_ASYMSHIFT),
  389. U64_LSHIFT(a->slice0_asym_limit, APL_ASYMSHIFT) +
  390. GENMASK_ULL(APL_ASYMSHIFT - 1, 0));
  391. }
  392. static void dnv_mk_region(char *name, struct region *rp, void *asym)
  393. {
  394. struct b_cr_asym_mem_region_denverton *a = asym;
  395. mk_region(name, rp,
  396. U64_LSHIFT(a->slice_asym_base, DNV_ASYMSHIFT),
  397. U64_LSHIFT(a->slice_asym_limit, DNV_ASYMSHIFT) +
  398. GENMASK_ULL(DNV_ASYMSHIFT - 1, 0));
  399. }
  400. static int apl_get_registers(void)
  401. {
  402. int ret = -ENODEV;
  403. int i;
  404. if (RD_REG(&asym_2way, b_cr_asym_2way_mem_region_mchbar))
  405. return -ENODEV;
  406. /*
  407. * RD_REGP() will fail for unpopulated or non-existent
  408. * DIMM slots. Return success if we find at least one DIMM.
  409. */
  410. for (i = 0; i < APL_NUM_CHANNELS; i++)
  411. if (!RD_REGP(&drp0[i], d_cr_drp0, apl_dports[i]))
  412. ret = 0;
  413. return ret;
  414. }
  415. static int dnv_get_registers(void)
  416. {
  417. int i;
  418. if (RD_REG(&dsch, d_cr_dsch))
  419. return -ENODEV;
  420. for (i = 0; i < DNV_NUM_CHANNELS; i++)
  421. if (RD_REGP(&ecc_ctrl[i], d_cr_ecc_ctrl, dnv_dports[i]) ||
  422. RD_REGP(&drp[i], d_cr_drp, dnv_dports[i]) ||
  423. RD_REGP(&dmap[i], d_cr_dmap, dnv_dports[i]) ||
  424. RD_REGP(&dmap1[i], d_cr_dmap1, dnv_dports[i]) ||
  425. RD_REGP(&dmap2[i], d_cr_dmap2, dnv_dports[i]) ||
  426. RD_REGP(&dmap3[i], d_cr_dmap3, dnv_dports[i]) ||
  427. RD_REGP(&dmap4[i], d_cr_dmap4, dnv_dports[i]) ||
  428. RD_REGP(&dmap5[i], d_cr_dmap5, dnv_dports[i]))
  429. return -ENODEV;
  430. return 0;
  431. }
  432. /*
  433. * Read all the h/w config registers once here (they don't
  434. * change at run time. Figure out which address ranges have
  435. * which interleave characteristics.
  436. */
  437. static int get_registers(void)
  438. {
  439. const int intlv[] = { 10, 11, 12, 12 };
  440. if (RD_REG(&tolud, b_cr_tolud_pci) ||
  441. RD_REG(&touud_lo, b_cr_touud_lo_pci) ||
  442. RD_REG(&touud_hi, b_cr_touud_hi_pci) ||
  443. RD_REG(&asym0, b_cr_asym_mem_region0_mchbar) ||
  444. RD_REG(&asym1, b_cr_asym_mem_region1_mchbar) ||
  445. RD_REG(&mot_base, b_cr_mot_out_base_mchbar) ||
  446. RD_REG(&mot_mask, b_cr_mot_out_mask_mchbar) ||
  447. RD_REG(&chash, b_cr_slice_channel_hash))
  448. return -ENODEV;
  449. if (ops->get_registers())
  450. return -ENODEV;
  451. if (ops->type == DNV) {
  452. /* PMI channel idx (always 0) for asymmetric region */
  453. asym0.slice0_asym_channel_select = 0;
  454. asym1.slice1_asym_channel_select = 0;
  455. /* PMI channel bitmap (always 1) for symmetric region */
  456. chash.sym_slice0_channel_enabled = 0x1;
  457. chash.sym_slice1_channel_enabled = 0x1;
  458. }
  459. if (asym0.slice0_asym_enable)
  460. ops->mk_region("as0", &as0, &asym0);
  461. if (asym1.slice1_asym_enable)
  462. ops->mk_region("as1", &as1, &asym1);
  463. if (asym_2way.asym_2way_interleave_enable) {
  464. mk_region("as2way", &as2,
  465. U64_LSHIFT(asym_2way.asym_2way_base, APL_ASYMSHIFT),
  466. U64_LSHIFT(asym_2way.asym_2way_limit, APL_ASYMSHIFT) +
  467. GENMASK_ULL(APL_ASYMSHIFT - 1, 0));
  468. }
  469. if (mot_base.imr_en) {
  470. mk_region_mask("mot", &mot,
  471. U64_LSHIFT(mot_base.mot_out_base, MOT_SHIFT),
  472. U64_LSHIFT(mot_mask.mot_out_mask, MOT_SHIFT));
  473. }
  474. top_lm = U64_LSHIFT(tolud.tolud, 20);
  475. top_hm = U64_LSHIFT(touud_hi.touud, 32) | U64_LSHIFT(touud_lo.touud, 20);
  476. two_slices = !chash.slice_1_disabled &&
  477. !chash.slice_0_mem_disabled &&
  478. (chash.sym_slice0_channel_enabled != 0) &&
  479. (chash.sym_slice1_channel_enabled != 0);
  480. two_channels = !chash.ch_1_disabled &&
  481. !chash.enable_pmi_dual_data_mode &&
  482. ((chash.sym_slice0_channel_enabled == 3) ||
  483. (chash.sym_slice1_channel_enabled == 3));
  484. sym_chan_mask = gen_sym_mask(&chash);
  485. asym_chan_mask = gen_asym_mask(&chash, &asym0, &asym1, &asym_2way);
  486. chan_mask = sym_chan_mask | asym_chan_mask;
  487. if (two_slices && !two_channels) {
  488. if (chash.hvm_mode)
  489. slice_selector = 29;
  490. else
  491. slice_selector = intlv[chash.interleave_mode];
  492. } else if (!two_slices && two_channels) {
  493. if (chash.hvm_mode)
  494. chan_selector = 29;
  495. else
  496. chan_selector = intlv[chash.interleave_mode];
  497. } else if (two_slices && two_channels) {
  498. if (chash.hvm_mode) {
  499. slice_selector = 29;
  500. chan_selector = 30;
  501. } else {
  502. slice_selector = intlv[chash.interleave_mode];
  503. chan_selector = intlv[chash.interleave_mode] + 1;
  504. }
  505. }
  506. if (two_slices) {
  507. if (!chash.hvm_mode)
  508. slice_hash_mask = chash.slice_hash_mask << SLICE_HASH_MASK_LSB;
  509. if (!two_channels)
  510. slice_hash_mask |= BIT_ULL(slice_selector);
  511. }
  512. if (two_channels) {
  513. if (!chash.hvm_mode)
  514. chan_hash_mask = chash.ch_hash_mask << CH_HASH_MASK_LSB;
  515. if (!two_slices)
  516. chan_hash_mask |= BIT_ULL(chan_selector);
  517. }
  518. return 0;
  519. }
  520. /* Get a contiguous memory address (remove the MMIO gap) */
  521. static u64 remove_mmio_gap(u64 sys)
  522. {
  523. return (sys < _4GB) ? sys : sys - (_4GB - top_lm);
  524. }
  525. /* Squeeze out one address bit, shift upper part down to fill gap */
  526. static void remove_addr_bit(u64 *addr, int bitidx)
  527. {
  528. u64 mask;
  529. if (bitidx == -1)
  530. return;
  531. mask = (1ull << bitidx) - 1;
  532. *addr = ((*addr >> 1) & ~mask) | (*addr & mask);
  533. }
  534. /* XOR all the bits from addr specified in mask */
  535. static int hash_by_mask(u64 addr, u64 mask)
  536. {
  537. u64 result = addr & mask;
  538. result = (result >> 32) ^ result;
  539. result = (result >> 16) ^ result;
  540. result = (result >> 8) ^ result;
  541. result = (result >> 4) ^ result;
  542. result = (result >> 2) ^ result;
  543. result = (result >> 1) ^ result;
  544. return (int)result & 1;
  545. }
  546. /*
  547. * First stage decode. Take the system address and figure out which
  548. * second stage will deal with it based on interleave modes.
  549. */
  550. static int sys2pmi(const u64 addr, u32 *pmiidx, u64 *pmiaddr, char *msg)
  551. {
  552. u64 contig_addr, contig_base, contig_offset, contig_base_adj;
  553. int mot_intlv_bit = two_slices ? MOT_CHAN_INTLV_BIT_2SLC_2CH :
  554. MOT_CHAN_INTLV_BIT_1SLC_2CH;
  555. int slice_intlv_bit_rm = SELECTOR_DISABLED;
  556. int chan_intlv_bit_rm = SELECTOR_DISABLED;
  557. /* Determine if address is in the MOT region. */
  558. bool mot_hit = in_region(&mot, addr);
  559. /* Calculate the number of symmetric regions enabled. */
  560. int sym_channels = hweight8(sym_chan_mask);
  561. /*
  562. * The amount we need to shift the asym base can be determined by the
  563. * number of enabled symmetric channels.
  564. * NOTE: This can only work because symmetric memory is not supposed
  565. * to do a 3-way interleave.
  566. */
  567. int sym_chan_shift = sym_channels >> 1;
  568. /* Give up if address is out of range, or in MMIO gap */
  569. if (addr >= (1ul << PND_MAX_PHYS_BIT) ||
  570. (addr >= top_lm && addr < _4GB) || addr >= top_hm) {
  571. snprintf(msg, PND2_MSG_SIZE, "Error address 0x%llx is not DRAM", addr);
  572. return -EINVAL;
  573. }
  574. /* Get a contiguous memory address (remove the MMIO gap) */
  575. contig_addr = remove_mmio_gap(addr);
  576. if (in_region(&as0, addr)) {
  577. *pmiidx = asym0.slice0_asym_channel_select;
  578. contig_base = remove_mmio_gap(as0.base);
  579. contig_offset = contig_addr - contig_base;
  580. contig_base_adj = (contig_base >> sym_chan_shift) *
  581. ((chash.sym_slice0_channel_enabled >> (*pmiidx & 1)) & 1);
  582. contig_addr = contig_offset + ((sym_channels > 0) ? contig_base_adj : 0ull);
  583. } else if (in_region(&as1, addr)) {
  584. *pmiidx = 2u + asym1.slice1_asym_channel_select;
  585. contig_base = remove_mmio_gap(as1.base);
  586. contig_offset = contig_addr - contig_base;
  587. contig_base_adj = (contig_base >> sym_chan_shift) *
  588. ((chash.sym_slice1_channel_enabled >> (*pmiidx & 1)) & 1);
  589. contig_addr = contig_offset + ((sym_channels > 0) ? contig_base_adj : 0ull);
  590. } else if (in_region(&as2, addr) && (asym_2way.asym_2way_intlv_mode == 0x3ul)) {
  591. bool channel1;
  592. mot_intlv_bit = MOT_CHAN_INTLV_BIT_1SLC_2CH;
  593. *pmiidx = (asym_2way.asym_2way_intlv_mode & 1) << 1;
  594. channel1 = mot_hit ? ((bool)((addr >> mot_intlv_bit) & 1)) :
  595. hash_by_mask(contig_addr, chan_hash_mask);
  596. *pmiidx |= (u32)channel1;
  597. contig_base = remove_mmio_gap(as2.base);
  598. chan_intlv_bit_rm = mot_hit ? mot_intlv_bit : chan_selector;
  599. contig_offset = contig_addr - contig_base;
  600. remove_addr_bit(&contig_offset, chan_intlv_bit_rm);
  601. contig_addr = (contig_base >> sym_chan_shift) + contig_offset;
  602. } else {
  603. /* Otherwise we're in normal, boring symmetric mode. */
  604. *pmiidx = 0u;
  605. if (two_slices) {
  606. bool slice1;
  607. if (mot_hit) {
  608. slice_intlv_bit_rm = MOT_SLC_INTLV_BIT;
  609. slice1 = (addr >> MOT_SLC_INTLV_BIT) & 1;
  610. } else {
  611. slice_intlv_bit_rm = slice_selector;
  612. slice1 = hash_by_mask(addr, slice_hash_mask);
  613. }
  614. *pmiidx = (u32)slice1 << 1;
  615. }
  616. if (two_channels) {
  617. bool channel1;
  618. mot_intlv_bit = two_slices ? MOT_CHAN_INTLV_BIT_2SLC_2CH :
  619. MOT_CHAN_INTLV_BIT_1SLC_2CH;
  620. if (mot_hit) {
  621. chan_intlv_bit_rm = mot_intlv_bit;
  622. channel1 = (addr >> mot_intlv_bit) & 1;
  623. } else {
  624. chan_intlv_bit_rm = chan_selector;
  625. channel1 = hash_by_mask(contig_addr, chan_hash_mask);
  626. }
  627. *pmiidx |= (u32)channel1;
  628. }
  629. }
  630. /* Remove the chan_selector bit first */
  631. remove_addr_bit(&contig_addr, chan_intlv_bit_rm);
  632. /* Remove the slice bit (we remove it second because it must be lower */
  633. remove_addr_bit(&contig_addr, slice_intlv_bit_rm);
  634. *pmiaddr = contig_addr;
  635. return 0;
  636. }
  637. /* Translate PMI address to memory (rank, row, bank, column) */
  638. #define C(n) (0x10 | (n)) /* column */
  639. #define B(n) (0x20 | (n)) /* bank */
  640. #define R(n) (0x40 | (n)) /* row */
  641. #define RS (0x80) /* rank */
  642. /* addrdec values */
  643. #define AMAP_1KB 0
  644. #define AMAP_2KB 1
  645. #define AMAP_4KB 2
  646. #define AMAP_RSVD 3
  647. /* dden values */
  648. #define DEN_4Gb 0
  649. #define DEN_8Gb 2
  650. /* dwid values */
  651. #define X8 0
  652. #define X16 1
  653. static struct dimm_geometry {
  654. u8 addrdec;
  655. u8 dden;
  656. u8 dwid;
  657. u8 rowbits, colbits;
  658. u16 bits[PMI_ADDRESS_WIDTH];
  659. } dimms[] = {
  660. {
  661. .addrdec = AMAP_1KB, .dden = DEN_4Gb, .dwid = X16,
  662. .rowbits = 15, .colbits = 10,
  663. .bits = {
  664. C(2), C(3), C(4), C(5), C(6), B(0), B(1), B(2), R(0),
  665. R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8), R(9),
  666. R(10), C(7), C(8), C(9), R(11), RS, R(12), R(13), R(14),
  667. 0, 0, 0, 0
  668. }
  669. },
  670. {
  671. .addrdec = AMAP_1KB, .dden = DEN_4Gb, .dwid = X8,
  672. .rowbits = 16, .colbits = 10,
  673. .bits = {
  674. C(2), C(3), C(4), C(5), C(6), B(0), B(1), B(2), R(0),
  675. R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8), R(9),
  676. R(10), C(7), C(8), C(9), R(11), RS, R(12), R(13), R(14),
  677. R(15), 0, 0, 0
  678. }
  679. },
  680. {
  681. .addrdec = AMAP_1KB, .dden = DEN_8Gb, .dwid = X16,
  682. .rowbits = 16, .colbits = 10,
  683. .bits = {
  684. C(2), C(3), C(4), C(5), C(6), B(0), B(1), B(2), R(0),
  685. R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8), R(9),
  686. R(10), C(7), C(8), C(9), R(11), RS, R(12), R(13), R(14),
  687. R(15), 0, 0, 0
  688. }
  689. },
  690. {
  691. .addrdec = AMAP_1KB, .dden = DEN_8Gb, .dwid = X8,
  692. .rowbits = 16, .colbits = 11,
  693. .bits = {
  694. C(2), C(3), C(4), C(5), C(6), B(0), B(1), B(2), R(0),
  695. R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8), R(9),
  696. R(10), C(7), C(8), C(9), R(11), RS, C(11), R(12), R(13),
  697. R(14), R(15), 0, 0
  698. }
  699. },
  700. {
  701. .addrdec = AMAP_2KB, .dden = DEN_4Gb, .dwid = X16,
  702. .rowbits = 15, .colbits = 10,
  703. .bits = {
  704. C(2), C(3), C(4), C(5), C(6), C(7), B(0), B(1), B(2),
  705. R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8),
  706. R(9), R(10), C(8), C(9), R(11), RS, R(12), R(13), R(14),
  707. 0, 0, 0, 0
  708. }
  709. },
  710. {
  711. .addrdec = AMAP_2KB, .dden = DEN_4Gb, .dwid = X8,
  712. .rowbits = 16, .colbits = 10,
  713. .bits = {
  714. C(2), C(3), C(4), C(5), C(6), C(7), B(0), B(1), B(2),
  715. R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8),
  716. R(9), R(10), C(8), C(9), R(11), RS, R(12), R(13), R(14),
  717. R(15), 0, 0, 0
  718. }
  719. },
  720. {
  721. .addrdec = AMAP_2KB, .dden = DEN_8Gb, .dwid = X16,
  722. .rowbits = 16, .colbits = 10,
  723. .bits = {
  724. C(2), C(3), C(4), C(5), C(6), C(7), B(0), B(1), B(2),
  725. R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8),
  726. R(9), R(10), C(8), C(9), R(11), RS, R(12), R(13), R(14),
  727. R(15), 0, 0, 0
  728. }
  729. },
  730. {
  731. .addrdec = AMAP_2KB, .dden = DEN_8Gb, .dwid = X8,
  732. .rowbits = 16, .colbits = 11,
  733. .bits = {
  734. C(2), C(3), C(4), C(5), C(6), C(7), B(0), B(1), B(2),
  735. R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7), R(8),
  736. R(9), R(10), C(8), C(9), R(11), RS, C(11), R(12), R(13),
  737. R(14), R(15), 0, 0
  738. }
  739. },
  740. {
  741. .addrdec = AMAP_4KB, .dden = DEN_4Gb, .dwid = X16,
  742. .rowbits = 15, .colbits = 10,
  743. .bits = {
  744. C(2), C(3), C(4), C(5), C(6), C(7), C(8), B(0), B(1),
  745. B(2), R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7),
  746. R(8), R(9), R(10), C(9), R(11), RS, R(12), R(13), R(14),
  747. 0, 0, 0, 0
  748. }
  749. },
  750. {
  751. .addrdec = AMAP_4KB, .dden = DEN_4Gb, .dwid = X8,
  752. .rowbits = 16, .colbits = 10,
  753. .bits = {
  754. C(2), C(3), C(4), C(5), C(6), C(7), C(8), B(0), B(1),
  755. B(2), R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7),
  756. R(8), R(9), R(10), C(9), R(11), RS, R(12), R(13), R(14),
  757. R(15), 0, 0, 0
  758. }
  759. },
  760. {
  761. .addrdec = AMAP_4KB, .dden = DEN_8Gb, .dwid = X16,
  762. .rowbits = 16, .colbits = 10,
  763. .bits = {
  764. C(2), C(3), C(4), C(5), C(6), C(7), C(8), B(0), B(1),
  765. B(2), R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7),
  766. R(8), R(9), R(10), C(9), R(11), RS, R(12), R(13), R(14),
  767. R(15), 0, 0, 0
  768. }
  769. },
  770. {
  771. .addrdec = AMAP_4KB, .dden = DEN_8Gb, .dwid = X8,
  772. .rowbits = 16, .colbits = 11,
  773. .bits = {
  774. C(2), C(3), C(4), C(5), C(6), C(7), C(8), B(0), B(1),
  775. B(2), R(0), R(1), R(2), R(3), R(4), R(5), R(6), R(7),
  776. R(8), R(9), R(10), C(9), R(11), RS, C(11), R(12), R(13),
  777. R(14), R(15), 0, 0
  778. }
  779. }
  780. };
  781. static int bank_hash(u64 pmiaddr, int idx, int shft)
  782. {
  783. int bhash = 0;
  784. switch (idx) {
  785. case 0:
  786. bhash ^= ((pmiaddr >> (12 + shft)) ^ (pmiaddr >> (9 + shft))) & 1;
  787. break;
  788. case 1:
  789. bhash ^= (((pmiaddr >> (10 + shft)) ^ (pmiaddr >> (8 + shft))) & 1) << 1;
  790. bhash ^= ((pmiaddr >> 22) & 1) << 1;
  791. break;
  792. case 2:
  793. bhash ^= (((pmiaddr >> (13 + shft)) ^ (pmiaddr >> (11 + shft))) & 1) << 2;
  794. break;
  795. }
  796. return bhash;
  797. }
  798. static int rank_hash(u64 pmiaddr)
  799. {
  800. return ((pmiaddr >> 16) ^ (pmiaddr >> 10)) & 1;
  801. }
  802. /* Second stage decode. Compute rank, bank, row & column. */
  803. static int apl_pmi2mem(struct mem_ctl_info *mci, u64 pmiaddr, u32 pmiidx,
  804. struct dram_addr *daddr, char *msg)
  805. {
  806. struct d_cr_drp0 *cr_drp0 = &drp0[pmiidx];
  807. struct pnd2_pvt *pvt = mci->pvt_info;
  808. int g = pvt->dimm_geom[pmiidx];
  809. struct dimm_geometry *d = &dimms[g];
  810. int column = 0, bank = 0, row = 0, rank = 0;
  811. int i, idx, type, skiprs = 0;
  812. for (i = 0; i < PMI_ADDRESS_WIDTH; i++) {
  813. int bit = (pmiaddr >> i) & 1;
  814. if (i + skiprs >= PMI_ADDRESS_WIDTH) {
  815. snprintf(msg, PND2_MSG_SIZE, "Bad dimm_geometry[] table\n");
  816. return -EINVAL;
  817. }
  818. type = d->bits[i + skiprs] & ~0xf;
  819. idx = d->bits[i + skiprs] & 0xf;
  820. /*
  821. * On single rank DIMMs ignore the rank select bit
  822. * and shift remainder of "bits[]" down one place.
  823. */
  824. if (type == RS && (cr_drp0->rken0 + cr_drp0->rken1) == 1) {
  825. skiprs = 1;
  826. type = d->bits[i + skiprs] & ~0xf;
  827. idx = d->bits[i + skiprs] & 0xf;
  828. }
  829. switch (type) {
  830. case C(0):
  831. column |= (bit << idx);
  832. break;
  833. case B(0):
  834. bank |= (bit << idx);
  835. if (cr_drp0->bahen)
  836. bank ^= bank_hash(pmiaddr, idx, d->addrdec);
  837. break;
  838. case R(0):
  839. row |= (bit << idx);
  840. break;
  841. case RS:
  842. rank = bit;
  843. if (cr_drp0->rsien)
  844. rank ^= rank_hash(pmiaddr);
  845. break;
  846. default:
  847. if (bit) {
  848. snprintf(msg, PND2_MSG_SIZE, "Bad translation\n");
  849. return -EINVAL;
  850. }
  851. goto done;
  852. }
  853. }
  854. done:
  855. daddr->col = column;
  856. daddr->bank = bank;
  857. daddr->row = row;
  858. daddr->rank = rank;
  859. daddr->dimm = 0;
  860. return 0;
  861. }
  862. /* Pluck bit "in" from pmiaddr and return value shifted to bit "out" */
  863. #define dnv_get_bit(pmi, in, out) ((int)(((pmi) >> (in)) & 1u) << (out))
  864. static int dnv_pmi2mem(struct mem_ctl_info *mci, u64 pmiaddr, u32 pmiidx,
  865. struct dram_addr *daddr, char *msg)
  866. {
  867. /* Rank 0 or 1 */
  868. daddr->rank = dnv_get_bit(pmiaddr, dmap[pmiidx].rs0 + 13, 0);
  869. /* Rank 2 or 3 */
  870. daddr->rank |= dnv_get_bit(pmiaddr, dmap[pmiidx].rs1 + 13, 1);
  871. /*
  872. * Normally ranks 0,1 are DIMM0, and 2,3 are DIMM1, but we
  873. * flip them if DIMM1 is larger than DIMM0.
  874. */
  875. daddr->dimm = (daddr->rank >= 2) ^ drp[pmiidx].dimmflip;
  876. daddr->bank = dnv_get_bit(pmiaddr, dmap[pmiidx].ba0 + 6, 0);
  877. daddr->bank |= dnv_get_bit(pmiaddr, dmap[pmiidx].ba1 + 6, 1);
  878. daddr->bank |= dnv_get_bit(pmiaddr, dmap[pmiidx].bg0 + 6, 2);
  879. if (dsch.ddr4en)
  880. daddr->bank |= dnv_get_bit(pmiaddr, dmap[pmiidx].bg1 + 6, 3);
  881. if (dmap1[pmiidx].bxor) {
  882. if (dsch.ddr4en) {
  883. daddr->bank ^= dnv_get_bit(pmiaddr, dmap3[pmiidx].row6 + 6, 0);
  884. daddr->bank ^= dnv_get_bit(pmiaddr, dmap3[pmiidx].row7 + 6, 1);
  885. if (dsch.chan_width == 0)
  886. /* 64/72 bit dram channel width */
  887. daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca3 + 6, 2);
  888. else
  889. /* 32/40 bit dram channel width */
  890. daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca4 + 6, 2);
  891. daddr->bank ^= dnv_get_bit(pmiaddr, dmap2[pmiidx].row2 + 6, 3);
  892. } else {
  893. daddr->bank ^= dnv_get_bit(pmiaddr, dmap2[pmiidx].row2 + 6, 0);
  894. daddr->bank ^= dnv_get_bit(pmiaddr, dmap3[pmiidx].row6 + 6, 1);
  895. if (dsch.chan_width == 0)
  896. daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca3 + 6, 2);
  897. else
  898. daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca4 + 6, 2);
  899. }
  900. }
  901. daddr->row = dnv_get_bit(pmiaddr, dmap2[pmiidx].row0 + 6, 0);
  902. daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row1 + 6, 1);
  903. daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row2 + 6, 2);
  904. daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row3 + 6, 3);
  905. daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row4 + 6, 4);
  906. daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row5 + 6, 5);
  907. daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row6 + 6, 6);
  908. daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row7 + 6, 7);
  909. daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row8 + 6, 8);
  910. daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row9 + 6, 9);
  911. daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row10 + 6, 10);
  912. daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row11 + 6, 11);
  913. daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row12 + 6, 12);
  914. daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row13 + 6, 13);
  915. if (dmap4[pmiidx].row14 != 31)
  916. daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row14 + 6, 14);
  917. if (dmap4[pmiidx].row15 != 31)
  918. daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row15 + 6, 15);
  919. if (dmap4[pmiidx].row16 != 31)
  920. daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row16 + 6, 16);
  921. if (dmap4[pmiidx].row17 != 31)
  922. daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row17 + 6, 17);
  923. daddr->col = dnv_get_bit(pmiaddr, dmap5[pmiidx].ca3 + 6, 3);
  924. daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca4 + 6, 4);
  925. daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca5 + 6, 5);
  926. daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca6 + 6, 6);
  927. daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca7 + 6, 7);
  928. daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca8 + 6, 8);
  929. daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca9 + 6, 9);
  930. if (!dsch.ddr4en && dmap1[pmiidx].ca11 != 0x3f)
  931. daddr->col |= dnv_get_bit(pmiaddr, dmap1[pmiidx].ca11 + 13, 11);
  932. return 0;
  933. }
  934. static int check_channel(int ch)
  935. {
  936. if (drp0[ch].dramtype != 0) {
  937. pnd2_printk(KERN_INFO, "Unsupported DIMM in channel %d\n", ch);
  938. return 1;
  939. } else if (drp0[ch].eccen == 0) {
  940. pnd2_printk(KERN_INFO, "ECC disabled on channel %d\n", ch);
  941. return 1;
  942. }
  943. return 0;
  944. }
  945. static int apl_check_ecc_active(void)
  946. {
  947. int i, ret = 0;
  948. /* Check dramtype and ECC mode for each present DIMM */
  949. for (i = 0; i < APL_NUM_CHANNELS; i++)
  950. if (chan_mask & BIT(i))
  951. ret += check_channel(i);
  952. return ret ? -EINVAL : 0;
  953. }
  954. #define DIMMS_PRESENT(d) ((d)->rken0 + (d)->rken1 + (d)->rken2 + (d)->rken3)
  955. static int check_unit(int ch)
  956. {
  957. struct d_cr_drp *d = &drp[ch];
  958. if (DIMMS_PRESENT(d) && !ecc_ctrl[ch].eccen) {
  959. pnd2_printk(KERN_INFO, "ECC disabled on channel %d\n", ch);
  960. return 1;
  961. }
  962. return 0;
  963. }
  964. static int dnv_check_ecc_active(void)
  965. {
  966. int i, ret = 0;
  967. for (i = 0; i < DNV_NUM_CHANNELS; i++)
  968. ret += check_unit(i);
  969. return ret ? -EINVAL : 0;
  970. }
  971. static int get_memory_error_data(struct mem_ctl_info *mci, u64 addr,
  972. struct dram_addr *daddr, char *msg)
  973. {
  974. u64 pmiaddr;
  975. u32 pmiidx;
  976. int ret;
  977. ret = sys2pmi(addr, &pmiidx, &pmiaddr, msg);
  978. if (ret)
  979. return ret;
  980. pmiaddr >>= ops->pmiaddr_shift;
  981. /* pmi channel idx to dimm channel idx */
  982. pmiidx >>= ops->pmiidx_shift;
  983. daddr->chan = pmiidx;
  984. ret = ops->pmi2mem(mci, pmiaddr, pmiidx, daddr, msg);
  985. if (ret)
  986. return ret;
  987. edac_dbg(0, "SysAddr=%llx PmiAddr=%llx Channel=%d DIMM=%d Rank=%d Bank=%d Row=%d Column=%d\n",
  988. addr, pmiaddr, daddr->chan, daddr->dimm, daddr->rank, daddr->bank, daddr->row, daddr->col);
  989. return 0;
  990. }
  991. static void pnd2_mce_output_error(struct mem_ctl_info *mci, const struct mce *m,
  992. struct dram_addr *daddr)
  993. {
  994. enum hw_event_mc_err_type tp_event;
  995. char *optype, msg[PND2_MSG_SIZE];
  996. bool ripv = m->mcgstatus & MCG_STATUS_RIPV;
  997. bool overflow = m->status & MCI_STATUS_OVER;
  998. bool uc_err = m->status & MCI_STATUS_UC;
  999. bool recov = m->status & MCI_STATUS_S;
  1000. u32 core_err_cnt = GET_BITFIELD(m->status, 38, 52);
  1001. u32 mscod = GET_BITFIELD(m->status, 16, 31);
  1002. u32 errcode = GET_BITFIELD(m->status, 0, 15);
  1003. u32 optypenum = GET_BITFIELD(m->status, 4, 6);
  1004. int rc;
  1005. tp_event = uc_err ? (ripv ? HW_EVENT_ERR_FATAL : HW_EVENT_ERR_UNCORRECTED) :
  1006. HW_EVENT_ERR_CORRECTED;
  1007. /*
  1008. * According with Table 15-9 of the Intel Architecture spec vol 3A,
  1009. * memory errors should fit in this mask:
  1010. * 000f 0000 1mmm cccc (binary)
  1011. * where:
  1012. * f = Correction Report Filtering Bit. If 1, subsequent errors
  1013. * won't be shown
  1014. * mmm = error type
  1015. * cccc = channel
  1016. * If the mask doesn't match, report an error to the parsing logic
  1017. */
  1018. if (!((errcode & 0xef80) == 0x80)) {
  1019. optype = "Can't parse: it is not a mem";
  1020. } else {
  1021. switch (optypenum) {
  1022. case 0:
  1023. optype = "generic undef request error";
  1024. break;
  1025. case 1:
  1026. optype = "memory read error";
  1027. break;
  1028. case 2:
  1029. optype = "memory write error";
  1030. break;
  1031. case 3:
  1032. optype = "addr/cmd error";
  1033. break;
  1034. case 4:
  1035. optype = "memory scrubbing error";
  1036. break;
  1037. default:
  1038. optype = "reserved";
  1039. break;
  1040. }
  1041. }
  1042. /* Only decode errors with an valid address (ADDRV) */
  1043. if (!(m->status & MCI_STATUS_ADDRV))
  1044. return;
  1045. rc = get_memory_error_data(mci, m->addr, daddr, msg);
  1046. if (rc)
  1047. goto address_error;
  1048. snprintf(msg, sizeof(msg),
  1049. "%s%s err_code:%04x:%04x channel:%d DIMM:%d rank:%d row:%d bank:%d col:%d",
  1050. overflow ? " OVERFLOW" : "", (uc_err && recov) ? " recoverable" : "", mscod,
  1051. errcode, daddr->chan, daddr->dimm, daddr->rank, daddr->row, daddr->bank, daddr->col);
  1052. edac_dbg(0, "%s\n", msg);
  1053. /* Call the helper to output message */
  1054. edac_mc_handle_error(tp_event, mci, core_err_cnt, m->addr >> PAGE_SHIFT,
  1055. m->addr & ~PAGE_MASK, 0, daddr->chan, daddr->dimm, -1, optype, msg);
  1056. return;
  1057. address_error:
  1058. edac_mc_handle_error(tp_event, mci, core_err_cnt, 0, 0, 0, -1, -1, -1, msg, "");
  1059. }
  1060. static void apl_get_dimm_config(struct mem_ctl_info *mci)
  1061. {
  1062. struct pnd2_pvt *pvt = mci->pvt_info;
  1063. struct dimm_info *dimm;
  1064. struct d_cr_drp0 *d;
  1065. u64 capacity;
  1066. int i, g;
  1067. for (i = 0; i < APL_NUM_CHANNELS; i++) {
  1068. if (!(chan_mask & BIT(i)))
  1069. continue;
  1070. dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, mci->n_layers, i, 0, 0);
  1071. if (!dimm) {
  1072. edac_dbg(0, "No allocated DIMM for channel %d\n", i);
  1073. continue;
  1074. }
  1075. d = &drp0[i];
  1076. for (g = 0; g < ARRAY_SIZE(dimms); g++)
  1077. if (dimms[g].addrdec == d->addrdec &&
  1078. dimms[g].dden == d->dden &&
  1079. dimms[g].dwid == d->dwid)
  1080. break;
  1081. if (g == ARRAY_SIZE(dimms)) {
  1082. edac_dbg(0, "Channel %d: unrecognized DIMM\n", i);
  1083. continue;
  1084. }
  1085. pvt->dimm_geom[i] = g;
  1086. capacity = (d->rken0 + d->rken1) * 8 * (1ul << dimms[g].rowbits) *
  1087. (1ul << dimms[g].colbits);
  1088. edac_dbg(0, "Channel %d: %lld MByte DIMM\n", i, capacity >> (20 - 3));
  1089. dimm->nr_pages = MiB_TO_PAGES(capacity >> (20 - 3));
  1090. dimm->grain = 32;
  1091. dimm->dtype = (d->dwid == 0) ? DEV_X8 : DEV_X16;
  1092. dimm->mtype = MEM_DDR3;
  1093. dimm->edac_mode = EDAC_SECDED;
  1094. snprintf(dimm->label, sizeof(dimm->label), "Slice#%d_Chan#%d", i / 2, i % 2);
  1095. }
  1096. }
  1097. static const int dnv_dtypes[] = {
  1098. DEV_X8, DEV_X4, DEV_X16, DEV_UNKNOWN
  1099. };
  1100. static void dnv_get_dimm_config(struct mem_ctl_info *mci)
  1101. {
  1102. int i, j, ranks_of_dimm[DNV_MAX_DIMMS], banks, rowbits, colbits, memtype;
  1103. struct dimm_info *dimm;
  1104. struct d_cr_drp *d;
  1105. u64 capacity;
  1106. if (dsch.ddr4en) {
  1107. memtype = MEM_DDR4;
  1108. banks = 16;
  1109. colbits = 10;
  1110. } else {
  1111. memtype = MEM_DDR3;
  1112. banks = 8;
  1113. }
  1114. for (i = 0; i < DNV_NUM_CHANNELS; i++) {
  1115. if (dmap4[i].row14 == 31)
  1116. rowbits = 14;
  1117. else if (dmap4[i].row15 == 31)
  1118. rowbits = 15;
  1119. else if (dmap4[i].row16 == 31)
  1120. rowbits = 16;
  1121. else if (dmap4[i].row17 == 31)
  1122. rowbits = 17;
  1123. else
  1124. rowbits = 18;
  1125. if (memtype == MEM_DDR3) {
  1126. if (dmap1[i].ca11 != 0x3f)
  1127. colbits = 12;
  1128. else
  1129. colbits = 10;
  1130. }
  1131. d = &drp[i];
  1132. /* DIMM0 is present if rank0 and/or rank1 is enabled */
  1133. ranks_of_dimm[0] = d->rken0 + d->rken1;
  1134. /* DIMM1 is present if rank2 and/or rank3 is enabled */
  1135. ranks_of_dimm[1] = d->rken2 + d->rken3;
  1136. for (j = 0; j < DNV_MAX_DIMMS; j++) {
  1137. if (!ranks_of_dimm[j])
  1138. continue;
  1139. dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, mci->n_layers, i, j, 0);
  1140. if (!dimm) {
  1141. edac_dbg(0, "No allocated DIMM for channel %d DIMM %d\n", i, j);
  1142. continue;
  1143. }
  1144. capacity = ranks_of_dimm[j] * banks * (1ul << rowbits) * (1ul << colbits);
  1145. edac_dbg(0, "Channel %d DIMM %d: %lld MByte DIMM\n", i, j, capacity >> (20 - 3));
  1146. dimm->nr_pages = MiB_TO_PAGES(capacity >> (20 - 3));
  1147. dimm->grain = 32;
  1148. dimm->dtype = dnv_dtypes[j ? d->dimmdwid0 : d->dimmdwid1];
  1149. dimm->mtype = memtype;
  1150. dimm->edac_mode = EDAC_SECDED;
  1151. snprintf(dimm->label, sizeof(dimm->label), "Chan#%d_DIMM#%d", i, j);
  1152. }
  1153. }
  1154. }
  1155. static int pnd2_register_mci(struct mem_ctl_info **ppmci)
  1156. {
  1157. struct edac_mc_layer layers[2];
  1158. struct mem_ctl_info *mci;
  1159. struct pnd2_pvt *pvt;
  1160. int rc;
  1161. rc = ops->check_ecc();
  1162. if (rc < 0)
  1163. return rc;
  1164. /* Allocate a new MC control structure */
  1165. layers[0].type = EDAC_MC_LAYER_CHANNEL;
  1166. layers[0].size = ops->channels;
  1167. layers[0].is_virt_csrow = false;
  1168. layers[1].type = EDAC_MC_LAYER_SLOT;
  1169. layers[1].size = ops->dimms_per_channel;
  1170. layers[1].is_virt_csrow = true;
  1171. mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(*pvt));
  1172. if (!mci)
  1173. return -ENOMEM;
  1174. pvt = mci->pvt_info;
  1175. memset(pvt, 0, sizeof(*pvt));
  1176. mci->mod_name = EDAC_MOD_STR;
  1177. mci->dev_name = ops->name;
  1178. mci->ctl_name = "Pondicherry2";
  1179. /* Get dimm basic config and the memory layout */
  1180. ops->get_dimm_config(mci);
  1181. if (edac_mc_add_mc(mci)) {
  1182. edac_dbg(0, "MC: failed edac_mc_add_mc()\n");
  1183. edac_mc_free(mci);
  1184. return -EINVAL;
  1185. }
  1186. *ppmci = mci;
  1187. return 0;
  1188. }
  1189. static void pnd2_unregister_mci(struct mem_ctl_info *mci)
  1190. {
  1191. if (unlikely(!mci || !mci->pvt_info)) {
  1192. pnd2_printk(KERN_ERR, "Couldn't find mci handler\n");
  1193. return;
  1194. }
  1195. /* Remove MC sysfs nodes */
  1196. edac_mc_del_mc(NULL);
  1197. edac_dbg(1, "%s: free mci struct\n", mci->ctl_name);
  1198. edac_mc_free(mci);
  1199. }
  1200. /*
  1201. * Callback function registered with core kernel mce code.
  1202. * Called once for each logged error.
  1203. */
  1204. static int pnd2_mce_check_error(struct notifier_block *nb, unsigned long val, void *data)
  1205. {
  1206. struct mce *mce = (struct mce *)data;
  1207. struct mem_ctl_info *mci;
  1208. struct dram_addr daddr;
  1209. char *type;
  1210. if (edac_get_report_status() == EDAC_REPORTING_DISABLED)
  1211. return NOTIFY_DONE;
  1212. mci = pnd2_mci;
  1213. if (!mci)
  1214. return NOTIFY_DONE;
  1215. /*
  1216. * Just let mcelog handle it if the error is
  1217. * outside the memory controller. A memory error
  1218. * is indicated by bit 7 = 1 and bits = 8-11,13-15 = 0.
  1219. * bit 12 has an special meaning.
  1220. */
  1221. if ((mce->status & 0xefff) >> 7 != 1)
  1222. return NOTIFY_DONE;
  1223. if (mce->mcgstatus & MCG_STATUS_MCIP)
  1224. type = "Exception";
  1225. else
  1226. type = "Event";
  1227. pnd2_mc_printk(mci, KERN_INFO, "HANDLING MCE MEMORY ERROR\n");
  1228. pnd2_mc_printk(mci, KERN_INFO, "CPU %u: Machine Check %s: %llx Bank %u: %llx\n",
  1229. mce->extcpu, type, mce->mcgstatus, mce->bank, mce->status);
  1230. pnd2_mc_printk(mci, KERN_INFO, "TSC %llx ", mce->tsc);
  1231. pnd2_mc_printk(mci, KERN_INFO, "ADDR %llx ", mce->addr);
  1232. pnd2_mc_printk(mci, KERN_INFO, "MISC %llx ", mce->misc);
  1233. pnd2_mc_printk(mci, KERN_INFO, "PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x\n",
  1234. mce->cpuvendor, mce->cpuid, mce->time, mce->socketid, mce->apicid);
  1235. pnd2_mce_output_error(mci, mce, &daddr);
  1236. /* Advice mcelog that the error were handled */
  1237. return NOTIFY_STOP;
  1238. }
  1239. static struct notifier_block pnd2_mce_dec = {
  1240. .notifier_call = pnd2_mce_check_error,
  1241. };
  1242. #ifdef CONFIG_EDAC_DEBUG
  1243. /*
  1244. * Write an address to this file to exercise the address decode
  1245. * logic in this driver.
  1246. */
  1247. static u64 pnd2_fake_addr;
  1248. #define PND2_BLOB_SIZE 1024
  1249. static char pnd2_result[PND2_BLOB_SIZE];
  1250. static struct dentry *pnd2_test;
  1251. static struct debugfs_blob_wrapper pnd2_blob = {
  1252. .data = pnd2_result,
  1253. .size = 0
  1254. };
  1255. static int debugfs_u64_set(void *data, u64 val)
  1256. {
  1257. struct dram_addr daddr;
  1258. struct mce m;
  1259. *(u64 *)data = val;
  1260. m.mcgstatus = 0;
  1261. /* ADDRV + MemRd + Unknown channel */
  1262. m.status = MCI_STATUS_ADDRV + 0x9f;
  1263. m.addr = val;
  1264. pnd2_mce_output_error(pnd2_mci, &m, &daddr);
  1265. snprintf(pnd2_blob.data, PND2_BLOB_SIZE,
  1266. "SysAddr=%llx Channel=%d DIMM=%d Rank=%d Bank=%d Row=%d Column=%d\n",
  1267. m.addr, daddr.chan, daddr.dimm, daddr.rank, daddr.bank, daddr.row, daddr.col);
  1268. pnd2_blob.size = strlen(pnd2_blob.data);
  1269. return 0;
  1270. }
  1271. DEFINE_DEBUGFS_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
  1272. static void setup_pnd2_debug(void)
  1273. {
  1274. pnd2_test = edac_debugfs_create_dir("pnd2_test");
  1275. edac_debugfs_create_file("pnd2_debug_addr", 0200, pnd2_test,
  1276. &pnd2_fake_addr, &fops_u64_wo);
  1277. debugfs_create_blob("pnd2_debug_results", 0400, pnd2_test, &pnd2_blob);
  1278. }
  1279. static void teardown_pnd2_debug(void)
  1280. {
  1281. debugfs_remove_recursive(pnd2_test);
  1282. }
  1283. #else
  1284. static void setup_pnd2_debug(void) {}
  1285. static void teardown_pnd2_debug(void) {}
  1286. #endif /* CONFIG_EDAC_DEBUG */
  1287. static int pnd2_probe(void)
  1288. {
  1289. int rc;
  1290. edac_dbg(2, "\n");
  1291. rc = get_registers();
  1292. if (rc)
  1293. return rc;
  1294. return pnd2_register_mci(&pnd2_mci);
  1295. }
  1296. static void pnd2_remove(void)
  1297. {
  1298. edac_dbg(0, "\n");
  1299. pnd2_unregister_mci(pnd2_mci);
  1300. }
  1301. static struct dunit_ops apl_ops = {
  1302. .name = "pnd2/apl",
  1303. .type = APL,
  1304. .pmiaddr_shift = LOG2_PMI_ADDR_GRANULARITY,
  1305. .pmiidx_shift = 0,
  1306. .channels = APL_NUM_CHANNELS,
  1307. .dimms_per_channel = 1,
  1308. .rd_reg = apl_rd_reg,
  1309. .get_registers = apl_get_registers,
  1310. .check_ecc = apl_check_ecc_active,
  1311. .mk_region = apl_mk_region,
  1312. .get_dimm_config = apl_get_dimm_config,
  1313. .pmi2mem = apl_pmi2mem,
  1314. };
  1315. static struct dunit_ops dnv_ops = {
  1316. .name = "pnd2/dnv",
  1317. .type = DNV,
  1318. .pmiaddr_shift = 0,
  1319. .pmiidx_shift = 1,
  1320. .channels = DNV_NUM_CHANNELS,
  1321. .dimms_per_channel = 2,
  1322. .rd_reg = dnv_rd_reg,
  1323. .get_registers = dnv_get_registers,
  1324. .check_ecc = dnv_check_ecc_active,
  1325. .mk_region = dnv_mk_region,
  1326. .get_dimm_config = dnv_get_dimm_config,
  1327. .pmi2mem = dnv_pmi2mem,
  1328. };
  1329. static const struct x86_cpu_id pnd2_cpuids[] = {
  1330. { X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_GOLDMONT, 0, (kernel_ulong_t)&apl_ops },
  1331. { X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_GOLDMONT_X, 0, (kernel_ulong_t)&dnv_ops },
  1332. { }
  1333. };
  1334. MODULE_DEVICE_TABLE(x86cpu, pnd2_cpuids);
  1335. static int __init pnd2_init(void)
  1336. {
  1337. const struct x86_cpu_id *id;
  1338. const char *owner;
  1339. int rc;
  1340. edac_dbg(2, "\n");
  1341. owner = edac_get_owner();
  1342. if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
  1343. return -EBUSY;
  1344. id = x86_match_cpu(pnd2_cpuids);
  1345. if (!id)
  1346. return -ENODEV;
  1347. ops = (struct dunit_ops *)id->driver_data;
  1348. if (ops->type == APL) {
  1349. p2sb_bus = pci_find_bus(0, 0);
  1350. if (!p2sb_bus)
  1351. return -ENODEV;
  1352. }
  1353. /* Ensure that the OPSTATE is set correctly for POLL or NMI */
  1354. opstate_init();
  1355. rc = pnd2_probe();
  1356. if (rc < 0) {
  1357. pnd2_printk(KERN_ERR, "Failed to register device with error %d.\n", rc);
  1358. return rc;
  1359. }
  1360. if (!pnd2_mci)
  1361. return -ENODEV;
  1362. mce_register_decode_chain(&pnd2_mce_dec);
  1363. setup_pnd2_debug();
  1364. return 0;
  1365. }
  1366. static void __exit pnd2_exit(void)
  1367. {
  1368. edac_dbg(2, "\n");
  1369. teardown_pnd2_debug();
  1370. mce_unregister_decode_chain(&pnd2_mce_dec);
  1371. pnd2_remove();
  1372. }
  1373. module_init(pnd2_init);
  1374. module_exit(pnd2_exit);
  1375. module_param(edac_op_state, int, 0444);
  1376. MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
  1377. MODULE_LICENSE("GPL v2");
  1378. MODULE_AUTHOR("Tony Luck");
  1379. MODULE_DESCRIPTION("MC Driver for Intel SoC using Pondicherry memory controller");