44x_spd_ddr.c 39 KB

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