44x_spd_ddr.c 31 KB

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