44x_spd_ddr.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224
  1. /*
  2. * arch/powerpc/cpu/ppc4xx/44x_spd_ddr.c
  3. * This SPD DDR detection code supports IBM/AMCC PPC44x cpu with a
  4. * DDR controller. Those are 440GP/GX/EP/GR.
  5. *
  6. * (C) Copyright 2001
  7. * Bill Hunter, Wave 7 Optics, williamhunter@attbi.com
  8. *
  9. * Based on code by:
  10. *
  11. * Kenneth Johansson ,Ericsson AB.
  12. * kenneth.johansson@etx.ericsson.se
  13. *
  14. * hacked up by bill hunter. fixed so we could run before
  15. * serial_init and console_init. previous version avoided this by
  16. * running out of cache memory during serial/console init, then running
  17. * this code later.
  18. *
  19. * (C) Copyright 2002
  20. * Jun Gu, Artesyn Technology, jung@artesyncp.com
  21. * Support for AMCC 440 based on OpenBIOS draminit.c from IBM.
  22. *
  23. * (C) Copyright 2005-2007
  24. * Stefan Roese, DENX Software Engineering, sr@denx.de.
  25. *
  26. * SPDX-License-Identifier: GPL-2.0+
  27. */
  28. /* define DEBUG for debugging output (obviously ;-)) */
  29. #if 0
  30. #define DEBUG
  31. #endif
  32. #include <common.h>
  33. #include <asm/processor.h>
  34. #include <i2c.h>
  35. #include <asm/ppc4xx.h>
  36. #include <asm/mmu.h>
  37. #include "ecc.h"
  38. #if defined(CONFIG_SPD_EEPROM) && \
  39. (defined(CONFIG_440GP) || defined(CONFIG_440GX) || \
  40. defined(CONFIG_440EP) || defined(CONFIG_440GR))
  41. /*
  42. * Set default values
  43. */
  44. #define ONE_BILLION 1000000000
  45. /*
  46. * Board-specific Platform code can reimplement spd_ddr_init_hang () if needed
  47. */
  48. void __spd_ddr_init_hang (void)
  49. {
  50. hang ();
  51. }
  52. void spd_ddr_init_hang (void) __attribute__((weak, alias("__spd_ddr_init_hang")));
  53. /*-----------------------------------------------------------------------------+
  54. | General Definition
  55. +-----------------------------------------------------------------------------*/
  56. #define DEFAULT_SPD_ADDR1 0x53
  57. #define DEFAULT_SPD_ADDR2 0x52
  58. #define MAXBANKS 4 /* at most 4 dimm banks */
  59. #define MAX_SPD_BYTES 256
  60. #define NUMHALFCYCLES 4
  61. #define NUMMEMTESTS 8
  62. #define NUMMEMWORDS 8
  63. #define MAXBXCR 4
  64. /*
  65. * This DDR2 setup code can dynamically setup the TLB entries for the DDR2 memory
  66. * region. Right now the cache should still be disabled in U-Boot because of the
  67. * EMAC driver, that need it's buffer descriptor to be located in non cached
  68. * memory.
  69. *
  70. * If at some time this restriction doesn't apply anymore, just define
  71. * CONFIG_4xx_DCACHE in the board config file and this code should setup
  72. * everything correctly.
  73. */
  74. #ifdef CONFIG_4xx_DCACHE
  75. #define MY_TLB_WORD2_I_ENABLE 0 /* enable caching on SDRAM */
  76. #else
  77. #define MY_TLB_WORD2_I_ENABLE TLB_WORD2_I_ENABLE /* disable caching on SDRAM */
  78. #endif
  79. /* bank_parms is used to sort the bank sizes by descending order */
  80. struct bank_param {
  81. unsigned long cr;
  82. unsigned long bank_size_bytes;
  83. };
  84. typedef struct bank_param BANKPARMS;
  85. #ifdef CONFIG_SYS_SIMULATE_SPD_EEPROM
  86. extern const unsigned char cfg_simulate_spd_eeprom[128];
  87. #endif
  88. static unsigned char spd_read(uchar chip, uint addr);
  89. static void get_spd_info(unsigned long *dimm_populated,
  90. unsigned char *iic0_dimm_addr,
  91. unsigned long num_dimm_banks);
  92. static void check_mem_type(unsigned long *dimm_populated,
  93. unsigned char *iic0_dimm_addr,
  94. unsigned long num_dimm_banks);
  95. static void check_volt_type(unsigned long *dimm_populated,
  96. unsigned char *iic0_dimm_addr,
  97. unsigned long num_dimm_banks);
  98. static void program_cfg0(unsigned long *dimm_populated,
  99. unsigned char *iic0_dimm_addr,
  100. unsigned long num_dimm_banks);
  101. static void program_cfg1(unsigned long *dimm_populated,
  102. unsigned char *iic0_dimm_addr,
  103. unsigned long num_dimm_banks);
  104. static void program_rtr(unsigned long *dimm_populated,
  105. unsigned char *iic0_dimm_addr,
  106. unsigned long num_dimm_banks);
  107. static void program_tr0(unsigned long *dimm_populated,
  108. unsigned char *iic0_dimm_addr,
  109. unsigned long num_dimm_banks);
  110. static void program_tr1(void);
  111. static unsigned long program_bxcr(unsigned long *dimm_populated,
  112. unsigned char *iic0_dimm_addr,
  113. unsigned long num_dimm_banks);
  114. /*
  115. * This function is reading data from the DIMM module EEPROM over the SPD bus
  116. * and uses that to program the sdram controller.
  117. *
  118. * This works on boards that has the same schematics that the AMCC walnut has.
  119. *
  120. * BUG: Don't handle ECC memory
  121. * BUG: A few values in the TR register is currently hardcoded
  122. */
  123. long int spd_sdram(void) {
  124. unsigned char iic0_dimm_addr[] = SPD_EEPROM_ADDRESS;
  125. unsigned long dimm_populated[sizeof(iic0_dimm_addr)];
  126. unsigned long total_size;
  127. unsigned long cfg0;
  128. unsigned long mcsts;
  129. unsigned long num_dimm_banks; /* on board dimm banks */
  130. num_dimm_banks = sizeof(iic0_dimm_addr);
  131. /*
  132. * Make sure I2C controller is initialized
  133. * before continuing.
  134. */
  135. i2c_set_bus_num(CONFIG_SYS_SPD_BUS_NUM);
  136. /*
  137. * Read the SPD information using I2C interface. Check to see if the
  138. * DIMM slots are populated.
  139. */
  140. get_spd_info(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  141. /*
  142. * Check the memory type for the dimms plugged.
  143. */
  144. check_mem_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  145. /*
  146. * Check the voltage type for the dimms plugged.
  147. */
  148. check_volt_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  149. #if defined(CONFIG_440GX) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
  150. /*
  151. * Soft-reset SDRAM controller.
  152. */
  153. mtsdr(SDR0_SRST, SDR0_SRST_DMC);
  154. mtsdr(SDR0_SRST, 0x00000000);
  155. #endif
  156. /*
  157. * program 440GP SDRAM controller options (SDRAM0_CFG0)
  158. */
  159. program_cfg0(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  160. /*
  161. * program 440GP SDRAM controller options (SDRAM0_CFG1)
  162. */
  163. program_cfg1(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  164. /*
  165. * program SDRAM refresh register (SDRAM0_RTR)
  166. */
  167. program_rtr(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  168. /*
  169. * program SDRAM Timing Register 0 (SDRAM0_TR0)
  170. */
  171. program_tr0(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  172. /*
  173. * program the BxCR registers to find out total sdram installed
  174. */
  175. total_size = program_bxcr(dimm_populated, iic0_dimm_addr,
  176. num_dimm_banks);
  177. #ifdef CONFIG_PROG_SDRAM_TLB /* this define should eventually be removed */
  178. /* and program tlb entries for this size (dynamic) */
  179. program_tlb(0, 0, total_size, MY_TLB_WORD2_I_ENABLE);
  180. #endif
  181. /*
  182. * program SDRAM Clock Timing Register (SDRAM0_CLKTR)
  183. */
  184. mtsdram(SDRAM0_CLKTR, 0x40000000);
  185. /*
  186. * delay to ensure 200 usec has elapsed
  187. */
  188. udelay(400);
  189. /*
  190. * enable the memory controller
  191. */
  192. mfsdram(SDRAM0_CFG0, cfg0);
  193. mtsdram(SDRAM0_CFG0, cfg0 | SDRAM_CFG0_DCEN);
  194. /*
  195. * wait for SDRAM_CFG0_DC_EN to complete
  196. */
  197. while (1) {
  198. mfsdram(SDRAM0_MCSTS, mcsts);
  199. if ((mcsts & SDRAM_MCSTS_MRSC) != 0)
  200. break;
  201. }
  202. /*
  203. * program SDRAM Timing Register 1, adding some delays
  204. */
  205. program_tr1();
  206. #ifdef CONFIG_DDR_ECC
  207. /*
  208. * If ecc is enabled, initialize the parity bits.
  209. */
  210. ecc_init(CONFIG_SYS_SDRAM_BASE, total_size);
  211. #endif
  212. return total_size;
  213. }
  214. static unsigned char spd_read(uchar chip, uint addr)
  215. {
  216. unsigned char data[2];
  217. #ifdef CONFIG_SYS_SIMULATE_SPD_EEPROM
  218. if (chip == CONFIG_SYS_SIMULATE_SPD_EEPROM) {
  219. /*
  220. * Onboard spd eeprom requested -> simulate values
  221. */
  222. return cfg_simulate_spd_eeprom[addr];
  223. }
  224. #endif /* CONFIG_SYS_SIMULATE_SPD_EEPROM */
  225. if (i2c_probe(chip) == 0) {
  226. if (i2c_read(chip, addr, 1, data, 1) == 0) {
  227. return data[0];
  228. }
  229. }
  230. return 0;
  231. }
  232. static void get_spd_info(unsigned long *dimm_populated,
  233. unsigned char *iic0_dimm_addr,
  234. unsigned long num_dimm_banks)
  235. {
  236. unsigned long dimm_num;
  237. unsigned long dimm_found;
  238. unsigned char num_of_bytes;
  239. unsigned char total_size;
  240. dimm_found = false;
  241. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  242. num_of_bytes = 0;
  243. total_size = 0;
  244. num_of_bytes = spd_read(iic0_dimm_addr[dimm_num], 0);
  245. total_size = spd_read(iic0_dimm_addr[dimm_num], 1);
  246. if ((num_of_bytes != 0) && (total_size != 0)) {
  247. dimm_populated[dimm_num] = true;
  248. dimm_found = true;
  249. debug("DIMM slot %lu: populated\n", dimm_num);
  250. } else {
  251. dimm_populated[dimm_num] = false;
  252. debug("DIMM slot %lu: Not populated\n", dimm_num);
  253. }
  254. }
  255. if (dimm_found == false) {
  256. printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n");
  257. spd_ddr_init_hang ();
  258. }
  259. }
  260. static void check_mem_type(unsigned long *dimm_populated,
  261. unsigned char *iic0_dimm_addr,
  262. unsigned long num_dimm_banks)
  263. {
  264. unsigned long dimm_num;
  265. unsigned char dimm_type;
  266. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  267. if (dimm_populated[dimm_num] == true) {
  268. dimm_type = spd_read(iic0_dimm_addr[dimm_num], 2);
  269. switch (dimm_type) {
  270. case 7:
  271. debug("DIMM slot %lu: DDR SDRAM detected\n", dimm_num);
  272. break;
  273. default:
  274. printf("ERROR: Unsupported DIMM detected in slot %lu.\n",
  275. dimm_num);
  276. printf("Only DDR SDRAM DIMMs are supported.\n");
  277. printf("Replace the DIMM module with a supported DIMM.\n\n");
  278. spd_ddr_init_hang ();
  279. break;
  280. }
  281. }
  282. }
  283. }
  284. static void check_volt_type(unsigned long *dimm_populated,
  285. unsigned char *iic0_dimm_addr,
  286. unsigned long num_dimm_banks)
  287. {
  288. unsigned long dimm_num;
  289. unsigned long voltage_type;
  290. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  291. if (dimm_populated[dimm_num] == true) {
  292. voltage_type = spd_read(iic0_dimm_addr[dimm_num], 8);
  293. if (voltage_type != 0x04) {
  294. printf("ERROR: DIMM %lu with unsupported voltage level.\n",
  295. dimm_num);
  296. spd_ddr_init_hang ();
  297. } else {
  298. debug("DIMM %lu voltage level supported.\n", dimm_num);
  299. }
  300. break;
  301. }
  302. }
  303. }
  304. static void program_cfg0(unsigned long *dimm_populated,
  305. unsigned char *iic0_dimm_addr,
  306. unsigned long num_dimm_banks)
  307. {
  308. unsigned long dimm_num;
  309. unsigned long cfg0;
  310. unsigned long ecc_enabled;
  311. unsigned char ecc;
  312. unsigned char attributes;
  313. unsigned long data_width;
  314. /*
  315. * get Memory Controller Options 0 data
  316. */
  317. mfsdram(SDRAM0_CFG0, cfg0);
  318. /*
  319. * clear bits
  320. */
  321. cfg0 &= ~(SDRAM_CFG0_DCEN | SDRAM_CFG0_MCHK_MASK |
  322. SDRAM_CFG0_RDEN | SDRAM_CFG0_PMUD |
  323. SDRAM_CFG0_DMWD_MASK |
  324. SDRAM_CFG0_UIOS_MASK | SDRAM_CFG0_PDP);
  325. /*
  326. * FIXME: assume the DDR SDRAMs in both banks are the same
  327. */
  328. ecc_enabled = true;
  329. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  330. if (dimm_populated[dimm_num] == true) {
  331. ecc = spd_read(iic0_dimm_addr[dimm_num], 11);
  332. if (ecc != 0x02) {
  333. ecc_enabled = false;
  334. }
  335. /*
  336. * program Registered DIMM Enable
  337. */
  338. attributes = spd_read(iic0_dimm_addr[dimm_num], 21);
  339. if ((attributes & 0x02) != 0x00) {
  340. cfg0 |= SDRAM_CFG0_RDEN;
  341. }
  342. /*
  343. * program DDR SDRAM Data Width
  344. */
  345. data_width =
  346. (unsigned long)spd_read(iic0_dimm_addr[dimm_num],6) +
  347. (((unsigned long)spd_read(iic0_dimm_addr[dimm_num],7)) << 8);
  348. if (data_width == 64 || data_width == 72) {
  349. cfg0 |= SDRAM_CFG0_DMWD_64;
  350. } else if (data_width == 32 || data_width == 40) {
  351. cfg0 |= SDRAM_CFG0_DMWD_32;
  352. } else {
  353. printf("WARNING: DIMM with datawidth of %lu bits.\n",
  354. data_width);
  355. printf("Only DIMMs with 32 or 64 bit datawidths supported.\n");
  356. spd_ddr_init_hang ();
  357. }
  358. break;
  359. }
  360. }
  361. /*
  362. * program Memory Data Error Checking
  363. */
  364. if (ecc_enabled == true) {
  365. cfg0 |= SDRAM_CFG0_MCHK_GEN;
  366. } else {
  367. cfg0 |= SDRAM_CFG0_MCHK_NON;
  368. }
  369. /*
  370. * program Page Management Unit (0 == enabled)
  371. */
  372. cfg0 &= ~SDRAM_CFG0_PMUD;
  373. /*
  374. * program Memory Controller Options 0
  375. * Note: DCEN must be enabled after all DDR SDRAM controller
  376. * configuration registers get initialized.
  377. */
  378. mtsdram(SDRAM0_CFG0, cfg0);
  379. }
  380. static void program_cfg1(unsigned long *dimm_populated,
  381. unsigned char *iic0_dimm_addr,
  382. unsigned long num_dimm_banks)
  383. {
  384. unsigned long cfg1;
  385. mfsdram(SDRAM0_CFG1, cfg1);
  386. /*
  387. * Self-refresh exit, disable PM
  388. */
  389. cfg1 &= ~(SDRAM_CFG1_SRE | SDRAM_CFG1_PMEN);
  390. /*
  391. * program Memory Controller Options 1
  392. */
  393. mtsdram(SDRAM0_CFG1, cfg1);
  394. }
  395. static void program_rtr(unsigned long *dimm_populated,
  396. unsigned char *iic0_dimm_addr,
  397. unsigned long num_dimm_banks)
  398. {
  399. unsigned long dimm_num;
  400. unsigned long bus_period_x_10;
  401. unsigned long refresh_rate = 0;
  402. unsigned char refresh_rate_type;
  403. unsigned long refresh_interval;
  404. unsigned long sdram_rtr;
  405. PPC4xx_SYS_INFO sys_info;
  406. /*
  407. * get the board info
  408. */
  409. get_sys_info(&sys_info);
  410. bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
  411. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  412. if (dimm_populated[dimm_num] == true) {
  413. refresh_rate_type = 0x7F & spd_read(iic0_dimm_addr[dimm_num], 12);
  414. switch (refresh_rate_type) {
  415. case 0x00:
  416. refresh_rate = 15625;
  417. break;
  418. case 0x01:
  419. refresh_rate = 15625/4;
  420. break;
  421. case 0x02:
  422. refresh_rate = 15625/2;
  423. break;
  424. case 0x03:
  425. refresh_rate = 15626*2;
  426. break;
  427. case 0x04:
  428. refresh_rate = 15625*4;
  429. break;
  430. case 0x05:
  431. refresh_rate = 15625*8;
  432. break;
  433. default:
  434. printf("ERROR: DIMM %lu, unsupported refresh rate/type.\n",
  435. dimm_num);
  436. printf("Replace the DIMM module with a supported DIMM.\n");
  437. break;
  438. }
  439. break;
  440. }
  441. }
  442. refresh_interval = refresh_rate * 10 / bus_period_x_10;
  443. sdram_rtr = (refresh_interval & 0x3ff8) << 16;
  444. /*
  445. * program Refresh Timer Register (SDRAM0_RTR)
  446. */
  447. mtsdram(SDRAM0_RTR, sdram_rtr);
  448. }
  449. static void program_tr0(unsigned long *dimm_populated,
  450. unsigned char *iic0_dimm_addr,
  451. unsigned long num_dimm_banks)
  452. {
  453. unsigned long dimm_num;
  454. unsigned long tr0;
  455. unsigned char wcsbc;
  456. unsigned char t_rp_ns;
  457. unsigned char t_rcd_ns;
  458. unsigned char t_ras_ns;
  459. unsigned long t_rp_clk;
  460. unsigned long t_ras_rcd_clk;
  461. unsigned long t_rcd_clk;
  462. unsigned long t_rfc_clk;
  463. unsigned long plb_check;
  464. unsigned char cas_bit;
  465. unsigned long cas_index;
  466. unsigned char cas_2_0_available;
  467. unsigned char cas_2_5_available;
  468. unsigned char cas_3_0_available;
  469. unsigned long cycle_time_ns_x_10[3];
  470. unsigned long tcyc_3_0_ns_x_10;
  471. unsigned long tcyc_2_5_ns_x_10;
  472. unsigned long tcyc_2_0_ns_x_10;
  473. unsigned long tcyc_reg;
  474. unsigned long bus_period_x_10;
  475. PPC4xx_SYS_INFO sys_info;
  476. unsigned long residue;
  477. /*
  478. * get the board info
  479. */
  480. get_sys_info(&sys_info);
  481. bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
  482. /*
  483. * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
  484. */
  485. mfsdram(SDRAM0_TR0, tr0);
  486. tr0 &= ~(SDRAM_TR0_SDWR_MASK | SDRAM_TR0_SDWD_MASK |
  487. SDRAM_TR0_SDCL_MASK | SDRAM_TR0_SDPA_MASK |
  488. SDRAM_TR0_SDCP_MASK | SDRAM_TR0_SDLD_MASK |
  489. SDRAM_TR0_SDRA_MASK | SDRAM_TR0_SDRD_MASK);
  490. /*
  491. * initialization
  492. */
  493. wcsbc = 0;
  494. t_rp_ns = 0;
  495. t_rcd_ns = 0;
  496. t_ras_ns = 0;
  497. cas_2_0_available = true;
  498. cas_2_5_available = true;
  499. cas_3_0_available = true;
  500. tcyc_2_0_ns_x_10 = 0;
  501. tcyc_2_5_ns_x_10 = 0;
  502. tcyc_3_0_ns_x_10 = 0;
  503. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  504. if (dimm_populated[dimm_num] == true) {
  505. wcsbc = spd_read(iic0_dimm_addr[dimm_num], 15);
  506. t_rp_ns = spd_read(iic0_dimm_addr[dimm_num], 27) >> 2;
  507. t_rcd_ns = spd_read(iic0_dimm_addr[dimm_num], 29) >> 2;
  508. t_ras_ns = spd_read(iic0_dimm_addr[dimm_num], 30);
  509. cas_bit = spd_read(iic0_dimm_addr[dimm_num], 18);
  510. for (cas_index = 0; cas_index < 3; cas_index++) {
  511. switch (cas_index) {
  512. case 0:
  513. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
  514. break;
  515. case 1:
  516. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 23);
  517. break;
  518. default:
  519. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 25);
  520. break;
  521. }
  522. if ((tcyc_reg & 0x0F) >= 10) {
  523. printf("ERROR: Tcyc incorrect for DIMM in slot %lu\n",
  524. dimm_num);
  525. spd_ddr_init_hang ();
  526. }
  527. cycle_time_ns_x_10[cas_index] =
  528. (((tcyc_reg & 0xF0) >> 4) * 10) + (tcyc_reg & 0x0F);
  529. }
  530. cas_index = 0;
  531. if ((cas_bit & 0x80) != 0) {
  532. cas_index += 3;
  533. } else if ((cas_bit & 0x40) != 0) {
  534. cas_index += 2;
  535. } else if ((cas_bit & 0x20) != 0) {
  536. cas_index += 1;
  537. }
  538. if (((cas_bit & 0x10) != 0) && (cas_index < 3)) {
  539. tcyc_3_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
  540. cas_index++;
  541. } else {
  542. if (cas_index != 0) {
  543. cas_index++;
  544. }
  545. cas_3_0_available = false;
  546. }
  547. if (((cas_bit & 0x08) != 0) || (cas_index < 3)) {
  548. tcyc_2_5_ns_x_10 = cycle_time_ns_x_10[cas_index];
  549. cas_index++;
  550. } else {
  551. if (cas_index != 0) {
  552. cas_index++;
  553. }
  554. cas_2_5_available = false;
  555. }
  556. if (((cas_bit & 0x04) != 0) || (cas_index < 3)) {
  557. tcyc_2_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
  558. cas_index++;
  559. } else {
  560. if (cas_index != 0) {
  561. cas_index++;
  562. }
  563. cas_2_0_available = false;
  564. }
  565. break;
  566. }
  567. }
  568. /*
  569. * Program SD_WR and SD_WCSBC fields
  570. */
  571. tr0 |= SDRAM_TR0_SDWR_2_CLK; /* Write Recovery: 2 CLK */
  572. switch (wcsbc) {
  573. case 0:
  574. tr0 |= SDRAM_TR0_SDWD_0_CLK;
  575. break;
  576. default:
  577. tr0 |= SDRAM_TR0_SDWD_1_CLK;
  578. break;
  579. }
  580. /*
  581. * Program SD_CASL field
  582. */
  583. if ((cas_2_0_available == true) &&
  584. (bus_period_x_10 >= tcyc_2_0_ns_x_10)) {
  585. tr0 |= SDRAM_TR0_SDCL_2_0_CLK;
  586. } else if ((cas_2_5_available == true) &&
  587. (bus_period_x_10 >= tcyc_2_5_ns_x_10)) {
  588. tr0 |= SDRAM_TR0_SDCL_2_5_CLK;
  589. } else if ((cas_3_0_available == true) &&
  590. (bus_period_x_10 >= tcyc_3_0_ns_x_10)) {
  591. tr0 |= SDRAM_TR0_SDCL_3_0_CLK;
  592. } else {
  593. printf("ERROR: No supported CAS latency with the installed DIMMs.\n");
  594. printf("Only CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");
  595. printf("Make sure the PLB speed is within the supported range.\n");
  596. spd_ddr_init_hang ();
  597. }
  598. /*
  599. * Calculate Trp in clock cycles and round up if necessary
  600. * Program SD_PTA field
  601. */
  602. t_rp_clk = sys_info.freqPLB * t_rp_ns / ONE_BILLION;
  603. plb_check = ONE_BILLION * t_rp_clk / t_rp_ns;
  604. if (sys_info.freqPLB != plb_check) {
  605. t_rp_clk++;
  606. }
  607. switch ((unsigned long)t_rp_clk) {
  608. case 0:
  609. case 1:
  610. case 2:
  611. tr0 |= SDRAM_TR0_SDPA_2_CLK;
  612. break;
  613. case 3:
  614. tr0 |= SDRAM_TR0_SDPA_3_CLK;
  615. break;
  616. default:
  617. tr0 |= SDRAM_TR0_SDPA_4_CLK;
  618. break;
  619. }
  620. /*
  621. * Program SD_CTP field
  622. */
  623. t_ras_rcd_clk = sys_info.freqPLB * (t_ras_ns - t_rcd_ns) / ONE_BILLION;
  624. plb_check = ONE_BILLION * t_ras_rcd_clk / (t_ras_ns - t_rcd_ns);
  625. if (sys_info.freqPLB != plb_check) {
  626. t_ras_rcd_clk++;
  627. }
  628. switch (t_ras_rcd_clk) {
  629. case 0:
  630. case 1:
  631. case 2:
  632. tr0 |= SDRAM_TR0_SDCP_2_CLK;
  633. break;
  634. case 3:
  635. tr0 |= SDRAM_TR0_SDCP_3_CLK;
  636. break;
  637. case 4:
  638. tr0 |= SDRAM_TR0_SDCP_4_CLK;
  639. break;
  640. default:
  641. tr0 |= SDRAM_TR0_SDCP_5_CLK;
  642. break;
  643. }
  644. /*
  645. * Program SD_LDF field
  646. */
  647. tr0 |= SDRAM_TR0_SDLD_2_CLK;
  648. /*
  649. * Program SD_RFTA field
  650. * FIXME tRFC hardcoded as 75 nanoseconds
  651. */
  652. t_rfc_clk = sys_info.freqPLB / (ONE_BILLION / 75);
  653. residue = sys_info.freqPLB % (ONE_BILLION / 75);
  654. if (residue >= (ONE_BILLION / 150)) {
  655. t_rfc_clk++;
  656. }
  657. switch (t_rfc_clk) {
  658. case 0:
  659. case 1:
  660. case 2:
  661. case 3:
  662. case 4:
  663. case 5:
  664. case 6:
  665. tr0 |= SDRAM_TR0_SDRA_6_CLK;
  666. break;
  667. case 7:
  668. tr0 |= SDRAM_TR0_SDRA_7_CLK;
  669. break;
  670. case 8:
  671. tr0 |= SDRAM_TR0_SDRA_8_CLK;
  672. break;
  673. case 9:
  674. tr0 |= SDRAM_TR0_SDRA_9_CLK;
  675. break;
  676. case 10:
  677. tr0 |= SDRAM_TR0_SDRA_10_CLK;
  678. break;
  679. case 11:
  680. tr0 |= SDRAM_TR0_SDRA_11_CLK;
  681. break;
  682. case 12:
  683. tr0 |= SDRAM_TR0_SDRA_12_CLK;
  684. break;
  685. default:
  686. tr0 |= SDRAM_TR0_SDRA_13_CLK;
  687. break;
  688. }
  689. /*
  690. * Program SD_RCD field
  691. */
  692. t_rcd_clk = sys_info.freqPLB * t_rcd_ns / ONE_BILLION;
  693. plb_check = ONE_BILLION * t_rcd_clk / t_rcd_ns;
  694. if (sys_info.freqPLB != plb_check) {
  695. t_rcd_clk++;
  696. }
  697. switch (t_rcd_clk) {
  698. case 0:
  699. case 1:
  700. case 2:
  701. tr0 |= SDRAM_TR0_SDRD_2_CLK;
  702. break;
  703. case 3:
  704. tr0 |= SDRAM_TR0_SDRD_3_CLK;
  705. break;
  706. default:
  707. tr0 |= SDRAM_TR0_SDRD_4_CLK;
  708. break;
  709. }
  710. debug("tr0: %lx\n", tr0);
  711. mtsdram(SDRAM0_TR0, tr0);
  712. }
  713. static int short_mem_test(void)
  714. {
  715. unsigned long i, j;
  716. unsigned long bxcr_num;
  717. unsigned long *membase;
  718. const unsigned long test[NUMMEMTESTS][NUMMEMWORDS] = {
  719. {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
  720. 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF},
  721. {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
  722. 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},
  723. {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
  724. 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555},
  725. {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
  726. 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA},
  727. {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
  728. 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A},
  729. {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
  730. 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5},
  731. {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
  732. 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA},
  733. {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
  734. 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55}};
  735. for (bxcr_num = 0; bxcr_num < MAXBXCR; bxcr_num++) {
  736. mtdcr(SDRAM0_CFGADDR, SDRAM0_B0CR + (bxcr_num << 2));
  737. if ((mfdcr(SDRAM0_CFGDATA) & SDRAM_BXCR_SDBE) == SDRAM_BXCR_SDBE) {
  738. /* Bank is enabled */
  739. membase = (unsigned long*)
  740. (mfdcr(SDRAM0_CFGDATA) & SDRAM_BXCR_SDBA_MASK);
  741. /*
  742. * Run the short memory test
  743. */
  744. for (i = 0; i < NUMMEMTESTS; i++) {
  745. for (j = 0; j < NUMMEMWORDS; j++) {
  746. /* printf("bank enabled base:%x\n", &membase[j]); */
  747. membase[j] = test[i][j];
  748. ppcDcbf((unsigned long)&(membase[j]));
  749. }
  750. for (j = 0; j < NUMMEMWORDS; j++) {
  751. if (membase[j] != test[i][j]) {
  752. ppcDcbf((unsigned long)&(membase[j]));
  753. return 0;
  754. }
  755. ppcDcbf((unsigned long)&(membase[j]));
  756. }
  757. if (j < NUMMEMWORDS)
  758. return 0;
  759. }
  760. /*
  761. * see if the rdclt value passed
  762. */
  763. if (i < NUMMEMTESTS)
  764. return 0;
  765. }
  766. }
  767. return 1;
  768. }
  769. static void program_tr1(void)
  770. {
  771. unsigned long tr0;
  772. unsigned long tr1;
  773. unsigned long cfg0;
  774. unsigned long ecc_temp;
  775. unsigned long dlycal;
  776. unsigned long dly_val;
  777. unsigned long k;
  778. unsigned long max_pass_length;
  779. unsigned long current_pass_length;
  780. unsigned long current_fail_length;
  781. unsigned long current_start;
  782. unsigned long rdclt;
  783. unsigned long rdclt_offset;
  784. long max_start;
  785. long max_end;
  786. long rdclt_average;
  787. unsigned char window_found;
  788. unsigned char fail_found;
  789. unsigned char pass_found;
  790. PPC4xx_SYS_INFO sys_info;
  791. /*
  792. * get the board info
  793. */
  794. get_sys_info(&sys_info);
  795. /*
  796. * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
  797. */
  798. mfsdram(SDRAM0_TR1, tr1);
  799. tr1 &= ~(SDRAM_TR1_RDSS_MASK | SDRAM_TR1_RDSL_MASK |
  800. SDRAM_TR1_RDCD_MASK | SDRAM_TR1_RDCT_MASK);
  801. mfsdram(SDRAM0_TR0, tr0);
  802. if (((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) &&
  803. (sys_info.freqPLB > 100000000)) {
  804. tr1 |= SDRAM_TR1_RDSS_TR2;
  805. tr1 |= SDRAM_TR1_RDSL_STAGE3;
  806. tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
  807. } else {
  808. tr1 |= SDRAM_TR1_RDSS_TR1;
  809. tr1 |= SDRAM_TR1_RDSL_STAGE2;
  810. tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
  811. }
  812. /*
  813. * save CFG0 ECC setting to a temporary variable and turn ECC off
  814. */
  815. mfsdram(SDRAM0_CFG0, cfg0);
  816. ecc_temp = cfg0 & SDRAM_CFG0_MCHK_MASK;
  817. mtsdram(SDRAM0_CFG0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | SDRAM_CFG0_MCHK_NON);
  818. /*
  819. * get the delay line calibration register value
  820. */
  821. mfsdram(SDRAM0_DLYCAL, dlycal);
  822. dly_val = SDRAM_DLYCAL_DLCV_DECODE(dlycal) << 2;
  823. max_pass_length = 0;
  824. max_start = 0;
  825. max_end = 0;
  826. current_pass_length = 0;
  827. current_fail_length = 0;
  828. current_start = 0;
  829. rdclt_offset = 0;
  830. window_found = false;
  831. fail_found = false;
  832. pass_found = false;
  833. debug("Starting memory test ");
  834. for (k = 0; k < NUMHALFCYCLES; k++) {
  835. for (rdclt = 0; rdclt < dly_val; rdclt++) {
  836. /*
  837. * Set the timing reg for the test.
  838. */
  839. mtsdram(SDRAM0_TR1, (tr1 | SDRAM_TR1_RDCT_ENCODE(rdclt)));
  840. if (short_mem_test()) {
  841. if (fail_found == true) {
  842. pass_found = true;
  843. if (current_pass_length == 0) {
  844. current_start = rdclt_offset + rdclt;
  845. }
  846. current_fail_length = 0;
  847. current_pass_length++;
  848. if (current_pass_length > max_pass_length) {
  849. max_pass_length = current_pass_length;
  850. max_start = current_start;
  851. max_end = rdclt_offset + rdclt;
  852. }
  853. }
  854. } else {
  855. current_pass_length = 0;
  856. current_fail_length++;
  857. if (current_fail_length >= (dly_val>>2)) {
  858. if (fail_found == false) {
  859. fail_found = true;
  860. } else if (pass_found == true) {
  861. window_found = true;
  862. break;
  863. }
  864. }
  865. }
  866. }
  867. debug(".");
  868. if (window_found == true)
  869. break;
  870. tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
  871. rdclt_offset += dly_val;
  872. }
  873. debug("\n");
  874. /*
  875. * make sure we find the window
  876. */
  877. if (window_found == false) {
  878. printf("ERROR: Cannot determine a common read delay.\n");
  879. spd_ddr_init_hang ();
  880. }
  881. /*
  882. * restore the orignal ECC setting
  883. */
  884. mtsdram(SDRAM0_CFG0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | ecc_temp);
  885. /*
  886. * set the SDRAM TR1 RDCD value
  887. */
  888. tr1 &= ~SDRAM_TR1_RDCD_MASK;
  889. if ((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) {
  890. tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
  891. } else {
  892. tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
  893. }
  894. /*
  895. * set the SDRAM TR1 RDCLT value
  896. */
  897. tr1 &= ~SDRAM_TR1_RDCT_MASK;
  898. while (max_end >= (dly_val << 1)) {
  899. max_end -= (dly_val << 1);
  900. max_start -= (dly_val << 1);
  901. }
  902. rdclt_average = ((max_start + max_end) >> 1);
  903. if (rdclt_average < 0) {
  904. rdclt_average = 0;
  905. }
  906. if (rdclt_average >= dly_val) {
  907. rdclt_average -= dly_val;
  908. tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
  909. }
  910. tr1 |= SDRAM_TR1_RDCT_ENCODE(rdclt_average);
  911. debug("tr1: %lx\n", tr1);
  912. /*
  913. * program SDRAM Timing Register 1 TR1
  914. */
  915. mtsdram(SDRAM0_TR1, tr1);
  916. }
  917. static unsigned long program_bxcr(unsigned long *dimm_populated,
  918. unsigned char *iic0_dimm_addr,
  919. unsigned long num_dimm_banks)
  920. {
  921. unsigned long dimm_num;
  922. unsigned long bank_base_addr;
  923. unsigned long cr;
  924. unsigned long i;
  925. unsigned long j;
  926. unsigned long temp;
  927. unsigned char num_row_addr;
  928. unsigned char num_col_addr;
  929. unsigned char num_banks;
  930. unsigned char bank_size_id;
  931. unsigned long ctrl_bank_num[MAXBANKS];
  932. unsigned long bx_cr_num;
  933. unsigned long largest_size_index;
  934. unsigned long largest_size;
  935. unsigned long current_size_index;
  936. BANKPARMS bank_parms[MAXBXCR];
  937. unsigned long sorted_bank_num[MAXBXCR]; /* DDR Controller bank number table (sorted by size) */
  938. unsigned long sorted_bank_size[MAXBXCR]; /* DDR Controller bank size table (sorted by size)*/
  939. /*
  940. * Set the BxCR regs. First, wipe out the bank config registers.
  941. */
  942. for (bx_cr_num = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
  943. mtdcr(SDRAM0_CFGADDR, SDRAM0_B0CR + (bx_cr_num << 2));
  944. mtdcr(SDRAM0_CFGDATA, 0x00000000);
  945. bank_parms[bx_cr_num].bank_size_bytes = 0;
  946. }
  947. #ifdef CONFIG_BAMBOO
  948. /*
  949. * This next section is hardware dependent and must be programmed
  950. * to match the hardware. For bamboo, the following holds...
  951. * 1. SDRAM0_B0CR: Bank 0 of dimm 0 ctrl_bank_num : 0 (soldered onboard)
  952. * 2. SDRAM0_B1CR: Bank 0 of dimm 1 ctrl_bank_num : 1
  953. * 3. SDRAM0_B2CR: Bank 1 of dimm 1 ctrl_bank_num : 1
  954. * 4. SDRAM0_B3CR: Bank 0 of dimm 2 ctrl_bank_num : 3
  955. * ctrl_bank_num corresponds to the first usable DDR controller bank number by DIMM
  956. */
  957. ctrl_bank_num[0] = 0;
  958. ctrl_bank_num[1] = 1;
  959. ctrl_bank_num[2] = 3;
  960. #else
  961. /*
  962. * Ocotea, Ebony and the other IBM/AMCC eval boards have
  963. * 2 DIMM slots with each max 2 banks
  964. */
  965. ctrl_bank_num[0] = 0;
  966. ctrl_bank_num[1] = 2;
  967. #endif
  968. /*
  969. * reset the bank_base address
  970. */
  971. bank_base_addr = CONFIG_SYS_SDRAM_BASE;
  972. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  973. if (dimm_populated[dimm_num] == true) {
  974. num_row_addr = spd_read(iic0_dimm_addr[dimm_num], 3);
  975. num_col_addr = spd_read(iic0_dimm_addr[dimm_num], 4);
  976. num_banks = spd_read(iic0_dimm_addr[dimm_num], 5);
  977. bank_size_id = spd_read(iic0_dimm_addr[dimm_num], 31);
  978. debug("DIMM%ld: row=%d col=%d banks=%d\n", dimm_num,
  979. num_row_addr, num_col_addr, num_banks);
  980. /*
  981. * Set the SDRAM0_BxCR regs
  982. */
  983. cr = 0;
  984. switch (bank_size_id) {
  985. case 0x02:
  986. cr |= SDRAM_BXCR_SDSZ_8;
  987. break;
  988. case 0x04:
  989. cr |= SDRAM_BXCR_SDSZ_16;
  990. break;
  991. case 0x08:
  992. cr |= SDRAM_BXCR_SDSZ_32;
  993. break;
  994. case 0x10:
  995. cr |= SDRAM_BXCR_SDSZ_64;
  996. break;
  997. case 0x20:
  998. cr |= SDRAM_BXCR_SDSZ_128;
  999. break;
  1000. case 0x40:
  1001. cr |= SDRAM_BXCR_SDSZ_256;
  1002. break;
  1003. case 0x80:
  1004. cr |= SDRAM_BXCR_SDSZ_512;
  1005. break;
  1006. default:
  1007. printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
  1008. dimm_num);
  1009. printf("ERROR: Unsupported value for the banksize: %d.\n",
  1010. bank_size_id);
  1011. printf("Replace the DIMM module with a supported DIMM.\n\n");
  1012. spd_ddr_init_hang ();
  1013. }
  1014. switch (num_col_addr) {
  1015. case 0x08:
  1016. cr |= SDRAM_BXCR_SDAM_1;
  1017. break;
  1018. case 0x09:
  1019. cr |= SDRAM_BXCR_SDAM_2;
  1020. break;
  1021. case 0x0A:
  1022. cr |= SDRAM_BXCR_SDAM_3;
  1023. break;
  1024. case 0x0B:
  1025. cr |= SDRAM_BXCR_SDAM_4;
  1026. break;
  1027. default:
  1028. printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
  1029. dimm_num);
  1030. printf("ERROR: Unsupported value for number of "
  1031. "column addresses: %d.\n", num_col_addr);
  1032. printf("Replace the DIMM module with a supported DIMM.\n\n");
  1033. spd_ddr_init_hang ();
  1034. }
  1035. /*
  1036. * enable the bank
  1037. */
  1038. cr |= SDRAM_BXCR_SDBE;
  1039. for (i = 0; i < num_banks; i++) {
  1040. bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes =
  1041. (4 << 20) * bank_size_id;
  1042. bank_parms[ctrl_bank_num[dimm_num]+i].cr = cr;
  1043. debug("DIMM%ld-bank %ld (SDRAM0_B%ldCR): "
  1044. "bank_size_bytes=%ld\n",
  1045. dimm_num, i,
  1046. ctrl_bank_num[dimm_num] + i,
  1047. bank_parms[ctrl_bank_num[dimm_num] + i].bank_size_bytes);
  1048. }
  1049. }
  1050. }
  1051. /* Initialize sort tables */
  1052. for (i = 0; i < MAXBXCR; i++) {
  1053. sorted_bank_num[i] = i;
  1054. sorted_bank_size[i] = bank_parms[i].bank_size_bytes;
  1055. }
  1056. for (i = 0; i < MAXBXCR-1; i++) {
  1057. largest_size = sorted_bank_size[i];
  1058. largest_size_index = 255;
  1059. /* Find the largest remaining value */
  1060. for (j = i + 1; j < MAXBXCR; j++) {
  1061. if (sorted_bank_size[j] > largest_size) {
  1062. /* Save largest remaining value and its index */
  1063. largest_size = sorted_bank_size[j];
  1064. largest_size_index = j;
  1065. }
  1066. }
  1067. if (largest_size_index != 255) {
  1068. /* Swap the current and largest values */
  1069. current_size_index = sorted_bank_num[largest_size_index];
  1070. sorted_bank_size[largest_size_index] = sorted_bank_size[i];
  1071. sorted_bank_size[i] = largest_size;
  1072. sorted_bank_num[largest_size_index] = sorted_bank_num[i];
  1073. sorted_bank_num[i] = current_size_index;
  1074. }
  1075. }
  1076. /* Set the SDRAM0_BxCR regs thanks to sort tables */
  1077. for (bx_cr_num = 0, bank_base_addr = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
  1078. if (bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes) {
  1079. mtdcr(SDRAM0_CFGADDR, SDRAM0_B0CR + (sorted_bank_num[bx_cr_num] << 2));
  1080. temp = mfdcr(SDRAM0_CFGDATA) & ~(SDRAM_BXCR_SDBA_MASK | SDRAM_BXCR_SDSZ_MASK |
  1081. SDRAM_BXCR_SDAM_MASK | SDRAM_BXCR_SDBE);
  1082. temp = temp | (bank_base_addr & SDRAM_BXCR_SDBA_MASK) |
  1083. bank_parms[sorted_bank_num[bx_cr_num]].cr;
  1084. mtdcr(SDRAM0_CFGDATA, temp);
  1085. bank_base_addr += bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes;
  1086. debug("SDRAM0_B%ldCR=0x%08lx\n",
  1087. sorted_bank_num[bx_cr_num], temp);
  1088. }
  1089. }
  1090. return(bank_base_addr);
  1091. }
  1092. #endif /* CONFIG_SPD_EEPROM */