mt_dramc.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731
  1. #include <linux/kernel.h>
  2. #include <linux/types.h>
  3. #include <linux/device.h>
  4. #include <linux/module.h>
  5. #include <linux/platform_device.h>
  6. #include <linux/kallsyms.h>
  7. #include <linux/cpu.h>
  8. #include <linux/smp.h>
  9. #include <linux/vmalloc.h>
  10. #include <linux/memblock.h>
  11. #include <linux/sched.h>
  12. #include <linux/delay.h>
  13. #include <asm/cacheflush.h>
  14. #include <asm/setup.h>
  15. #ifdef CONFIG_OF
  16. #include <linux/of.h>
  17. #include <linux/of_address.h>
  18. #include <linux/of_fdt.h>
  19. #endif
  20. #include <mt-plat/mt_io.h>
  21. #include <mt-plat/dma.h>
  22. #include <mt-plat/sync_write.h>
  23. /* #include <mach/mt_reg_base.h> */
  24. #ifdef CONFIG_MTK_CLKMGR
  25. #include <mach/mt_clkmgr.h>
  26. #else
  27. #include <linux/clk.h>
  28. #endif /* #ifdef CONFIG_MTK_CLKMGR */
  29. #include "mt_dramc.h"
  30. /* #include <mach/mt_typedefs.h> */
  31. /* #include <mach/memory.h> */
  32. /* #include <mach/mt_sleep.h> */
  33. /* #include <mach/mt_dcm.h> */
  34. /* #include <mach/mt_ccci_common.h> */
  35. /* #include <mach/mt_vcore_dvfs.h> */
  36. #ifdef FREQ_HOPPING_TEST
  37. #include <mach/mt_freqhopping.h>
  38. #endif
  39. #ifdef VCORE1_ADJ_TEST
  40. #include <mt-plat/upmu_common.h>
  41. #include <mach/upmu_hw.h>
  42. #endif
  43. #ifdef CONFIG_OF_RESERVED_MEM
  44. #define DRAM_R0_DUMMY_READ_RESERVED_KEY "reserve-memory-dram_r0_dummy_read"
  45. #define DRAM_R1_DUMMY_READ_RESERVED_KEY "reserve-memory-dram_r1_dummy_read"
  46. #define DRAM_RSV_SIZE 0x1000
  47. #include <linux/of_reserved_mem.h>
  48. #include <mt-plat/mtk_memcfg.h>
  49. #endif
  50. static void __iomem *CQDMA_BASE_ADDR;
  51. static void __iomem *DRAMCAO_BASE_ADDR;
  52. static void __iomem *DDRPHY_BASE_ADDR;
  53. static void __iomem *DRAMCNAO_BASE_ADDR;
  54. volatile unsigned char *dst_array_v;
  55. volatile unsigned int dst_array_p;
  56. static char dfs_dummy_buffer[BUFF_LEN] __aligned(PAGE_SIZE);
  57. int init_done = 0;
  58. static DEFINE_MUTEX(dram_dfs_mutex);
  59. int org_dram_data_rate = 0;
  60. static unsigned int dram_rank_num;
  61. phys_addr_t dram_rank0_addr, dram_rank1_addr;
  62. /* #include <mach/emi_bwl.h> */
  63. #define DRAMC_LPDDR2 (0x1e0)
  64. #define DRAMC_PADCTL4 (0x0e4)
  65. #define DRAMC_ACTIM1 (0x1e8)
  66. #ifndef CONFIG_MTK_CLKMGR
  67. struct clk *clk_cqdma;
  68. #endif /* #ifndef CONFIG_MTK_CLKMGR */
  69. int get_ddr_type(void)
  70. {
  71. unsigned int value;
  72. value = ucDram_Register_Read(DRAMC_LPDDR2);
  73. if ((value >> 28) & 0x1) { /* check LPDDR2_EN */
  74. return TYPE_LPDDR2;
  75. }
  76. value = ucDram_Register_Read(DRAMC_PADCTL4);
  77. if ((value >> 7) & 0x1) { /* check DDR3_EN */
  78. return TYPE_PCDDR3;
  79. }
  80. value = ucDram_Register_Read(DRAMC_ACTIM1);
  81. if ((value >> 28) & 0x1) { /* check LPDDR3_EN */
  82. return TYPE_LPDDR3;
  83. }
  84. return TYPE_DDR1;
  85. }
  86. /*----------------------------------------------------------------------------------------*/
  87. /* Sampler function for profiling purpose */
  88. /*----------------------------------------------------------------------------------------*/
  89. typedef void (*dram_sampler_func) (unsigned int);
  90. static dram_sampler_func g_pDramFreqSampler;
  91. void mt_dramfreq_setfreq_registerCB(dram_sampler_func pCB)
  92. {
  93. g_pDramFreqSampler = pCB;
  94. }
  95. EXPORT_SYMBOL(mt_dramfreq_setfreq_registerCB);
  96. void mt_dramfreq_setfreq_notify(unsigned int freq)
  97. {
  98. if (NULL != g_pDramFreqSampler)
  99. g_pDramFreqSampler(freq);
  100. }
  101. static int check_dramc_base_addr(void)
  102. {
  103. if ((!DRAMCAO_BASE_ADDR) || (!DDRPHY_BASE_ADDR) || (!DRAMCNAO_BASE_ADDR))
  104. return -1;
  105. else
  106. return 0;
  107. }
  108. static int check_cqdma_base_addr(void)
  109. {
  110. if (!CQDMA_BASE_ADDR)
  111. return -1;
  112. else
  113. return 0;
  114. }
  115. void *mt_dramc_base_get(void)
  116. {
  117. return DRAMCAO_BASE_ADDR;
  118. }
  119. EXPORT_SYMBOL(mt_dramc_base_get);
  120. void *mt_dramc_nao_base_get(void)
  121. {
  122. return DRAMCNAO_BASE_ADDR;
  123. }
  124. EXPORT_SYMBOL(mt_dramc_nao_base_get);
  125. void *mt_ddrphy_base_get(void)
  126. {
  127. return DDRPHY_BASE_ADDR;
  128. }
  129. EXPORT_SYMBOL(mt_ddrphy_base_get);
  130. #ifdef VCORE1_ADJ_TEST
  131. void pmic_voltage_read(unsigned int nAdjust)
  132. {
  133. int ret_val = 0;
  134. unsigned int OldVcore1 = 0;
  135. unsigned int OldVmem = 0, OldVmem1 = 0;
  136. pr_warn("[PMIC]pmic_voltage_read : \r\n");
  137. ret_val = pmic_read_interface(MT6328_VCORE1_CON11, &OldVcore1, 0x7F, 0);
  138. ret_val = pmic_read_interface(MT6328_SLDO_ANA_CON0, &OldVmem, 0x7F, 0);
  139. ret_val = pmic_read_interface(MT6328_SLDO_ANA_CON1, &OldVmem1, 0x0F, 8);
  140. pr_warn("[Vcore] MT6328_VCORE1_CON11=0x%x,\r\n[Vmem] MT6328_SLDO_ANA_CON0/1=0x%x 0x%x\r\n",
  141. OldVcore1, OldVmem, OldVmem1);
  142. }
  143. void pmic_Vcore_adjust(int nAdjust)
  144. {
  145. switch (nAdjust) {
  146. case 0: /* HV 1280MHz */
  147. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x6B, 0x7F, 0);*/ /* 1.265V */
  148. pmic_config_interface(MT6328_VCORE1_CON11, 0x65, 0x7F, 0); /* 1.230V */
  149. break;
  150. case 1: /* HV 938MHz */
  151. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x59, 0x7F, 0);*/ /* 1.155V */
  152. pmic_config_interface(MT6328_VCORE1_CON11, 0x54, 0x7F, 0); /* 1.124V */
  153. break;
  154. case 2: /* NV 1280MHz */
  155. pmic_config_interface(MT6328_VCORE1_CON11, 0x58, 0x7F, 0); /* 1.15V */
  156. break;
  157. case 3: /* NV 938MHz */
  158. pmic_config_interface(MT6328_VCORE1_CON11, 0x48, 0x7F, 0); /* 1.05V */
  159. break;
  160. case 4: /* LV 1280MHz */
  161. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x46, 0x7F, 0);*/ /* 1.035V */
  162. pmic_config_interface(MT6328_VCORE1_CON11, 0x4B, 0x7F, 0); /* 1.070V */
  163. break;
  164. case 5: /* LV 938MHz */
  165. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x38, 0x7F, 0);*/ /* 0.945V */
  166. pmic_config_interface(MT6328_VCORE1_CON11, 0x3C, 0x7F, 0); /* 0.976V */
  167. break;
  168. default:
  169. pr_warn("Enter incorrect config number !!!\n");
  170. break;
  171. }
  172. }
  173. void pmic_Vmem_adjust(int nAdjust)
  174. {
  175. switch (nAdjust) {
  176. case 0:
  177. pmic_config_interface(MT6328_SLDO_ANA_CON0, 0, 0x3, 0); /* 1.24V */
  178. break;
  179. case 1:
  180. pmic_config_interface(MT6328_SLDO_ANA_CON0, 1, 0x3, 0); /* 1.39V */
  181. break;
  182. case 2:
  183. pmic_config_interface(MT6328_SLDO_ANA_CON0, 2, 0x3, 0); /* 1.54V */
  184. break;
  185. default:
  186. pmic_config_interface(MT6328_SLDO_ANA_CON0, 0, 0x3, 0); /* 1.24V */
  187. break;
  188. }
  189. }
  190. void pmic_Vmem_Cal_adjust(int nAdjust)
  191. {
  192. switch (nAdjust) {
  193. case 0:
  194. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x0D, 0xF, 8); /* +0.06V */
  195. break;
  196. case 1:
  197. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x01, 0xF, 8); /* -0.02V */
  198. break;
  199. case 2:
  200. /*pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x04, 0xF, 8);*/ /* -0.08V */
  201. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x05, 0xF, 8); /* -1.00V */
  202. break;
  203. default:
  204. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x00, 0xF, 8); /* 1.24V */
  205. break;
  206. }
  207. }
  208. void pmic_HQA_NoSSC_Voltage_adjust(int nAdjust)
  209. {
  210. switch (nAdjust) {
  211. case 0: /* Vm = 1.18V & Vc = 1.15V */
  212. pmic_config_interface(MT6328_VCORE1_CON11, 0x58, 0x7F, 0); /* 1.15V */
  213. pmic_config_interface(MT6328_VCORE1_CON12, 0x58, 0x7F, 0); /* 1.15V */
  214. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x03, 0xF, 8); /* -0.06V (1.18V) */
  215. pr_warn("========== Vm = 1.18V & Vc = 1.15V ==========\r\n");
  216. break;
  217. case 1: /* Vm = 1.26V & Vc = 1.15V */
  218. pmic_config_interface(MT6328_VCORE1_CON11, 0x58, 0x7F, 0); /* 1.15V */
  219. pmic_config_interface(MT6328_VCORE1_CON12, 0x58, 0x7F, 0); /* 1.15V */
  220. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x0F, 0xF, 8); /* +0.02V (1.26V) */
  221. pr_warn("========== Vm = 1.26V & Vc = 1.15V ==========\r\n");
  222. break;
  223. case 2: /* Vm = 1.22V & Vc = 1.11V */
  224. pmic_config_interface(MT6328_VCORE1_CON11, 0x52, 0x7F, 0); /* 1.11V */
  225. pmic_config_interface(MT6328_VCORE1_CON12, 0x52, 0x7F, 0); /* 1.11V */
  226. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x01, 0xF, 8); /* -0.02V (1.22V) */
  227. pr_warn("========== Vm = 1.22V & Vc = 1.11V ==========\r\n");
  228. break;
  229. case 3: /* Vm = 1.22V & Vc = 1.19V */
  230. pmic_config_interface(MT6328_VCORE1_CON11, 0x5F, 0x7F, 0); /* 1.19V */
  231. pmic_config_interface(MT6328_VCORE1_CON12, 0x5F, 0x7F, 0); /* 1.19V */
  232. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x01, 0xF, 8); /* -0.02V (1.22V) */
  233. pr_warn("========== Vm = 1.22V & Vc = 1.19V ==========\r\n");
  234. break;
  235. case 4: /*NV*/
  236. pmic_config_interface(MT6328_VCORE1_CON11, 0x58, 0x7F, 0); /* 1.15V */
  237. pmic_config_interface(MT6328_VCORE1_CON12, 0x58, 0x7F, 0); /* 1.15V */
  238. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x01, 0xF, 8); /* -0.02V (1.22V) */
  239. pr_warn("========== NV ==========\r\n");
  240. break;
  241. default: /*NV*/
  242. pmic_config_interface(MT6328_VCORE1_CON11, 0x58, 0x7F, 0); /* 1.15V */
  243. pmic_config_interface(MT6328_VCORE1_CON12, 0x58, 0x7F, 0); /* 1.15V */
  244. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x01, 0xF, 8); /* -0.02V (1.22V) */
  245. pr_warn("========== NV ==========\r\n");
  246. break;
  247. }
  248. }
  249. void pmic_HQA_Voltage_adjust(int nAdjust)
  250. {
  251. switch (nAdjust) {
  252. case 0: /*HVcHVm*/
  253. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x6B, 0x7F, 0);*/ /* 1.265V */
  254. #if defined(CONFIG_ARCH_MT6753)
  255. pmic_config_interface(MT6328_VCORE1_CON11, 0x71, 0x7F, 0); /* 1.310V */
  256. pmic_config_interface(MT6328_VCORE1_CON12, 0x71, 0x7F, 0); /* 1.310V */
  257. #else
  258. pmic_config_interface(MT6328_VCORE1_CON11, 0x65, 0x7F, 0); /* 1.230V */
  259. pmic_config_interface(MT6328_VCORE1_CON12, 0x65, 0x7F, 0); /* 1.230V */
  260. #endif
  261. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x0D, 0xF, 8); /* +0.06V (1.3V) */
  262. pr_warn("========== HVcHVm ==========\r\n");
  263. break;
  264. case 1: /*HVcLVm*/
  265. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x6B, 0x7F, 0);*/ /* 1.265V */
  266. #if defined(CONFIG_ARCH_MT6753)
  267. pmic_config_interface(MT6328_VCORE1_CON11, 0x71, 0x7F, 0); /* 1.310V */
  268. pmic_config_interface(MT6328_VCORE1_CON12, 0x71, 0x7F, 0); /* 1.310V */
  269. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x04, 0xF, 8); /* -0.08V (1.16V) */
  270. #else
  271. pmic_config_interface(MT6328_VCORE1_CON11, 0x65, 0x7F, 0); /* 1.230V */
  272. pmic_config_interface(MT6328_VCORE1_CON12, 0x65, 0x7F, 0); /* 1.230V */
  273. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x05, 0xF, 8); /* -1.00V (1.14V) */
  274. #endif
  275. pr_warn("========== HVcLVm ==========\r\n");
  276. break;
  277. case 2: /*LVcHVm*/
  278. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x46, 0x7F, 0);*/ /* 1.035V */
  279. #if defined(CONFIG_ARCH_MT6753)
  280. pmic_config_interface(MT6328_VCORE1_CON11, 0x54, 0x7F, 0); /* 1.125V */
  281. pmic_config_interface(MT6328_VCORE1_CON12, 0x54, 0x7F, 0); /* 1.125V */
  282. #else
  283. pmic_config_interface(MT6328_VCORE1_CON11, 0x4B, 0x7F, 0); /* 1.070V */
  284. pmic_config_interface(MT6328_VCORE1_CON12, 0x4B, 0x7F, 0); /* 1.070V */
  285. #endif
  286. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x0D, 0xF, 8); /* +0.06V (1.3V) */
  287. pr_warn("========== LVcHVm ==========\r\n");
  288. break;
  289. case 3: /*LVcLVm*/
  290. /*pmic_config_interface(MT6328_VCORE1_CON11, 0x46, 0x7F, 0);*/ /* 1.035V */
  291. #if defined(CONFIG_ARCH_MT6753)
  292. pmic_config_interface(MT6328_VCORE1_CON11, 0x54, 0x7F, 0); /* 1.125V */
  293. pmic_config_interface(MT6328_VCORE1_CON12, 0x54, 0x7F, 0); /* 1.125V */
  294. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x04, 0xF, 8); /* -0.08V (1.16V)*/
  295. #else
  296. pmic_config_interface(MT6328_VCORE1_CON11, 0x4B, 0x7F, 0); /* 1.070V */
  297. pmic_config_interface(MT6328_VCORE1_CON12, 0x4B, 0x7F, 0); /* 1.070V */
  298. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x05, 0xF, 8); /* -1.00V (1.14V) */
  299. #endif
  300. pr_warn("========== LVcLVm ==========\r\n");
  301. break;
  302. case 4: /*NV*/
  303. #if defined(CONFIG_ARCH_MT6753)
  304. pmic_config_interface(MT6328_VCORE1_CON11, 0x68, 0x7F, 0); /* 1.25V */
  305. pmic_config_interface(MT6328_VCORE1_CON12, 0x68, 0x7F, 0); /* 1.25V */
  306. #else
  307. pmic_config_interface(MT6328_VCORE1_CON11, 0x58, 0x7F, 0); /* 1.15V */
  308. pmic_config_interface(MT6328_VCORE1_CON12, 0x58, 0x7F, 0); /* 1.15V */
  309. #endif
  310. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x01, 0xF, 8); /* -0.02V (1.22V) */
  311. pr_warn("========== NV ==========\r\n");
  312. break;
  313. default: /*NV*/
  314. #if defined(CONFIG_ARCH_MT6753)
  315. pmic_config_interface(MT6328_VCORE1_CON11, 0x68, 0x7F, 0); /* 1.25V */
  316. pmic_config_interface(MT6328_VCORE1_CON12, 0x68, 0x7F, 0); /* 1.25V */
  317. #else
  318. pmic_config_interface(MT6328_VCORE1_CON11, 0x58, 0x7F, 0); /* 1.15V */
  319. pmic_config_interface(MT6328_VCORE1_CON12, 0x58, 0x7F, 0); /* 1.15V */
  320. #endif
  321. pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x01, 0xF, 8); /* -0.02V (1.22V) */
  322. pr_warn("========== NV ==========\r\n");
  323. break;
  324. }
  325. }
  326. #endif
  327. #if defined(CONFIG_ARCH_MT6753)
  328. int enter_pasr_dpd_config(unsigned char segment_rank0,
  329. unsigned char segment_rank1)
  330. {
  331. /* for D-3, support run time MRW */
  332. unsigned int rank_pasr_segment[2];
  333. unsigned int dramc0_spcmd, dramc0_pd_ctrl, dramc0_padctl4;
  334. unsigned int i, cnt = 1000;
  335. rank_pasr_segment[0] = segment_rank0 & 0xFF; /* for rank0 */
  336. rank_pasr_segment[1] = segment_rank1 & 0xFF; /* for rank1 */
  337. pr_warn("[DRAMC0] PASR r0 = 0x%x r1 = 0x%x\n", rank_pasr_segment[0], rank_pasr_segment[1]);
  338. /* backup original data */
  339. dramc0_spcmd = readl(PDEF_DRAMC0_REG_1E4);
  340. dramc0_pd_ctrl = readl(PDEF_DRAMC0_REG_1DC);
  341. dramc0_padctl4 = readl(PDEF_DRAMC0_REG_0E4);
  342. /* Set MIOCKCTRLOFF(0x1dc[26])=1: not stop to DRAM clock! */
  343. writel(dramc0_pd_ctrl | 0x04000000, PDEF_DRAMC0_REG_1DC);
  344. /* fix CKE */
  345. writel(dramc0_padctl4 | 0x00000004, PDEF_DRAMC0_REG_0E4);
  346. udelay(1);
  347. for (i = 0; i < 2; i++) {
  348. /* set MRS settings include rank number, segment information and MRR17 */
  349. writel(((i << 28) | (rank_pasr_segment[i] << 16) | 0x00000011), PDEF_DRAMC0_REG_088);
  350. /* Mode register write command enable */
  351. writel(0x00000001, PDEF_DRAMC0_REG_1E4);
  352. /* wait MRW command response */
  353. /* wait >1us */
  354. /* gpt_busy_wait_us(1); */
  355. do {
  356. if (cnt-- == 0) {
  357. pr_warn("[DRAMC0] PASR MRW fail!\n");
  358. return -1;
  359. }
  360. udelay(1);
  361. } while ((readl(PDEF_DRAMC0_REG_3B8) & 0x00000001) == 0x0);
  362. mb(); /* make sure the DRAM have been read */
  363. /* Mode register write command disable */
  364. writel(0x0, PDEF_DRAMC0_REG_1E4);
  365. }
  366. /* release fix CKE */
  367. writel(dramc0_padctl4, PDEF_DRAMC0_REG_0E4);
  368. /* recover Set MIOCKCTRLOFF(0x1dc[26]) */
  369. /* Set MIOCKCTRLOFF(0x1DC[26])=0: stop to DRAM clock */
  370. writel(dramc0_pd_ctrl, PDEF_DRAMC0_REG_1DC);
  371. /* writel(0x00000004, PDEF_DRAMC0_REG_088); */
  372. pr_warn("[DRAMC0] PASR offset 0x88 = 0x%x\n", readl(PDEF_DRAMC0_REG_088));
  373. writel(dramc0_spcmd, PDEF_DRAMC0_REG_1E4);
  374. return 0;
  375. #if 0
  376. if (segment_rank1 == 0xFF) { /*all segments of rank1 are not reserved -> rank1 enter DPD*/
  377. slp_dpd_en(1);
  378. }
  379. #endif
  380. /*slp_pasr_en(1, segment_rank0 | (segment_rank1 << 8));*/
  381. }
  382. int exit_pasr_dpd_config(void)
  383. {
  384. int ret;
  385. /*slp_dpd_en(0);*/
  386. /*slp_pasr_en(0, 0);*/
  387. ret = enter_pasr_dpd_config(0, 0);
  388. return ret;
  389. }
  390. #endif
  391. #define MEM_TEST_SIZE 0x2000
  392. #define PATTERN1 0x5A5A5A5A
  393. #define PATTERN2 0xA5A5A5A5
  394. int Binning_DRAM_complex_mem_test(void)
  395. {
  396. unsigned char *MEM8_BASE;
  397. unsigned short *MEM16_BASE;
  398. unsigned int *MEM32_BASE;
  399. unsigned int *MEM_BASE;
  400. unsigned long mem_ptr;
  401. unsigned char pattern8;
  402. unsigned short pattern16;
  403. unsigned int i, j, size, pattern32;
  404. unsigned int value;
  405. unsigned int len = MEM_TEST_SIZE;
  406. void *ptr;
  407. int ret = 1;
  408. ptr = vmalloc(PAGE_SIZE * 2);
  409. MEM8_BASE = (unsigned char *)ptr;
  410. MEM16_BASE = (unsigned short *)ptr;
  411. MEM32_BASE = (unsigned int *)ptr;
  412. MEM_BASE = (unsigned int *)ptr;
  413. pr_warn("Test DRAM start address 0x%lx\n", (unsigned long)ptr);
  414. pr_warn("Test DRAM SIZE 0x%x\n", MEM_TEST_SIZE);
  415. size = len >> 2;
  416. /* === Verify the tied bits (tied high) === */
  417. for (i = 0; i < size; i++)
  418. MEM32_BASE[i] = 0;
  419. for (i = 0; i < size; i++) {
  420. if (MEM32_BASE[i] != 0) {
  421. vfree(ptr);
  422. /* return -1; */
  423. ret = -1;
  424. goto fail;
  425. } else
  426. MEM32_BASE[i] = 0xffffffff;
  427. }
  428. /* === Verify the tied bits (tied low) === */
  429. for (i = 0; i < size; i++) {
  430. if (MEM32_BASE[i] != 0xffffffff) {
  431. vfree(ptr);
  432. /* return -2; */
  433. ret = -2;
  434. goto fail;
  435. } else
  436. MEM32_BASE[i] = 0x00;
  437. }
  438. /* === Verify pattern 1 (0x00~0xff) === */
  439. pattern8 = 0x00;
  440. for (i = 0; i < len; i++)
  441. MEM8_BASE[i] = pattern8++;
  442. pattern8 = 0x00;
  443. for (i = 0; i < len; i++) {
  444. if (MEM8_BASE[i] != pattern8++) {
  445. vfree(ptr);
  446. /* return -3; */
  447. ret = -3;
  448. goto fail;
  449. }
  450. }
  451. /* === Verify pattern 2 (0x00~0xff) === */
  452. pattern8 = 0x00;
  453. for (i = j = 0; i < len; i += 2, j++) {
  454. if (MEM8_BASE[i] == pattern8)
  455. MEM16_BASE[j] = pattern8;
  456. if (MEM16_BASE[j] != pattern8) {
  457. vfree(ptr);
  458. /* return -4; */
  459. ret = -4;
  460. goto fail;
  461. }
  462. pattern8 += 2;
  463. }
  464. /* === Verify pattern 3 (0x00~0xffff) === */
  465. pattern16 = 0x00;
  466. for (i = 0; i < (len >> 1); i++)
  467. MEM16_BASE[i] = pattern16++;
  468. pattern16 = 0x00;
  469. for (i = 0; i < (len >> 1); i++) {
  470. if (MEM16_BASE[i] != pattern16++) {
  471. vfree(ptr);
  472. /* return -5; */
  473. ret = -5;
  474. goto fail;
  475. }
  476. }
  477. /* === Verify pattern 4 (0x00~0xffffffff) === */
  478. pattern32 = 0x00;
  479. for (i = 0; i < (len >> 2); i++)
  480. MEM32_BASE[i] = pattern32++;
  481. pattern32 = 0x00;
  482. for (i = 0; i < (len >> 2); i++) {
  483. if (MEM32_BASE[i] != pattern32++) {
  484. vfree(ptr);
  485. /* return -6; */
  486. ret = -6;
  487. goto fail;
  488. }
  489. }
  490. /* === Pattern 5: Filling memory range with 0x44332211 === */
  491. for (i = 0; i < size; i++)
  492. MEM32_BASE[i] = 0x44332211;
  493. /* === Read Check then Fill Memory with a5a5a5a5 Pattern === */
  494. for (i = 0; i < size; i++) {
  495. if (MEM32_BASE[i] != 0x44332211) {
  496. vfree(ptr);
  497. /* return -7; */
  498. ret = -7;
  499. goto fail;
  500. } else {
  501. MEM32_BASE[i] = 0xa5a5a5a5;
  502. }
  503. }
  504. /* === Read Check then Fill Memory with 00 Byte Pattern at offset 0h === */
  505. for (i = 0; i < size; i++) {
  506. if (MEM32_BASE[i] != 0xa5a5a5a5) {
  507. vfree(ptr);
  508. /* return -8; */
  509. ret = -8;
  510. goto fail;
  511. } else {
  512. MEM8_BASE[i * 4] = 0x00;
  513. }
  514. }
  515. /* === Read Check then Fill Memory with 00 Byte Pattern at offset 2h === */
  516. for (i = 0; i < size; i++) {
  517. if (MEM32_BASE[i] != 0xa5a5a500) {
  518. vfree(ptr);
  519. /* return -9; */
  520. ret = -9;
  521. goto fail;
  522. } else {
  523. MEM8_BASE[i * 4 + 2] = 0x00;
  524. }
  525. }
  526. /* === Read Check then Fill Memory with 00 Byte Pattern at offset 1h === */
  527. for (i = 0; i < size; i++) {
  528. if (MEM32_BASE[i] != 0xa500a500) {
  529. vfree(ptr);
  530. /* return -10; */
  531. ret = -10;
  532. goto fail;
  533. } else {
  534. MEM8_BASE[i * 4 + 1] = 0x00;
  535. }
  536. }
  537. /* === Read Check then Fill Memory with 00 Byte Pattern at offset 3h === */
  538. for (i = 0; i < size; i++) {
  539. if (MEM32_BASE[i] != 0xa5000000) {
  540. vfree(ptr);
  541. /* return -11; */
  542. ret = -11;
  543. goto fail;
  544. } else {
  545. MEM8_BASE[i * 4 + 3] = 0x00;
  546. }
  547. }
  548. /* === Read Check then Fill Memory with ffff Word Pattern at offset 1h == */
  549. for (i = 0; i < size; i++) {
  550. if (MEM32_BASE[i] != 0x00000000) {
  551. vfree(ptr);
  552. /* return -12; */
  553. ret = -12;
  554. goto fail;
  555. } else {
  556. MEM16_BASE[i * 2 + 1] = 0xffff;
  557. }
  558. }
  559. /* === Read Check then Fill Memory with ffff Word Pattern at offset 0h == */
  560. for (i = 0; i < size; i++) {
  561. if (MEM32_BASE[i] != 0xffff0000) {
  562. vfree(ptr);
  563. /* return -13; */
  564. ret = -13;
  565. goto fail;
  566. } else {
  567. MEM16_BASE[i * 2] = 0xffff;
  568. }
  569. }
  570. /*=== Read Check === */
  571. for (i = 0; i < size; i++) {
  572. if (MEM32_BASE[i] != 0xffffffff) {
  573. vfree(ptr);
  574. /* return -14; */
  575. ret = -14;
  576. goto fail;
  577. }
  578. }
  579. /************************************************
  580. * Additional verification
  581. ************************************************/
  582. /* === stage 1 => write 0 === */
  583. for (i = 0; i < size; i++)
  584. MEM_BASE[i] = PATTERN1;
  585. /* === stage 2 => read 0, write 0xF === */
  586. for (i = 0; i < size; i++) {
  587. value = MEM_BASE[i];
  588. if (value != PATTERN1) {
  589. vfree(ptr);
  590. /* return -15; */
  591. ret = -15;
  592. goto fail;
  593. }
  594. MEM_BASE[i] = PATTERN2;
  595. }
  596. /* === stage 3 => read 0xF, write 0 === */
  597. for (i = 0; i < size; i++) {
  598. value = MEM_BASE[i];
  599. if (value != PATTERN2) {
  600. vfree(ptr);
  601. /* return -16; */
  602. ret = -16;
  603. goto fail;
  604. }
  605. MEM_BASE[i] = PATTERN1;
  606. }
  607. /* === stage 4 => read 0, write 0xF === */
  608. for (i = 0; i < size; i++) {
  609. value = MEM_BASE[i];
  610. if (value != PATTERN1) {
  611. vfree(ptr);
  612. /* return -17; */
  613. ret = -17;
  614. goto fail;
  615. }
  616. MEM_BASE[i] = PATTERN2;
  617. }
  618. /* === stage 5 => read 0xF, write 0 === */
  619. for (i = 0; i < size; i++) {
  620. value = MEM_BASE[i];
  621. if (value != PATTERN2) {
  622. vfree(ptr);
  623. /* return -18; */
  624. ret = -18;
  625. goto fail;
  626. }
  627. MEM_BASE[i] = PATTERN1;
  628. }
  629. /* === stage 6 => read 0 === */
  630. for (i = 0; i < size; i++) {
  631. value = MEM_BASE[i];
  632. if (value != PATTERN1) {
  633. vfree(ptr);
  634. /* return -19; */
  635. ret = -19;
  636. goto fail;
  637. }
  638. }
  639. /* === 1/2/4-byte combination test === */
  640. mem_ptr = (unsigned long)MEM_BASE;
  641. while (mem_ptr < ((unsigned long)MEM_BASE + (size << 2))) {
  642. *((unsigned char *)mem_ptr) = 0x78;
  643. mem_ptr += 1;
  644. *((unsigned char *)mem_ptr) = 0x56;
  645. mem_ptr += 1;
  646. *((unsigned short *)mem_ptr) = 0x1234;
  647. mem_ptr += 2;
  648. *((unsigned int *)mem_ptr) = 0x12345678;
  649. mem_ptr += 4;
  650. *((unsigned short *)mem_ptr) = 0x5678;
  651. mem_ptr += 2;
  652. *((unsigned char *)mem_ptr) = 0x34;
  653. mem_ptr += 1;
  654. *((unsigned char *)mem_ptr) = 0x12;
  655. mem_ptr += 1;
  656. *((unsigned int *)mem_ptr) = 0x12345678;
  657. mem_ptr += 4;
  658. *((unsigned char *)mem_ptr) = 0x78;
  659. mem_ptr += 1;
  660. *((unsigned char *)mem_ptr) = 0x56;
  661. mem_ptr += 1;
  662. *((unsigned short *)mem_ptr) = 0x1234;
  663. mem_ptr += 2;
  664. *((unsigned int *)mem_ptr) = 0x12345678;
  665. mem_ptr += 4;
  666. *((unsigned short *)mem_ptr) = 0x5678;
  667. mem_ptr += 2;
  668. *((unsigned char *)mem_ptr) = 0x34;
  669. mem_ptr += 1;
  670. *((unsigned char *)mem_ptr) = 0x12;
  671. mem_ptr += 1;
  672. *((unsigned int *)mem_ptr) = 0x12345678;
  673. mem_ptr += 4;
  674. }
  675. for (i = 0; i < size; i++) {
  676. value = MEM_BASE[i];
  677. if (value != 0x12345678) {
  678. vfree(ptr);
  679. /* return -20; */
  680. ret = -20;
  681. goto fail;
  682. }
  683. }
  684. /* === Verify pattern 1 (0x00~0xff) === */
  685. pattern8 = 0x00;
  686. MEM8_BASE[0] = pattern8;
  687. for (i = 0; i < size * 4; i++) {
  688. unsigned char waddr8, raddr8;
  689. waddr8 = i + 1;
  690. raddr8 = i;
  691. if (i < size * 4 - 1)
  692. MEM8_BASE[waddr8] = pattern8 + 1;
  693. if (MEM8_BASE[raddr8] != pattern8) {
  694. vfree(ptr);
  695. /* return -21; */
  696. ret = -21;
  697. goto fail;
  698. }
  699. pattern8++;
  700. }
  701. /* === Verify pattern 2 (0x00~0xffff) === */
  702. pattern16 = 0x00;
  703. MEM16_BASE[0] = pattern16;
  704. for (i = 0; i < size * 2; i++) {
  705. if (i < size * 2 - 1)
  706. MEM16_BASE[i + 1] = pattern16 + 1;
  707. if (MEM16_BASE[i] != pattern16) {
  708. vfree(ptr);
  709. /* return -22; */
  710. ret = -22;
  711. goto fail;
  712. }
  713. pattern16++;
  714. }
  715. /* === Verify pattern 3 (0x00~0xffffffff) === */
  716. pattern32 = 0x00;
  717. MEM32_BASE[0] = pattern32;
  718. for (i = 0; i < size; i++) {
  719. if (i < size - 1)
  720. MEM32_BASE[i + 1] = pattern32 + 1;
  721. if (MEM32_BASE[i] != pattern32) {
  722. vfree(ptr);
  723. /* return -23; */
  724. ret = -23;
  725. goto fail;
  726. }
  727. pattern32++;
  728. }
  729. pr_warn("complex R/W mem test pass\n");
  730. fail:
  731. vfree(ptr);
  732. return ret;
  733. }
  734. unsigned int ucDram_Register_Read(unsigned long u4reg_addr)
  735. {
  736. unsigned int pu4reg_value;
  737. if (check_dramc_base_addr() == -1) {
  738. pr_err("[DRAMC] Access-R DRAMC base address is NULL!!!\n");
  739. /* ASSERT(0); */ /* need porting*/
  740. }
  741. pu4reg_value = (*(volatile unsigned int *)(DRAMCAO_BASE_ADDR + (u4reg_addr))) |
  742. (*(volatile unsigned int *)(DDRPHY_BASE_ADDR + (u4reg_addr))) |
  743. (*(volatile unsigned int *)(DRAMCNAO_BASE_ADDR + (u4reg_addr)));
  744. return pu4reg_value;
  745. }
  746. void ucDram_Register_Write(unsigned long u4reg_addr, unsigned int u4reg_value)
  747. {
  748. if (check_dramc_base_addr() == -1) {
  749. pr_err("[DRAMC] Access-W DRAMC base address is NULL!!!\n");
  750. /* ASSERT(0); */ /* need porting*/
  751. }
  752. (*(volatile unsigned int *)(DRAMCAO_BASE_ADDR + (u4reg_addr))) = u4reg_value;
  753. (*(volatile unsigned int *)(DDRPHY_BASE_ADDR + (u4reg_addr))) = u4reg_value;
  754. (*(volatile unsigned int *)(DRAMCNAO_BASE_ADDR + (u4reg_addr))) = u4reg_value;
  755. mb(); /* make sure the DRAM have been read */
  756. }
  757. unsigned int dram_support_1600_freq(void)
  758. {
  759. unsigned int spbin = ((get_devinfo_with_index(5) & (1<<20)) && (get_devinfo_with_index(5) & (1<<21)) &&
  760. (get_devinfo_with_index(5) & (1<<22))) ? 1 : 0; /* MT6753 or MT6753T */
  761. unsigned int ddr1466 = (get_devinfo_with_index(15) & (1<<8)) ? 1 : 0; /* DDR1466 or DDR1600 */
  762. unsigned result = 0;
  763. if (spbin == 1) {
  764. if (ddr1466 == 1)
  765. result = 0;
  766. else
  767. result = 1;
  768. } else
  769. result = 0;
  770. return result;
  771. }
  772. int dram_fh_steps_freq(unsigned int step)
  773. {
  774. int freq;
  775. #if defined(CONFIG_ARCH_MT6735)
  776. unsigned int d1plus = ((get_devinfo_with_index(47) & (1<<31)) && !(get_devinfo_with_index(47) & (1<<29)) &&
  777. !(get_devinfo_with_index(47) & (1<<28))) ? 1 : 0;
  778. unsigned int ddr_type = get_ddr_type();
  779. #if defined(CONFIG_MTK_EFUSE_DOWNGRADE)
  780. d1plus = 0;
  781. #endif
  782. switch (step) {
  783. case 0:
  784. if (d1plus == 1)
  785. freq = 1466;
  786. else
  787. if (ddr_type == TYPE_LPDDR2)
  788. freq = 1066;
  789. else
  790. freq = 1280;
  791. break;
  792. case 1:
  793. if (d1plus == 1)
  794. freq = 1313;
  795. else
  796. freq = 938;
  797. break;
  798. default:
  799. return -1;
  800. }
  801. #elif defined(CONFIG_ARCH_MT6735M)
  802. unsigned int d2plus = ((get_devinfo_with_index(47) & (1<<31)) &&
  803. (get_devinfo_with_index(47) & (1<<29))) ? 1 : 0;
  804. #if defined(CONFIG_MTK_EFUSE_DOWNGRADE)
  805. d2plus = 0;
  806. #endif
  807. switch (step) {
  808. case 0:
  809. if (d2plus == 1)
  810. freq = 1280;
  811. else
  812. freq = 1066;
  813. break;
  814. case 1:
  815. if (d2plus == 1)
  816. freq = 938;
  817. else
  818. freq = 800;
  819. break;
  820. default:
  821. return -1;
  822. }
  823. #elif defined(CONFIG_ARCH_MT6753)
  824. unsigned int temp = dram_support_1600_freq();
  825. switch (step) {
  826. case 0:
  827. /* need porting to eFuse check for MT6753T (1600) */
  828. if (temp == 1)
  829. freq = 1600;
  830. else
  831. freq = 1466;
  832. break;
  833. case 1:
  834. freq = 1313;
  835. break;
  836. default:
  837. return -1;
  838. }
  839. #else
  840. pr_warn("DRAM FH steps not define\n");
  841. #endif
  842. return freq;
  843. }
  844. int dram_can_support_fh(void)
  845. {
  846. unsigned int value;
  847. int ret = 0;
  848. value = ucDram_Register_Read(0xf4);
  849. /*value = (0x1 <<15);
  850. pr_debug("dummy regs 0x%x\n", value);
  851. pr_debug("check 0x%x\n",(0x1 <<15));*/
  852. if (value & (0x1 << 15))
  853. /*pr_debug("DFS could be enabled\n");*/
  854. ret = 1;
  855. else
  856. /*pr_debug("DFS could NOT be enabled\n");*/
  857. ret = 0;
  858. return ret;
  859. }
  860. #ifdef FREQ_HOPPING_TEST
  861. int dram_do_dfs_by_fh(unsigned int freq)
  862. {
  863. int detect_fh = dram_can_support_fh();
  864. unsigned int target_dds;
  865. #if defined(CONFIG_ARCH_MT6735)
  866. unsigned int ddr_type = get_ddr_type();
  867. #endif
  868. if ((check_cqdma_base_addr() == -1) || (check_dramc_base_addr() == -1)) {
  869. pr_err("[DRAMC] DFS DRAMC/CQDMA base addr fail!");
  870. return -1;
  871. }
  872. if (detect_fh == 0)
  873. return -1;
  874. switch (freq) {
  875. #if defined(CONFIG_ARCH_MT6735)
  876. case 938000:
  877. if (ddr_type == TYPE_LPDDR2)
  878. target_dds = 0x10cefe; /* ///< 938Mbps for LPDDR2 */
  879. else
  880. target_dds = 0xe38fe; /* ///< 938Mbps for LPDDR3 */
  881. break;
  882. case 1066000:
  883. target_dds = 0x131A2D; /* ///< 1066Mbps */
  884. break;
  885. case 1280000:
  886. target_dds = 0x136885; /* ///< 1280Mbps */
  887. break;
  888. case 1313000:
  889. target_dds = 0x127C92; /* ///< 1313Mbps */
  890. break;
  891. case 1466000:
  892. target_dds = 0x14A40B; /* ///< 1466Mbps */
  893. break;
  894. #elif defined(CONFIG_ARCH_MT6735M)
  895. case 800000:
  896. target_dds = 0xe55ee; /* ///< 800Mbps */
  897. break;
  898. case 938000:
  899. target_dds = 0xe38fe; /* ///< 938Mbps for LPDDR3 */
  900. break;
  901. case 1066000:
  902. target_dds = 0x131A2D; /* ///< 1066Mbps */
  903. break;
  904. case 1280000:
  905. target_dds = 0x136885; /* ///< 1280Mbps */
  906. break;
  907. #elif defined(CONFIG_ARCH_MT6753)
  908. case 1313000:
  909. target_dds = 0x127C92; /* ///< 1313Mbps */
  910. break;
  911. case 1466000:
  912. target_dds = 0x14A40B; /* ///< 1466Mbps */
  913. break;
  914. case 1600000:
  915. target_dds = 0x168708; /* ///< 1600Mbps */
  916. break;
  917. #endif
  918. default:
  919. pr_err("[DRAMC] Input incorrect freq for DFS fail!\n");
  920. return -1;
  921. }
  922. /*pr_warn("dram_do_dfs_by_fh to 0x%x ddr_type = %d\n", target_dds, ddr_type);*/
  923. #ifdef CONFIG_MTK_CLKMGR
  924. enable_clock(MT_CG_INFRA_GCE, "CQDMA");
  925. #else
  926. if (clk_prepare_enable(clk_cqdma))
  927. pr_err("enable CQDMA clk fail!\n");
  928. #endif /* #ifdef CONFIG_MTK_CLKMGR */
  929. mt_dfs_mempll(target_dds);
  930. #ifdef CONFIG_MTK_CLKMGR
  931. disable_clock(MT_CG_INFRA_GCE, "CQDMA");
  932. #else
  933. clk_disable_unprepare(clk_cqdma);
  934. #endif /* #ifdef CONFIG_MTK_CLKMGR */
  935. /*Notify profiling engine */
  936. mt_dramfreq_setfreq_notify(freq);
  937. return 0;
  938. }
  939. #endif
  940. bool pasr_is_valid(void)
  941. {
  942. unsigned int ddr_type = 0;
  943. ddr_type = get_ddr_type();
  944. /* Following DDR types can support PASR */
  945. if ((ddr_type == TYPE_LPDDR3) || (ddr_type == TYPE_LPDDR2))
  946. return true;
  947. return false;
  948. }
  949. /*-------------------------------------------------------------------------*/
  950. /** Round_Operation
  951. * Round operation of A/B
  952. * @param A
  953. * @param B
  954. * @retval round(A/B)
  955. */
  956. /*-------------------------------------------------------------------------*/
  957. unsigned int Round_Operation(unsigned int A, unsigned int B)
  958. {
  959. unsigned int temp;
  960. if (B == 0)
  961. return 0xffffffff;
  962. temp = A / B;
  963. if ((A - temp * B) >= ((temp + 1) * B - A))
  964. return temp++;
  965. else
  966. return temp;
  967. }
  968. int get_dram_data_rate(void)
  969. {
  970. unsigned int MEMPLL1_DIV, MEMPLL1_NCPO, MEMPLL1_FOUT;
  971. unsigned int MEMPLL2_FOUT, MEMPLL2_FBSEL, MEMPLL2_FBDIV;
  972. unsigned int MEMPLL2_M4PDIV;
  973. MEMPLL1_DIV = (ucDram_Register_Read(0x0604) & (0x0000007f << 25)) >> 25;
  974. MEMPLL1_NCPO = (ucDram_Register_Read(0x0624) & (0x7fffffff << 1)) >> 1;
  975. MEMPLL2_FBSEL = (ucDram_Register_Read(0x0608) & (0x00000003 << 10)) >> 10;
  976. MEMPLL2_FBSEL = 1 << MEMPLL2_FBSEL;
  977. MEMPLL2_FBDIV = (ucDram_Register_Read(0x0618) & (0x0000007f << 2)) >> 2;
  978. MEMPLL2_M4PDIV = (ucDram_Register_Read(0x060c) & (0x00000003 << 10)) >> 10;
  979. MEMPLL2_M4PDIV = 1 << (MEMPLL2_M4PDIV + 1);
  980. /* 1PLL: 26*MEMPLL1_NCPO/MEMPLL1_DIV*MEMPLL2_FBSEL*MEMPLL2_FBDIV/2^24 */
  981. /* 3PLL: 26*MEMPLL1_NCPO/MEMPLL1_DIV*MEMPLL2_M4PDIV*MEMPLL2_FBDIV*2/2^24 */
  982. MEMPLL1_FOUT = (MEMPLL1_NCPO / MEMPLL1_DIV) * 26;
  983. if ((ucDram_Register_Read(0x0640) & 0x3) == 3) {
  984. /* 1PLL */
  985. MEMPLL2_FOUT = (((MEMPLL1_FOUT * MEMPLL2_FBSEL) >> 12) * MEMPLL2_FBDIV) >> 12;
  986. } else {
  987. /* 2 or 3 PLL */
  988. MEMPLL2_FOUT = (((MEMPLL1_FOUT * MEMPLL2_M4PDIV * 2) >> 12) * MEMPLL2_FBDIV) >> 12;
  989. }
  990. /* pr_warn("MEMPLL1_DIV=%d, MEMPLL1_NCPO=%d, MEMPLL2_FBSEL=%d, MEMPLL2_FBDIV=%d\n",
  991. MEMPLL1_DIV, MEMPLL1_NCPO, MEMPLL2_FBSEL, MEMPLL2_FBDIV); */
  992. /* pr_warn("MEMPLL2_M4PDIV=%d, MEMPLL1_FOUT=%d, MEMPLL2_FOUT=%d\n",
  993. MEMPLL2_M4PDIV, MEMPLL1_FOUT, MEMPLL2_FOUT); */
  994. /* workaround (Darren) */
  995. MEMPLL2_FOUT++;
  996. switch (MEMPLL2_FOUT) {
  997. case 800:
  998. case 938:
  999. case 1066:
  1000. case 1280:
  1001. case 1313:
  1002. case 1466:
  1003. case 1600:
  1004. break;
  1005. default:
  1006. pr_warn("[DRAMC] MemFreq region is incorrect MEMPLL2_FOUT=%d\n", MEMPLL2_FOUT);
  1007. /* return -1; */
  1008. }
  1009. return MEMPLL2_FOUT;
  1010. }
  1011. unsigned int DRAM_MRR(int MRR_num)
  1012. {
  1013. unsigned int MRR_value = 0x0;
  1014. unsigned int u4value;
  1015. /* set DQ bit 0, 1, 2, 3, 4, 5, 6, 7 pinmux for LPDDR3 */
  1016. ucDram_Register_Write(DRAMC_REG_RRRATE_CTL, 0x13121110);
  1017. ucDram_Register_Write(DRAMC_REG_MRR_CTL, 0x17161514);
  1018. ucDram_Register_Write(DRAMC_REG_MRS, MRR_num);
  1019. ucDram_Register_Write(DRAMC_REG_SPCMD, ucDram_Register_Read(DRAMC_REG_SPCMD) | 0x00000002);
  1020. /* udelay(1); */
  1021. while ((ucDram_Register_Read(DRAMC_REG_SPCMDRESP) & 0x02) == 0)
  1022. ;
  1023. ucDram_Register_Write(DRAMC_REG_SPCMD, ucDram_Register_Read(DRAMC_REG_SPCMD) & 0xFFFFFFFD);
  1024. u4value = ucDram_Register_Read(DRAMC_REG_SPCMDRESP);
  1025. MRR_value = (u4value >> 20) & 0xFF;
  1026. return MRR_value;
  1027. }
  1028. unsigned int read_dram_temperature(void)
  1029. {
  1030. unsigned int value;
  1031. value = DRAM_MRR(4) & 0x7;
  1032. return value;
  1033. }
  1034. #if 0
  1035. volatile int shuffer_done;
  1036. void dram_dfs_ipi_handler(int id, void *data, unsigned int len)
  1037. {
  1038. shuffer_done = 1;
  1039. }
  1040. #endif
  1041. #if 0
  1042. __attribute__ ((__section__(".sram.func"))) void uart_print(unsigned char ch)
  1043. {
  1044. int i;
  1045. for (i = 0; i < 5; i++)
  1046. (*(volatile unsigned int *)(0xF1003000)) = ch;
  1047. }
  1048. #endif
  1049. #ifdef FREQ_HOPPING_TEST
  1050. static ssize_t freq_hopping_test_show(struct device_driver *driver, char *buf)
  1051. {
  1052. int dfs_ability = 0;
  1053. unsigned int temp = dram_support_1600_freq();
  1054. dfs_ability = dram_can_support_fh();
  1055. if (dfs_ability == 0)
  1056. return snprintf(buf, PAGE_SIZE, "DRAM DFS can not be enabled, 1600 = %d\n", temp);
  1057. else
  1058. return snprintf(buf, PAGE_SIZE, "DRAM DFS can be enabled, 1600 = %d\n", temp);
  1059. }
  1060. static ssize_t freq_hopping_test_store(struct device_driver *driver,
  1061. const char *buf, size_t count)
  1062. {
  1063. unsigned int freq;
  1064. if (kstrtouint(buf, 10, &freq))
  1065. return -EINVAL;
  1066. pr_warn("[DRAM DFS] freqency hopping to %dKHz\n", freq);
  1067. dram_do_dfs_by_fh(freq);
  1068. return count;
  1069. }
  1070. #endif
  1071. static int __init dt_scan_dram_info(unsigned long node, const char *uname, int depth, void *data)
  1072. {
  1073. char *type = (char *)of_get_flat_dt_prop(node, "device_type", NULL);
  1074. const __be32 *reg, *endp;
  1075. const struct dram_info *dram_info = NULL;
  1076. unsigned long l;
  1077. /* We are scanning "memory" nodes only */
  1078. if (type == NULL) {
  1079. /*
  1080. * The longtrail doesn't have a device_type on the
  1081. * /memory node, so look for the node called /memory@0.
  1082. */
  1083. if (depth != 1 || strcmp(uname, "memory@0") != 0)
  1084. return 0;
  1085. } else if (strcmp(type, "memory") != 0)
  1086. return 0;
  1087. reg = (const __be32 *)of_get_flat_dt_prop(node, (const char *)"reg", (int *)&l);
  1088. if (reg == NULL)
  1089. return 0;
  1090. endp = reg + (l / sizeof(__be32));
  1091. if (node) {
  1092. /* orig_dram_info */
  1093. dram_info = (const struct dram_info *)of_get_flat_dt_prop(node, "orig_dram_info", NULL);
  1094. if (dram_info == NULL)
  1095. return 0;
  1096. if ((dram_rank_num == 0) || ((dram_rank_num != dram_info->rank_num) && (dram_rank_num != 0))) {
  1097. /* OTA, Rsv fail and 1GB simluate to 512MB */
  1098. dram_rank_num = dram_info->rank_num;
  1099. if (dram_rank0_addr == 0) /* Rsv fail */
  1100. dram_rank0_addr = dram_info->rank_info[0].start;
  1101. if (dram_rank_num == SINGLE_RANK)
  1102. pr_warn("[DFS] enable (dram base): (%pa)\n", &dram_rank0_addr);
  1103. else {
  1104. if (dram_rank1_addr == 0) /* Rsv fail */
  1105. dram_rank1_addr = dram_info->rank_info[1].start;
  1106. pr_warn("[DFS] enable (dram base, dram rank1 base): (%pa,%pa)\n",
  1107. &dram_rank0_addr, &dram_rank1_addr);
  1108. }
  1109. } else
  1110. pr_warn("[DFS] rsv memory from LK node\n");
  1111. }
  1112. return node;
  1113. }
  1114. int DFS_APDMA_early_init(void)
  1115. {
  1116. if (init_done == 0) {
  1117. dst_array_p = __pa(dfs_dummy_buffer);
  1118. pr_warn("[DFS]dfs_dummy_buffer va: 0x%p, dst_pa: 0x%llx, size: %d\n",
  1119. (void *)dfs_dummy_buffer, (unsigned long long)dst_array_p,
  1120. BUFF_LEN);
  1121. #ifdef APDMAREG_DUMP
  1122. src_array_v =
  1123. ioremap(rounddown(src_array_p, IOREMAP_ALIGMENT),
  1124. IOREMAP_ALIGMENT << 1) + IOREMAP_ALIGMENT -
  1125. (BUFF_LEN >> 1);
  1126. dst_array_v = src_array_v + BUFF_LEN;
  1127. #endif
  1128. /* memset(src_array_v, 0x6a6a6a6a, BUFF_LEN); */
  1129. init_done = 1;
  1130. }
  1131. return 1;
  1132. }
  1133. int DFS_APDMA_Init(void)
  1134. {
  1135. writel(((~DMA_GSEC_EN_BIT) & readl(DMA_GSEC_EN)), DMA_GSEC_EN);
  1136. return 1;
  1137. }
  1138. int DFS_APDMA_Enable(void)
  1139. {
  1140. #ifdef APDMAREG_DUMP
  1141. int i;
  1142. #endif
  1143. while (readl(DMA_START) & 0x1)
  1144. ;
  1145. if (dram_rank_num == DUAL_RANK) {
  1146. writel(dram_rank0_addr, DMA_SRC);
  1147. writel(dram_rank1_addr, DMA_SRC2);
  1148. writel(dst_array_p, DMA_DST);
  1149. writel((BUFF_LEN >> 1), DMA_LEN1);
  1150. writel((BUFF_LEN >> 1), DMA_LEN2);
  1151. writel((DMA_CON_BURST_8BEAT | DMA_CON_WPEN), DMA_CON);
  1152. } else if (dram_rank_num == SINGLE_RANK) {
  1153. writel(dram_rank0_addr, DMA_SRC);
  1154. writel(dst_array_p, DMA_DST);
  1155. writel(BUFF_LEN, DMA_LEN1);
  1156. writel(DMA_CON_BURST_8BEAT, DMA_CON);
  1157. } else {
  1158. pr_warn("[DFS] error rank number = %x\n", dram_rank_num);
  1159. return 1;
  1160. }
  1161. #ifdef APDMAREG_DUMP
  1162. pr_debug("src_p=0x%x, dst_p=0x%x, src_v=0x%x, dst_v=0x%x, len=%d\n",
  1163. src_array_p, dst_array_p, (unsigned int)src_array_v,
  1164. (unsigned int)dst_array_v, BUFF_LEN);
  1165. for (i = 0; i < 0x60; i += 4) {
  1166. pr_debug("[Before]addr:0x%x, value:%x\n",
  1167. (unsigned int)(DMA_BASE + i),
  1168. *((volatile int *)(DMA_BASE + i)));
  1169. }
  1170. #ifdef APDMA_TEST
  1171. for (i = 0; i < BUFF_LEN / sizeof(unsigned int); i++) {
  1172. dst_array_v[i] = 0;
  1173. src_array_v[i] = i;
  1174. }
  1175. #endif
  1176. #endif
  1177. mt_reg_sync_writel(0x1, DMA_START);
  1178. #ifdef APDMAREG_DUMP
  1179. for (i = 0; i < 0x60; i += 4) {
  1180. pr_debug("[AFTER]addr:0x%x, value:%x\n",
  1181. (unsigned int)(DMA_BASE + i),
  1182. *((volatile int *)(DMA_BASE + i)));
  1183. }
  1184. #ifdef APDMA_TEST
  1185. for (i = 0; i < BUFF_LEN / sizeof(unsigned int); i++) {
  1186. if (dst_array_v[i] != src_array_v[i]) {
  1187. pr_debug("DMA ERROR at Address %x\n (i=%d, value=0x%x(should be 0x%x))",
  1188. (unsigned int)&dst_array_v[i], i, dst_array_v[i],
  1189. src_array_v[i]);
  1190. ASSERT(0);
  1191. }
  1192. }
  1193. pr_debug("Channe0 DFS DMA TEST PASS\n");
  1194. #endif
  1195. #endif
  1196. return 1;
  1197. }
  1198. int DFS_APDMA_END(void)
  1199. {
  1200. while (readl(DMA_START))
  1201. ;
  1202. return 1;
  1203. }
  1204. void DFS_APDMA_dummy_read_preinit(void)
  1205. {
  1206. DFS_APDMA_early_init();
  1207. }
  1208. void DFS_APDMA_dummy_read_deinit(void)
  1209. {
  1210. }
  1211. void dma_dummy_read_for_vcorefs(int loops)
  1212. {
  1213. int i, count;
  1214. unsigned long long start_time, end_time, duration;
  1215. DFS_APDMA_early_init();
  1216. #ifdef CONFIG_MTK_CLKMGR
  1217. enable_clock(MT_CG_INFRA_GCE, "CQDMA");
  1218. #else
  1219. if (clk_prepare_enable(clk_cqdma))
  1220. pr_err("enable CQDMA clk fail!\n");
  1221. #endif /* #ifdef CONFIG_MTK_CLKMGR */
  1222. for (i = 0; i < loops; i++) {
  1223. count = 0;
  1224. start_time = sched_clock();
  1225. do {
  1226. DFS_APDMA_Enable();
  1227. DFS_APDMA_END();
  1228. end_time = sched_clock();
  1229. duration = end_time - start_time;
  1230. count++;
  1231. } while (duration < 4000L);
  1232. /* pr_warn("[DMA_dummy_read[%d], duration=%lld, count = %d\n", duration, count); */
  1233. }
  1234. #ifdef CONFIG_MTK_CLKMGR
  1235. disable_clock(MT_CG_INFRA_GCE, "CQDMA");
  1236. #else
  1237. clk_disable_unprepare(clk_cqdma);
  1238. #endif /* #ifdef CONFIG_MTK_CLKMGR */
  1239. }
  1240. #ifdef CONFIG_OF_RESERVED_MEM
  1241. int dram_dummy_read_reserve_mem_of_init(struct reserved_mem *rmem)
  1242. {
  1243. phys_addr_t rptr = 0;
  1244. unsigned int rsize = 0;
  1245. rptr = rmem->base;
  1246. rsize = (unsigned int)rmem->size;
  1247. if (strstr(DRAM_R0_DUMMY_READ_RESERVED_KEY, rmem->name)) {
  1248. if (rsize < DRAM_RSV_SIZE)
  1249. return 0;
  1250. dram_rank0_addr = rptr;
  1251. dram_rank_num++;
  1252. pr_debug("[dram_dummy_read_reserve_mem_of_init] dram_rank0_addr = %pa, size = 0x%x\n",
  1253. &dram_rank0_addr, rsize);
  1254. }
  1255. if (strstr(DRAM_R1_DUMMY_READ_RESERVED_KEY, rmem->name)) {
  1256. if (rsize < DRAM_RSV_SIZE)
  1257. return 0;
  1258. dram_rank1_addr = rptr;
  1259. dram_rank_num++;
  1260. pr_debug("[dram_dummy_read_reserve_mem_of_init] dram_rank1_addr = %pa, size = 0x%x\n",
  1261. &dram_rank1_addr, rsize);
  1262. }
  1263. return 0;
  1264. }
  1265. RESERVEDMEM_OF_DECLARE(dram_reserve_r0_dummy_read_init, DRAM_R0_DUMMY_READ_RESERVED_KEY,
  1266. dram_dummy_read_reserve_mem_of_init);
  1267. RESERVEDMEM_OF_DECLARE(dram_reserve_r1_dummy_read_init, DRAM_R1_DUMMY_READ_RESERVED_KEY,
  1268. dram_dummy_read_reserve_mem_of_init);
  1269. #endif
  1270. unsigned int is_one_pll_mode(void)
  1271. {
  1272. int data;
  1273. unsigned int ret = 0;
  1274. data = *(volatile unsigned int *)(0xF0004000 + (0x00a << 2));
  1275. if (data & 0x10000)
  1276. /* print("It is 1-PLL mode (value = 0x%x)\n", data); */
  1277. ret = 1;
  1278. else
  1279. /* print("It is 3-PLL mode (value = 0x%x)\n", data); */
  1280. ret = 0;
  1281. return ret;
  1282. }
  1283. static ssize_t complex_mem_test_show(struct device_driver *driver, char *buf)
  1284. {
  1285. int ret;
  1286. ret = Binning_DRAM_complex_mem_test();
  1287. if (ret > 0)
  1288. return snprintf(buf, PAGE_SIZE, "MEM Test all pass\n");
  1289. else
  1290. return snprintf(buf, PAGE_SIZE, "MEM TEST failed %d\n", ret);
  1291. }
  1292. static ssize_t complex_mem_test_store(struct device_driver *driver,
  1293. const char *buf, size_t count)
  1294. {
  1295. return count;
  1296. }
  1297. #ifdef APDMA_TEST
  1298. static ssize_t DFS_APDMA_TEST_show(struct device_driver *driver, char *buf)
  1299. {
  1300. dma_dummy_read_for_vcorefs(7);
  1301. if (dram_rank_num == DUAL_RANK)
  1302. return snprintf(buf, PAGE_SIZE, "DFS APDMA Dummy Read Address src1:%pa src2:%pa\n",
  1303. &dram_rank0_addr, &dram_rank1_addr);
  1304. else if (dram_rank_num == SINGLE_RANK)
  1305. return snprintf(buf, PAGE_SIZE, "DFS APDMA Dummy Read Address src1:%pa\n", &dram_rank0_addr);
  1306. else
  1307. return snprintf(buf, PAGE_SIZE, "DFS APDMA Dummy Read rank number incorrect = %d !!!\n", dram_rank_num);
  1308. }
  1309. static ssize_t DFS_APDMA_TEST_store(struct device_driver *driver,
  1310. const char *buf, size_t count)
  1311. {
  1312. return count;
  1313. }
  1314. #endif
  1315. #ifdef READ_DRAM_TEMP_TEST
  1316. static ssize_t read_dram_temp_show(struct device_driver *driver, char *buf)
  1317. {
  1318. return snprintf(buf, PAGE_SIZE, "DRAM MR4 = 0x%x\n", read_dram_temperature());
  1319. }
  1320. static ssize_t read_dram_temp_store(struct device_driver *driver,
  1321. const char *buf, size_t count)
  1322. {
  1323. return count;
  1324. }
  1325. #endif
  1326. #ifdef READ_DRAM_FREQ_TEST
  1327. static ssize_t read_dram_data_rate_show(struct device_driver *driver, char *buf)
  1328. {
  1329. return snprintf(buf, PAGE_SIZE, "DRAM data rate = %d\n", get_dram_data_rate());
  1330. }
  1331. static ssize_t read_dram_data_rate_store(struct device_driver *driver,
  1332. const char *buf, size_t count)
  1333. {
  1334. return count;
  1335. }
  1336. #endif
  1337. DRIVER_ATTR(emi_clk_mem_test, 0664, complex_mem_test_show,
  1338. complex_mem_test_store);
  1339. #ifdef APDMA_TEST
  1340. DRIVER_ATTR(dram_dummy_read_test, 0664, DFS_APDMA_TEST_show,
  1341. DFS_APDMA_TEST_store);
  1342. #endif
  1343. #ifdef READ_DRAM_TEMP_TEST
  1344. DRIVER_ATTR(read_dram_temp_test, 0664, read_dram_temp_show,
  1345. read_dram_temp_store);
  1346. #endif
  1347. #ifdef READ_DRAM_FREQ_TEST
  1348. DRIVER_ATTR(read_dram_data_rate, 0664, read_dram_data_rate_show,
  1349. read_dram_data_rate_store);
  1350. #endif
  1351. #ifdef FREQ_HOPPING_TEST
  1352. DRIVER_ATTR(freq_hopping_test, 0664, freq_hopping_test_show,
  1353. freq_hopping_test_store);
  1354. #endif
  1355. static int dram_probe(struct platform_device *pdev)
  1356. {
  1357. int ret = 0;
  1358. pr_debug("[DRAMC0] module probe.\n");
  1359. #ifndef CONFIG_MTK_CLKMGR
  1360. clk_cqdma = devm_clk_get(&pdev->dev, "infra-cqdma");
  1361. if (IS_ERR(clk_cqdma)) {
  1362. pr_err("[DRAMC0] can not get CQDMA clock fail!\n");
  1363. return PTR_ERR(clk_cqdma);
  1364. }
  1365. #endif /* #ifndef CONFIG_MTK_CLKMGR */
  1366. return ret;
  1367. }
  1368. static int dram_remove(struct platform_device *dev)
  1369. {
  1370. return 0;
  1371. }
  1372. #ifdef CONFIG_OF
  1373. static const struct of_device_id dram_of_ids[] = {
  1374. {.compatible = "mediatek,mt6735-dramc",},
  1375. {}
  1376. };
  1377. #endif
  1378. static struct platform_driver dram_test_drv = {
  1379. .probe = dram_probe,
  1380. .remove = dram_remove,
  1381. .driver = {
  1382. .name = "emi_clk_test",
  1383. .owner = THIS_MODULE,
  1384. #ifdef CONFIG_OF
  1385. .of_match_table = dram_of_ids,
  1386. #endif
  1387. },
  1388. };
  1389. static int dram_dt_init(void)
  1390. {
  1391. int ret = 0;
  1392. struct device_node *node = NULL;
  1393. /* DTS version */
  1394. node = of_find_compatible_node(NULL, NULL, "mediatek,cqdma");
  1395. if (node) {
  1396. CQDMA_BASE_ADDR = of_iomap(node, 0);
  1397. pr_warn("[DRAMC]get CQDMA_BASE_ADDR @ %p\n", CQDMA_BASE_ADDR);
  1398. } else {
  1399. pr_warn("[DRAMC]can't find compatible node\n");
  1400. return -1;
  1401. }
  1402. node = of_find_compatible_node(NULL, NULL, "mediatek,mt6735-dramc");
  1403. if (node) {
  1404. DRAMCAO_BASE_ADDR = of_iomap(node, 0);
  1405. pr_warn("[DRAMC]get DRAMCAO_BASE_ADDR @ %p\n", DRAMCAO_BASE_ADDR);
  1406. } else {
  1407. pr_warn("[DRAMC]can't find DRAMC0 compatible node\n");
  1408. return -1;
  1409. }
  1410. node = of_find_compatible_node(NULL, NULL, "mediatek,mt6735-ddrphy");
  1411. if (node) {
  1412. DDRPHY_BASE_ADDR = of_iomap(node, 0);
  1413. pr_warn("[DRAMC]get DDRPHY_BASE_ADDR @ %p\n", DDRPHY_BASE_ADDR);
  1414. } else {
  1415. pr_warn("[DRAMC]can't find DDRPHY compatible node\n");
  1416. return -1;
  1417. }
  1418. node = of_find_compatible_node(NULL, NULL, "mediatek,mt6735-dramc_nao");
  1419. if (node) {
  1420. DRAMCNAO_BASE_ADDR = of_iomap(node, 0);
  1421. pr_warn("[DRAMC]get DRAMCNAO_BASE_ADDR @ %p\n", DRAMCNAO_BASE_ADDR);
  1422. } else {
  1423. pr_warn("[DRAMC]can't find DRAMCNAO compatible node\n");
  1424. return -1;
  1425. }
  1426. if (of_scan_flat_dt(dt_scan_dram_info, NULL) > 0) {
  1427. pr_err("[DRAMC]find dt_scan_dram_info\n");
  1428. } else {
  1429. pr_err("[DRAMC]can't find dt_scan_dram_info\n");
  1430. return -1;
  1431. }
  1432. return ret;
  1433. }
  1434. /* int __init dram_test_init(void) */
  1435. static int __init dram_test_init(void)
  1436. {
  1437. int ret = 0;
  1438. unsigned int tmp;
  1439. /* unsigned char * dst = &__ssram_text; */
  1440. /* unsigned char * src = &_sram_start; */
  1441. ret = dram_dt_init();
  1442. if (ret) {
  1443. pr_warn("[DRAMC] Device Tree Init Fail\n");
  1444. return ret;
  1445. }
  1446. ret = platform_driver_register(&dram_test_drv);
  1447. if (ret) {
  1448. pr_warn("fail to create dram_test platform driver\n");
  1449. return ret;
  1450. }
  1451. ret = driver_create_file(&dram_test_drv.driver, &driver_attr_emi_clk_mem_test);
  1452. if (ret) {
  1453. pr_warn("fail to create the emi_clk_mem_test sysfs files\n");
  1454. return ret;
  1455. }
  1456. #ifdef APDMA_TEST
  1457. ret = driver_create_file(&dram_test_drv.driver, &driver_attr_dram_dummy_read_test);
  1458. if (ret) {
  1459. pr_warn("fail to create the DFS sysfs files\n");
  1460. return ret;
  1461. }
  1462. #endif
  1463. #ifdef READ_DRAM_TEMP_TEST
  1464. ret = driver_create_file(&dram_test_drv.driver, &driver_attr_read_dram_temp_test);
  1465. if (ret) {
  1466. pr_warn("fail to create the read dram temp sysfs files\n");
  1467. return ret;
  1468. }
  1469. #endif
  1470. #ifdef READ_DRAM_FREQ_TEST
  1471. ret = driver_create_file(&dram_test_drv.driver, &driver_attr_read_dram_data_rate);
  1472. if (ret) {
  1473. pr_warn("fail to create the read dram data rate sysfs files\n");
  1474. return ret;
  1475. }
  1476. #endif
  1477. #ifdef FREQ_HOPPING_TEST
  1478. ret = driver_create_file(&dram_test_drv.driver, &driver_attr_freq_hopping_test);
  1479. if (ret) {
  1480. pr_warn("fail to create the read dram temp sysfs files\n");
  1481. return ret;
  1482. }
  1483. #endif
  1484. org_dram_data_rate = get_dram_data_rate();
  1485. pr_warn("[DRAMC Driver] Dram Data Rate = %d\n", org_dram_data_rate);
  1486. if (org_dram_data_rate != dram_fh_steps_freq(0)) {
  1487. tmp = ucDram_Register_Read(0xf4);
  1488. tmp &= ~(0x1 << 15);
  1489. ucDram_Register_Write(0xf4, tmp);
  1490. pr_warn("[DRAMC Driver] (boot DRAM freq != DVFS DRAM freq) !!!\n");
  1491. }
  1492. if (dram_can_support_fh())
  1493. pr_warn("[DRAMC Driver] dram can support Frequency Hopping\n");
  1494. else
  1495. pr_warn("[DRAMC Driver] dram can not support Frequency Hopping\n");
  1496. return ret;
  1497. }
  1498. static void __exit dram_test_exit(void)
  1499. {
  1500. platform_driver_unregister(&dram_test_drv);
  1501. }
  1502. postcore_initcall(dram_test_init);
  1503. module_exit(dram_test_exit);
  1504. MODULE_DESCRIPTION("MediaTek DRAMC Driver v0.1");