pnd2_edac.c 42 KB

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