44x_spd_ddr.c 31 KB

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