44x_spd_ddr.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  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. #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(SDR0_SRST, SDR0_SRST_DMC);
  175. mtsdr(SDR0_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(SDRAM0_CLKTR, 0x40000000);
  206. /*
  207. * delay to ensure 200 usec has elapsed
  208. */
  209. udelay(400);
  210. /*
  211. * enable the memory controller
  212. */
  213. mfsdram(SDRAM0_CFG0, cfg0);
  214. mtsdram(SDRAM0_CFG0, cfg0 | SDRAM_CFG0_DCEN);
  215. /*
  216. * wait for SDRAM_CFG0_DC_EN to complete
  217. */
  218. while (1) {
  219. mfsdram(SDRAM0_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. /*
  336. * get Memory Controller Options 0 data
  337. */
  338. mfsdram(SDRAM0_CFG0, cfg0);
  339. /*
  340. * clear bits
  341. */
  342. cfg0 &= ~(SDRAM_CFG0_DCEN | SDRAM_CFG0_MCHK_MASK |
  343. SDRAM_CFG0_RDEN | SDRAM_CFG0_PMUD |
  344. SDRAM_CFG0_DMWD_MASK |
  345. SDRAM_CFG0_UIOS_MASK | SDRAM_CFG0_PDP);
  346. /*
  347. * FIXME: assume the DDR SDRAMs in both banks are the same
  348. */
  349. ecc_enabled = TRUE;
  350. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  351. if (dimm_populated[dimm_num] == TRUE) {
  352. ecc = spd_read(iic0_dimm_addr[dimm_num], 11);
  353. if (ecc != 0x02) {
  354. ecc_enabled = FALSE;
  355. }
  356. /*
  357. * program Registered DIMM Enable
  358. */
  359. attributes = spd_read(iic0_dimm_addr[dimm_num], 21);
  360. if ((attributes & 0x02) != 0x00) {
  361. cfg0 |= SDRAM_CFG0_RDEN;
  362. }
  363. /*
  364. * program DDR SDRAM Data Width
  365. */
  366. data_width =
  367. (unsigned long)spd_read(iic0_dimm_addr[dimm_num],6) +
  368. (((unsigned long)spd_read(iic0_dimm_addr[dimm_num],7)) << 8);
  369. if (data_width == 64 || data_width == 72) {
  370. cfg0 |= SDRAM_CFG0_DMWD_64;
  371. } else if (data_width == 32 || data_width == 40) {
  372. cfg0 |= SDRAM_CFG0_DMWD_32;
  373. } else {
  374. printf("WARNING: DIMM with datawidth of %lu bits.\n",
  375. data_width);
  376. printf("Only DIMMs with 32 or 64 bit datawidths supported.\n");
  377. spd_ddr_init_hang ();
  378. }
  379. break;
  380. }
  381. }
  382. /*
  383. * program Memory Data Error Checking
  384. */
  385. if (ecc_enabled == TRUE) {
  386. cfg0 |= SDRAM_CFG0_MCHK_GEN;
  387. } else {
  388. cfg0 |= SDRAM_CFG0_MCHK_NON;
  389. }
  390. /*
  391. * program Page Management Unit (0 == enabled)
  392. */
  393. cfg0 &= ~SDRAM_CFG0_PMUD;
  394. /*
  395. * program Memory Controller Options 0
  396. * Note: DCEN must be enabled after all DDR SDRAM controller
  397. * configuration registers get initialized.
  398. */
  399. mtsdram(SDRAM0_CFG0, cfg0);
  400. }
  401. static void program_cfg1(unsigned long *dimm_populated,
  402. unsigned char *iic0_dimm_addr,
  403. unsigned long num_dimm_banks)
  404. {
  405. unsigned long cfg1;
  406. mfsdram(SDRAM0_CFG1, cfg1);
  407. /*
  408. * Self-refresh exit, disable PM
  409. */
  410. cfg1 &= ~(SDRAM_CFG1_SRE | SDRAM_CFG1_PMEN);
  411. /*
  412. * program Memory Controller Options 1
  413. */
  414. mtsdram(SDRAM0_CFG1, cfg1);
  415. }
  416. static void program_rtr(unsigned long *dimm_populated,
  417. unsigned char *iic0_dimm_addr,
  418. unsigned long num_dimm_banks)
  419. {
  420. unsigned long dimm_num;
  421. unsigned long bus_period_x_10;
  422. unsigned long refresh_rate = 0;
  423. unsigned char refresh_rate_type;
  424. unsigned long refresh_interval;
  425. unsigned long sdram_rtr;
  426. PPC4xx_SYS_INFO sys_info;
  427. /*
  428. * get the board info
  429. */
  430. get_sys_info(&sys_info);
  431. bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
  432. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  433. if (dimm_populated[dimm_num] == TRUE) {
  434. refresh_rate_type = 0x7F & spd_read(iic0_dimm_addr[dimm_num], 12);
  435. switch (refresh_rate_type) {
  436. case 0x00:
  437. refresh_rate = 15625;
  438. break;
  439. case 0x01:
  440. refresh_rate = 15625/4;
  441. break;
  442. case 0x02:
  443. refresh_rate = 15625/2;
  444. break;
  445. case 0x03:
  446. refresh_rate = 15626*2;
  447. break;
  448. case 0x04:
  449. refresh_rate = 15625*4;
  450. break;
  451. case 0x05:
  452. refresh_rate = 15625*8;
  453. break;
  454. default:
  455. printf("ERROR: DIMM %lu, unsupported refresh rate/type.\n",
  456. dimm_num);
  457. printf("Replace the DIMM module with a supported DIMM.\n");
  458. break;
  459. }
  460. break;
  461. }
  462. }
  463. refresh_interval = refresh_rate * 10 / bus_period_x_10;
  464. sdram_rtr = (refresh_interval & 0x3ff8) << 16;
  465. /*
  466. * program Refresh Timer Register (SDRAM0_RTR)
  467. */
  468. mtsdram(SDRAM0_RTR, sdram_rtr);
  469. }
  470. static void program_tr0(unsigned long *dimm_populated,
  471. unsigned char *iic0_dimm_addr,
  472. unsigned long num_dimm_banks)
  473. {
  474. unsigned long dimm_num;
  475. unsigned long tr0;
  476. unsigned char wcsbc;
  477. unsigned char t_rp_ns;
  478. unsigned char t_rcd_ns;
  479. unsigned char t_ras_ns;
  480. unsigned long t_rp_clk;
  481. unsigned long t_ras_rcd_clk;
  482. unsigned long t_rcd_clk;
  483. unsigned long t_rfc_clk;
  484. unsigned long plb_check;
  485. unsigned char cas_bit;
  486. unsigned long cas_index;
  487. unsigned char cas_2_0_available;
  488. unsigned char cas_2_5_available;
  489. unsigned char cas_3_0_available;
  490. unsigned long cycle_time_ns_x_10[3];
  491. unsigned long tcyc_3_0_ns_x_10;
  492. unsigned long tcyc_2_5_ns_x_10;
  493. unsigned long tcyc_2_0_ns_x_10;
  494. unsigned long tcyc_reg;
  495. unsigned long bus_period_x_10;
  496. PPC4xx_SYS_INFO sys_info;
  497. unsigned long residue;
  498. /*
  499. * get the board info
  500. */
  501. get_sys_info(&sys_info);
  502. bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
  503. /*
  504. * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
  505. */
  506. mfsdram(SDRAM0_TR0, tr0);
  507. tr0 &= ~(SDRAM_TR0_SDWR_MASK | SDRAM_TR0_SDWD_MASK |
  508. SDRAM_TR0_SDCL_MASK | SDRAM_TR0_SDPA_MASK |
  509. SDRAM_TR0_SDCP_MASK | SDRAM_TR0_SDLD_MASK |
  510. SDRAM_TR0_SDRA_MASK | SDRAM_TR0_SDRD_MASK);
  511. /*
  512. * initialization
  513. */
  514. wcsbc = 0;
  515. t_rp_ns = 0;
  516. t_rcd_ns = 0;
  517. t_ras_ns = 0;
  518. cas_2_0_available = TRUE;
  519. cas_2_5_available = TRUE;
  520. cas_3_0_available = TRUE;
  521. tcyc_2_0_ns_x_10 = 0;
  522. tcyc_2_5_ns_x_10 = 0;
  523. tcyc_3_0_ns_x_10 = 0;
  524. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  525. if (dimm_populated[dimm_num] == TRUE) {
  526. wcsbc = spd_read(iic0_dimm_addr[dimm_num], 15);
  527. t_rp_ns = spd_read(iic0_dimm_addr[dimm_num], 27) >> 2;
  528. t_rcd_ns = spd_read(iic0_dimm_addr[dimm_num], 29) >> 2;
  529. t_ras_ns = spd_read(iic0_dimm_addr[dimm_num], 30);
  530. cas_bit = spd_read(iic0_dimm_addr[dimm_num], 18);
  531. for (cas_index = 0; cas_index < 3; cas_index++) {
  532. switch (cas_index) {
  533. case 0:
  534. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
  535. break;
  536. case 1:
  537. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 23);
  538. break;
  539. default:
  540. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 25);
  541. break;
  542. }
  543. if ((tcyc_reg & 0x0F) >= 10) {
  544. printf("ERROR: Tcyc incorrect for DIMM in slot %lu\n",
  545. dimm_num);
  546. spd_ddr_init_hang ();
  547. }
  548. cycle_time_ns_x_10[cas_index] =
  549. (((tcyc_reg & 0xF0) >> 4) * 10) + (tcyc_reg & 0x0F);
  550. }
  551. cas_index = 0;
  552. if ((cas_bit & 0x80) != 0) {
  553. cas_index += 3;
  554. } else if ((cas_bit & 0x40) != 0) {
  555. cas_index += 2;
  556. } else if ((cas_bit & 0x20) != 0) {
  557. cas_index += 1;
  558. }
  559. if (((cas_bit & 0x10) != 0) && (cas_index < 3)) {
  560. tcyc_3_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
  561. cas_index++;
  562. } else {
  563. if (cas_index != 0) {
  564. cas_index++;
  565. }
  566. cas_3_0_available = FALSE;
  567. }
  568. if (((cas_bit & 0x08) != 0) || (cas_index < 3)) {
  569. tcyc_2_5_ns_x_10 = cycle_time_ns_x_10[cas_index];
  570. cas_index++;
  571. } else {
  572. if (cas_index != 0) {
  573. cas_index++;
  574. }
  575. cas_2_5_available = FALSE;
  576. }
  577. if (((cas_bit & 0x04) != 0) || (cas_index < 3)) {
  578. tcyc_2_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
  579. cas_index++;
  580. } else {
  581. if (cas_index != 0) {
  582. cas_index++;
  583. }
  584. cas_2_0_available = FALSE;
  585. }
  586. break;
  587. }
  588. }
  589. /*
  590. * Program SD_WR and SD_WCSBC fields
  591. */
  592. tr0 |= SDRAM_TR0_SDWR_2_CLK; /* Write Recovery: 2 CLK */
  593. switch (wcsbc) {
  594. case 0:
  595. tr0 |= SDRAM_TR0_SDWD_0_CLK;
  596. break;
  597. default:
  598. tr0 |= SDRAM_TR0_SDWD_1_CLK;
  599. break;
  600. }
  601. /*
  602. * Program SD_CASL field
  603. */
  604. if ((cas_2_0_available == TRUE) &&
  605. (bus_period_x_10 >= tcyc_2_0_ns_x_10)) {
  606. tr0 |= SDRAM_TR0_SDCL_2_0_CLK;
  607. } else if ((cas_2_5_available == TRUE) &&
  608. (bus_period_x_10 >= tcyc_2_5_ns_x_10)) {
  609. tr0 |= SDRAM_TR0_SDCL_2_5_CLK;
  610. } else if ((cas_3_0_available == TRUE) &&
  611. (bus_period_x_10 >= tcyc_3_0_ns_x_10)) {
  612. tr0 |= SDRAM_TR0_SDCL_3_0_CLK;
  613. } else {
  614. printf("ERROR: No supported CAS latency with the installed DIMMs.\n");
  615. printf("Only CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");
  616. printf("Make sure the PLB speed is within the supported range.\n");
  617. spd_ddr_init_hang ();
  618. }
  619. /*
  620. * Calculate Trp in clock cycles and round up if necessary
  621. * Program SD_PTA field
  622. */
  623. t_rp_clk = sys_info.freqPLB * t_rp_ns / ONE_BILLION;
  624. plb_check = ONE_BILLION * t_rp_clk / t_rp_ns;
  625. if (sys_info.freqPLB != plb_check) {
  626. t_rp_clk++;
  627. }
  628. switch ((unsigned long)t_rp_clk) {
  629. case 0:
  630. case 1:
  631. case 2:
  632. tr0 |= SDRAM_TR0_SDPA_2_CLK;
  633. break;
  634. case 3:
  635. tr0 |= SDRAM_TR0_SDPA_3_CLK;
  636. break;
  637. default:
  638. tr0 |= SDRAM_TR0_SDPA_4_CLK;
  639. break;
  640. }
  641. /*
  642. * Program SD_CTP field
  643. */
  644. t_ras_rcd_clk = sys_info.freqPLB * (t_ras_ns - t_rcd_ns) / ONE_BILLION;
  645. plb_check = ONE_BILLION * t_ras_rcd_clk / (t_ras_ns - t_rcd_ns);
  646. if (sys_info.freqPLB != plb_check) {
  647. t_ras_rcd_clk++;
  648. }
  649. switch (t_ras_rcd_clk) {
  650. case 0:
  651. case 1:
  652. case 2:
  653. tr0 |= SDRAM_TR0_SDCP_2_CLK;
  654. break;
  655. case 3:
  656. tr0 |= SDRAM_TR0_SDCP_3_CLK;
  657. break;
  658. case 4:
  659. tr0 |= SDRAM_TR0_SDCP_4_CLK;
  660. break;
  661. default:
  662. tr0 |= SDRAM_TR0_SDCP_5_CLK;
  663. break;
  664. }
  665. /*
  666. * Program SD_LDF field
  667. */
  668. tr0 |= SDRAM_TR0_SDLD_2_CLK;
  669. /*
  670. * Program SD_RFTA field
  671. * FIXME tRFC hardcoded as 75 nanoseconds
  672. */
  673. t_rfc_clk = sys_info.freqPLB / (ONE_BILLION / 75);
  674. residue = sys_info.freqPLB % (ONE_BILLION / 75);
  675. if (residue >= (ONE_BILLION / 150)) {
  676. t_rfc_clk++;
  677. }
  678. switch (t_rfc_clk) {
  679. case 0:
  680. case 1:
  681. case 2:
  682. case 3:
  683. case 4:
  684. case 5:
  685. case 6:
  686. tr0 |= SDRAM_TR0_SDRA_6_CLK;
  687. break;
  688. case 7:
  689. tr0 |= SDRAM_TR0_SDRA_7_CLK;
  690. break;
  691. case 8:
  692. tr0 |= SDRAM_TR0_SDRA_8_CLK;
  693. break;
  694. case 9:
  695. tr0 |= SDRAM_TR0_SDRA_9_CLK;
  696. break;
  697. case 10:
  698. tr0 |= SDRAM_TR0_SDRA_10_CLK;
  699. break;
  700. case 11:
  701. tr0 |= SDRAM_TR0_SDRA_11_CLK;
  702. break;
  703. case 12:
  704. tr0 |= SDRAM_TR0_SDRA_12_CLK;
  705. break;
  706. default:
  707. tr0 |= SDRAM_TR0_SDRA_13_CLK;
  708. break;
  709. }
  710. /*
  711. * Program SD_RCD field
  712. */
  713. t_rcd_clk = sys_info.freqPLB * t_rcd_ns / ONE_BILLION;
  714. plb_check = ONE_BILLION * t_rcd_clk / t_rcd_ns;
  715. if (sys_info.freqPLB != plb_check) {
  716. t_rcd_clk++;
  717. }
  718. switch (t_rcd_clk) {
  719. case 0:
  720. case 1:
  721. case 2:
  722. tr0 |= SDRAM_TR0_SDRD_2_CLK;
  723. break;
  724. case 3:
  725. tr0 |= SDRAM_TR0_SDRD_3_CLK;
  726. break;
  727. default:
  728. tr0 |= SDRAM_TR0_SDRD_4_CLK;
  729. break;
  730. }
  731. debug("tr0: %lx\n", tr0);
  732. mtsdram(SDRAM0_TR0, tr0);
  733. }
  734. static int short_mem_test(void)
  735. {
  736. unsigned long i, j;
  737. unsigned long bxcr_num;
  738. unsigned long *membase;
  739. const unsigned long test[NUMMEMTESTS][NUMMEMWORDS] = {
  740. {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
  741. 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF},
  742. {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
  743. 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},
  744. {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
  745. 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555},
  746. {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
  747. 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA},
  748. {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
  749. 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A},
  750. {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
  751. 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5},
  752. {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
  753. 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA},
  754. {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
  755. 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55}};
  756. for (bxcr_num = 0; bxcr_num < MAXBXCR; bxcr_num++) {
  757. mtdcr(SDRAM0_CFGADDR, SDRAM0_B0CR + (bxcr_num << 2));
  758. if ((mfdcr(SDRAM0_CFGDATA) & SDRAM_BXCR_SDBE) == SDRAM_BXCR_SDBE) {
  759. /* Bank is enabled */
  760. membase = (unsigned long*)
  761. (mfdcr(SDRAM0_CFGDATA) & SDRAM_BXCR_SDBA_MASK);
  762. /*
  763. * Run the short memory test
  764. */
  765. for (i = 0; i < NUMMEMTESTS; i++) {
  766. for (j = 0; j < NUMMEMWORDS; j++) {
  767. /* printf("bank enabled base:%x\n", &membase[j]); */
  768. membase[j] = test[i][j];
  769. ppcDcbf((unsigned long)&(membase[j]));
  770. }
  771. for (j = 0; j < NUMMEMWORDS; j++) {
  772. if (membase[j] != test[i][j]) {
  773. ppcDcbf((unsigned long)&(membase[j]));
  774. return 0;
  775. }
  776. ppcDcbf((unsigned long)&(membase[j]));
  777. }
  778. if (j < NUMMEMWORDS)
  779. return 0;
  780. }
  781. /*
  782. * see if the rdclt value passed
  783. */
  784. if (i < NUMMEMTESTS)
  785. return 0;
  786. }
  787. }
  788. return 1;
  789. }
  790. static void program_tr1(void)
  791. {
  792. unsigned long tr0;
  793. unsigned long tr1;
  794. unsigned long cfg0;
  795. unsigned long ecc_temp;
  796. unsigned long dlycal;
  797. unsigned long dly_val;
  798. unsigned long k;
  799. unsigned long max_pass_length;
  800. unsigned long current_pass_length;
  801. unsigned long current_fail_length;
  802. unsigned long current_start;
  803. unsigned long rdclt;
  804. unsigned long rdclt_offset;
  805. long max_start;
  806. long max_end;
  807. long rdclt_average;
  808. unsigned char window_found;
  809. unsigned char fail_found;
  810. unsigned char pass_found;
  811. PPC4xx_SYS_INFO sys_info;
  812. /*
  813. * get the board info
  814. */
  815. get_sys_info(&sys_info);
  816. /*
  817. * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
  818. */
  819. mfsdram(SDRAM0_TR1, tr1);
  820. tr1 &= ~(SDRAM_TR1_RDSS_MASK | SDRAM_TR1_RDSL_MASK |
  821. SDRAM_TR1_RDCD_MASK | SDRAM_TR1_RDCT_MASK);
  822. mfsdram(SDRAM0_TR0, tr0);
  823. if (((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) &&
  824. (sys_info.freqPLB > 100000000)) {
  825. tr1 |= SDRAM_TR1_RDSS_TR2;
  826. tr1 |= SDRAM_TR1_RDSL_STAGE3;
  827. tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
  828. } else {
  829. tr1 |= SDRAM_TR1_RDSS_TR1;
  830. tr1 |= SDRAM_TR1_RDSL_STAGE2;
  831. tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
  832. }
  833. /*
  834. * save CFG0 ECC setting to a temporary variable and turn ECC off
  835. */
  836. mfsdram(SDRAM0_CFG0, cfg0);
  837. ecc_temp = cfg0 & SDRAM_CFG0_MCHK_MASK;
  838. mtsdram(SDRAM0_CFG0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | SDRAM_CFG0_MCHK_NON);
  839. /*
  840. * get the delay line calibration register value
  841. */
  842. mfsdram(SDRAM0_DLYCAL, dlycal);
  843. dly_val = SDRAM_DLYCAL_DLCV_DECODE(dlycal) << 2;
  844. max_pass_length = 0;
  845. max_start = 0;
  846. max_end = 0;
  847. current_pass_length = 0;
  848. current_fail_length = 0;
  849. current_start = 0;
  850. rdclt_offset = 0;
  851. window_found = FALSE;
  852. fail_found = FALSE;
  853. pass_found = FALSE;
  854. debug("Starting memory test ");
  855. for (k = 0; k < NUMHALFCYCLES; k++) {
  856. for (rdclt = 0; rdclt < dly_val; rdclt++) {
  857. /*
  858. * Set the timing reg for the test.
  859. */
  860. mtsdram(SDRAM0_TR1, (tr1 | SDRAM_TR1_RDCT_ENCODE(rdclt)));
  861. if (short_mem_test()) {
  862. if (fail_found == TRUE) {
  863. pass_found = TRUE;
  864. if (current_pass_length == 0) {
  865. current_start = rdclt_offset + rdclt;
  866. }
  867. current_fail_length = 0;
  868. current_pass_length++;
  869. if (current_pass_length > max_pass_length) {
  870. max_pass_length = current_pass_length;
  871. max_start = current_start;
  872. max_end = rdclt_offset + rdclt;
  873. }
  874. }
  875. } else {
  876. current_pass_length = 0;
  877. current_fail_length++;
  878. if (current_fail_length >= (dly_val>>2)) {
  879. if (fail_found == FALSE) {
  880. fail_found = TRUE;
  881. } else if (pass_found == TRUE) {
  882. window_found = TRUE;
  883. break;
  884. }
  885. }
  886. }
  887. }
  888. debug(".");
  889. if (window_found == TRUE) {
  890. break;
  891. }
  892. tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
  893. rdclt_offset += dly_val;
  894. }
  895. debug("\n");
  896. /*
  897. * make sure we find the window
  898. */
  899. if (window_found == FALSE) {
  900. printf("ERROR: Cannot determine a common read delay.\n");
  901. spd_ddr_init_hang ();
  902. }
  903. /*
  904. * restore the orignal ECC setting
  905. */
  906. mtsdram(SDRAM0_CFG0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | ecc_temp);
  907. /*
  908. * set the SDRAM TR1 RDCD value
  909. */
  910. tr1 &= ~SDRAM_TR1_RDCD_MASK;
  911. if ((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) {
  912. tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
  913. } else {
  914. tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
  915. }
  916. /*
  917. * set the SDRAM TR1 RDCLT value
  918. */
  919. tr1 &= ~SDRAM_TR1_RDCT_MASK;
  920. while (max_end >= (dly_val << 1)) {
  921. max_end -= (dly_val << 1);
  922. max_start -= (dly_val << 1);
  923. }
  924. rdclt_average = ((max_start + max_end) >> 1);
  925. if (rdclt_average < 0) {
  926. rdclt_average = 0;
  927. }
  928. if (rdclt_average >= dly_val) {
  929. rdclt_average -= dly_val;
  930. tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
  931. }
  932. tr1 |= SDRAM_TR1_RDCT_ENCODE(rdclt_average);
  933. debug("tr1: %lx\n", tr1);
  934. /*
  935. * program SDRAM Timing Register 1 TR1
  936. */
  937. mtsdram(SDRAM0_TR1, tr1);
  938. }
  939. static unsigned long program_bxcr(unsigned long *dimm_populated,
  940. unsigned char *iic0_dimm_addr,
  941. unsigned long num_dimm_banks)
  942. {
  943. unsigned long dimm_num;
  944. unsigned long bank_base_addr;
  945. unsigned long cr;
  946. unsigned long i;
  947. unsigned long j;
  948. unsigned long temp;
  949. unsigned char num_row_addr;
  950. unsigned char num_col_addr;
  951. unsigned char num_banks;
  952. unsigned char bank_size_id;
  953. unsigned long ctrl_bank_num[MAXBANKS];
  954. unsigned long bx_cr_num;
  955. unsigned long largest_size_index;
  956. unsigned long largest_size;
  957. unsigned long current_size_index;
  958. BANKPARMS bank_parms[MAXBXCR];
  959. unsigned long sorted_bank_num[MAXBXCR]; /* DDR Controller bank number table (sorted by size) */
  960. unsigned long sorted_bank_size[MAXBXCR]; /* DDR Controller bank size table (sorted by size)*/
  961. /*
  962. * Set the BxCR regs. First, wipe out the bank config registers.
  963. */
  964. for (bx_cr_num = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
  965. mtdcr(SDRAM0_CFGADDR, SDRAM0_B0CR + (bx_cr_num << 2));
  966. mtdcr(SDRAM0_CFGDATA, 0x00000000);
  967. bank_parms[bx_cr_num].bank_size_bytes = 0;
  968. }
  969. #ifdef CONFIG_BAMBOO
  970. /*
  971. * This next section is hardware dependent and must be programmed
  972. * to match the hardware. For bamboo, the following holds...
  973. * 1. SDRAM0_B0CR: Bank 0 of dimm 0 ctrl_bank_num : 0 (soldered onboard)
  974. * 2. SDRAM0_B1CR: Bank 0 of dimm 1 ctrl_bank_num : 1
  975. * 3. SDRAM0_B2CR: Bank 1 of dimm 1 ctrl_bank_num : 1
  976. * 4. SDRAM0_B3CR: Bank 0 of dimm 2 ctrl_bank_num : 3
  977. * ctrl_bank_num corresponds to the first usable DDR controller bank number by DIMM
  978. */
  979. ctrl_bank_num[0] = 0;
  980. ctrl_bank_num[1] = 1;
  981. ctrl_bank_num[2] = 3;
  982. #else
  983. /*
  984. * Ocotea, Ebony and the other IBM/AMCC eval boards have
  985. * 2 DIMM slots with each max 2 banks
  986. */
  987. ctrl_bank_num[0] = 0;
  988. ctrl_bank_num[1] = 2;
  989. #endif
  990. /*
  991. * reset the bank_base address
  992. */
  993. bank_base_addr = CONFIG_SYS_SDRAM_BASE;
  994. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  995. if (dimm_populated[dimm_num] == TRUE) {
  996. num_row_addr = spd_read(iic0_dimm_addr[dimm_num], 3);
  997. num_col_addr = spd_read(iic0_dimm_addr[dimm_num], 4);
  998. num_banks = spd_read(iic0_dimm_addr[dimm_num], 5);
  999. bank_size_id = spd_read(iic0_dimm_addr[dimm_num], 31);
  1000. debug("DIMM%ld: row=%d col=%d banks=%d\n", dimm_num,
  1001. num_row_addr, num_col_addr, num_banks);
  1002. /*
  1003. * Set the SDRAM0_BxCR regs
  1004. */
  1005. cr = 0;
  1006. switch (bank_size_id) {
  1007. case 0x02:
  1008. cr |= SDRAM_BXCR_SDSZ_8;
  1009. break;
  1010. case 0x04:
  1011. cr |= SDRAM_BXCR_SDSZ_16;
  1012. break;
  1013. case 0x08:
  1014. cr |= SDRAM_BXCR_SDSZ_32;
  1015. break;
  1016. case 0x10:
  1017. cr |= SDRAM_BXCR_SDSZ_64;
  1018. break;
  1019. case 0x20:
  1020. cr |= SDRAM_BXCR_SDSZ_128;
  1021. break;
  1022. case 0x40:
  1023. cr |= SDRAM_BXCR_SDSZ_256;
  1024. break;
  1025. case 0x80:
  1026. cr |= SDRAM_BXCR_SDSZ_512;
  1027. break;
  1028. default:
  1029. printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
  1030. dimm_num);
  1031. printf("ERROR: Unsupported value for the banksize: %d.\n",
  1032. bank_size_id);
  1033. printf("Replace the DIMM module with a supported DIMM.\n\n");
  1034. spd_ddr_init_hang ();
  1035. }
  1036. switch (num_col_addr) {
  1037. case 0x08:
  1038. cr |= SDRAM_BXCR_SDAM_1;
  1039. break;
  1040. case 0x09:
  1041. cr |= SDRAM_BXCR_SDAM_2;
  1042. break;
  1043. case 0x0A:
  1044. cr |= SDRAM_BXCR_SDAM_3;
  1045. break;
  1046. case 0x0B:
  1047. cr |= SDRAM_BXCR_SDAM_4;
  1048. break;
  1049. default:
  1050. printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
  1051. dimm_num);
  1052. printf("ERROR: Unsupported value for number of "
  1053. "column addresses: %d.\n", num_col_addr);
  1054. printf("Replace the DIMM module with a supported DIMM.\n\n");
  1055. spd_ddr_init_hang ();
  1056. }
  1057. /*
  1058. * enable the bank
  1059. */
  1060. cr |= SDRAM_BXCR_SDBE;
  1061. for (i = 0; i < num_banks; i++) {
  1062. bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes =
  1063. (4 << 20) * bank_size_id;
  1064. bank_parms[ctrl_bank_num[dimm_num]+i].cr = cr;
  1065. debug("DIMM%ld-bank %ld (SDRAM0_B%ldCR): "
  1066. "bank_size_bytes=%ld\n",
  1067. dimm_num, i,
  1068. ctrl_bank_num[dimm_num] + i,
  1069. bank_parms[ctrl_bank_num[dimm_num] + i].bank_size_bytes);
  1070. }
  1071. }
  1072. }
  1073. /* Initialize sort tables */
  1074. for (i = 0; i < MAXBXCR; i++) {
  1075. sorted_bank_num[i] = i;
  1076. sorted_bank_size[i] = bank_parms[i].bank_size_bytes;
  1077. }
  1078. for (i = 0; i < MAXBXCR-1; i++) {
  1079. largest_size = sorted_bank_size[i];
  1080. largest_size_index = 255;
  1081. /* Find the largest remaining value */
  1082. for (j = i + 1; j < MAXBXCR; j++) {
  1083. if (sorted_bank_size[j] > largest_size) {
  1084. /* Save largest remaining value and its index */
  1085. largest_size = sorted_bank_size[j];
  1086. largest_size_index = j;
  1087. }
  1088. }
  1089. if (largest_size_index != 255) {
  1090. /* Swap the current and largest values */
  1091. current_size_index = sorted_bank_num[largest_size_index];
  1092. sorted_bank_size[largest_size_index] = sorted_bank_size[i];
  1093. sorted_bank_size[i] = largest_size;
  1094. sorted_bank_num[largest_size_index] = sorted_bank_num[i];
  1095. sorted_bank_num[i] = current_size_index;
  1096. }
  1097. }
  1098. /* Set the SDRAM0_BxCR regs thanks to sort tables */
  1099. for (bx_cr_num = 0, bank_base_addr = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
  1100. if (bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes) {
  1101. mtdcr(SDRAM0_CFGADDR, SDRAM0_B0CR + (sorted_bank_num[bx_cr_num] << 2));
  1102. temp = mfdcr(SDRAM0_CFGDATA) & ~(SDRAM_BXCR_SDBA_MASK | SDRAM_BXCR_SDSZ_MASK |
  1103. SDRAM_BXCR_SDAM_MASK | SDRAM_BXCR_SDBE);
  1104. temp = temp | (bank_base_addr & SDRAM_BXCR_SDBA_MASK) |
  1105. bank_parms[sorted_bank_num[bx_cr_num]].cr;
  1106. mtdcr(SDRAM0_CFGDATA, temp);
  1107. bank_base_addr += bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes;
  1108. debug("SDRAM0_B%ldCR=0x%08lx\n",
  1109. sorted_bank_num[bx_cr_num], temp);
  1110. }
  1111. }
  1112. return(bank_base_addr);
  1113. }
  1114. #endif /* CONFIG_SPD_EEPROM */