tegra210-emc-core.c 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2015-2020, NVIDIA CORPORATION. All rights reserved.
  4. */
  5. #include <linux/bitfield.h>
  6. #include <linux/clk.h>
  7. #include <linux/clk/tegra.h>
  8. #include <linux/debugfs.h>
  9. #include <linux/delay.h>
  10. #include <linux/kernel.h>
  11. #include <linux/mod_devicetable.h>
  12. #include <linux/module.h>
  13. #include <linux/of_reserved_mem.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/slab.h>
  16. #include <linux/thermal.h>
  17. #include <soc/tegra/fuse.h>
  18. #include <soc/tegra/mc.h>
  19. #include "tegra210-emc.h"
  20. #include "tegra210-mc.h"
  21. /* CLK_RST_CONTROLLER_CLK_SOURCE_EMC */
  22. #define EMC_CLK_EMC_2X_CLK_SRC_SHIFT 29
  23. #define EMC_CLK_EMC_2X_CLK_SRC_MASK \
  24. (0x7 << EMC_CLK_EMC_2X_CLK_SRC_SHIFT)
  25. #define EMC_CLK_SOURCE_PLLM_LJ 0x4
  26. #define EMC_CLK_SOURCE_PLLMB_LJ 0x5
  27. #define EMC_CLK_FORCE_CC_TRIGGER BIT(27)
  28. #define EMC_CLK_MC_EMC_SAME_FREQ BIT(16)
  29. #define EMC_CLK_EMC_2X_CLK_DIVISOR_SHIFT 0
  30. #define EMC_CLK_EMC_2X_CLK_DIVISOR_MASK \
  31. (0xff << EMC_CLK_EMC_2X_CLK_DIVISOR_SHIFT)
  32. /* CLK_RST_CONTROLLER_CLK_SOURCE_EMC_DLL */
  33. #define DLL_CLK_EMC_DLL_CLK_SRC_SHIFT 29
  34. #define DLL_CLK_EMC_DLL_CLK_SRC_MASK \
  35. (0x7 << DLL_CLK_EMC_DLL_CLK_SRC_SHIFT)
  36. #define DLL_CLK_EMC_DLL_DDLL_CLK_SEL_SHIFT 10
  37. #define DLL_CLK_EMC_DLL_DDLL_CLK_SEL_MASK \
  38. (0x3 << DLL_CLK_EMC_DLL_DDLL_CLK_SEL_SHIFT)
  39. #define PLLM_VCOA 0
  40. #define PLLM_VCOB 1
  41. #define EMC_DLL_SWITCH_OUT 2
  42. #define DLL_CLK_EMC_DLL_CLK_DIVISOR_SHIFT 0
  43. #define DLL_CLK_EMC_DLL_CLK_DIVISOR_MASK \
  44. (0xff << DLL_CLK_EMC_DLL_CLK_DIVISOR_SHIFT)
  45. /* MC_EMEM_ARB_MISC0 */
  46. #define MC_EMEM_ARB_MISC0_EMC_SAME_FREQ BIT(27)
  47. /* EMC_DATA_BRLSHFT_X */
  48. #define EMC0_EMC_DATA_BRLSHFT_0_INDEX 2
  49. #define EMC1_EMC_DATA_BRLSHFT_0_INDEX 3
  50. #define EMC0_EMC_DATA_BRLSHFT_1_INDEX 4
  51. #define EMC1_EMC_DATA_BRLSHFT_1_INDEX 5
  52. #define TRIM_REG(chan, rank, reg, byte) \
  53. (((EMC_PMACRO_OB_DDLL_LONG_DQ_RANK ## rank ## _ ## reg ## \
  54. _OB_DDLL_LONG_DQ_RANK ## rank ## _BYTE ## byte ## _MASK & \
  55. next->trim_regs[EMC_PMACRO_OB_DDLL_LONG_DQ_RANK ## \
  56. rank ## _ ## reg ## _INDEX]) >> \
  57. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK ## rank ## _ ## reg ## \
  58. _OB_DDLL_LONG_DQ_RANK ## rank ## _BYTE ## byte ## _SHIFT) \
  59. + \
  60. (((EMC_DATA_BRLSHFT_ ## rank ## _RANK ## rank ## _BYTE ## \
  61. byte ## _DATA_BRLSHFT_MASK & \
  62. next->trim_perch_regs[EMC ## chan ## \
  63. _EMC_DATA_BRLSHFT_ ## rank ## _INDEX]) >> \
  64. EMC_DATA_BRLSHFT_ ## rank ## _RANK ## rank ## _BYTE ## \
  65. byte ## _DATA_BRLSHFT_SHIFT) * 64))
  66. #define CALC_TEMP(rank, reg, byte1, byte2, n) \
  67. (((new[n] << EMC_PMACRO_OB_DDLL_LONG_DQ_RANK ## rank ## _ ## \
  68. reg ## _OB_DDLL_LONG_DQ_RANK ## rank ## _BYTE ## byte1 ## _SHIFT) & \
  69. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK ## rank ## _ ## reg ## \
  70. _OB_DDLL_LONG_DQ_RANK ## rank ## _BYTE ## byte1 ## _MASK) \
  71. | \
  72. ((new[n + 1] << EMC_PMACRO_OB_DDLL_LONG_DQ_RANK ## rank ## _ ##\
  73. reg ## _OB_DDLL_LONG_DQ_RANK ## rank ## _BYTE ## byte2 ## _SHIFT) & \
  74. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK ## rank ## _ ## reg ## \
  75. _OB_DDLL_LONG_DQ_RANK ## rank ## _BYTE ## byte2 ## _MASK))
  76. #define REFRESH_SPEEDUP(value, speedup) \
  77. (((value) & 0xffff0000) | ((value) & 0xffff) * (speedup))
  78. #define LPDDR2_MR4_SRR GENMASK(2, 0)
  79. static const struct tegra210_emc_sequence *tegra210_emc_sequences[] = {
  80. &tegra210_emc_r21021,
  81. };
  82. static const struct tegra210_emc_table_register_offsets
  83. tegra210_emc_table_register_offsets = {
  84. .burst = {
  85. EMC_RC,
  86. EMC_RFC,
  87. EMC_RFCPB,
  88. EMC_REFCTRL2,
  89. EMC_RFC_SLR,
  90. EMC_RAS,
  91. EMC_RP,
  92. EMC_R2W,
  93. EMC_W2R,
  94. EMC_R2P,
  95. EMC_W2P,
  96. EMC_R2R,
  97. EMC_TPPD,
  98. EMC_CCDMW,
  99. EMC_RD_RCD,
  100. EMC_WR_RCD,
  101. EMC_RRD,
  102. EMC_REXT,
  103. EMC_WEXT,
  104. EMC_WDV_CHK,
  105. EMC_WDV,
  106. EMC_WSV,
  107. EMC_WEV,
  108. EMC_WDV_MASK,
  109. EMC_WS_DURATION,
  110. EMC_WE_DURATION,
  111. EMC_QUSE,
  112. EMC_QUSE_WIDTH,
  113. EMC_IBDLY,
  114. EMC_OBDLY,
  115. EMC_EINPUT,
  116. EMC_MRW6,
  117. EMC_EINPUT_DURATION,
  118. EMC_PUTERM_EXTRA,
  119. EMC_PUTERM_WIDTH,
  120. EMC_QRST,
  121. EMC_QSAFE,
  122. EMC_RDV,
  123. EMC_RDV_MASK,
  124. EMC_RDV_EARLY,
  125. EMC_RDV_EARLY_MASK,
  126. EMC_REFRESH,
  127. EMC_BURST_REFRESH_NUM,
  128. EMC_PRE_REFRESH_REQ_CNT,
  129. EMC_PDEX2WR,
  130. EMC_PDEX2RD,
  131. EMC_PCHG2PDEN,
  132. EMC_ACT2PDEN,
  133. EMC_AR2PDEN,
  134. EMC_RW2PDEN,
  135. EMC_CKE2PDEN,
  136. EMC_PDEX2CKE,
  137. EMC_PDEX2MRR,
  138. EMC_TXSR,
  139. EMC_TXSRDLL,
  140. EMC_TCKE,
  141. EMC_TCKESR,
  142. EMC_TPD,
  143. EMC_TFAW,
  144. EMC_TRPAB,
  145. EMC_TCLKSTABLE,
  146. EMC_TCLKSTOP,
  147. EMC_MRW7,
  148. EMC_TREFBW,
  149. EMC_ODT_WRITE,
  150. EMC_FBIO_CFG5,
  151. EMC_FBIO_CFG7,
  152. EMC_CFG_DIG_DLL,
  153. EMC_CFG_DIG_DLL_PERIOD,
  154. EMC_PMACRO_IB_RXRT,
  155. EMC_CFG_PIPE_1,
  156. EMC_CFG_PIPE_2,
  157. EMC_PMACRO_QUSE_DDLL_RANK0_4,
  158. EMC_PMACRO_QUSE_DDLL_RANK0_5,
  159. EMC_PMACRO_QUSE_DDLL_RANK1_4,
  160. EMC_PMACRO_QUSE_DDLL_RANK1_5,
  161. EMC_MRW8,
  162. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4,
  163. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5,
  164. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0,
  165. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1,
  166. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2,
  167. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3,
  168. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4,
  169. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5,
  170. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0,
  171. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1,
  172. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2,
  173. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3,
  174. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4,
  175. EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5,
  176. EMC_PMACRO_DDLL_LONG_CMD_0,
  177. EMC_PMACRO_DDLL_LONG_CMD_1,
  178. EMC_PMACRO_DDLL_LONG_CMD_2,
  179. EMC_PMACRO_DDLL_LONG_CMD_3,
  180. EMC_PMACRO_DDLL_LONG_CMD_4,
  181. EMC_PMACRO_DDLL_SHORT_CMD_0,
  182. EMC_PMACRO_DDLL_SHORT_CMD_1,
  183. EMC_PMACRO_DDLL_SHORT_CMD_2,
  184. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_3,
  185. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_3,
  186. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_3,
  187. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_3,
  188. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_3,
  189. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_3,
  190. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_3,
  191. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_3,
  192. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_3,
  193. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_3,
  194. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_3,
  195. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_3,
  196. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_3,
  197. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_3,
  198. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_3,
  199. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_3,
  200. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_3,
  201. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_3,
  202. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_3,
  203. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_3,
  204. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_0,
  205. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_1,
  206. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_2,
  207. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_3,
  208. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_0,
  209. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_1,
  210. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_2,
  211. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_3,
  212. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_0,
  213. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_1,
  214. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_2,
  215. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_3,
  216. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_0,
  217. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_1,
  218. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_2,
  219. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_3,
  220. EMC_TXDSRVTTGEN,
  221. EMC_FDPD_CTRL_DQ,
  222. EMC_FDPD_CTRL_CMD,
  223. EMC_FBIO_SPARE,
  224. EMC_ZCAL_INTERVAL,
  225. EMC_ZCAL_WAIT_CNT,
  226. EMC_MRS_WAIT_CNT,
  227. EMC_MRS_WAIT_CNT2,
  228. EMC_AUTO_CAL_CHANNEL,
  229. EMC_DLL_CFG_0,
  230. EMC_DLL_CFG_1,
  231. EMC_PMACRO_AUTOCAL_CFG_COMMON,
  232. EMC_PMACRO_ZCTRL,
  233. EMC_CFG,
  234. EMC_CFG_PIPE,
  235. EMC_DYN_SELF_REF_CONTROL,
  236. EMC_QPOP,
  237. EMC_DQS_BRLSHFT_0,
  238. EMC_DQS_BRLSHFT_1,
  239. EMC_CMD_BRLSHFT_2,
  240. EMC_CMD_BRLSHFT_3,
  241. EMC_PMACRO_PAD_CFG_CTRL,
  242. EMC_PMACRO_DATA_PAD_RX_CTRL,
  243. EMC_PMACRO_CMD_PAD_RX_CTRL,
  244. EMC_PMACRO_DATA_RX_TERM_MODE,
  245. EMC_PMACRO_CMD_RX_TERM_MODE,
  246. EMC_PMACRO_CMD_PAD_TX_CTRL,
  247. EMC_PMACRO_DATA_PAD_TX_CTRL,
  248. EMC_PMACRO_COMMON_PAD_TX_CTRL,
  249. EMC_PMACRO_VTTGEN_CTRL_0,
  250. EMC_PMACRO_VTTGEN_CTRL_1,
  251. EMC_PMACRO_VTTGEN_CTRL_2,
  252. EMC_PMACRO_BRICK_CTRL_RFU1,
  253. EMC_PMACRO_CMD_BRICK_CTRL_FDPD,
  254. EMC_PMACRO_BRICK_CTRL_RFU2,
  255. EMC_PMACRO_DATA_BRICK_CTRL_FDPD,
  256. EMC_PMACRO_BG_BIAS_CTRL_0,
  257. EMC_CFG_3,
  258. EMC_PMACRO_TX_PWRD_0,
  259. EMC_PMACRO_TX_PWRD_1,
  260. EMC_PMACRO_TX_PWRD_2,
  261. EMC_PMACRO_TX_PWRD_3,
  262. EMC_PMACRO_TX_PWRD_4,
  263. EMC_PMACRO_TX_PWRD_5,
  264. EMC_CONFIG_SAMPLE_DELAY,
  265. EMC_PMACRO_TX_SEL_CLK_SRC_0,
  266. EMC_PMACRO_TX_SEL_CLK_SRC_1,
  267. EMC_PMACRO_TX_SEL_CLK_SRC_2,
  268. EMC_PMACRO_TX_SEL_CLK_SRC_3,
  269. EMC_PMACRO_TX_SEL_CLK_SRC_4,
  270. EMC_PMACRO_TX_SEL_CLK_SRC_5,
  271. EMC_PMACRO_DDLL_BYPASS,
  272. EMC_PMACRO_DDLL_PWRD_0,
  273. EMC_PMACRO_DDLL_PWRD_1,
  274. EMC_PMACRO_DDLL_PWRD_2,
  275. EMC_PMACRO_CMD_CTRL_0,
  276. EMC_PMACRO_CMD_CTRL_1,
  277. EMC_PMACRO_CMD_CTRL_2,
  278. EMC_TR_TIMING_0,
  279. EMC_TR_DVFS,
  280. EMC_TR_CTRL_1,
  281. EMC_TR_RDV,
  282. EMC_TR_QPOP,
  283. EMC_TR_RDV_MASK,
  284. EMC_MRW14,
  285. EMC_TR_QSAFE,
  286. EMC_TR_QRST,
  287. EMC_TRAINING_CTRL,
  288. EMC_TRAINING_SETTLE,
  289. EMC_TRAINING_VREF_SETTLE,
  290. EMC_TRAINING_CA_FINE_CTRL,
  291. EMC_TRAINING_CA_CTRL_MISC,
  292. EMC_TRAINING_CA_CTRL_MISC1,
  293. EMC_TRAINING_CA_VREF_CTRL,
  294. EMC_TRAINING_QUSE_CORS_CTRL,
  295. EMC_TRAINING_QUSE_FINE_CTRL,
  296. EMC_TRAINING_QUSE_CTRL_MISC,
  297. EMC_TRAINING_QUSE_VREF_CTRL,
  298. EMC_TRAINING_READ_FINE_CTRL,
  299. EMC_TRAINING_READ_CTRL_MISC,
  300. EMC_TRAINING_READ_VREF_CTRL,
  301. EMC_TRAINING_WRITE_FINE_CTRL,
  302. EMC_TRAINING_WRITE_CTRL_MISC,
  303. EMC_TRAINING_WRITE_VREF_CTRL,
  304. EMC_TRAINING_MPC,
  305. EMC_MRW15,
  306. },
  307. .trim = {
  308. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0,
  309. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1,
  310. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2,
  311. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3,
  312. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0,
  313. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1,
  314. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2,
  315. EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3,
  316. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_0,
  317. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_1,
  318. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_2,
  319. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_0,
  320. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_1,
  321. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_2,
  322. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_0,
  323. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_1,
  324. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_2,
  325. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_0,
  326. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_1,
  327. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_2,
  328. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_0,
  329. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_1,
  330. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_2,
  331. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_0,
  332. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_1,
  333. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_2,
  334. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_0,
  335. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_1,
  336. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_2,
  337. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_0,
  338. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_1,
  339. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_2,
  340. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_0,
  341. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_1,
  342. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_2,
  343. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_0,
  344. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_1,
  345. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_2,
  346. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_0,
  347. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_1,
  348. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_2,
  349. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_0,
  350. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_1,
  351. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_2,
  352. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_0,
  353. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_1,
  354. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_2,
  355. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_0,
  356. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_1,
  357. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_2,
  358. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_0,
  359. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_1,
  360. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_2,
  361. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_0,
  362. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_1,
  363. EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_2,
  364. EMC_PMACRO_IB_VREF_DQS_0,
  365. EMC_PMACRO_IB_VREF_DQS_1,
  366. EMC_PMACRO_IB_VREF_DQ_0,
  367. EMC_PMACRO_IB_VREF_DQ_1,
  368. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0,
  369. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1,
  370. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2,
  371. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3,
  372. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4,
  373. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5,
  374. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0,
  375. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1,
  376. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2,
  377. EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3,
  378. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_0,
  379. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_1,
  380. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_2,
  381. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_0,
  382. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_1,
  383. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_2,
  384. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_0,
  385. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_1,
  386. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_2,
  387. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_0,
  388. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_1,
  389. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_2,
  390. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_0,
  391. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_1,
  392. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_2,
  393. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_0,
  394. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_1,
  395. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_2,
  396. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_0,
  397. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_1,
  398. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_2,
  399. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_0,
  400. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_1,
  401. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_2,
  402. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_0,
  403. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_1,
  404. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_2,
  405. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_0,
  406. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_1,
  407. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_2,
  408. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_0,
  409. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_1,
  410. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_2,
  411. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_0,
  412. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_1,
  413. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_2,
  414. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_0,
  415. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_1,
  416. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_2,
  417. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_0,
  418. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_1,
  419. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_2,
  420. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_0,
  421. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_1,
  422. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_2,
  423. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_0,
  424. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_1,
  425. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_2,
  426. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_0,
  427. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_1,
  428. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_2,
  429. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_0,
  430. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_1,
  431. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_2,
  432. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_0,
  433. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_1,
  434. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_2,
  435. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_0,
  436. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_1,
  437. EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_2,
  438. EMC_PMACRO_QUSE_DDLL_RANK0_0,
  439. EMC_PMACRO_QUSE_DDLL_RANK0_1,
  440. EMC_PMACRO_QUSE_DDLL_RANK0_2,
  441. EMC_PMACRO_QUSE_DDLL_RANK0_3,
  442. EMC_PMACRO_QUSE_DDLL_RANK1_0,
  443. EMC_PMACRO_QUSE_DDLL_RANK1_1,
  444. EMC_PMACRO_QUSE_DDLL_RANK1_2,
  445. EMC_PMACRO_QUSE_DDLL_RANK1_3
  446. },
  447. .burst_mc = {
  448. MC_EMEM_ARB_CFG,
  449. MC_EMEM_ARB_OUTSTANDING_REQ,
  450. MC_EMEM_ARB_REFPB_HP_CTRL,
  451. MC_EMEM_ARB_REFPB_BANK_CTRL,
  452. MC_EMEM_ARB_TIMING_RCD,
  453. MC_EMEM_ARB_TIMING_RP,
  454. MC_EMEM_ARB_TIMING_RC,
  455. MC_EMEM_ARB_TIMING_RAS,
  456. MC_EMEM_ARB_TIMING_FAW,
  457. MC_EMEM_ARB_TIMING_RRD,
  458. MC_EMEM_ARB_TIMING_RAP2PRE,
  459. MC_EMEM_ARB_TIMING_WAP2PRE,
  460. MC_EMEM_ARB_TIMING_R2R,
  461. MC_EMEM_ARB_TIMING_W2W,
  462. MC_EMEM_ARB_TIMING_R2W,
  463. MC_EMEM_ARB_TIMING_CCDMW,
  464. MC_EMEM_ARB_TIMING_W2R,
  465. MC_EMEM_ARB_TIMING_RFCPB,
  466. MC_EMEM_ARB_DA_TURNS,
  467. MC_EMEM_ARB_DA_COVERS,
  468. MC_EMEM_ARB_MISC0,
  469. MC_EMEM_ARB_MISC1,
  470. MC_EMEM_ARB_MISC2,
  471. MC_EMEM_ARB_RING1_THROTTLE,
  472. MC_EMEM_ARB_DHYST_CTRL,
  473. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_0,
  474. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_1,
  475. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_2,
  476. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_3,
  477. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_4,
  478. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_5,
  479. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_6,
  480. MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_7,
  481. },
  482. .la_scale = {
  483. MC_MLL_MPCORER_PTSA_RATE,
  484. MC_FTOP_PTSA_RATE,
  485. MC_PTSA_GRANT_DECREMENT,
  486. MC_LATENCY_ALLOWANCE_XUSB_0,
  487. MC_LATENCY_ALLOWANCE_XUSB_1,
  488. MC_LATENCY_ALLOWANCE_TSEC_0,
  489. MC_LATENCY_ALLOWANCE_SDMMCA_0,
  490. MC_LATENCY_ALLOWANCE_SDMMCAA_0,
  491. MC_LATENCY_ALLOWANCE_SDMMC_0,
  492. MC_LATENCY_ALLOWANCE_SDMMCAB_0,
  493. MC_LATENCY_ALLOWANCE_PPCS_0,
  494. MC_LATENCY_ALLOWANCE_PPCS_1,
  495. MC_LATENCY_ALLOWANCE_MPCORE_0,
  496. MC_LATENCY_ALLOWANCE_HC_0,
  497. MC_LATENCY_ALLOWANCE_HC_1,
  498. MC_LATENCY_ALLOWANCE_AVPC_0,
  499. MC_LATENCY_ALLOWANCE_GPU_0,
  500. MC_LATENCY_ALLOWANCE_GPU2_0,
  501. MC_LATENCY_ALLOWANCE_NVENC_0,
  502. MC_LATENCY_ALLOWANCE_NVDEC_0,
  503. MC_LATENCY_ALLOWANCE_VIC_0,
  504. MC_LATENCY_ALLOWANCE_VI2_0,
  505. MC_LATENCY_ALLOWANCE_ISP2_0,
  506. MC_LATENCY_ALLOWANCE_ISP2_1,
  507. },
  508. .burst_per_channel = {
  509. { .bank = 0, .offset = EMC_MRW10, },
  510. { .bank = 1, .offset = EMC_MRW10, },
  511. { .bank = 0, .offset = EMC_MRW11, },
  512. { .bank = 1, .offset = EMC_MRW11, },
  513. { .bank = 0, .offset = EMC_MRW12, },
  514. { .bank = 1, .offset = EMC_MRW12, },
  515. { .bank = 0, .offset = EMC_MRW13, },
  516. { .bank = 1, .offset = EMC_MRW13, },
  517. },
  518. .trim_per_channel = {
  519. { .bank = 0, .offset = EMC_CMD_BRLSHFT_0, },
  520. { .bank = 1, .offset = EMC_CMD_BRLSHFT_1, },
  521. { .bank = 0, .offset = EMC_DATA_BRLSHFT_0, },
  522. { .bank = 1, .offset = EMC_DATA_BRLSHFT_0, },
  523. { .bank = 0, .offset = EMC_DATA_BRLSHFT_1, },
  524. { .bank = 1, .offset = EMC_DATA_BRLSHFT_1, },
  525. { .bank = 0, .offset = EMC_QUSE_BRLSHFT_0, },
  526. { .bank = 1, .offset = EMC_QUSE_BRLSHFT_1, },
  527. { .bank = 0, .offset = EMC_QUSE_BRLSHFT_2, },
  528. { .bank = 1, .offset = EMC_QUSE_BRLSHFT_3, },
  529. },
  530. .vref_per_channel = {
  531. {
  532. .bank = 0,
  533. .offset = EMC_TRAINING_OPT_DQS_IB_VREF_RANK0,
  534. }, {
  535. .bank = 1,
  536. .offset = EMC_TRAINING_OPT_DQS_IB_VREF_RANK0,
  537. }, {
  538. .bank = 0,
  539. .offset = EMC_TRAINING_OPT_DQS_IB_VREF_RANK1,
  540. }, {
  541. .bank = 1,
  542. .offset = EMC_TRAINING_OPT_DQS_IB_VREF_RANK1,
  543. },
  544. },
  545. };
  546. static void tegra210_emc_train(struct timer_list *timer)
  547. {
  548. struct tegra210_emc *emc = from_timer(emc, timer, training);
  549. unsigned long flags;
  550. if (!emc->last)
  551. return;
  552. spin_lock_irqsave(&emc->lock, flags);
  553. if (emc->sequence->periodic_compensation)
  554. emc->sequence->periodic_compensation(emc);
  555. spin_unlock_irqrestore(&emc->lock, flags);
  556. mod_timer(&emc->training,
  557. jiffies + msecs_to_jiffies(emc->training_interval));
  558. }
  559. static void tegra210_emc_training_start(struct tegra210_emc *emc)
  560. {
  561. mod_timer(&emc->training,
  562. jiffies + msecs_to_jiffies(emc->training_interval));
  563. }
  564. static void tegra210_emc_training_stop(struct tegra210_emc *emc)
  565. {
  566. del_timer(&emc->training);
  567. }
  568. static unsigned int tegra210_emc_get_temperature(struct tegra210_emc *emc)
  569. {
  570. unsigned long flags;
  571. u32 value, max = 0;
  572. unsigned int i;
  573. spin_lock_irqsave(&emc->lock, flags);
  574. for (i = 0; i < emc->num_devices; i++) {
  575. value = tegra210_emc_mrr_read(emc, i, 4);
  576. if (value & BIT(7))
  577. dev_dbg(emc->dev,
  578. "sensor reading changed for device %u: %08x\n",
  579. i, value);
  580. value = FIELD_GET(LPDDR2_MR4_SRR, value);
  581. if (value > max)
  582. max = value;
  583. }
  584. spin_unlock_irqrestore(&emc->lock, flags);
  585. return max;
  586. }
  587. static void tegra210_emc_poll_refresh(struct timer_list *timer)
  588. {
  589. struct tegra210_emc *emc = from_timer(emc, timer, refresh_timer);
  590. unsigned int temperature;
  591. if (!emc->debugfs.temperature)
  592. temperature = tegra210_emc_get_temperature(emc);
  593. else
  594. temperature = emc->debugfs.temperature;
  595. if (temperature == emc->temperature)
  596. goto reset;
  597. switch (temperature) {
  598. case 0 ... 3:
  599. /* temperature is fine, using regular refresh */
  600. dev_dbg(emc->dev, "switching to nominal refresh...\n");
  601. tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_NOMINAL);
  602. break;
  603. case 4:
  604. dev_dbg(emc->dev, "switching to 2x refresh...\n");
  605. tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_2X);
  606. break;
  607. case 5:
  608. dev_dbg(emc->dev, "switching to 4x refresh...\n");
  609. tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_4X);
  610. break;
  611. case 6 ... 7:
  612. dev_dbg(emc->dev, "switching to throttle refresh...\n");
  613. tegra210_emc_set_refresh(emc, TEGRA210_EMC_REFRESH_THROTTLE);
  614. break;
  615. default:
  616. WARN(1, "invalid DRAM temperature state %u\n", temperature);
  617. return;
  618. }
  619. emc->temperature = temperature;
  620. reset:
  621. if (atomic_read(&emc->refresh_poll) > 0) {
  622. unsigned int interval = emc->refresh_poll_interval;
  623. unsigned int timeout = msecs_to_jiffies(interval);
  624. mod_timer(&emc->refresh_timer, jiffies + timeout);
  625. }
  626. }
  627. static void tegra210_emc_poll_refresh_stop(struct tegra210_emc *emc)
  628. {
  629. atomic_set(&emc->refresh_poll, 0);
  630. del_timer_sync(&emc->refresh_timer);
  631. }
  632. static void tegra210_emc_poll_refresh_start(struct tegra210_emc *emc)
  633. {
  634. atomic_set(&emc->refresh_poll, 1);
  635. mod_timer(&emc->refresh_timer,
  636. jiffies + msecs_to_jiffies(emc->refresh_poll_interval));
  637. }
  638. static int tegra210_emc_cd_max_state(struct thermal_cooling_device *cd,
  639. unsigned long *state)
  640. {
  641. *state = 1;
  642. return 0;
  643. }
  644. static int tegra210_emc_cd_get_state(struct thermal_cooling_device *cd,
  645. unsigned long *state)
  646. {
  647. struct tegra210_emc *emc = cd->devdata;
  648. *state = atomic_read(&emc->refresh_poll);
  649. return 0;
  650. }
  651. static int tegra210_emc_cd_set_state(struct thermal_cooling_device *cd,
  652. unsigned long state)
  653. {
  654. struct tegra210_emc *emc = cd->devdata;
  655. if (state == atomic_read(&emc->refresh_poll))
  656. return 0;
  657. if (state)
  658. tegra210_emc_poll_refresh_start(emc);
  659. else
  660. tegra210_emc_poll_refresh_stop(emc);
  661. return 0;
  662. }
  663. static const struct thermal_cooling_device_ops tegra210_emc_cd_ops = {
  664. .get_max_state = tegra210_emc_cd_max_state,
  665. .get_cur_state = tegra210_emc_cd_get_state,
  666. .set_cur_state = tegra210_emc_cd_set_state,
  667. };
  668. static void tegra210_emc_set_clock(struct tegra210_emc *emc, u32 clksrc)
  669. {
  670. emc->sequence->set_clock(emc, clksrc);
  671. if (emc->next->periodic_training)
  672. tegra210_emc_training_start(emc);
  673. else
  674. tegra210_emc_training_stop(emc);
  675. }
  676. static void tegra210_change_dll_src(struct tegra210_emc *emc,
  677. u32 clksrc)
  678. {
  679. u32 dll_setting = emc->next->dll_clk_src;
  680. u32 emc_clk_src;
  681. u32 emc_clk_div;
  682. emc_clk_src = (clksrc & EMC_CLK_EMC_2X_CLK_SRC_MASK) >>
  683. EMC_CLK_EMC_2X_CLK_SRC_SHIFT;
  684. emc_clk_div = (clksrc & EMC_CLK_EMC_2X_CLK_DIVISOR_MASK) >>
  685. EMC_CLK_EMC_2X_CLK_DIVISOR_SHIFT;
  686. dll_setting &= ~(DLL_CLK_EMC_DLL_CLK_SRC_MASK |
  687. DLL_CLK_EMC_DLL_CLK_DIVISOR_MASK);
  688. dll_setting |= emc_clk_src << DLL_CLK_EMC_DLL_CLK_SRC_SHIFT;
  689. dll_setting |= emc_clk_div << DLL_CLK_EMC_DLL_CLK_DIVISOR_SHIFT;
  690. dll_setting &= ~DLL_CLK_EMC_DLL_DDLL_CLK_SEL_MASK;
  691. if (emc_clk_src == EMC_CLK_SOURCE_PLLMB_LJ)
  692. dll_setting |= (PLLM_VCOB <<
  693. DLL_CLK_EMC_DLL_DDLL_CLK_SEL_SHIFT);
  694. else if (emc_clk_src == EMC_CLK_SOURCE_PLLM_LJ)
  695. dll_setting |= (PLLM_VCOA <<
  696. DLL_CLK_EMC_DLL_DDLL_CLK_SEL_SHIFT);
  697. else
  698. dll_setting |= (EMC_DLL_SWITCH_OUT <<
  699. DLL_CLK_EMC_DLL_DDLL_CLK_SEL_SHIFT);
  700. tegra210_clk_emc_dll_update_setting(dll_setting);
  701. if (emc->next->clk_out_enb_x_0_clk_enb_emc_dll)
  702. tegra210_clk_emc_dll_enable(true);
  703. else
  704. tegra210_clk_emc_dll_enable(false);
  705. }
  706. int tegra210_emc_set_refresh(struct tegra210_emc *emc,
  707. enum tegra210_emc_refresh refresh)
  708. {
  709. struct tegra210_emc_timing *timings;
  710. unsigned long flags;
  711. if ((emc->dram_type != DRAM_TYPE_LPDDR2 &&
  712. emc->dram_type != DRAM_TYPE_LPDDR4) ||
  713. !emc->last)
  714. return -ENODEV;
  715. if (refresh > TEGRA210_EMC_REFRESH_THROTTLE)
  716. return -EINVAL;
  717. if (refresh == emc->refresh)
  718. return 0;
  719. spin_lock_irqsave(&emc->lock, flags);
  720. if (refresh == TEGRA210_EMC_REFRESH_THROTTLE && emc->derated)
  721. timings = emc->derated;
  722. else
  723. timings = emc->nominal;
  724. if (timings != emc->timings) {
  725. unsigned int index = emc->last - emc->timings;
  726. u32 clksrc;
  727. clksrc = emc->provider.configs[index].value |
  728. EMC_CLK_FORCE_CC_TRIGGER;
  729. emc->next = &timings[index];
  730. emc->timings = timings;
  731. tegra210_emc_set_clock(emc, clksrc);
  732. } else {
  733. tegra210_emc_adjust_timing(emc, emc->last);
  734. tegra210_emc_timing_update(emc);
  735. if (refresh != TEGRA210_EMC_REFRESH_NOMINAL)
  736. emc_writel(emc, EMC_REF_REF_CMD, EMC_REF);
  737. }
  738. spin_unlock_irqrestore(&emc->lock, flags);
  739. return 0;
  740. }
  741. u32 tegra210_emc_mrr_read(struct tegra210_emc *emc, unsigned int chip,
  742. unsigned int address)
  743. {
  744. u32 value, ret = 0;
  745. unsigned int i;
  746. value = (chip & EMC_MRR_DEV_SEL_MASK) << EMC_MRR_DEV_SEL_SHIFT |
  747. (address & EMC_MRR_MA_MASK) << EMC_MRR_MA_SHIFT;
  748. emc_writel(emc, value, EMC_MRR);
  749. for (i = 0; i < emc->num_channels; i++)
  750. WARN(tegra210_emc_wait_for_update(emc, i, EMC_EMC_STATUS,
  751. EMC_EMC_STATUS_MRR_DIVLD, 1),
  752. "Timed out waiting for MRR %u (ch=%u)\n", address, i);
  753. for (i = 0; i < emc->num_channels; i++) {
  754. value = emc_channel_readl(emc, i, EMC_MRR);
  755. value &= EMC_MRR_DATA_MASK;
  756. ret = (ret << 16) | value;
  757. }
  758. return ret;
  759. }
  760. void tegra210_emc_do_clock_change(struct tegra210_emc *emc, u32 clksrc)
  761. {
  762. int err;
  763. mc_readl(emc->mc, MC_EMEM_ADR_CFG);
  764. emc_readl(emc, EMC_INTSTATUS);
  765. tegra210_clk_emc_update_setting(clksrc);
  766. err = tegra210_emc_wait_for_update(emc, 0, EMC_INTSTATUS,
  767. EMC_INTSTATUS_CLKCHANGE_COMPLETE,
  768. true);
  769. if (err)
  770. dev_warn(emc->dev, "clock change completion error: %d\n", err);
  771. }
  772. struct tegra210_emc_timing *tegra210_emc_find_timing(struct tegra210_emc *emc,
  773. unsigned long rate)
  774. {
  775. unsigned int i;
  776. for (i = 0; i < emc->num_timings; i++)
  777. if (emc->timings[i].rate * 1000UL == rate)
  778. return &emc->timings[i];
  779. return NULL;
  780. }
  781. int tegra210_emc_wait_for_update(struct tegra210_emc *emc, unsigned int channel,
  782. unsigned int offset, u32 bit_mask, bool state)
  783. {
  784. unsigned int i;
  785. u32 value;
  786. for (i = 0; i < EMC_STATUS_UPDATE_TIMEOUT; i++) {
  787. value = emc_channel_readl(emc, channel, offset);
  788. if (!!(value & bit_mask) == state)
  789. return 0;
  790. udelay(1);
  791. }
  792. return -ETIMEDOUT;
  793. }
  794. void tegra210_emc_set_shadow_bypass(struct tegra210_emc *emc, int set)
  795. {
  796. u32 emc_dbg = emc_readl(emc, EMC_DBG);
  797. if (set)
  798. emc_writel(emc, emc_dbg | EMC_DBG_WRITE_MUX_ACTIVE, EMC_DBG);
  799. else
  800. emc_writel(emc, emc_dbg & ~EMC_DBG_WRITE_MUX_ACTIVE, EMC_DBG);
  801. }
  802. u32 tegra210_emc_get_dll_state(struct tegra210_emc_timing *next)
  803. {
  804. if (next->emc_emrs & 0x1)
  805. return 0;
  806. return 1;
  807. }
  808. void tegra210_emc_timing_update(struct tegra210_emc *emc)
  809. {
  810. unsigned int i;
  811. int err = 0;
  812. emc_writel(emc, 0x1, EMC_TIMING_CONTROL);
  813. for (i = 0; i < emc->num_channels; i++) {
  814. err |= tegra210_emc_wait_for_update(emc, i, EMC_EMC_STATUS,
  815. EMC_EMC_STATUS_TIMING_UPDATE_STALLED,
  816. false);
  817. }
  818. if (err)
  819. dev_warn(emc->dev, "timing update error: %d\n", err);
  820. }
  821. unsigned long tegra210_emc_actual_osc_clocks(u32 in)
  822. {
  823. if (in < 0x40)
  824. return in * 16;
  825. else if (in < 0x80)
  826. return 2048;
  827. else if (in < 0xc0)
  828. return 4096;
  829. else
  830. return 8192;
  831. }
  832. void tegra210_emc_start_periodic_compensation(struct tegra210_emc *emc)
  833. {
  834. u32 mpc_req = 0x4b;
  835. emc_writel(emc, mpc_req, EMC_MPC);
  836. mpc_req = emc_readl(emc, EMC_MPC);
  837. }
  838. u32 tegra210_emc_compensate(struct tegra210_emc_timing *next, u32 offset)
  839. {
  840. u32 temp = 0, rate = next->rate / 1000;
  841. s32 delta[4], delta_taps[4];
  842. s32 new[] = {
  843. TRIM_REG(0, 0, 0, 0),
  844. TRIM_REG(0, 0, 0, 1),
  845. TRIM_REG(0, 0, 1, 2),
  846. TRIM_REG(0, 0, 1, 3),
  847. TRIM_REG(1, 0, 2, 4),
  848. TRIM_REG(1, 0, 2, 5),
  849. TRIM_REG(1, 0, 3, 6),
  850. TRIM_REG(1, 0, 3, 7),
  851. TRIM_REG(0, 1, 0, 0),
  852. TRIM_REG(0, 1, 0, 1),
  853. TRIM_REG(0, 1, 1, 2),
  854. TRIM_REG(0, 1, 1, 3),
  855. TRIM_REG(1, 1, 2, 4),
  856. TRIM_REG(1, 1, 2, 5),
  857. TRIM_REG(1, 1, 3, 6),
  858. TRIM_REG(1, 1, 3, 7)
  859. };
  860. unsigned i;
  861. switch (offset) {
  862. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0:
  863. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1:
  864. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2:
  865. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3:
  866. case EMC_DATA_BRLSHFT_0:
  867. delta[0] = 128 * (next->current_dram_clktree[C0D0U0] -
  868. next->trained_dram_clktree[C0D0U0]);
  869. delta[1] = 128 * (next->current_dram_clktree[C0D0U1] -
  870. next->trained_dram_clktree[C0D0U1]);
  871. delta[2] = 128 * (next->current_dram_clktree[C1D0U0] -
  872. next->trained_dram_clktree[C1D0U0]);
  873. delta[3] = 128 * (next->current_dram_clktree[C1D0U1] -
  874. next->trained_dram_clktree[C1D0U1]);
  875. delta_taps[0] = (delta[0] * (s32)rate) / 1000000;
  876. delta_taps[1] = (delta[1] * (s32)rate) / 1000000;
  877. delta_taps[2] = (delta[2] * (s32)rate) / 1000000;
  878. delta_taps[3] = (delta[3] * (s32)rate) / 1000000;
  879. for (i = 0; i < 4; i++) {
  880. if ((delta_taps[i] > next->tree_margin) ||
  881. (delta_taps[i] < (-1 * next->tree_margin))) {
  882. new[i * 2] = new[i * 2] + delta_taps[i];
  883. new[i * 2 + 1] = new[i * 2 + 1] +
  884. delta_taps[i];
  885. }
  886. }
  887. if (offset == EMC_DATA_BRLSHFT_0) {
  888. for (i = 0; i < 8; i++)
  889. new[i] = new[i] / 64;
  890. } else {
  891. for (i = 0; i < 8; i++)
  892. new[i] = new[i] % 64;
  893. }
  894. break;
  895. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0:
  896. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1:
  897. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2:
  898. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3:
  899. case EMC_DATA_BRLSHFT_1:
  900. delta[0] = 128 * (next->current_dram_clktree[C0D1U0] -
  901. next->trained_dram_clktree[C0D1U0]);
  902. delta[1] = 128 * (next->current_dram_clktree[C0D1U1] -
  903. next->trained_dram_clktree[C0D1U1]);
  904. delta[2] = 128 * (next->current_dram_clktree[C1D1U0] -
  905. next->trained_dram_clktree[C1D1U0]);
  906. delta[3] = 128 * (next->current_dram_clktree[C1D1U1] -
  907. next->trained_dram_clktree[C1D1U1]);
  908. delta_taps[0] = (delta[0] * (s32)rate) / 1000000;
  909. delta_taps[1] = (delta[1] * (s32)rate) / 1000000;
  910. delta_taps[2] = (delta[2] * (s32)rate) / 1000000;
  911. delta_taps[3] = (delta[3] * (s32)rate) / 1000000;
  912. for (i = 0; i < 4; i++) {
  913. if ((delta_taps[i] > next->tree_margin) ||
  914. (delta_taps[i] < (-1 * next->tree_margin))) {
  915. new[8 + i * 2] = new[8 + i * 2] +
  916. delta_taps[i];
  917. new[8 + i * 2 + 1] = new[8 + i * 2 + 1] +
  918. delta_taps[i];
  919. }
  920. }
  921. if (offset == EMC_DATA_BRLSHFT_1) {
  922. for (i = 0; i < 8; i++)
  923. new[i + 8] = new[i + 8] / 64;
  924. } else {
  925. for (i = 0; i < 8; i++)
  926. new[i + 8] = new[i + 8] % 64;
  927. }
  928. break;
  929. }
  930. switch (offset) {
  931. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0:
  932. temp = CALC_TEMP(0, 0, 0, 1, 0);
  933. break;
  934. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1:
  935. temp = CALC_TEMP(0, 1, 2, 3, 2);
  936. break;
  937. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2:
  938. temp = CALC_TEMP(0, 2, 4, 5, 4);
  939. break;
  940. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3:
  941. temp = CALC_TEMP(0, 3, 6, 7, 6);
  942. break;
  943. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0:
  944. temp = CALC_TEMP(1, 0, 0, 1, 8);
  945. break;
  946. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1:
  947. temp = CALC_TEMP(1, 1, 2, 3, 10);
  948. break;
  949. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2:
  950. temp = CALC_TEMP(1, 2, 4, 5, 12);
  951. break;
  952. case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3:
  953. temp = CALC_TEMP(1, 3, 6, 7, 14);
  954. break;
  955. case EMC_DATA_BRLSHFT_0:
  956. temp = ((new[0] <<
  957. EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_SHIFT) &
  958. EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_MASK) |
  959. ((new[1] <<
  960. EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_SHIFT) &
  961. EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_MASK) |
  962. ((new[2] <<
  963. EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_SHIFT) &
  964. EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_MASK) |
  965. ((new[3] <<
  966. EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_SHIFT) &
  967. EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_MASK) |
  968. ((new[4] <<
  969. EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_SHIFT) &
  970. EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_MASK) |
  971. ((new[5] <<
  972. EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_SHIFT) &
  973. EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_MASK) |
  974. ((new[6] <<
  975. EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_SHIFT) &
  976. EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_MASK) |
  977. ((new[7] <<
  978. EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_SHIFT) &
  979. EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_MASK);
  980. break;
  981. case EMC_DATA_BRLSHFT_1:
  982. temp = ((new[8] <<
  983. EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_SHIFT) &
  984. EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_MASK) |
  985. ((new[9] <<
  986. EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_SHIFT) &
  987. EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_MASK) |
  988. ((new[10] <<
  989. EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_SHIFT) &
  990. EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_MASK) |
  991. ((new[11] <<
  992. EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_SHIFT) &
  993. EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_MASK) |
  994. ((new[12] <<
  995. EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_SHIFT) &
  996. EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_MASK) |
  997. ((new[13] <<
  998. EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_SHIFT) &
  999. EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_MASK) |
  1000. ((new[14] <<
  1001. EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_SHIFT) &
  1002. EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_MASK) |
  1003. ((new[15] <<
  1004. EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_SHIFT) &
  1005. EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_MASK);
  1006. break;
  1007. default:
  1008. break;
  1009. }
  1010. return temp;
  1011. }
  1012. u32 tegra210_emc_dll_prelock(struct tegra210_emc *emc, u32 clksrc)
  1013. {
  1014. unsigned int i;
  1015. u32 value;
  1016. value = emc_readl(emc, EMC_CFG_DIG_DLL);
  1017. value &= ~EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_MASK;
  1018. value |= (3 << EMC_CFG_DIG_DLL_CFG_DLL_LOCK_LIMIT_SHIFT);
  1019. value &= ~EMC_CFG_DIG_DLL_CFG_DLL_EN;
  1020. value &= ~EMC_CFG_DIG_DLL_CFG_DLL_MODE_MASK;
  1021. value |= (3 << EMC_CFG_DIG_DLL_CFG_DLL_MODE_SHIFT);
  1022. value |= EMC_CFG_DIG_DLL_CFG_DLL_STALL_ALL_TRAFFIC;
  1023. value &= ~EMC_CFG_DIG_DLL_CFG_DLL_STALL_RW_UNTIL_LOCK;
  1024. value &= ~EMC_CFG_DIG_DLL_CFG_DLL_STALL_ALL_UNTIL_LOCK;
  1025. emc_writel(emc, value, EMC_CFG_DIG_DLL);
  1026. emc_writel(emc, 1, EMC_TIMING_CONTROL);
  1027. for (i = 0; i < emc->num_channels; i++)
  1028. tegra210_emc_wait_for_update(emc, i, EMC_EMC_STATUS,
  1029. EMC_EMC_STATUS_TIMING_UPDATE_STALLED,
  1030. 0);
  1031. for (i = 0; i < emc->num_channels; i++) {
  1032. while (true) {
  1033. value = emc_channel_readl(emc, i, EMC_CFG_DIG_DLL);
  1034. if ((value & EMC_CFG_DIG_DLL_CFG_DLL_EN) == 0)
  1035. break;
  1036. }
  1037. }
  1038. value = emc->next->burst_regs[EMC_DLL_CFG_0_INDEX];
  1039. emc_writel(emc, value, EMC_DLL_CFG_0);
  1040. value = emc_readl(emc, EMC_DLL_CFG_1);
  1041. value &= EMC_DLL_CFG_1_DDLLCAL_CTRL_START_TRIM_MASK;
  1042. if (emc->next->rate >= 400000 && emc->next->rate < 600000)
  1043. value |= 150;
  1044. else if (emc->next->rate >= 600000 && emc->next->rate < 800000)
  1045. value |= 100;
  1046. else if (emc->next->rate >= 800000 && emc->next->rate < 1000000)
  1047. value |= 70;
  1048. else if (emc->next->rate >= 1000000 && emc->next->rate < 1200000)
  1049. value |= 30;
  1050. else
  1051. value |= 20;
  1052. emc_writel(emc, value, EMC_DLL_CFG_1);
  1053. tegra210_change_dll_src(emc, clksrc);
  1054. value = emc_readl(emc, EMC_CFG_DIG_DLL);
  1055. value |= EMC_CFG_DIG_DLL_CFG_DLL_EN;
  1056. emc_writel(emc, value, EMC_CFG_DIG_DLL);
  1057. tegra210_emc_timing_update(emc);
  1058. for (i = 0; i < emc->num_channels; i++) {
  1059. while (true) {
  1060. value = emc_channel_readl(emc, 0, EMC_CFG_DIG_DLL);
  1061. if (value & EMC_CFG_DIG_DLL_CFG_DLL_EN)
  1062. break;
  1063. }
  1064. }
  1065. while (true) {
  1066. value = emc_readl(emc, EMC_DIG_DLL_STATUS);
  1067. if ((value & EMC_DIG_DLL_STATUS_DLL_PRIV_UPDATED) == 0)
  1068. continue;
  1069. if ((value & EMC_DIG_DLL_STATUS_DLL_LOCK) == 0)
  1070. continue;
  1071. break;
  1072. }
  1073. value = emc_readl(emc, EMC_DIG_DLL_STATUS);
  1074. return value & EMC_DIG_DLL_STATUS_DLL_OUT_MASK;
  1075. }
  1076. u32 tegra210_emc_dvfs_power_ramp_up(struct tegra210_emc *emc, u32 clk,
  1077. bool flip_backward)
  1078. {
  1079. u32 cmd_pad, dq_pad, rfu1, cfg5, common_tx, ramp_up_wait = 0;
  1080. const struct tegra210_emc_timing *timing;
  1081. if (flip_backward)
  1082. timing = emc->last;
  1083. else
  1084. timing = emc->next;
  1085. cmd_pad = timing->burst_regs[EMC_PMACRO_CMD_PAD_TX_CTRL_INDEX];
  1086. dq_pad = timing->burst_regs[EMC_PMACRO_DATA_PAD_TX_CTRL_INDEX];
  1087. rfu1 = timing->burst_regs[EMC_PMACRO_BRICK_CTRL_RFU1_INDEX];
  1088. cfg5 = timing->burst_regs[EMC_FBIO_CFG5_INDEX];
  1089. common_tx = timing->burst_regs[EMC_PMACRO_COMMON_PAD_TX_CTRL_INDEX];
  1090. cmd_pad |= EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_DRVFORCEON;
  1091. if (clk < 1000000 / DVFS_FGCG_MID_SPEED_THRESHOLD) {
  1092. ccfifo_writel(emc, common_tx & 0xa,
  1093. EMC_PMACRO_COMMON_PAD_TX_CTRL, 0);
  1094. ccfifo_writel(emc, common_tx & 0xf,
  1095. EMC_PMACRO_COMMON_PAD_TX_CTRL,
  1096. (100000 / clk) + 1);
  1097. ramp_up_wait += 100000;
  1098. } else {
  1099. ccfifo_writel(emc, common_tx | 0x8,
  1100. EMC_PMACRO_COMMON_PAD_TX_CTRL, 0);
  1101. }
  1102. if (clk < 1000000 / DVFS_FGCG_HIGH_SPEED_THRESHOLD) {
  1103. if (clk < 1000000 / IOBRICK_DCC_THRESHOLD) {
  1104. cmd_pad |=
  1105. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSP_TX_E_DCC |
  1106. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSN_TX_E_DCC;
  1107. cmd_pad &=
  1108. ~(EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_E_DCC |
  1109. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_CMD_TX_E_DCC);
  1110. ccfifo_writel(emc, cmd_pad,
  1111. EMC_PMACRO_CMD_PAD_TX_CTRL,
  1112. (100000 / clk) + 1);
  1113. ramp_up_wait += 100000;
  1114. dq_pad |=
  1115. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSP_TX_E_DCC |
  1116. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSN_TX_E_DCC;
  1117. dq_pad &=
  1118. ~(EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_TX_E_DCC |
  1119. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_CMD_TX_E_DCC);
  1120. ccfifo_writel(emc, dq_pad,
  1121. EMC_PMACRO_DATA_PAD_TX_CTRL, 0);
  1122. ccfifo_writel(emc, rfu1 & 0xfe40fe40,
  1123. EMC_PMACRO_BRICK_CTRL_RFU1, 0);
  1124. } else {
  1125. ccfifo_writel(emc, rfu1 & 0xfe40fe40,
  1126. EMC_PMACRO_BRICK_CTRL_RFU1,
  1127. (100000 / clk) + 1);
  1128. ramp_up_wait += 100000;
  1129. }
  1130. ccfifo_writel(emc, rfu1 & 0xfeedfeed,
  1131. EMC_PMACRO_BRICK_CTRL_RFU1, (100000 / clk) + 1);
  1132. ramp_up_wait += 100000;
  1133. if (clk < 1000000 / IOBRICK_DCC_THRESHOLD) {
  1134. cmd_pad |=
  1135. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSP_TX_E_DCC |
  1136. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSN_TX_E_DCC |
  1137. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_E_DCC |
  1138. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_CMD_TX_E_DCC;
  1139. ccfifo_writel(emc, cmd_pad,
  1140. EMC_PMACRO_CMD_PAD_TX_CTRL,
  1141. (100000 / clk) + 1);
  1142. ramp_up_wait += 100000;
  1143. dq_pad |=
  1144. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSP_TX_E_DCC |
  1145. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSN_TX_E_DCC |
  1146. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_TX_E_DCC |
  1147. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_CMD_TX_E_DCC;
  1148. ccfifo_writel(emc, dq_pad,
  1149. EMC_PMACRO_DATA_PAD_TX_CTRL, 0);
  1150. ccfifo_writel(emc, rfu1,
  1151. EMC_PMACRO_BRICK_CTRL_RFU1, 0);
  1152. } else {
  1153. ccfifo_writel(emc, rfu1,
  1154. EMC_PMACRO_BRICK_CTRL_RFU1,
  1155. (100000 / clk) + 1);
  1156. ramp_up_wait += 100000;
  1157. }
  1158. ccfifo_writel(emc, cfg5 & ~EMC_FBIO_CFG5_CMD_TX_DIS,
  1159. EMC_FBIO_CFG5, (100000 / clk) + 10);
  1160. ramp_up_wait += 100000 + (10 * clk);
  1161. } else if (clk < 1000000 / DVFS_FGCG_MID_SPEED_THRESHOLD) {
  1162. ccfifo_writel(emc, rfu1 | 0x06000600,
  1163. EMC_PMACRO_BRICK_CTRL_RFU1, (100000 / clk) + 1);
  1164. ccfifo_writel(emc, cfg5 & ~EMC_FBIO_CFG5_CMD_TX_DIS,
  1165. EMC_FBIO_CFG5, (100000 / clk) + 10);
  1166. ramp_up_wait += 100000 + 10 * clk;
  1167. } else {
  1168. ccfifo_writel(emc, rfu1 | 0x00000600,
  1169. EMC_PMACRO_BRICK_CTRL_RFU1, 0);
  1170. ccfifo_writel(emc, cfg5 & ~EMC_FBIO_CFG5_CMD_TX_DIS,
  1171. EMC_FBIO_CFG5, 12);
  1172. ramp_up_wait += 12 * clk;
  1173. }
  1174. cmd_pad &= ~EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_DRVFORCEON;
  1175. ccfifo_writel(emc, cmd_pad, EMC_PMACRO_CMD_PAD_TX_CTRL, 5);
  1176. return ramp_up_wait;
  1177. }
  1178. u32 tegra210_emc_dvfs_power_ramp_down(struct tegra210_emc *emc, u32 clk,
  1179. bool flip_backward)
  1180. {
  1181. u32 ramp_down_wait = 0, cmd_pad, dq_pad, rfu1, cfg5, common_tx;
  1182. const struct tegra210_emc_timing *entry;
  1183. u32 seq_wait;
  1184. if (flip_backward)
  1185. entry = emc->next;
  1186. else
  1187. entry = emc->last;
  1188. cmd_pad = entry->burst_regs[EMC_PMACRO_CMD_PAD_TX_CTRL_INDEX];
  1189. dq_pad = entry->burst_regs[EMC_PMACRO_DATA_PAD_TX_CTRL_INDEX];
  1190. rfu1 = entry->burst_regs[EMC_PMACRO_BRICK_CTRL_RFU1_INDEX];
  1191. cfg5 = entry->burst_regs[EMC_FBIO_CFG5_INDEX];
  1192. common_tx = entry->burst_regs[EMC_PMACRO_COMMON_PAD_TX_CTRL_INDEX];
  1193. cmd_pad |= EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_DRVFORCEON;
  1194. ccfifo_writel(emc, cmd_pad, EMC_PMACRO_CMD_PAD_TX_CTRL, 0);
  1195. ccfifo_writel(emc, cfg5 | EMC_FBIO_CFG5_CMD_TX_DIS,
  1196. EMC_FBIO_CFG5, 12);
  1197. ramp_down_wait = 12 * clk;
  1198. seq_wait = (100000 / clk) + 1;
  1199. if (clk < (1000000 / DVFS_FGCG_HIGH_SPEED_THRESHOLD)) {
  1200. if (clk < (1000000 / IOBRICK_DCC_THRESHOLD)) {
  1201. cmd_pad &=
  1202. ~(EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_E_DCC |
  1203. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_CMD_TX_E_DCC);
  1204. cmd_pad |=
  1205. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSP_TX_E_DCC |
  1206. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSN_TX_E_DCC;
  1207. ccfifo_writel(emc, cmd_pad,
  1208. EMC_PMACRO_CMD_PAD_TX_CTRL, seq_wait);
  1209. ramp_down_wait += 100000;
  1210. dq_pad &=
  1211. ~(EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_TX_E_DCC |
  1212. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_CMD_TX_E_DCC);
  1213. dq_pad |=
  1214. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSP_TX_E_DCC |
  1215. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSN_TX_E_DCC;
  1216. ccfifo_writel(emc, dq_pad,
  1217. EMC_PMACRO_DATA_PAD_TX_CTRL, 0);
  1218. ccfifo_writel(emc, rfu1 & ~0x01120112,
  1219. EMC_PMACRO_BRICK_CTRL_RFU1, 0);
  1220. } else {
  1221. ccfifo_writel(emc, rfu1 & ~0x01120112,
  1222. EMC_PMACRO_BRICK_CTRL_RFU1, seq_wait);
  1223. ramp_down_wait += 100000;
  1224. }
  1225. ccfifo_writel(emc, rfu1 & ~0x01bf01bf,
  1226. EMC_PMACRO_BRICK_CTRL_RFU1, seq_wait);
  1227. ramp_down_wait += 100000;
  1228. if (clk < (1000000 / IOBRICK_DCC_THRESHOLD)) {
  1229. cmd_pad &=
  1230. ~(EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQ_TX_E_DCC |
  1231. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_CMD_TX_E_DCC |
  1232. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSP_TX_E_DCC |
  1233. EMC_PMACRO_CMD_PAD_TX_CTRL_CMD_DQSN_TX_E_DCC);
  1234. ccfifo_writel(emc, cmd_pad,
  1235. EMC_PMACRO_CMD_PAD_TX_CTRL, seq_wait);
  1236. ramp_down_wait += 100000;
  1237. dq_pad &=
  1238. ~(EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQ_TX_E_DCC |
  1239. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_CMD_TX_E_DCC |
  1240. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSP_TX_E_DCC |
  1241. EMC_PMACRO_DATA_PAD_TX_CTRL_DATA_DQSN_TX_E_DCC);
  1242. ccfifo_writel(emc, dq_pad,
  1243. EMC_PMACRO_DATA_PAD_TX_CTRL, 0);
  1244. ccfifo_writel(emc, rfu1 & ~0x07ff07ff,
  1245. EMC_PMACRO_BRICK_CTRL_RFU1, 0);
  1246. } else {
  1247. ccfifo_writel(emc, rfu1 & ~0x07ff07ff,
  1248. EMC_PMACRO_BRICK_CTRL_RFU1, seq_wait);
  1249. ramp_down_wait += 100000;
  1250. }
  1251. } else {
  1252. ccfifo_writel(emc, rfu1 & ~0xffff07ff,
  1253. EMC_PMACRO_BRICK_CTRL_RFU1, seq_wait + 19);
  1254. ramp_down_wait += 100000 + (20 * clk);
  1255. }
  1256. if (clk < (1000000 / DVFS_FGCG_MID_SPEED_THRESHOLD)) {
  1257. ramp_down_wait += 100000;
  1258. ccfifo_writel(emc, common_tx & ~0x5,
  1259. EMC_PMACRO_COMMON_PAD_TX_CTRL, seq_wait);
  1260. ramp_down_wait += 100000;
  1261. ccfifo_writel(emc, common_tx & ~0xf,
  1262. EMC_PMACRO_COMMON_PAD_TX_CTRL, seq_wait);
  1263. ramp_down_wait += 100000;
  1264. ccfifo_writel(emc, 0, 0, seq_wait);
  1265. ramp_down_wait += 100000;
  1266. } else {
  1267. ccfifo_writel(emc, common_tx & ~0xf,
  1268. EMC_PMACRO_COMMON_PAD_TX_CTRL, seq_wait);
  1269. }
  1270. return ramp_down_wait;
  1271. }
  1272. void tegra210_emc_reset_dram_clktree_values(struct tegra210_emc_timing *timing)
  1273. {
  1274. timing->current_dram_clktree[C0D0U0] =
  1275. timing->trained_dram_clktree[C0D0U0];
  1276. timing->current_dram_clktree[C0D0U1] =
  1277. timing->trained_dram_clktree[C0D0U1];
  1278. timing->current_dram_clktree[C1D0U0] =
  1279. timing->trained_dram_clktree[C1D0U0];
  1280. timing->current_dram_clktree[C1D0U1] =
  1281. timing->trained_dram_clktree[C1D0U1];
  1282. timing->current_dram_clktree[C1D1U0] =
  1283. timing->trained_dram_clktree[C1D1U0];
  1284. timing->current_dram_clktree[C1D1U1] =
  1285. timing->trained_dram_clktree[C1D1U1];
  1286. }
  1287. static void update_dll_control(struct tegra210_emc *emc, u32 value, bool state)
  1288. {
  1289. unsigned int i;
  1290. emc_writel(emc, value, EMC_CFG_DIG_DLL);
  1291. tegra210_emc_timing_update(emc);
  1292. for (i = 0; i < emc->num_channels; i++)
  1293. tegra210_emc_wait_for_update(emc, i, EMC_CFG_DIG_DLL,
  1294. EMC_CFG_DIG_DLL_CFG_DLL_EN,
  1295. state);
  1296. }
  1297. void tegra210_emc_dll_disable(struct tegra210_emc *emc)
  1298. {
  1299. u32 value;
  1300. value = emc_readl(emc, EMC_CFG_DIG_DLL);
  1301. value &= ~EMC_CFG_DIG_DLL_CFG_DLL_EN;
  1302. update_dll_control(emc, value, false);
  1303. }
  1304. void tegra210_emc_dll_enable(struct tegra210_emc *emc)
  1305. {
  1306. u32 value;
  1307. value = emc_readl(emc, EMC_CFG_DIG_DLL);
  1308. value |= EMC_CFG_DIG_DLL_CFG_DLL_EN;
  1309. update_dll_control(emc, value, true);
  1310. }
  1311. void tegra210_emc_adjust_timing(struct tegra210_emc *emc,
  1312. struct tegra210_emc_timing *timing)
  1313. {
  1314. u32 dsr_cntrl = timing->burst_regs[EMC_DYN_SELF_REF_CONTROL_INDEX];
  1315. u32 pre_ref = timing->burst_regs[EMC_PRE_REFRESH_REQ_CNT_INDEX];
  1316. u32 ref = timing->burst_regs[EMC_REFRESH_INDEX];
  1317. switch (emc->refresh) {
  1318. case TEGRA210_EMC_REFRESH_NOMINAL:
  1319. case TEGRA210_EMC_REFRESH_THROTTLE:
  1320. break;
  1321. case TEGRA210_EMC_REFRESH_2X:
  1322. ref = REFRESH_SPEEDUP(ref, 2);
  1323. pre_ref = REFRESH_SPEEDUP(pre_ref, 2);
  1324. dsr_cntrl = REFRESH_SPEEDUP(dsr_cntrl, 2);
  1325. break;
  1326. case TEGRA210_EMC_REFRESH_4X:
  1327. ref = REFRESH_SPEEDUP(ref, 4);
  1328. pre_ref = REFRESH_SPEEDUP(pre_ref, 4);
  1329. dsr_cntrl = REFRESH_SPEEDUP(dsr_cntrl, 4);
  1330. break;
  1331. default:
  1332. dev_warn(emc->dev, "failed to set refresh: %d\n", emc->refresh);
  1333. return;
  1334. }
  1335. emc_writel(emc, ref, emc->offsets->burst[EMC_REFRESH_INDEX]);
  1336. emc_writel(emc, pre_ref,
  1337. emc->offsets->burst[EMC_PRE_REFRESH_REQ_CNT_INDEX]);
  1338. emc_writel(emc, dsr_cntrl,
  1339. emc->offsets->burst[EMC_DYN_SELF_REF_CONTROL_INDEX]);
  1340. }
  1341. static int tegra210_emc_set_rate(struct device *dev,
  1342. const struct tegra210_clk_emc_config *config)
  1343. {
  1344. struct tegra210_emc *emc = dev_get_drvdata(dev);
  1345. struct tegra210_emc_timing *timing = NULL;
  1346. unsigned long rate = config->rate;
  1347. s64 last_change_delay;
  1348. unsigned long flags;
  1349. unsigned int i;
  1350. if (rate == emc->last->rate * 1000UL)
  1351. return 0;
  1352. for (i = 0; i < emc->num_timings; i++) {
  1353. if (emc->timings[i].rate * 1000UL == rate) {
  1354. timing = &emc->timings[i];
  1355. break;
  1356. }
  1357. }
  1358. if (!timing)
  1359. return -EINVAL;
  1360. if (rate > 204000000 && !timing->trained)
  1361. return -EINVAL;
  1362. emc->next = timing;
  1363. last_change_delay = ktime_us_delta(ktime_get(), emc->clkchange_time);
  1364. /* XXX use non-busy-looping sleep? */
  1365. if ((last_change_delay >= 0) &&
  1366. (last_change_delay < emc->clkchange_delay))
  1367. udelay(emc->clkchange_delay - (int)last_change_delay);
  1368. spin_lock_irqsave(&emc->lock, flags);
  1369. tegra210_emc_set_clock(emc, config->value);
  1370. emc->clkchange_time = ktime_get();
  1371. emc->last = timing;
  1372. spin_unlock_irqrestore(&emc->lock, flags);
  1373. return 0;
  1374. }
  1375. /*
  1376. * debugfs interface
  1377. *
  1378. * The memory controller driver exposes some files in debugfs that can be used
  1379. * to control the EMC frequency. The top-level directory can be found here:
  1380. *
  1381. * /sys/kernel/debug/emc
  1382. *
  1383. * It contains the following files:
  1384. *
  1385. * - available_rates: This file contains a list of valid, space-separated
  1386. * EMC frequencies.
  1387. *
  1388. * - min_rate: Writing a value to this file sets the given frequency as the
  1389. * floor of the permitted range. If this is higher than the currently
  1390. * configured EMC frequency, this will cause the frequency to be
  1391. * increased so that it stays within the valid range.
  1392. *
  1393. * - max_rate: Similarily to the min_rate file, writing a value to this file
  1394. * sets the given frequency as the ceiling of the permitted range. If
  1395. * the value is lower than the currently configured EMC frequency, this
  1396. * will cause the frequency to be decreased so that it stays within the
  1397. * valid range.
  1398. */
  1399. static bool tegra210_emc_validate_rate(struct tegra210_emc *emc,
  1400. unsigned long rate)
  1401. {
  1402. unsigned int i;
  1403. for (i = 0; i < emc->num_timings; i++)
  1404. if (rate == emc->timings[i].rate * 1000UL)
  1405. return true;
  1406. return false;
  1407. }
  1408. static int tegra210_emc_debug_available_rates_show(struct seq_file *s,
  1409. void *data)
  1410. {
  1411. struct tegra210_emc *emc = s->private;
  1412. const char *prefix = "";
  1413. unsigned int i;
  1414. for (i = 0; i < emc->num_timings; i++) {
  1415. seq_printf(s, "%s%u", prefix, emc->timings[i].rate * 1000);
  1416. prefix = " ";
  1417. }
  1418. seq_puts(s, "\n");
  1419. return 0;
  1420. }
  1421. DEFINE_SHOW_ATTRIBUTE(tegra210_emc_debug_available_rates);
  1422. static int tegra210_emc_debug_min_rate_get(void *data, u64 *rate)
  1423. {
  1424. struct tegra210_emc *emc = data;
  1425. *rate = emc->debugfs.min_rate;
  1426. return 0;
  1427. }
  1428. static int tegra210_emc_debug_min_rate_set(void *data, u64 rate)
  1429. {
  1430. struct tegra210_emc *emc = data;
  1431. int err;
  1432. if (!tegra210_emc_validate_rate(emc, rate))
  1433. return -EINVAL;
  1434. err = clk_set_min_rate(emc->clk, rate);
  1435. if (err < 0)
  1436. return err;
  1437. emc->debugfs.min_rate = rate;
  1438. return 0;
  1439. }
  1440. DEFINE_DEBUGFS_ATTRIBUTE(tegra210_emc_debug_min_rate_fops,
  1441. tegra210_emc_debug_min_rate_get,
  1442. tegra210_emc_debug_min_rate_set, "%llu\n");
  1443. static int tegra210_emc_debug_max_rate_get(void *data, u64 *rate)
  1444. {
  1445. struct tegra210_emc *emc = data;
  1446. *rate = emc->debugfs.max_rate;
  1447. return 0;
  1448. }
  1449. static int tegra210_emc_debug_max_rate_set(void *data, u64 rate)
  1450. {
  1451. struct tegra210_emc *emc = data;
  1452. int err;
  1453. if (!tegra210_emc_validate_rate(emc, rate))
  1454. return -EINVAL;
  1455. err = clk_set_max_rate(emc->clk, rate);
  1456. if (err < 0)
  1457. return err;
  1458. emc->debugfs.max_rate = rate;
  1459. return 0;
  1460. }
  1461. DEFINE_DEBUGFS_ATTRIBUTE(tegra210_emc_debug_max_rate_fops,
  1462. tegra210_emc_debug_max_rate_get,
  1463. tegra210_emc_debug_max_rate_set, "%llu\n");
  1464. static int tegra210_emc_debug_temperature_get(void *data, u64 *temperature)
  1465. {
  1466. struct tegra210_emc *emc = data;
  1467. unsigned int value;
  1468. if (!emc->debugfs.temperature)
  1469. value = tegra210_emc_get_temperature(emc);
  1470. else
  1471. value = emc->debugfs.temperature;
  1472. *temperature = value;
  1473. return 0;
  1474. }
  1475. static int tegra210_emc_debug_temperature_set(void *data, u64 temperature)
  1476. {
  1477. struct tegra210_emc *emc = data;
  1478. if (temperature > 7)
  1479. return -EINVAL;
  1480. emc->debugfs.temperature = temperature;
  1481. return 0;
  1482. }
  1483. DEFINE_DEBUGFS_ATTRIBUTE(tegra210_emc_debug_temperature_fops,
  1484. tegra210_emc_debug_temperature_get,
  1485. tegra210_emc_debug_temperature_set, "%llu\n");
  1486. static void tegra210_emc_debugfs_init(struct tegra210_emc *emc)
  1487. {
  1488. struct device *dev = emc->dev;
  1489. unsigned int i;
  1490. int err;
  1491. emc->debugfs.min_rate = ULONG_MAX;
  1492. emc->debugfs.max_rate = 0;
  1493. for (i = 0; i < emc->num_timings; i++) {
  1494. if (emc->timings[i].rate * 1000UL < emc->debugfs.min_rate)
  1495. emc->debugfs.min_rate = emc->timings[i].rate * 1000UL;
  1496. if (emc->timings[i].rate * 1000UL > emc->debugfs.max_rate)
  1497. emc->debugfs.max_rate = emc->timings[i].rate * 1000UL;
  1498. }
  1499. if (!emc->num_timings) {
  1500. emc->debugfs.min_rate = clk_get_rate(emc->clk);
  1501. emc->debugfs.max_rate = emc->debugfs.min_rate;
  1502. }
  1503. err = clk_set_rate_range(emc->clk, emc->debugfs.min_rate,
  1504. emc->debugfs.max_rate);
  1505. if (err < 0) {
  1506. dev_err(dev, "failed to set rate range [%lu-%lu] for %pC\n",
  1507. emc->debugfs.min_rate, emc->debugfs.max_rate,
  1508. emc->clk);
  1509. return;
  1510. }
  1511. emc->debugfs.root = debugfs_create_dir("emc", NULL);
  1512. debugfs_create_file("available_rates", 0444, emc->debugfs.root, emc,
  1513. &tegra210_emc_debug_available_rates_fops);
  1514. debugfs_create_file("min_rate", 0644, emc->debugfs.root, emc,
  1515. &tegra210_emc_debug_min_rate_fops);
  1516. debugfs_create_file("max_rate", 0644, emc->debugfs.root, emc,
  1517. &tegra210_emc_debug_max_rate_fops);
  1518. debugfs_create_file("temperature", 0644, emc->debugfs.root, emc,
  1519. &tegra210_emc_debug_temperature_fops);
  1520. }
  1521. static void tegra210_emc_detect(struct tegra210_emc *emc)
  1522. {
  1523. u32 value;
  1524. /* probe the number of connected DRAM devices */
  1525. value = mc_readl(emc->mc, MC_EMEM_ADR_CFG);
  1526. if (value & MC_EMEM_ADR_CFG_EMEM_NUMDEV)
  1527. emc->num_devices = 2;
  1528. else
  1529. emc->num_devices = 1;
  1530. /* probe the type of DRAM */
  1531. value = emc_readl(emc, EMC_FBIO_CFG5);
  1532. emc->dram_type = value & 0x3;
  1533. /* probe the number of channels */
  1534. value = emc_readl(emc, EMC_FBIO_CFG7);
  1535. if ((value & EMC_FBIO_CFG7_CH1_ENABLE) &&
  1536. (value & EMC_FBIO_CFG7_CH0_ENABLE))
  1537. emc->num_channels = 2;
  1538. else
  1539. emc->num_channels = 1;
  1540. }
  1541. static int tegra210_emc_validate_timings(struct tegra210_emc *emc,
  1542. struct tegra210_emc_timing *timings,
  1543. unsigned int num_timings)
  1544. {
  1545. unsigned int i;
  1546. for (i = 0; i < num_timings; i++) {
  1547. u32 min_volt = timings[i].min_volt;
  1548. u32 rate = timings[i].rate;
  1549. if (!rate)
  1550. return -EINVAL;
  1551. if ((i > 0) && ((rate <= timings[i - 1].rate) ||
  1552. (min_volt < timings[i - 1].min_volt)))
  1553. return -EINVAL;
  1554. if (timings[i].revision != timings[0].revision)
  1555. continue;
  1556. }
  1557. return 0;
  1558. }
  1559. static int tegra210_emc_probe(struct platform_device *pdev)
  1560. {
  1561. struct thermal_cooling_device *cd;
  1562. unsigned long current_rate;
  1563. struct tegra210_emc *emc;
  1564. struct device_node *np;
  1565. unsigned int i;
  1566. int err;
  1567. emc = devm_kzalloc(&pdev->dev, sizeof(*emc), GFP_KERNEL);
  1568. if (!emc)
  1569. return -ENOMEM;
  1570. emc->clk = devm_clk_get(&pdev->dev, "emc");
  1571. if (IS_ERR(emc->clk))
  1572. return PTR_ERR(emc->clk);
  1573. platform_set_drvdata(pdev, emc);
  1574. spin_lock_init(&emc->lock);
  1575. emc->dev = &pdev->dev;
  1576. emc->mc = devm_tegra_memory_controller_get(&pdev->dev);
  1577. if (IS_ERR(emc->mc))
  1578. return PTR_ERR(emc->mc);
  1579. emc->regs = devm_platform_ioremap_resource(pdev, 0);
  1580. if (IS_ERR(emc->regs))
  1581. return PTR_ERR(emc->regs);
  1582. for (i = 0; i < 2; i++) {
  1583. emc->channel[i] = devm_platform_ioremap_resource(pdev, 1 + i);
  1584. if (IS_ERR(emc->channel[i]))
  1585. return PTR_ERR(emc->channel[i]);
  1586. }
  1587. tegra210_emc_detect(emc);
  1588. np = pdev->dev.of_node;
  1589. /* attach to the nominal and (optional) derated tables */
  1590. err = of_reserved_mem_device_init_by_name(emc->dev, np, "nominal");
  1591. if (err < 0) {
  1592. dev_err(emc->dev, "failed to get nominal EMC table: %d\n", err);
  1593. return err;
  1594. }
  1595. err = of_reserved_mem_device_init_by_name(emc->dev, np, "derated");
  1596. if (err < 0 && err != -ENODEV) {
  1597. dev_err(emc->dev, "failed to get derated EMC table: %d\n", err);
  1598. goto release;
  1599. }
  1600. /* validate the tables */
  1601. if (emc->nominal) {
  1602. err = tegra210_emc_validate_timings(emc, emc->nominal,
  1603. emc->num_timings);
  1604. if (err < 0)
  1605. goto release;
  1606. }
  1607. if (emc->derated) {
  1608. err = tegra210_emc_validate_timings(emc, emc->derated,
  1609. emc->num_timings);
  1610. if (err < 0)
  1611. goto release;
  1612. }
  1613. /* default to the nominal table */
  1614. emc->timings = emc->nominal;
  1615. /* pick the current timing based on the current EMC clock rate */
  1616. current_rate = clk_get_rate(emc->clk) / 1000;
  1617. for (i = 0; i < emc->num_timings; i++) {
  1618. if (emc->timings[i].rate == current_rate) {
  1619. emc->last = &emc->timings[i];
  1620. break;
  1621. }
  1622. }
  1623. if (i == emc->num_timings) {
  1624. dev_err(emc->dev, "no EMC table entry found for %lu kHz\n",
  1625. current_rate);
  1626. err = -ENOENT;
  1627. goto release;
  1628. }
  1629. /* pick a compatible clock change sequence for the EMC table */
  1630. for (i = 0; i < ARRAY_SIZE(tegra210_emc_sequences); i++) {
  1631. const struct tegra210_emc_sequence *sequence =
  1632. tegra210_emc_sequences[i];
  1633. if (emc->timings[0].revision == sequence->revision) {
  1634. emc->sequence = sequence;
  1635. break;
  1636. }
  1637. }
  1638. if (!emc->sequence) {
  1639. dev_err(&pdev->dev, "sequence %u not supported\n",
  1640. emc->timings[0].revision);
  1641. err = -ENOTSUPP;
  1642. goto release;
  1643. }
  1644. emc->offsets = &tegra210_emc_table_register_offsets;
  1645. emc->refresh = TEGRA210_EMC_REFRESH_NOMINAL;
  1646. emc->provider.owner = THIS_MODULE;
  1647. emc->provider.dev = &pdev->dev;
  1648. emc->provider.set_rate = tegra210_emc_set_rate;
  1649. emc->provider.configs = devm_kcalloc(&pdev->dev, emc->num_timings,
  1650. sizeof(*emc->provider.configs),
  1651. GFP_KERNEL);
  1652. if (!emc->provider.configs) {
  1653. err = -ENOMEM;
  1654. goto release;
  1655. }
  1656. emc->provider.num_configs = emc->num_timings;
  1657. for (i = 0; i < emc->provider.num_configs; i++) {
  1658. struct tegra210_emc_timing *timing = &emc->timings[i];
  1659. struct tegra210_clk_emc_config *config =
  1660. &emc->provider.configs[i];
  1661. u32 value;
  1662. config->rate = timing->rate * 1000UL;
  1663. config->value = timing->clk_src_emc;
  1664. value = timing->burst_mc_regs[MC_EMEM_ARB_MISC0_INDEX];
  1665. if ((value & MC_EMEM_ARB_MISC0_EMC_SAME_FREQ) == 0)
  1666. config->same_freq = false;
  1667. else
  1668. config->same_freq = true;
  1669. }
  1670. err = tegra210_clk_emc_attach(emc->clk, &emc->provider);
  1671. if (err < 0) {
  1672. dev_err(&pdev->dev, "failed to attach to EMC clock: %d\n", err);
  1673. goto release;
  1674. }
  1675. emc->clkchange_delay = 100;
  1676. emc->training_interval = 100;
  1677. dev_set_drvdata(emc->dev, emc);
  1678. timer_setup(&emc->refresh_timer, tegra210_emc_poll_refresh,
  1679. TIMER_DEFERRABLE);
  1680. atomic_set(&emc->refresh_poll, 0);
  1681. emc->refresh_poll_interval = 1000;
  1682. timer_setup(&emc->training, tegra210_emc_train, 0);
  1683. tegra210_emc_debugfs_init(emc);
  1684. cd = devm_thermal_of_cooling_device_register(emc->dev, np, "emc", emc,
  1685. &tegra210_emc_cd_ops);
  1686. if (IS_ERR(cd)) {
  1687. err = PTR_ERR(cd);
  1688. dev_err(emc->dev, "failed to register cooling device: %d\n",
  1689. err);
  1690. goto detach;
  1691. }
  1692. return 0;
  1693. detach:
  1694. debugfs_remove_recursive(emc->debugfs.root);
  1695. tegra210_clk_emc_detach(emc->clk);
  1696. release:
  1697. of_reserved_mem_device_release(emc->dev);
  1698. return err;
  1699. }
  1700. static void tegra210_emc_remove(struct platform_device *pdev)
  1701. {
  1702. struct tegra210_emc *emc = platform_get_drvdata(pdev);
  1703. debugfs_remove_recursive(emc->debugfs.root);
  1704. tegra210_clk_emc_detach(emc->clk);
  1705. of_reserved_mem_device_release(emc->dev);
  1706. }
  1707. static int __maybe_unused tegra210_emc_suspend(struct device *dev)
  1708. {
  1709. struct tegra210_emc *emc = dev_get_drvdata(dev);
  1710. int err;
  1711. err = clk_rate_exclusive_get(emc->clk);
  1712. if (err < 0) {
  1713. dev_err(emc->dev, "failed to acquire clock: %d\n", err);
  1714. return err;
  1715. }
  1716. emc->resume_rate = clk_get_rate(emc->clk);
  1717. clk_set_rate(emc->clk, 204000000);
  1718. tegra210_clk_emc_detach(emc->clk);
  1719. dev_dbg(dev, "suspending at %lu Hz\n", clk_get_rate(emc->clk));
  1720. return 0;
  1721. }
  1722. static int __maybe_unused tegra210_emc_resume(struct device *dev)
  1723. {
  1724. struct tegra210_emc *emc = dev_get_drvdata(dev);
  1725. int err;
  1726. err = tegra210_clk_emc_attach(emc->clk, &emc->provider);
  1727. if (err < 0) {
  1728. dev_err(dev, "failed to attach to EMC clock: %d\n", err);
  1729. return err;
  1730. }
  1731. clk_set_rate(emc->clk, emc->resume_rate);
  1732. clk_rate_exclusive_put(emc->clk);
  1733. dev_dbg(dev, "resuming at %lu Hz\n", clk_get_rate(emc->clk));
  1734. return 0;
  1735. }
  1736. static const struct dev_pm_ops tegra210_emc_pm_ops = {
  1737. SET_SYSTEM_SLEEP_PM_OPS(tegra210_emc_suspend, tegra210_emc_resume)
  1738. };
  1739. static const struct of_device_id tegra210_emc_of_match[] = {
  1740. { .compatible = "nvidia,tegra210-emc", },
  1741. { },
  1742. };
  1743. MODULE_DEVICE_TABLE(of, tegra210_emc_of_match);
  1744. static struct platform_driver tegra210_emc_driver = {
  1745. .driver = {
  1746. .name = "tegra210-emc",
  1747. .of_match_table = tegra210_emc_of_match,
  1748. .pm = &tegra210_emc_pm_ops,
  1749. },
  1750. .probe = tegra210_emc_probe,
  1751. .remove_new = tegra210_emc_remove,
  1752. };
  1753. module_platform_driver(tegra210_emc_driver);
  1754. MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
  1755. MODULE_AUTHOR("Joseph Lo <josephl@nvidia.com>");
  1756. MODULE_DESCRIPTION("NVIDIA Tegra210 EMC driver");
  1757. MODULE_LICENSE("GPL v2");