44x_spd_ddr.c 38 KB

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