44x_spd_ddr.c 39 KB

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