44x_spd_ddr.c 31 KB

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