hikey_ddr.c 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451
  1. /*
  2. * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. */
  6. #include <assert.h>
  7. #include <errno.h>
  8. #include <arch_helpers.h>
  9. #include <common/debug.h>
  10. #include <drivers/arm/sp804_delay_timer.h>
  11. #include <lib/mmio.h>
  12. #include <hi6220.h>
  13. #include <hi6553.h>
  14. #include <hisi_sram_map.h>
  15. #include "hikey_private.h"
  16. static void init_pll(void)
  17. {
  18. unsigned int data;
  19. data = mmio_read_32((0xf7032000 + 0x000));
  20. data |= 0x1;
  21. mmio_write_32((0xf7032000 + 0x000), data);
  22. do {
  23. data = mmio_read_32((0xf7032000 + 0x000));
  24. } while (!(data & (1 << 28)));
  25. data = mmio_read_32((0xf7800000 + 0x000));
  26. data &= ~0x007;
  27. data |= 0x004;
  28. mmio_write_32((0xf7800000 + 0x000), data);
  29. do {
  30. data = mmio_read_32((0xf7800000 + 0x014));
  31. data &= 0x007;
  32. } while (data != 0x004);
  33. mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
  34. dsb();
  35. isb();
  36. udelay(10);
  37. mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
  38. dsb();
  39. isb();
  40. udelay(10);
  41. mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
  42. dsb();
  43. isb();
  44. udelay(10);
  45. mmio_write_32(0xf7032000 + 0x02c, 0x5110103e);
  46. dsb();
  47. isb();
  48. udelay(10);
  49. data = mmio_read_32(0xf7032000 + 0x050);
  50. data |= 1 << 28;
  51. mmio_write_32(0xf7032000 + 0x050, data);
  52. dsb();
  53. isb();
  54. udelay(10);
  55. mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
  56. dsb();
  57. isb();
  58. udelay(10);
  59. mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
  60. dsb();
  61. isb();
  62. udelay(10);
  63. mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
  64. dsb();
  65. isb();
  66. udelay(10);
  67. }
  68. static void init_freq(void)
  69. {
  70. unsigned int data, tmp;
  71. unsigned int cpuext_cfg, ddr_cfg;
  72. mmio_write_32((0xf7032000 + 0x374), 0x4a);
  73. mmio_write_32((0xf7032000 + 0x368), 0xda);
  74. mmio_write_32((0xf7032000 + 0x36c), 0x01);
  75. mmio_write_32((0xf7032000 + 0x370), 0x01);
  76. mmio_write_32((0xf7032000 + 0x360), 0x60);
  77. mmio_write_32((0xf7032000 + 0x364), 0x60);
  78. mmio_write_32((0xf7032000 + 0x114), 0x1000);
  79. data = mmio_read_32((0xf7032000 + 0x110));
  80. data |= (3 << 12);
  81. mmio_write_32((0xf7032000 + 0x110), data);
  82. data = mmio_read_32((0xf7032000 + 0x110));
  83. data |= (1 << 4);
  84. mmio_write_32((0xf7032000 + 0x110), data);
  85. data = mmio_read_32((0xf7032000 + 0x110));
  86. data &= ~0x7;
  87. data |= 0x5;
  88. mmio_write_32((0xf7032000 + 0x110), data);
  89. dsb();
  90. mdelay(10);
  91. do {
  92. data = mmio_read_32((0xf6504000 + 0x008));
  93. data &= (3 << 20);
  94. } while (data != (3 << 20));
  95. dsb();
  96. mdelay(10);
  97. data = mmio_read_32((0xf6504000 + 0x054));
  98. data &= ~((1 << 0) | (1 << 11));
  99. mmio_write_32((0xf6504000 + 0x054), data);
  100. mdelay(10);
  101. data = mmio_read_32((0xf7032000 + 0x104));
  102. data &= ~(3 << 8);
  103. data |= (1 << 8);
  104. mmio_write_32((0xf7032000 + 0x104), data);
  105. data = mmio_read_32((0xf7032000 + 0x100));
  106. data |= (1 << 0);
  107. mmio_write_32((0xf7032000 + 0x100), data);
  108. dsb();
  109. do {
  110. data = mmio_read_32((0xf7032000 + 0x100));
  111. data &= (1 << 2);
  112. } while (data != (1 << 2));
  113. data = mmio_read_32((0xf6504000 + 0x06c));
  114. data &= ~0xffff;
  115. data |= 0x56;
  116. mmio_write_32((0xf6504000 + 0x06c), data);
  117. data = mmio_read_32((0xf6504000 + 0x06c));
  118. data &= ~(0xffffffu << 8);
  119. data |= 0xc7a << 8;
  120. mmio_write_32((0xf6504000 + 0x06c), data);
  121. data = mmio_read_32((0xf6504000 + 0x058));
  122. data &= ((1 << 13) - 1);
  123. data |= 0xccb;
  124. mmio_write_32((0xf6504000 + 0x058), data);
  125. mmio_write_32((0xf6504000 + 0x060), 0x1fff);
  126. mmio_write_32((0xf6504000 + 0x064), 0x1ffffff);
  127. mmio_write_32((0xf6504000 + 0x068), 0x7fffffff);
  128. mmio_write_32((0xf6504000 + 0x05c), 0x1);
  129. data = mmio_read_32((0xf6504000 + 0x054));
  130. data &= ~(0xf << 12);
  131. data |= 1 << 12;
  132. mmio_write_32((0xf6504000 + 0x054), data);
  133. dsb();
  134. data = mmio_read_32((0xf7032000 + 0x000));
  135. data &= ~(1 << 0);
  136. mmio_write_32((0xf7032000 + 0x000), data);
  137. mmio_write_32((0xf7032000 + 0x004), 0x5110207d);
  138. mmio_write_32((0xf7032000 + 0x134), 0x10000005);
  139. data = mmio_read_32((0xf7032000 + 0x134));
  140. data = mmio_read_32((0xf7032000 + 0x000));
  141. data |= (1 << 0);
  142. mmio_write_32((0xf7032000 + 0x000), data);
  143. mmio_write_32((0xf7032000 + 0x368), 0x100da);
  144. data = mmio_read_32((0xf7032000 + 0x378));
  145. data &= ~((1 << 7) - 1);
  146. data |= 0x6b;
  147. mmio_write_32((0xf7032000 + 0x378), data);
  148. dsb();
  149. do {
  150. data = mmio_read_32((0xf7032000 + 0x378));
  151. tmp = data & 0x7f;
  152. data = (data & (0x7f << 8)) >> 8;
  153. if (data != tmp)
  154. continue;
  155. data = mmio_read_32((0xf7032000 + 0x37c));
  156. } while (!(data & 1));
  157. data = mmio_read_32((0xf7032000 + 0x104));
  158. data &= ~((3 << 0) |
  159. (3 << 8));
  160. cpuext_cfg = 1;
  161. ddr_cfg = 1;
  162. data |= cpuext_cfg | (ddr_cfg << 8);
  163. mmio_write_32((0xf7032000 + 0x104), data);
  164. dsb();
  165. do {
  166. data = mmio_read_32((0xf7032000 + 0x104));
  167. tmp = (data & (3 << 16)) >> 16;
  168. if (cpuext_cfg != tmp)
  169. continue;
  170. tmp = (data & (3 << 24)) >> 24;
  171. if (ddr_cfg != tmp)
  172. continue;
  173. data = mmio_read_32((0xf7032000 + 0x000));
  174. data &= 1 << 28;
  175. } while (!data);
  176. data = mmio_read_32((0xf7032000 + 0x100));
  177. data &= ~(1 << 0);
  178. mmio_write_32((0xf7032000 + 0x100), data);
  179. dsb();
  180. do {
  181. data = mmio_read_32((0xf7032000 + 0x100));
  182. data &= (1 << 1);
  183. } while (data != (1 << 1));
  184. mdelay(1000);
  185. data = mmio_read_32((0xf6504000 + 0x054));
  186. data &= ~(1 << 28);
  187. mmio_write_32((0xf6504000 + 0x054), data);
  188. dsb();
  189. data = mmio_read_32((0xf7032000 + 0x110));
  190. data &= ~((1 << 4) |
  191. (3 << 12));
  192. mmio_write_32((0xf7032000 + 0x110), data);
  193. }
  194. int cat_533mhz_800mhz(void)
  195. {
  196. unsigned int data, i;
  197. unsigned int bdl[5];
  198. data = mmio_read_32((0xf712c000 + 0x1c8));
  199. data &= 0xfffff0f0;
  200. data |= 0x100f01;
  201. mmio_write_32((0xf712c000 + 0x1c8), data);
  202. for (i = 0; i < 0x20; i++) {
  203. mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
  204. data = (i << 0x10) + i;
  205. mmio_write_32((0xf712c000 + 0x140), data);
  206. mmio_write_32((0xf712c000 + 0x144), data);
  207. mmio_write_32((0xf712c000 + 0x148), data);
  208. mmio_write_32((0xf712c000 + 0x14c), data);
  209. mmio_write_32((0xf712c000 + 0x150), data);
  210. data = mmio_read_32((0xf712c000 + 0x070));
  211. data |= 0x80000;
  212. mmio_write_32((0xf712c000 + 0x070), data);
  213. data = mmio_read_32((0xf712c000 + 0x070));
  214. data &= 0xfff7ffff;
  215. mmio_write_32((0xf712c000 + 0x070), data);
  216. mmio_write_32((0xf712c000 + 0x004), 0x8000);
  217. mmio_write_32((0xf712c000 + 0x004), 0x0);
  218. mmio_write_32((0xf712c000 + 0x004), 0x801);
  219. do {
  220. data = mmio_read_32((0xf712c000 + 0x004));
  221. } while (data & 1);
  222. data = mmio_read_32((0xf712c000 + 0x008));
  223. if ((data & 0x400) == 0) {
  224. mdelay(10);
  225. return 0;
  226. }
  227. WARN("lpddr3 cat fail\n");
  228. data = mmio_read_32((0xf712c000 + 0x1d4));
  229. if ((data & 0x1f00) && ((data & 0x1f) == 0)) {
  230. bdl[0] = mmio_read_32((0xf712c000 + 0x140));
  231. bdl[1] = mmio_read_32((0xf712c000 + 0x144));
  232. bdl[2] = mmio_read_32((0xf712c000 + 0x148));
  233. bdl[3] = mmio_read_32((0xf712c000 + 0x14c));
  234. bdl[4] = mmio_read_32((0xf712c000 + 0x150));
  235. if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) ||
  236. (!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) ||
  237. (!(bdl[4] & 0x1f001f))) {
  238. WARN("lpddr3 cat deskew error\n");
  239. if (i == 0x1f) {
  240. WARN("addrnbdl is max\n");
  241. return -EINVAL;
  242. }
  243. mmio_write_32((0xf712c000 + 0x008), 0x400);
  244. } else {
  245. WARN("lpddr3 cat other error1\n");
  246. return -EINVAL;
  247. }
  248. } else {
  249. WARN("lpddr3 cat other error2\n");
  250. return -EINVAL;
  251. }
  252. }
  253. return -EINVAL;
  254. }
  255. static void ddrx_rdet(void)
  256. {
  257. unsigned int data, rdet, bdl[4];
  258. data = mmio_read_32((0xf712c000 + 0x0d0));
  259. data &= 0xf800ffff;
  260. data |= 0x8f0000;
  261. mmio_write_32((0xf712c000 + 0x0d0), data);
  262. data = mmio_read_32((0xf712c000 + 0x0dc));
  263. data &= 0xfffffff0;
  264. data |= 0xf;
  265. mmio_write_32((0xf712c000 + 0x0dc), data);
  266. data = mmio_read_32((0xf712c000 + 0x070));
  267. data |= 0x80000;
  268. mmio_write_32((0xf712c000 + 0x070), data);
  269. data = mmio_read_32((0xf712c000 + 0x070));
  270. data &= 0xfff7ffff;
  271. mmio_write_32((0xf712c000 + 0x070), data);
  272. mmio_write_32((0xf712c000 + 0x004), 0x8000);
  273. mmio_write_32((0xf712c000 + 0x004), 0);
  274. data = mmio_read_32((0xf712c000 + 0x0d0));
  275. data &= ~0xf0000000;
  276. data |= 0x80000000;
  277. mmio_write_32((0xf712c000 + 0x0d0), data);
  278. mmio_write_32((0xf712c000 + 0x004), 0x101);
  279. do {
  280. data = mmio_read_32((0xf712c000 + 0x004));
  281. } while (!(data & 1));
  282. data = mmio_read_32((0xf712c000 + 0x008));
  283. if (data & 0x100)
  284. WARN("rdet lbs fail\n");
  285. bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f;
  286. bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f;
  287. bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f;
  288. bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f;
  289. do {
  290. data = mmio_read_32((0xf712c000 + 0x22c));
  291. data &= ~0x7f;
  292. data |= bdl[0];
  293. mmio_write_32((0xf712c000 + 0x22c), data);
  294. data = mmio_read_32((0xf712c000 + 0x2ac));
  295. data &= ~0x7f;
  296. data |= bdl[1];
  297. mmio_write_32((0xf712c000 + 0x2ac), data);
  298. data = mmio_read_32((0xf712c000 + 0x32c));
  299. data &= ~0x7f;
  300. data |= bdl[2];
  301. mmio_write_32((0xf712c000 + 0x32c), data);
  302. data = mmio_read_32((0xf712c000 + 0x3ac));
  303. data &= ~0x7f;
  304. data |= bdl[3];
  305. mmio_write_32((0xf712c000 + 0x3ac), data);
  306. data = mmio_read_32((0xf712c000 + 0x070));
  307. data |= 0x80000;
  308. mmio_write_32((0xf712c000 + 0x070), data);
  309. data = mmio_read_32((0xf712c000 + 0x070));
  310. data &= 0xfff7ffff;
  311. mmio_write_32((0xf712c000 + 0x070), data);
  312. mmio_write_32((0xf712c000 + 0x004), 0x8000);
  313. mmio_write_32((0xf712c000 + 0x004), 0);
  314. data = mmio_read_32((0xf712c000 + 0x0d0));
  315. data &= ~0xf0000000;
  316. data |= 0x40000000;
  317. mmio_write_32((0xf712c000 + 0x0d0), data);
  318. mmio_write_32((0xf712c000 + 0x004), 0x101);
  319. do {
  320. data = mmio_read_32((0xf712c000 + 0x004));
  321. } while (data & 1);
  322. data = mmio_read_32((0xf712c000 + 0x008));
  323. rdet = data & 0x100;
  324. if (rdet) {
  325. INFO("rdet ds fail\n");
  326. mmio_write_32((0xf712c000 + 0x008), 0x100);
  327. }
  328. bdl[0]++;
  329. bdl[1]++;
  330. bdl[2]++;
  331. bdl[3]++;
  332. } while (rdet);
  333. data = mmio_read_32((0xf712c000 + 0x0d0));
  334. data &= ~0xf0000000;
  335. data |= 0x30000000;
  336. mmio_write_32((0xf712c000 + 0x0d0), data);
  337. mmio_write_32((0xf712c000 + 0x004), 0x101);
  338. do {
  339. data = mmio_read_32((0xf712c000 + 0x004));
  340. } while (data & 1);
  341. data = mmio_read_32((0xf712c000 + 0x008));
  342. if (data & 0x100)
  343. INFO("rdet rbs av fail\n");
  344. }
  345. static void ddrx_wdet(void)
  346. {
  347. unsigned int data, wdet, zero_bdl = 0, dq[4];
  348. int i;
  349. data = mmio_read_32((0xf712c000 + 0x0d0));
  350. data &= ~0xf;
  351. data |= 0xf;
  352. mmio_write_32((0xf712c000 + 0x0d0), data);
  353. data = mmio_read_32((0xf712c000 + 0x070));
  354. data |= 0x80000;
  355. mmio_write_32((0xf712c000 + 0x070), data);
  356. data = mmio_read_32((0xf712c000 + 0x070));
  357. data &= ~0x80000;
  358. mmio_write_32((0xf712c000 + 0x070), data);
  359. mmio_write_32((0xf712c000 + 0x004), 0x8000);
  360. mmio_write_32((0xf712c000 + 0x004), 0);
  361. data = mmio_read_32((0xf712c000 + 0x0d0));
  362. data &= ~0xf000;
  363. data |= 0x8000;
  364. mmio_write_32((0xf712c000 + 0x0d0), data);
  365. mmio_write_32((0xf712c000 + 0x004), 0x201);
  366. do {
  367. data = mmio_read_32((0xf712c000 + 0x004));
  368. } while (data & 1);
  369. data = mmio_read_32((0xf712c000 + 0x008));
  370. if (data & 0x200)
  371. INFO("wdet lbs fail\n");
  372. dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00;
  373. dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00;
  374. dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00;
  375. dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00;
  376. do {
  377. mmio_write_32((0xf712c000 + 0x234), dq[0]);
  378. mmio_write_32((0xf712c000 + 0x2b4), dq[1]);
  379. mmio_write_32((0xf712c000 + 0x334), dq[2]);
  380. mmio_write_32((0xf712c000 + 0x3b4), dq[3]);
  381. data = mmio_read_32((0xf712c000 + 0x070));
  382. data |= 0x80000;
  383. mmio_write_32((0xf712c000 + 0x070), data);
  384. data = mmio_read_32((0xf712c000 + 0x070));
  385. data &= ~0x80000;
  386. mmio_write_32((0xf712c000 + 0x070), data);
  387. mmio_write_32((0xf712c000 + 0x004), 0x8000);
  388. mmio_write_32((0xf712c000 + 0x004), 0);
  389. data = mmio_read_32((0xf712c000 + 0x0d0));
  390. data &= ~0xf000;
  391. data |= 0x4000;
  392. mmio_write_32((0xf712c000 + 0x0d0), data);
  393. mmio_write_32((0xf712c000 + 0x004), 0x201);
  394. do {
  395. data = mmio_read_32((0xf712c000 + 0x004));
  396. } while (data & 1);
  397. data = mmio_read_32((0xf712c000 + 0x008));
  398. wdet = data & 0x200;
  399. if (wdet) {
  400. INFO("wdet ds fail\n");
  401. mmio_write_32((0xf712c000 + 0x008), 0x200);
  402. }
  403. mdelay(10);
  404. for (i = 0; i < 4; i++) {
  405. data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80));
  406. if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
  407. (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
  408. zero_bdl = 1;
  409. data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80));
  410. if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
  411. (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
  412. zero_bdl = 1;
  413. data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80));
  414. if (!(data & 0x1f))
  415. zero_bdl = 1;
  416. if (zero_bdl) {
  417. if (i == 0)
  418. dq[0] = dq[0] - 0x100;
  419. if (i == 1)
  420. dq[1] = dq[1] - 0x100;
  421. if (i == 2)
  422. dq[2] = dq[2] - 0x100;
  423. if (i == 3)
  424. dq[3] = dq[3] - 0x100;
  425. }
  426. }
  427. } while (wdet);
  428. data = mmio_read_32((0xf712c000 + 0x0d0));
  429. data &= ~0xf000;
  430. data |= 0x3000;
  431. mmio_write_32((0xf712c000 + 0x0d0), data);
  432. mmio_write_32((0xf712c000 + 0x004), 0x201);
  433. do {
  434. data = mmio_read_32((0xf712c000 + 0x004));
  435. } while (data & 1);
  436. data = mmio_read_32((0xf712c000 + 0x008));
  437. if (data & 0x200)
  438. INFO("wdet rbs av fail\n");
  439. }
  440. void set_ddrc_150mhz(void)
  441. {
  442. unsigned int data;
  443. mmio_write_32((0xf7032000 + 0x580), 0x1);
  444. mmio_write_32((0xf7032000 + 0x5a8), 0x7);
  445. data = mmio_read_32((0xf7032000 + 0x104));
  446. data &= 0xfffffcff;
  447. mmio_write_32((0xf7032000 + 0x104), data);
  448. mmio_write_32((0xf7030000 + 0x050), 0x31);
  449. mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
  450. mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
  451. mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
  452. mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
  453. mmio_write_32((0xf712c000 + 0x018), 0x7);
  454. mmio_write_32((0xf712c000 + 0x090), 0x7200000);
  455. mmio_write_32((0xf712c000 + 0x258), 0x720);
  456. mmio_write_32((0xf712c000 + 0x2d8), 0x720);
  457. mmio_write_32((0xf712c000 + 0x358), 0x720);
  458. mmio_write_32((0xf712c000 + 0x3d8), 0x720);
  459. mmio_write_32((0xf712c000 + 0x018), 0x7);
  460. mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
  461. mmio_write_32((0xf712c000 + 0x0b4), 0xf);
  462. mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
  463. mmio_write_32((0xf712c000 + 0x070), 0x8940000);
  464. data = mmio_read_32((0xf712c000 + 0x078));
  465. data |= 4;
  466. mmio_write_32((0xf712c000 + 0x078), data);
  467. mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
  468. data = mmio_read_32((0xf712c000 + 0x020));
  469. data &= 0xfffffffe;
  470. mmio_write_32((0xf712c000 + 0x020), data);
  471. mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
  472. mmio_write_32((0xf712c000 + 0x010), 0x500000f);
  473. mmio_write_32((0xf712c000 + 0x014), 0x10);
  474. data = mmio_read_32((0xf712c000 + 0x1e4));
  475. data &= 0xffffff00;
  476. mmio_write_32((0xf712c000 + 0x1e4), data);
  477. mmio_write_32((0xf712c000 + 0x030), 0x30c82355);
  478. mmio_write_32((0xf712c000 + 0x034), 0x62112bb);
  479. mmio_write_32((0xf712c000 + 0x038), 0x20041022);
  480. mmio_write_32((0xf712c000 + 0x03c), 0x63177497);
  481. mmio_write_32((0xf712c000 + 0x040), 0x3008407);
  482. mmio_write_32((0xf712c000 + 0x064), 0x10483);
  483. mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
  484. data = mmio_read_32((0xf712c000 + 0x070));
  485. data &= 0xffff0000;
  486. data |= 0x184;
  487. mmio_write_32((0xf712c000 + 0x070), data);
  488. data = mmio_read_32((0xf712c000 + 0x048));
  489. data &= 0xbfffffff;
  490. mmio_write_32((0xf712c000 + 0x048), data);
  491. data = mmio_read_32((0xf712c000 + 0x020));
  492. data &= ~0x10;
  493. mmio_write_32((0xf712c000 + 0x020), data);
  494. data = mmio_read_32((0xf712c000 + 0x080));
  495. data &= ~0x2000;
  496. mmio_write_32((0xf712c000 + 0x080), data);
  497. mmio_write_32((0xf712c000 + 0x270), 0x3);
  498. mmio_write_32((0xf712c000 + 0x2f0), 0x3);
  499. mmio_write_32((0xf712c000 + 0x370), 0x3);
  500. mmio_write_32((0xf712c000 + 0x3f0), 0x3);
  501. mmio_write_32((0xf712c000 + 0x048), 0x90420880);
  502. mmio_write_32((0xf7128000 + 0x040), 0x0);
  503. mmio_write_32((0xf712c000 + 0x004), 0x146d);
  504. mmio_write_32((0xf7128000 + 0x050), 0x100123);
  505. mmio_write_32((0xf7128000 + 0x060), 0x133);
  506. mmio_write_32((0xf7128000 + 0x064), 0x133);
  507. mmio_write_32((0xf7128000 + 0x200), 0xa1000);
  508. mmio_write_32((0xf7128000 + 0x100), 0xb3290d08);
  509. mmio_write_32((0xf7128000 + 0x104), 0x9621821);
  510. mmio_write_32((0xf7128000 + 0x108), 0x45009023);
  511. mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145);
  512. mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
  513. mmio_write_32((0xf7128000 + 0x114), 0x11080806);
  514. mmio_write_32((0xf7128000 + 0x118), 0x44);
  515. do {
  516. data = mmio_read_32((0xf712c000 + 0x004));
  517. } while (data & 1);
  518. data = mmio_read_32((0xf712c000 + 0x008));
  519. if (data & 8) {
  520. NOTICE("fail to init ddr3 rank0\n");
  521. return;
  522. }
  523. data = mmio_read_32((0xf712c000 + 0x048));
  524. data |= 1;
  525. mmio_write_32((0xf712c000 + 0x048), data);
  526. mmio_write_32((0xf712c000 + 0x004), 0x21);
  527. do {
  528. data = mmio_read_32((0xf712c000 + 0x004));
  529. } while (data & 1);
  530. data = mmio_read_32((0xf712c000 + 0x008));
  531. if (data & 0x8)
  532. NOTICE("ddr3 rank1 init failure\n");
  533. else
  534. INFO("ddr3 rank1 init pass\n");
  535. data = mmio_read_32((0xf712c000 + 0x048));
  536. data &= ~0xf;
  537. mmio_write_32((0xf712c000 + 0x048), data);
  538. INFO("succeed to set ddrc 150mhz\n");
  539. }
  540. void set_ddrc_266mhz(void)
  541. {
  542. unsigned int data;
  543. mmio_write_32((0xf7032000 + 0x580), 0x3);
  544. mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
  545. data = mmio_read_32((0xf7032000 + 0x104));
  546. data &= 0xfffffcff;
  547. mmio_write_32((0xf7032000 + 0x104), data);
  548. mmio_write_32((0xf7030000 + 0x050), 0x31);
  549. mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
  550. mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
  551. mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
  552. mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
  553. mmio_write_32((0xf712c000 + 0x018), 0x7);
  554. mmio_write_32((0xf712c000 + 0x090), 0x7200000);
  555. mmio_write_32((0xf712c000 + 0x258), 0x720);
  556. mmio_write_32((0xf712c000 + 0x2d8), 0x720);
  557. mmio_write_32((0xf712c000 + 0x358), 0x720);
  558. mmio_write_32((0xf712c000 + 0x3d8), 0x720);
  559. mmio_write_32((0xf712c000 + 0x018), 0x7);
  560. mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
  561. mmio_write_32((0xf712c000 + 0x0b4), 0xf);
  562. mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
  563. mmio_write_32((0xf712c000 + 0x070), 0x8940000);
  564. data = mmio_read_32((0xf712c000 + 0x078));
  565. data |= 4;
  566. mmio_write_32((0xf712c000 + 0x078), data);
  567. mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
  568. data = mmio_read_32((0xf712c000 + 0x020));
  569. data &= 0xfffffffe;
  570. mmio_write_32((0xf712c000 + 0x020), data);
  571. mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
  572. mmio_write_32((0xf712c000 + 0x010), 0x500000f);
  573. mmio_write_32((0xf712c000 + 0x014), 0x10);
  574. data = mmio_read_32((0xf712c000 + 0x1e4));
  575. data &= 0xffffff00;
  576. mmio_write_32((0xf712c000 + 0x1e4), data);
  577. mmio_write_32((0xf712c000 + 0x030), 0x510d4455);
  578. mmio_write_32((0xf712c000 + 0x034), 0x8391ebb);
  579. mmio_write_32((0xf712c000 + 0x038), 0x2005103c);
  580. mmio_write_32((0xf712c000 + 0x03c), 0x6329950b);
  581. mmio_write_32((0xf712c000 + 0x040), 0x300858c);
  582. mmio_write_32((0xf712c000 + 0x064), 0x10483);
  583. mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
  584. data = mmio_read_32((0xf712c000 + 0x070));
  585. data &= 0xffff0000;
  586. data |= 0x184;
  587. mmio_write_32((0xf712c000 + 0x070), data);
  588. data = mmio_read_32((0xf712c000 + 0x048));
  589. data &= 0xbfffffff;
  590. mmio_write_32((0xf712c000 + 0x048), data);
  591. data = mmio_read_32((0xf712c000 + 0x020));
  592. data &= ~0x10;
  593. mmio_write_32((0xf712c000 + 0x020), data);
  594. data = mmio_read_32((0xf712c000 + 0x080));
  595. data &= ~0x2000;
  596. mmio_write_32((0xf712c000 + 0x080), data);
  597. mmio_write_32((0xf712c000 + 0x270), 0x3);
  598. mmio_write_32((0xf712c000 + 0x2f0), 0x3);
  599. mmio_write_32((0xf712c000 + 0x370), 0x3);
  600. mmio_write_32((0xf712c000 + 0x3f0), 0x3);
  601. mmio_write_32((0xf712c000 + 0x048), 0x90420880);
  602. mmio_write_32((0xf7128000 + 0x040), 0x0);
  603. mmio_write_32((0xf712c000 + 0x004), 0x146d);
  604. mmio_write_32((0xf7128000 + 0x050), 0x100123);
  605. mmio_write_32((0xf7128000 + 0x060), 0x133);
  606. mmio_write_32((0xf7128000 + 0x064), 0x133);
  607. mmio_write_32((0xf7128000 + 0x200), 0xa1000);
  608. mmio_write_32((0xf7128000 + 0x100), 0xb441d50d);
  609. mmio_write_32((0xf7128000 + 0x104), 0xf721839);
  610. mmio_write_32((0xf7128000 + 0x108), 0x5500f03f);
  611. mmio_write_32((0xf7128000 + 0x10c), 0xaf486145);
  612. mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
  613. mmio_write_32((0xf7128000 + 0x114), 0x12080d06);
  614. mmio_write_32((0xf7128000 + 0x118), 0x44);
  615. do {
  616. data = mmio_read_32((0xf712c000 + 0x004));
  617. } while (data & 1);
  618. data = mmio_read_32((0xf712c000 + 0x008));
  619. if (data & 8) {
  620. NOTICE("fail to init ddr3 rank0\n");
  621. return;
  622. }
  623. data = mmio_read_32((0xf712c000 + 0x048));
  624. data |= 1;
  625. mmio_write_32((0xf712c000 + 0x048), data);
  626. mmio_write_32((0xf712c000 + 0x004), 0x21);
  627. do {
  628. data = mmio_read_32((0xf712c000 + 0x004));
  629. } while (data & 1);
  630. data = mmio_read_32((0xf712c000 + 0x008));
  631. if (data & 0x8)
  632. NOTICE("ddr3 rank1 init failure\n");
  633. else
  634. INFO("ddr3 rank1 init pass\n");
  635. data = mmio_read_32((0xf712c000 + 0x048));
  636. data &= ~0xf;
  637. mmio_write_32((0xf712c000 + 0x048), data);
  638. INFO("succeed to set ddrc 266mhz\n");
  639. }
  640. void set_ddrc_400mhz(void)
  641. {
  642. unsigned int data;
  643. mmio_write_32((0xf7032000 + 0x580), 0x2);
  644. mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
  645. data = mmio_read_32((0xf7032000 + 0x104));
  646. data &= 0xfffffcff;
  647. mmio_write_32((0xf7032000 + 0x104), data);
  648. mmio_write_32((0xf7030000 + 0x050), 0x31);
  649. mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
  650. mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
  651. mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
  652. mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
  653. mmio_write_32((0xf712c000 + 0x018), 0x7);
  654. mmio_write_32((0xf712c000 + 0x090), 0x7200000);
  655. mmio_write_32((0xf712c000 + 0x258), 0x720);
  656. mmio_write_32((0xf712c000 + 0x2d8), 0x720);
  657. mmio_write_32((0xf712c000 + 0x358), 0x720);
  658. mmio_write_32((0xf712c000 + 0x3d8), 0x720);
  659. mmio_write_32((0xf712c000 + 0x018), 0x7);
  660. mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
  661. mmio_write_32((0xf712c000 + 0x0b4), 0xf);
  662. mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
  663. mmio_write_32((0xf712c000 + 0x070), 0x8940000);
  664. data = mmio_read_32((0xf712c000 + 0x078));
  665. data |= 4;
  666. mmio_write_32((0xf712c000 + 0x078), data);
  667. mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
  668. data = mmio_read_32((0xf712c000 + 0x020));
  669. data &= 0xfffffffe;
  670. mmio_write_32((0xf712c000 + 0x020), data);
  671. mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
  672. mmio_write_32((0xf712c000 + 0x010), 0x500000f);
  673. mmio_write_32((0xf712c000 + 0x014), 0x10);
  674. data = mmio_read_32((0xf712c000 + 0x1e4));
  675. data &= 0xffffff00;
  676. mmio_write_32((0xf712c000 + 0x1e4), data);
  677. mmio_write_32((0xf712c000 + 0x030), 0x75525655);
  678. mmio_write_32((0xf712c000 + 0x034), 0xa552abb);
  679. mmio_write_32((0xf712c000 + 0x038), 0x20071059);
  680. mmio_write_32((0xf712c000 + 0x03c), 0x633e8591);
  681. mmio_write_32((0xf712c000 + 0x040), 0x3008691);
  682. mmio_write_32((0xf712c000 + 0x064), 0x10483);
  683. mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
  684. data = mmio_read_32((0xf712c000 + 0x070));
  685. data &= 0xffff0000;
  686. data |= 0x184;
  687. mmio_write_32((0xf712c000 + 0x070), data);
  688. data = mmio_read_32((0xf712c000 + 0x048));
  689. data &= 0xbfffffff;
  690. mmio_write_32((0xf712c000 + 0x048), data);
  691. data = mmio_read_32((0xf712c000 + 0x020));
  692. data &= ~0x10;
  693. mmio_write_32((0xf712c000 + 0x020), data);
  694. data = mmio_read_32((0xf712c000 + 0x080));
  695. data &= ~0x2000;
  696. mmio_write_32((0xf712c000 + 0x080), data);
  697. mmio_write_32((0xf712c000 + 0x270), 0x3);
  698. mmio_write_32((0xf712c000 + 0x2f0), 0x3);
  699. mmio_write_32((0xf712c000 + 0x370), 0x3);
  700. mmio_write_32((0xf712c000 + 0x3f0), 0x3);
  701. mmio_write_32((0xf712c000 + 0x048), 0x90420880);
  702. mmio_write_32((0xf7128000 + 0x040), 0x0);
  703. mmio_write_32((0xf712c000 + 0x004), 0x146d);
  704. mmio_write_32((0xf7128000 + 0x050), 0x100123);
  705. mmio_write_32((0xf7128000 + 0x060), 0x133);
  706. mmio_write_32((0xf7128000 + 0x064), 0x133);
  707. mmio_write_32((0xf7128000 + 0x200), 0xa1000);
  708. mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12);
  709. mmio_write_32((0xf7128000 + 0x104), 0x17721855);
  710. mmio_write_32((0xf7128000 + 0x108), 0x7501505f);
  711. mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245);
  712. mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
  713. mmio_write_32((0xf7128000 + 0x114), 0x13081306);
  714. mmio_write_32((0xf7128000 + 0x118), 0x44);
  715. do {
  716. data = mmio_read_32((0xf712c000 + 0x004));
  717. } while (data & 1);
  718. data = mmio_read_32((0xf712c000 + 0x008));
  719. if (data & 8) {
  720. NOTICE("fail to init ddr3 rank0\n");
  721. return;
  722. }
  723. data = mmio_read_32((0xf712c000 + 0x048));
  724. data |= 1;
  725. mmio_write_32((0xf712c000 + 0x048), data);
  726. mmio_write_32((0xf712c000 + 0x004), 0x21);
  727. do {
  728. data = mmio_read_32((0xf712c000 + 0x004));
  729. } while (data & 1);
  730. data = mmio_read_32((0xf712c000 + 0x008));
  731. if (data & 0x8)
  732. NOTICE("ddr3 rank1 init failure\n");
  733. else
  734. INFO("ddr3 rank1 init pass\n");
  735. data = mmio_read_32((0xf712c000 + 0x048));
  736. data &= ~0xf;
  737. mmio_write_32((0xf712c000 + 0x048), data);
  738. INFO("succeed to set ddrc 400mhz\n");
  739. }
  740. void set_ddrc_533mhz(void)
  741. {
  742. unsigned int data;
  743. mmio_write_32((0xf7032000 + 0x580), 0x3);
  744. mmio_write_32((0xf7032000 + 0x5a8), 0x11111);
  745. data = mmio_read_32((0xf7032000 + 0x104));
  746. data |= 0x100;
  747. mmio_write_32((0xf7032000 + 0x104), data);
  748. mmio_write_32((0xf7030000 + 0x050), 0x30);
  749. mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
  750. mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
  751. mmio_write_32((0xf712c000 + 0x00c), 0x400);
  752. mmio_write_32((0xf712c000 + 0x00c), 0x400);
  753. mmio_write_32((0xf712c000 + 0x018), 0x7);
  754. mmio_write_32((0xf712c000 + 0x090), 0x6400000);
  755. mmio_write_32((0xf712c000 + 0x258), 0x640);
  756. mmio_write_32((0xf712c000 + 0x2d8), 0x640);
  757. mmio_write_32((0xf712c000 + 0x358), 0x640);
  758. mmio_write_32((0xf712c000 + 0x3d8), 0x640);
  759. mmio_write_32((0xf712c000 + 0x018), 0x0);
  760. mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
  761. mmio_write_32((0xf712c000 + 0x0b4), 0xf);
  762. mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
  763. mmio_write_32((0xf712c000 + 0x070), 0x8940000);
  764. data = mmio_read_32((0xf712c000 + 0x078));
  765. data |= 4;
  766. mmio_write_32((0xf712c000 + 0x078), data);
  767. mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
  768. data = mmio_read_32((0xf712c000 + 0x020));
  769. data &= 0xfffffffe;
  770. mmio_write_32((0xf712c000 + 0x020), data);
  771. mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
  772. mmio_write_32((0xf712c000 + 0x010), 0x500000f);
  773. mmio_write_32((0xf712c000 + 0x014), 0x10);
  774. data = mmio_read_32((0xf712c000 + 0x1e4));
  775. data &= 0xffffff00;
  776. mmio_write_32((0xf712c000 + 0x1e4), data);
  777. mmio_write_32((0xf712c000 + 0x030), 0x9dd87855);
  778. mmio_write_32((0xf712c000 + 0x034), 0xa7138bb);
  779. mmio_write_32((0xf712c000 + 0x038), 0x20091477);
  780. mmio_write_32((0xf712c000 + 0x03c), 0x84534e16);
  781. mmio_write_32((0xf712c000 + 0x040), 0x3008817);
  782. mmio_write_32((0xf712c000 + 0x064), 0x106c3);
  783. mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
  784. data = mmio_read_32((0xf712c000 + 0x070));
  785. data &= 0xffff0000;
  786. data |= 0x305;
  787. mmio_write_32((0xf712c000 + 0x070), data);
  788. data = mmio_read_32((0xf712c000 + 0x048));
  789. data |= 0x40000000;
  790. mmio_write_32((0xf712c000 + 0x048), data);
  791. data = mmio_read_32((0xf712c000 + 0x020));
  792. data &= ~0x10;
  793. mmio_write_32((0xf712c000 + 0x020), data);
  794. data = mmio_read_32((0xf712c000 + 0x080));
  795. data &= ~0x2000;
  796. mmio_write_32((0xf712c000 + 0x080), data);
  797. mmio_write_32((0xf712c000 + 0x270), 0x3);
  798. mmio_write_32((0xf712c000 + 0x2f0), 0x3);
  799. mmio_write_32((0xf712c000 + 0x370), 0x3);
  800. mmio_write_32((0xf712c000 + 0x3f0), 0x3);
  801. mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
  802. mmio_write_32((0xf7128000 + 0x040), 0x0);
  803. mmio_write_32((0xf712c000 + 0x004), 0x140f);
  804. do {
  805. data = mmio_read_32((0xf712c000 + 0x004));
  806. } while (data & 1);
  807. data = mmio_read_32((0xf712c000 + 0x008));
  808. if (data & 0x7fe) {
  809. NOTICE("failed to init lpddr3 rank0 dram phy\n");
  810. return;
  811. }
  812. cat_533mhz_800mhz();
  813. mmio_write_32((0xf712c000 + 0x004), 0xf1);
  814. mmio_write_32((0xf7128000 + 0x050), 0x100123);
  815. mmio_write_32((0xf7128000 + 0x060), 0x133);
  816. mmio_write_32((0xf7128000 + 0x064), 0x133);
  817. mmio_write_32((0xf7128000 + 0x200), 0xa1000);
  818. mmio_write_32((0xf7128000 + 0x100), 0xb77b6718);
  819. mmio_write_32((0xf7128000 + 0x104), 0x1e82a071);
  820. mmio_write_32((0xf7128000 + 0x108), 0x9501c07e);
  821. mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255);
  822. mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
  823. mmio_write_32((0xf7128000 + 0x114), 0x13181908);
  824. mmio_write_32((0xf7128000 + 0x118), 0x44);
  825. do {
  826. data = mmio_read_32((0xf712c000 + 0x004));
  827. } while (data & 1);
  828. data = mmio_read_32((0xf712c000 + 0x008));
  829. if (data & 0x7fe) {
  830. NOTICE("fail to init ddr3 rank0\n");
  831. return;
  832. }
  833. ddrx_rdet();
  834. ddrx_wdet();
  835. data = mmio_read_32((0xf712c000 + 0x048));
  836. data |= 1;
  837. mmio_write_32((0xf712c000 + 0x048), data);
  838. mmio_write_32((0xf712c000 + 0x004), 0x21);
  839. do {
  840. data = mmio_read_32((0xf712c000 + 0x004));
  841. } while (data & 1);
  842. data = mmio_read_32((0xf712c000 + 0x008));
  843. if (data & 0x7fe)
  844. NOTICE("ddr3 rank1 init failure\n");
  845. else
  846. INFO("ddr3 rank1 init pass\n");
  847. data = mmio_read_32((0xf712c000 + 0x048));
  848. data &= ~0xf;
  849. mmio_write_32((0xf712c000 + 0x048), data);
  850. INFO("succeed to set ddrc 533mhz\n");
  851. }
  852. void set_ddrc_800mhz(void)
  853. {
  854. unsigned int data;
  855. mmio_write_32((0xf7032000 + 0x580), 0x2);
  856. mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
  857. data = mmio_read_32((0xf7032000 + 0x104));
  858. data &= 0xfffffcff;
  859. mmio_write_32((0xf7032000 + 0x104), data);
  860. mmio_write_32((0xf7030000 + 0x050), 0x30);
  861. mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
  862. mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
  863. mmio_write_32((0xf712c000 + 0x00c), 0x400);
  864. mmio_write_32((0xf712c000 + 0x00c), 0x400);
  865. mmio_write_32((0xf712c000 + 0x018), 0x7);
  866. mmio_write_32((0xf712c000 + 0x090), 0x5400000);
  867. mmio_write_32((0xf712c000 + 0x258), 0x540);
  868. mmio_write_32((0xf712c000 + 0x2d8), 0x540);
  869. mmio_write_32((0xf712c000 + 0x358), 0x540);
  870. mmio_write_32((0xf712c000 + 0x3d8), 0x540);
  871. mmio_write_32((0xf712c000 + 0x018), 0x0);
  872. mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
  873. mmio_write_32((0xf712c000 + 0x0b4), 0xf);
  874. mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
  875. mmio_write_32((0xf712c000 + 0x070), 0x8940000);
  876. data = mmio_read_32((0xf712c000 + 0x078));
  877. data |= 4;
  878. mmio_write_32((0xf712c000 + 0x078), data);
  879. mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
  880. data = mmio_read_32((0xf712c000 + 0x020));
  881. data &= 0xfffffffe;
  882. mmio_write_32((0xf712c000 + 0x020), data);
  883. mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
  884. mmio_write_32((0xf712c000 + 0x010), 0x500000f);
  885. mmio_write_32((0xf712c000 + 0x014), 0x10);
  886. data = mmio_read_32((0xf712c000 + 0x1e4));
  887. data &= 0xffffff00;
  888. mmio_write_32((0xf712c000 + 0x1e4), data);
  889. mmio_write_32((0xf712c000 + 0x030), 0xe663ab77);
  890. mmio_write_32((0xf712c000 + 0x034), 0xea952db);
  891. mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1);
  892. mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721);
  893. mmio_write_32((0xf712c000 + 0x040), 0x3008aa1);
  894. mmio_write_32((0xf712c000 + 0x064), 0x11a43);
  895. mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
  896. data = mmio_read_32((0xf712c000 + 0x070));
  897. data &= 0xffff0000;
  898. data |= 0x507;
  899. mmio_write_32((0xf712c000 + 0x070), data);
  900. data = mmio_read_32((0xf712c000 + 0x048));
  901. data |= 0x40000000;
  902. mmio_write_32((0xf712c000 + 0x048), data);
  903. data = mmio_read_32((0xf712c000 + 0x020));
  904. data &= 0xffffffef;
  905. mmio_write_32((0xf712c000 + 0x020), data);
  906. data = mmio_read_32((0xf712c000 + 0x080));
  907. data &= 0xffffdfff;
  908. mmio_write_32((0xf712c000 + 0x080), data);
  909. mmio_write_32((0xf712c000 + 0x270), 0x3);
  910. mmio_write_32((0xf712c000 + 0x2f0), 0x3);
  911. mmio_write_32((0xf712c000 + 0x370), 0x3);
  912. mmio_write_32((0xf712c000 + 0x3f0), 0x3);
  913. mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
  914. mmio_write_32((0xf7128000 + 0x040), 0x2001);
  915. mmio_write_32((0xf712c000 + 0x004), 0x140f);
  916. do {
  917. data = mmio_read_32((0xf712c000 + 0x004));
  918. } while (data & 1);
  919. data = mmio_read_32((0xf712c000 + 0x008));
  920. if (data & 0x7fe) {
  921. WARN("failed to init lpddr3 rank0 dram phy\n");
  922. return;
  923. }
  924. cat_533mhz_800mhz();
  925. mmio_write_32((0xf712c000 + 0x004), 0xf1);
  926. mmio_write_32((0xf7128000 + 0x050), 0x100023);
  927. mmio_write_32((0xf7128000 + 0x060), 0x133);
  928. mmio_write_32((0xf7128000 + 0x064), 0x133);
  929. mmio_write_32((0xf7128000 + 0x200), 0xa1000);
  930. mmio_write_32((0xf7128000 + 0x100), 0x755a9d12);
  931. mmio_write_32((0xf7128000 + 0x104), 0x1753b055);
  932. mmio_write_32((0xf7128000 + 0x108), 0x7401505f);
  933. mmio_write_32((0xf7128000 + 0x10c), 0x578ca244);
  934. mmio_write_32((0xf7128000 + 0x110), 0x10700000);
  935. mmio_write_32((0xf7128000 + 0x114), 0x13141306);
  936. mmio_write_32((0xf7128000 + 0x118), 0x44);
  937. do {
  938. data = mmio_read_32((0xf712c000 + 0x004));
  939. } while (data & 1);
  940. data = mmio_read_32((0xf712c000 + 0x008));
  941. if (data & 0x7fe) {
  942. NOTICE("fail to init ddr3 rank0\n");
  943. return;
  944. }
  945. ddrx_rdet();
  946. ddrx_wdet();
  947. data = mmio_read_32((0xf712c000 + 0x048));
  948. data |= 1;
  949. mmio_write_32((0xf712c000 + 0x048), data);
  950. mmio_write_32((0xf712c000 + 0x004), 0x21);
  951. do {
  952. data = mmio_read_32((0xf712c000 + 0x004));
  953. } while (data & 1);
  954. data = mmio_read_32((0xf712c000 + 0x008));
  955. if (data & 0x7fe)
  956. NOTICE("ddr3 rank1 init failure\n");
  957. else
  958. INFO("ddr3 rank1 init pass\n");
  959. data = mmio_read_32((0xf712c000 + 0x048));
  960. data &= ~0xf;
  961. mmio_write_32((0xf712c000 + 0x048), data);
  962. INFO("succeed to set ddrc 800mhz\n");
  963. }
  964. static void ddrc_common_init(int freq)
  965. {
  966. unsigned int data;
  967. mmio_write_32((0xf7120000 + 0x020), 0x1);
  968. mmio_write_32((0xf7120000 + 0x100), 0x1700);
  969. mmio_write_32((0xf7120000 + 0x104), 0x71040004);
  970. mmio_write_32((0xf7121400 + 0x104), 0xf);
  971. mmio_write_32((0xf7121800 + 0x104), 0xf);
  972. mmio_write_32((0xf7121c00 + 0x104), 0xf);
  973. mmio_write_32((0xf7122000 + 0x104), 0xf);
  974. mmio_write_32((0xf7128000 + 0x02c), 0x6);
  975. mmio_write_32((0xf7128000 + 0x020), 0x30003);
  976. mmio_write_32((0xf7128000 + 0x028), 0x310201);
  977. mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600);
  978. mmio_write_32((0xf7128000 + 0x01c), 0xaf001);
  979. data = mmio_read_32((0xf7128000 + 0x280));
  980. data |= 1 << 7;
  981. mmio_write_32((0xf7128000 + 0x280), data);
  982. mmio_write_32((0xf7128000 + 0x244), 0x3);
  983. if (freq == DDR_FREQ_800M)
  984. mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024);
  985. else
  986. mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024);
  987. data = mmio_read_32((0xf712c000 + 0x080));
  988. data &= 0xffff;
  989. data |= 0x4002000;
  990. mmio_write_32((0xf712c000 + 0x080), data);
  991. mmio_write_32((0xf7128000 + 0x000), 0x0);
  992. do {
  993. data = mmio_read_32((0xf7128000 + 0x294));
  994. } while (data & 1);
  995. mmio_write_32((0xf7128000 + 0x000), 0x2);
  996. }
  997. static int dienum_det_and_rowcol_cfg(void)
  998. {
  999. unsigned int data;
  1000. mmio_write_32((0xf7128000 + 0x210), 0x87);
  1001. mmio_write_32((0xf7128000 + 0x218), 0x10000);
  1002. mmio_write_32((0xf7128000 + 0x00c), 0x1);
  1003. do {
  1004. data = mmio_read_32((0xf7128000 + 0x00c));
  1005. } while (data & 1);
  1006. data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc;
  1007. switch (data) {
  1008. case 0x18:
  1009. mmio_write_32((0xf7128000 + 0x060), 0x132);
  1010. mmio_write_32((0xf7128000 + 0x064), 0x132);
  1011. mmio_write_32((0xf7120000 + 0x100), 0x1600);
  1012. mmio_write_32((0xf7120000 + 0x104), 0x71040004);
  1013. mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x40000000);
  1014. break;
  1015. case 0x1c:
  1016. mmio_write_32((0xf7128000 + 0x060), 0x142);
  1017. mmio_write_32((0xf7128000 + 0x064), 0x142);
  1018. mmio_write_32((0xf7120000 + 0x100), 0x1700);
  1019. mmio_write_32((0xf7120000 + 0x104), 0x71040004);
  1020. mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
  1021. break;
  1022. case 0x58:
  1023. mmio_write_32((0xf7128000 + 0x060), 0x133);
  1024. mmio_write_32((0xf7128000 + 0x064), 0x133);
  1025. mmio_write_32((0xf7120000 + 0x100), 0x1700);
  1026. mmio_write_32((0xf7120000 + 0x104), 0x71040004);
  1027. mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
  1028. break;
  1029. default:
  1030. mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
  1031. break;
  1032. }
  1033. if (!data)
  1034. return -EINVAL;
  1035. return 0;
  1036. }
  1037. static int detect_ddr_chip_info(void)
  1038. {
  1039. unsigned int data, mr5, mr6, mr7;
  1040. mmio_write_32((0xf7128000 + 0x210), 0x57);
  1041. mmio_write_32((0xf7128000 + 0x218), 0x10000);
  1042. mmio_write_32((0xf7128000 + 0x00c), 0x1);
  1043. do {
  1044. data = mmio_read_32((0xf7128000 + 0x00c));
  1045. } while (data & 1);
  1046. data = mmio_read_32((0xf7128000 + 0x4a8));
  1047. mr5 = data & 0xff;
  1048. switch (mr5) {
  1049. case 1:
  1050. INFO("Samsung DDR\n");
  1051. break;
  1052. case 6:
  1053. INFO("Hynix DDR\n");
  1054. break;
  1055. case 3:
  1056. INFO("Elpida DDR\n");
  1057. break;
  1058. default:
  1059. INFO("DDR from other vendors\n");
  1060. break;
  1061. }
  1062. mmio_write_32((0xf7128000 + 0x210), 0x67);
  1063. mmio_write_32((0xf7128000 + 0x218), 0x10000);
  1064. mmio_write_32((0xf7128000 + 0x00c), 0x1);
  1065. do {
  1066. data = mmio_read_32((0xf7128000 + 0x00c));
  1067. } while (data & 1);
  1068. data = mmio_read_32((0xf7128000 + 0x4a8));
  1069. mr6 = data & 0xff;
  1070. mmio_write_32((0xf7128000 + 0x210), 0x77);
  1071. mmio_write_32((0xf7128000 + 0x218), 0x10000);
  1072. mmio_write_32((0xf7128000 + 0x00c), 0x1);
  1073. do {
  1074. data = mmio_read_32((0xf7128000 + 0x00c));
  1075. } while (data & 1);
  1076. data = mmio_read_32((0xf7128000 + 0x4a8));
  1077. mr7 = data & 0xff;
  1078. data = mr5 + (mr6 << 8) + (mr7 << 16);
  1079. return data;
  1080. }
  1081. void ddr_phy_reset(void)
  1082. {
  1083. mmio_write_32(0xf7030340, 0xa000);
  1084. mmio_write_32(0xf7030344, 0xa000);
  1085. }
  1086. void lpddrx_save_ddl_para_bypass(uint32_t *ddr_ddl_para, unsigned int index)
  1087. {
  1088. uint32_t value;
  1089. uint32_t cnt = index;
  1090. uint32_t i;
  1091. for (i = 0; i < 4; i++) {
  1092. value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80);
  1093. ddr_ddl_para[cnt++] = value;
  1094. value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80);
  1095. ddr_ddl_para[cnt++] = value;
  1096. value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80);
  1097. ddr_ddl_para[cnt++] = value;
  1098. value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80);
  1099. ddr_ddl_para[cnt++] = value;
  1100. }
  1101. }
  1102. void lpddrx_save_ddl_para_mission(uint32_t *ddr_ddl_para, unsigned int index)
  1103. {
  1104. uint32_t value;
  1105. uint32_t cnt = index;
  1106. uint32_t i;
  1107. value = mmio_read_32(0xf712c000 + 0x140);
  1108. ddr_ddl_para[cnt++] = value;
  1109. value = mmio_read_32(0xf712c000 + 0x144);
  1110. ddr_ddl_para[cnt++] = value;
  1111. value = mmio_read_32(0xf712c000 + 0x148);
  1112. ddr_ddl_para[cnt++] = value;
  1113. value = mmio_read_32(0xf712c000 + 0x14c);
  1114. ddr_ddl_para[cnt++] = value;
  1115. value = mmio_read_32(0xf712c000 + 0x150);
  1116. ddr_ddl_para[cnt++] = value;
  1117. value = mmio_read_32(0xf712c000 + 0x1d4);
  1118. ddr_ddl_para[cnt++] = value;
  1119. for (i = 0; i < 4; i++) {
  1120. value = mmio_read_32(0xf712c000 + 0x210 + i * 0x80);
  1121. ddr_ddl_para[cnt++] = value;
  1122. value = mmio_read_32(0xf712c000 + 0x214 + i * 0x80);
  1123. ddr_ddl_para[cnt++] = value;
  1124. value = mmio_read_32(0xf712c000 + 0x218 + i * 0x80);
  1125. ddr_ddl_para[cnt++] = value;
  1126. value = mmio_read_32(0xf712c000 + 0x21c + i * 0x80);
  1127. ddr_ddl_para[cnt++] = value;
  1128. value = mmio_read_32(0xf712c000 + 0x220 + i * 0x80);
  1129. ddr_ddl_para[cnt++] = value;
  1130. value = mmio_read_32(0xf712c000 + 0x224 + i * 0x80);
  1131. ddr_ddl_para[cnt++] = value;
  1132. value = mmio_read_32(0xf712c000 + 0x228 + i * 0x80);
  1133. ddr_ddl_para[cnt++] = value;
  1134. value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80);
  1135. ddr_ddl_para[cnt++] = value;
  1136. value = mmio_read_32(0xf712c000 + 0x230 + i * 0x80);
  1137. ddr_ddl_para[cnt++] = value;
  1138. value = mmio_read_32(0xf712c000 + 0x234 + i * 0x80);
  1139. ddr_ddl_para[cnt++] = value;
  1140. value = mmio_read_32(0xf712c000 + 0x238 + i * 0x80);
  1141. ddr_ddl_para[cnt++] = value;
  1142. value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80);
  1143. ddr_ddl_para[cnt++] = value;
  1144. value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80);
  1145. ddr_ddl_para[cnt++] = value;
  1146. value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80);
  1147. ddr_ddl_para[cnt++] = value;
  1148. }
  1149. value = mmio_read_32(0xf712c000 + 0x168);
  1150. ddr_ddl_para[cnt++] = value;
  1151. value = mmio_read_32(0xf712c000 + 0x24c + 0 * 0x80);
  1152. ddr_ddl_para[cnt++] = value;
  1153. value = mmio_read_32(0xf712c000 + 0x24c + 2 * 0x80);
  1154. ddr_ddl_para[cnt++] = value;
  1155. }
  1156. int lpddr3_freq_init(int freq)
  1157. {
  1158. set_ddrc_150mhz();
  1159. lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 0);
  1160. if (freq > DDR_FREQ_150M) {
  1161. ddr_phy_reset();
  1162. set_ddrc_266mhz();
  1163. lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
  1164. 16);
  1165. }
  1166. if (freq > DDR_FREQ_266M) {
  1167. ddr_phy_reset();
  1168. set_ddrc_400mhz();
  1169. lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
  1170. 16 * 2);
  1171. }
  1172. if (freq > DDR_FREQ_400M) {
  1173. ddr_phy_reset();
  1174. set_ddrc_533mhz();
  1175. lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
  1176. 16 * 3);
  1177. }
  1178. if (freq > DDR_FREQ_533M) {
  1179. ddr_phy_reset();
  1180. set_ddrc_800mhz();
  1181. lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
  1182. 16 * 3 + 61);
  1183. }
  1184. return 0;
  1185. }
  1186. static void init_ddr(int freq)
  1187. {
  1188. unsigned int data;
  1189. int ret;
  1190. data = mmio_read_32((0xf7032000 + 0x030));
  1191. data |= 1;
  1192. mmio_write_32((0xf7032000 + 0x030), data);
  1193. data = mmio_read_32((0xf7032000 + 0x010));
  1194. data |= 1;
  1195. mmio_write_32((0xf7032000 + 0x010), data);
  1196. udelay(300);
  1197. do {
  1198. data = mmio_read_32((0xf7032000 + 0x030));
  1199. data &= 3 << 28;
  1200. } while (data != (3 << 28));
  1201. do {
  1202. data = mmio_read_32((0xf7032000 + 0x010));
  1203. data &= 3 << 28;
  1204. } while (data != (3 << 28));
  1205. ret = lpddr3_freq_init(freq);
  1206. if (ret)
  1207. return;
  1208. }
  1209. static void init_ddrc_qos(void)
  1210. {
  1211. unsigned int port, data;
  1212. mmio_write_32((0xf7124000 + 0x088), 1);
  1213. port = 0;
  1214. mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
  1215. mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111);
  1216. mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111);
  1217. mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007);
  1218. for (port = 3; port <= 4; port++) {
  1219. mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
  1220. mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777);
  1221. mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777);
  1222. }
  1223. port = 1;
  1224. mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
  1225. mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
  1226. mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
  1227. mmio_write_32((0xf7124000 + 0x1f0), 0);
  1228. mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
  1229. mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
  1230. mmio_write_32((0xf7124000 + 0x1f4), 0x01000100);
  1231. mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402);
  1232. mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31);
  1233. mmio_write_32((0xf7124000 + 0x000), 0x7);
  1234. data = mmio_read_32((0xf7124000 + 0x09c));
  1235. data &= ~0xff0000;
  1236. data |= 0x400000;
  1237. mmio_write_32((0xf7124000 + 0x09c), data);
  1238. data = mmio_read_32((0xf7124000 + 0x0ac));
  1239. data &= ~0xff0000;
  1240. data |= 0x400000;
  1241. mmio_write_32((0xf7124000 + 0x0ac), data);
  1242. port = 2;
  1243. mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
  1244. mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
  1245. mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
  1246. mmio_write_32((0xf7124000 + 0x09c), 0xff7fff);
  1247. mmio_write_32((0xf7124000 + 0x0a0), 0xff);
  1248. mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff);
  1249. mmio_write_32((0xf7124000 + 0x0b0), 0xff);
  1250. mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
  1251. mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
  1252. }
  1253. void hikey_ddr_init(unsigned int ddr_freq)
  1254. {
  1255. uint32_t data;
  1256. assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) ||
  1257. (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) ||
  1258. (ddr_freq == DDR_FREQ_800M));
  1259. init_pll();
  1260. init_freq();
  1261. init_ddr(ddr_freq);
  1262. ddrc_common_init(ddr_freq);
  1263. dienum_det_and_rowcol_cfg();
  1264. detect_ddr_chip_info();
  1265. if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) {
  1266. data = mmio_read_32(0xf7032000 + 0x010);
  1267. data &= ~0x1;
  1268. mmio_write_32(0xf7032000 + 0x010, data);
  1269. } else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) {
  1270. data = mmio_read_32(0xf7032000 + 0x030);
  1271. data &= ~0x1;
  1272. mmio_write_32(0xf7032000 + 0x030, data);
  1273. } else {
  1274. data = mmio_read_32(0xf7032000 + 0x010);
  1275. data &= ~0x1;
  1276. mmio_write_32(0xf7032000 + 0x010, data);
  1277. data = mmio_read_32(0xf7032000 + 0x030);
  1278. data &= ~0x1;
  1279. mmio_write_32(0xf7032000 + 0x030, data);
  1280. }
  1281. dsb();
  1282. isb();
  1283. /*
  1284. * Test memory access. Do not use address 0x0 because the compiler
  1285. * may assume it is not a valid address and generate incorrect code
  1286. * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance).
  1287. */
  1288. mmio_write_32(0x4, 0xa5a55a5a);
  1289. INFO("ddr test value:0x%x\n", mmio_read_32(0x4));
  1290. init_ddrc_qos();
  1291. }