44x_spd_ddr2.c 100 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193
  1. /*
  2. * arch/powerpc/cpu/ppc4xx/44x_spd_ddr2.c
  3. * This SPD SDRAM detection code supports AMCC PPC44x cpu's with a
  4. * DDR2 controller (non Denali Core). Those currently are:
  5. *
  6. * 405: 405EX(r)
  7. * 440/460: 440SP/440SPe/460EX/460GT
  8. *
  9. * Copyright (c) 2008 Nuovation System Designs, LLC
  10. * Grant Erickson <gerickson@nuovations.com>
  11. * (C) Copyright 2007-2009
  12. * Stefan Roese, DENX Software Engineering, sr@denx.de.
  13. *
  14. * COPYRIGHT AMCC CORPORATION 2004
  15. *
  16. * See file CREDITS for list of people who contributed to this
  17. * project.
  18. *
  19. * This program is free software; you can redistribute it and/or
  20. * modify it under the terms of the GNU General Public License as
  21. * published by the Free Software Foundation; either version 2 of
  22. * the License, or (at your option) any later version.
  23. *
  24. * This program is distributed in the hope that it will be useful,
  25. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  27. * GNU General Public License for more details.
  28. *
  29. * You should have received a copy of the GNU General Public License
  30. * along with this program; if not, write to the Free Software
  31. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  32. * MA 02111-1307 USA
  33. *
  34. */
  35. /* define DEBUG for debugging output (obviously ;-)) */
  36. #if 0
  37. #define DEBUG
  38. #endif
  39. #include <common.h>
  40. #include <command.h>
  41. #include <asm/ppc4xx.h>
  42. #include <i2c.h>
  43. #include <asm/io.h>
  44. #include <asm/processor.h>
  45. #include <asm/mmu.h>
  46. #include <asm/cache.h>
  47. #include "ecc.h"
  48. #define PPC4xx_IBM_DDR2_DUMP_REGISTER(mnemonic) \
  49. do { \
  50. u32 data; \
  51. mfsdram(SDRAM_##mnemonic, data); \
  52. printf("%20s[%02x] = 0x%08X\n", \
  53. "SDRAM_" #mnemonic, SDRAM_##mnemonic, data); \
  54. } while (0)
  55. #define PPC4xx_IBM_DDR2_DUMP_MQ_REGISTER(mnemonic) \
  56. do { \
  57. u32 data; \
  58. data = mfdcr(SDRAM_##mnemonic); \
  59. printf("%20s[%02x] = 0x%08X\n", \
  60. "SDRAM_" #mnemonic, SDRAM_##mnemonic, data); \
  61. } while (0)
  62. #if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
  63. static void update_rdcc(void)
  64. {
  65. u32 val;
  66. /*
  67. * Complete RDSS configuration as mentioned on page 7 of the AMCC
  68. * PowerPC440SP/SPe DDR2 application note:
  69. * "DDR1/DDR2 Initialization Sequence and Dynamic Tuning"
  70. *
  71. * Or item #10 "10. Complete RDSS configuration" in chapter
  72. * "22.2.9 SDRAM Initialization" of AMCC PPC460EX/EXr/GT users
  73. * manual.
  74. */
  75. mfsdram(SDRAM_RTSR, val);
  76. if ((val & SDRAM_RTSR_TRK1SM_MASK) == SDRAM_RTSR_TRK1SM_ATPLS1) {
  77. mfsdram(SDRAM_RDCC, val);
  78. if ((val & SDRAM_RDCC_RDSS_MASK) != SDRAM_RDCC_RDSS_T4) {
  79. val += 0x40000000;
  80. mtsdram(SDRAM_RDCC, val);
  81. }
  82. }
  83. }
  84. #endif
  85. #if defined(CONFIG_440)
  86. /*
  87. * This DDR2 setup code can dynamically setup the TLB entries for the DDR2
  88. * memory region. Right now the cache should still be disabled in U-Boot
  89. * because of the EMAC driver, that need its buffer descriptor to be located
  90. * in non cached memory.
  91. *
  92. * If at some time this restriction doesn't apply anymore, just define
  93. * CONFIG_4xx_DCACHE in the board config file and this code should setup
  94. * everything correctly.
  95. */
  96. #ifdef CONFIG_4xx_DCACHE
  97. /* enable caching on SDRAM */
  98. #define MY_TLB_WORD2_I_ENABLE 0
  99. #else
  100. /* disable caching on SDRAM */
  101. #define MY_TLB_WORD2_I_ENABLE TLB_WORD2_I_ENABLE
  102. #endif /* CONFIG_4xx_DCACHE */
  103. void dcbz_area(u32 start_address, u32 num_bytes);
  104. #endif /* CONFIG_440 */
  105. #define MAXRANKS 4
  106. #define MAXBXCF 4
  107. #define MULDIV64(m1, m2, d) (u32)(((u64)(m1) * (u64)(m2)) / (u64)(d))
  108. #if !defined(CONFIG_NAND_SPL)
  109. /*-----------------------------------------------------------------------------+
  110. * sdram_memsize
  111. *-----------------------------------------------------------------------------*/
  112. phys_size_t sdram_memsize(void)
  113. {
  114. phys_size_t mem_size;
  115. unsigned long mcopt2;
  116. unsigned long mcstat;
  117. unsigned long mb0cf;
  118. unsigned long sdsz;
  119. unsigned long i;
  120. mem_size = 0;
  121. mfsdram(SDRAM_MCOPT2, mcopt2);
  122. mfsdram(SDRAM_MCSTAT, mcstat);
  123. /* DDR controller must be enabled and not in self-refresh. */
  124. /* Otherwise memsize is zero. */
  125. if (((mcopt2 & SDRAM_MCOPT2_DCEN_MASK) == SDRAM_MCOPT2_DCEN_ENABLE)
  126. && ((mcopt2 & SDRAM_MCOPT2_SREN_MASK) == SDRAM_MCOPT2_SREN_EXIT)
  127. && ((mcstat & (SDRAM_MCSTAT_MIC_MASK | SDRAM_MCSTAT_SRMS_MASK))
  128. == (SDRAM_MCSTAT_MIC_COMP | SDRAM_MCSTAT_SRMS_NOT_SF))) {
  129. for (i = 0; i < MAXBXCF; i++) {
  130. mfsdram(SDRAM_MB0CF + (i << 2), mb0cf);
  131. /* Banks enabled */
  132. if ((mb0cf & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {
  133. #if defined(CONFIG_440)
  134. sdsz = mfdcr_any(SDRAM_R0BAS + i) & SDRAM_RXBAS_SDSZ_MASK;
  135. #else
  136. sdsz = mb0cf & SDRAM_RXBAS_SDSZ_MASK;
  137. #endif
  138. switch(sdsz) {
  139. case SDRAM_RXBAS_SDSZ_8:
  140. mem_size+=8;
  141. break;
  142. case SDRAM_RXBAS_SDSZ_16:
  143. mem_size+=16;
  144. break;
  145. case SDRAM_RXBAS_SDSZ_32:
  146. mem_size+=32;
  147. break;
  148. case SDRAM_RXBAS_SDSZ_64:
  149. mem_size+=64;
  150. break;
  151. case SDRAM_RXBAS_SDSZ_128:
  152. mem_size+=128;
  153. break;
  154. case SDRAM_RXBAS_SDSZ_256:
  155. mem_size+=256;
  156. break;
  157. case SDRAM_RXBAS_SDSZ_512:
  158. mem_size+=512;
  159. break;
  160. case SDRAM_RXBAS_SDSZ_1024:
  161. mem_size+=1024;
  162. break;
  163. case SDRAM_RXBAS_SDSZ_2048:
  164. mem_size+=2048;
  165. break;
  166. case SDRAM_RXBAS_SDSZ_4096:
  167. mem_size+=4096;
  168. break;
  169. default:
  170. printf("WARNING: Unsupported bank size (SDSZ=0x%lx)!\n"
  171. , sdsz);
  172. mem_size=0;
  173. break;
  174. }
  175. }
  176. }
  177. }
  178. return mem_size << 20;
  179. }
  180. /*-----------------------------------------------------------------------------+
  181. * is_ecc_enabled
  182. *-----------------------------------------------------------------------------*/
  183. static unsigned long is_ecc_enabled(void)
  184. {
  185. unsigned long val;
  186. mfsdram(SDRAM_MCOPT1, val);
  187. return SDRAM_MCOPT1_MCHK_CHK_DECODE(val);
  188. }
  189. /*-----------------------------------------------------------------------------+
  190. * board_add_ram_info
  191. *-----------------------------------------------------------------------------*/
  192. void board_add_ram_info(int use_default)
  193. {
  194. PPC4xx_SYS_INFO board_cfg;
  195. u32 val;
  196. if (is_ecc_enabled())
  197. puts(" (ECC");
  198. else
  199. puts(" (ECC not");
  200. get_sys_info(&board_cfg);
  201. #if defined(CONFIG_405EX)
  202. val = board_cfg.freqPLB;
  203. #else
  204. mfsdr(SDR0_DDR0, val);
  205. val = MULDIV64((board_cfg.freqPLB), SDR0_DDR0_DDRM_DECODE(val), 1);
  206. #endif
  207. printf(" enabled, %d MHz", (val * 2) / 1000000);
  208. mfsdram(SDRAM_MMODE, val);
  209. val = (val & SDRAM_MMODE_DCL_MASK) >> 4;
  210. printf(", CL%d)", val);
  211. }
  212. #endif /* !CONFIG_NAND_SPL */
  213. #if defined(CONFIG_SPD_EEPROM)
  214. /*-----------------------------------------------------------------------------+
  215. * Defines
  216. *-----------------------------------------------------------------------------*/
  217. #ifndef TRUE
  218. #define TRUE 1
  219. #endif
  220. #ifndef FALSE
  221. #define FALSE 0
  222. #endif
  223. #define SDRAM_DDR1 1
  224. #define SDRAM_DDR2 2
  225. #define SDRAM_NONE 0
  226. #define MAXDIMMS 2
  227. #define MAX_SPD_BYTES 256 /* Max number of bytes on the DIMM's SPD EEPROM */
  228. #define ONE_BILLION 1000000000
  229. #define CMD_NOP (7 << 19)
  230. #define CMD_PRECHARGE (2 << 19)
  231. #define CMD_REFRESH (1 << 19)
  232. #define CMD_EMR (0 << 19)
  233. #define CMD_READ (5 << 19)
  234. #define CMD_WRITE (4 << 19)
  235. #define SELECT_MR (0 << 16)
  236. #define SELECT_EMR (1 << 16)
  237. #define SELECT_EMR2 (2 << 16)
  238. #define SELECT_EMR3 (3 << 16)
  239. /* MR */
  240. #define DLL_RESET 0x00000100
  241. #define WRITE_RECOV_2 (1 << 9)
  242. #define WRITE_RECOV_3 (2 << 9)
  243. #define WRITE_RECOV_4 (3 << 9)
  244. #define WRITE_RECOV_5 (4 << 9)
  245. #define WRITE_RECOV_6 (5 << 9)
  246. #define BURST_LEN_4 0x00000002
  247. /* EMR */
  248. #define ODT_0_OHM 0x00000000
  249. #define ODT_50_OHM 0x00000044
  250. #define ODT_75_OHM 0x00000004
  251. #define ODT_150_OHM 0x00000040
  252. #define ODS_FULL 0x00000000
  253. #define ODS_REDUCED 0x00000002
  254. #define OCD_CALIB_DEF 0x00000380
  255. /* defines for ODT (On Die Termination) of the 440SP(e) DDR2 controller */
  256. #define ODT_EB0R (0x80000000 >> 8)
  257. #define ODT_EB0W (0x80000000 >> 7)
  258. #define CALC_ODT_R(n) (ODT_EB0R << (n << 1))
  259. #define CALC_ODT_W(n) (ODT_EB0W << (n << 1))
  260. #define CALC_ODT_RW(n) (CALC_ODT_R(n) | CALC_ODT_W(n))
  261. /* Defines for the Read Cycle Delay test */
  262. #define NUMMEMTESTS 8
  263. #define NUMMEMWORDS 8
  264. #define NUMLOOPS 64 /* memory test loops */
  265. /*
  266. * Newer PPC's like 440SPe, 460EX/GT can be equipped with more than 2GB of SDRAM.
  267. * To support such configurations, we "only" map the first 2GB via the TLB's. We
  268. * need some free virtual address space for the remaining peripherals like, SoC
  269. * devices, FLASH etc.
  270. *
  271. * Note that ECC is currently not supported on configurations with more than 2GB
  272. * SDRAM. This is because we only map the first 2GB on such systems, and therefore
  273. * the ECC parity byte of the remaining area can't be written.
  274. */
  275. /*
  276. * Board-specific Platform code can reimplement spd_ddr_init_hang () if needed
  277. */
  278. void __spd_ddr_init_hang (void)
  279. {
  280. hang ();
  281. }
  282. void spd_ddr_init_hang (void) __attribute__((weak, alias("__spd_ddr_init_hang")));
  283. /*
  284. * To provide an interface for board specific config values in this common
  285. * DDR setup code, we implement he "weak" default functions here. They return
  286. * the default value back to the caller.
  287. *
  288. * Please see include/configs/yucca.h for an example fora board specific
  289. * implementation.
  290. */
  291. u32 __ddr_wrdtr(u32 default_val)
  292. {
  293. return default_val;
  294. }
  295. u32 ddr_wrdtr(u32) __attribute__((weak, alias("__ddr_wrdtr")));
  296. u32 __ddr_clktr(u32 default_val)
  297. {
  298. return default_val;
  299. }
  300. u32 ddr_clktr(u32) __attribute__((weak, alias("__ddr_clktr")));
  301. /* Private Structure Definitions */
  302. /* enum only to ease code for cas latency setting */
  303. typedef enum ddr_cas_id {
  304. DDR_CAS_2 = 20,
  305. DDR_CAS_2_5 = 25,
  306. DDR_CAS_3 = 30,
  307. DDR_CAS_4 = 40,
  308. DDR_CAS_5 = 50
  309. } ddr_cas_id_t;
  310. /*-----------------------------------------------------------------------------+
  311. * Prototypes
  312. *-----------------------------------------------------------------------------*/
  313. static void get_spd_info(unsigned long *dimm_populated,
  314. unsigned char *iic0_dimm_addr,
  315. unsigned long num_dimm_banks);
  316. static void check_mem_type(unsigned long *dimm_populated,
  317. unsigned char *iic0_dimm_addr,
  318. unsigned long num_dimm_banks);
  319. static void check_frequency(unsigned long *dimm_populated,
  320. unsigned char *iic0_dimm_addr,
  321. unsigned long num_dimm_banks);
  322. static void check_rank_number(unsigned long *dimm_populated,
  323. unsigned char *iic0_dimm_addr,
  324. unsigned long num_dimm_banks);
  325. static void check_voltage_type(unsigned long *dimm_populated,
  326. unsigned char *iic0_dimm_addr,
  327. unsigned long num_dimm_banks);
  328. static void program_memory_queue(unsigned long *dimm_populated,
  329. unsigned char *iic0_dimm_addr,
  330. unsigned long num_dimm_banks);
  331. static void program_codt(unsigned long *dimm_populated,
  332. unsigned char *iic0_dimm_addr,
  333. unsigned long num_dimm_banks);
  334. static void program_mode(unsigned long *dimm_populated,
  335. unsigned char *iic0_dimm_addr,
  336. unsigned long num_dimm_banks,
  337. ddr_cas_id_t *selected_cas,
  338. int *write_recovery);
  339. static void program_tr(unsigned long *dimm_populated,
  340. unsigned char *iic0_dimm_addr,
  341. unsigned long num_dimm_banks);
  342. static void program_rtr(unsigned long *dimm_populated,
  343. unsigned char *iic0_dimm_addr,
  344. unsigned long num_dimm_banks);
  345. static void program_bxcf(unsigned long *dimm_populated,
  346. unsigned char *iic0_dimm_addr,
  347. unsigned long num_dimm_banks);
  348. static void program_copt1(unsigned long *dimm_populated,
  349. unsigned char *iic0_dimm_addr,
  350. unsigned long num_dimm_banks);
  351. static void program_initplr(unsigned long *dimm_populated,
  352. unsigned char *iic0_dimm_addr,
  353. unsigned long num_dimm_banks,
  354. ddr_cas_id_t selected_cas,
  355. int write_recovery);
  356. #ifdef CONFIG_DDR_ECC
  357. static void program_ecc(unsigned long *dimm_populated,
  358. unsigned char *iic0_dimm_addr,
  359. unsigned long num_dimm_banks,
  360. unsigned long tlb_word2_i_value);
  361. #endif
  362. #if !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
  363. static void program_DQS_calibration(unsigned long *dimm_populated,
  364. unsigned char *iic0_dimm_addr,
  365. unsigned long num_dimm_banks);
  366. #ifdef HARD_CODED_DQS /* calibration test with hardvalues */
  367. static void test(void);
  368. #else
  369. static void DQS_calibration_process(void);
  370. #endif
  371. #endif
  372. static unsigned char spd_read(uchar chip, uint addr)
  373. {
  374. unsigned char data[2];
  375. if (i2c_probe(chip) == 0)
  376. if (i2c_read(chip, addr, 1, data, 1) == 0)
  377. return data[0];
  378. return 0;
  379. }
  380. /*-----------------------------------------------------------------------------+
  381. * initdram. Initializes the 440SP Memory Queue and DDR SDRAM controller.
  382. * Note: This routine runs from flash with a stack set up in the chip's
  383. * sram space. It is important that the routine does not require .sbss, .bss or
  384. * .data sections. It also cannot call routines that require these sections.
  385. *-----------------------------------------------------------------------------*/
  386. /*-----------------------------------------------------------------------------
  387. * Function: initdram
  388. * Description: Configures SDRAM memory banks for DDR operation.
  389. * Auto Memory Configuration option reads the DDR SDRAM EEPROMs
  390. * via the IIC bus and then configures the DDR SDRAM memory
  391. * banks appropriately. If Auto Memory Configuration is
  392. * not used, it is assumed that no DIMM is plugged
  393. *-----------------------------------------------------------------------------*/
  394. phys_size_t initdram(int board_type)
  395. {
  396. unsigned char iic0_dimm_addr[] = SPD_EEPROM_ADDRESS;
  397. unsigned char spd0[MAX_SPD_BYTES];
  398. unsigned char spd1[MAX_SPD_BYTES];
  399. unsigned char *dimm_spd[MAXDIMMS];
  400. unsigned long dimm_populated[MAXDIMMS] = {SDRAM_NONE, SDRAM_NONE};
  401. unsigned long num_dimm_banks; /* on board dimm banks */
  402. unsigned long val;
  403. ddr_cas_id_t selected_cas = DDR_CAS_5; /* preset to silence compiler */
  404. int write_recovery;
  405. phys_size_t dram_size = 0;
  406. num_dimm_banks = sizeof(iic0_dimm_addr);
  407. /*------------------------------------------------------------------
  408. * Set up an array of SPD matrixes.
  409. *-----------------------------------------------------------------*/
  410. dimm_spd[0] = spd0;
  411. dimm_spd[1] = spd1;
  412. /*------------------------------------------------------------------
  413. * Reset the DDR-SDRAM controller.
  414. *-----------------------------------------------------------------*/
  415. mtsdr(SDR0_SRST, SDR0_SRST0_DMC);
  416. mtsdr(SDR0_SRST, 0x00000000);
  417. /*
  418. * Make sure I2C controller is initialized
  419. * before continuing.
  420. */
  421. /* switch to correct I2C bus */
  422. I2C_SET_BUS(CONFIG_SYS_SPD_BUS_NUM);
  423. i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
  424. /*------------------------------------------------------------------
  425. * Clear out the serial presence detect buffers.
  426. * Perform IIC reads from the dimm. Fill in the spds.
  427. * Check to see if the dimm slots are populated
  428. *-----------------------------------------------------------------*/
  429. get_spd_info(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  430. /*------------------------------------------------------------------
  431. * Check the memory type for the dimms plugged.
  432. *-----------------------------------------------------------------*/
  433. check_mem_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  434. /*------------------------------------------------------------------
  435. * Check the frequency supported for the dimms plugged.
  436. *-----------------------------------------------------------------*/
  437. check_frequency(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  438. /*------------------------------------------------------------------
  439. * Check the total rank number.
  440. *-----------------------------------------------------------------*/
  441. check_rank_number(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  442. /*------------------------------------------------------------------
  443. * Check the voltage type for the dimms plugged.
  444. *-----------------------------------------------------------------*/
  445. check_voltage_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  446. /*------------------------------------------------------------------
  447. * Program SDRAM controller options 2 register
  448. * Except Enabling of the memory controller.
  449. *-----------------------------------------------------------------*/
  450. mfsdram(SDRAM_MCOPT2, val);
  451. mtsdram(SDRAM_MCOPT2,
  452. (val &
  453. ~(SDRAM_MCOPT2_SREN_MASK | SDRAM_MCOPT2_PMEN_MASK |
  454. SDRAM_MCOPT2_IPTR_MASK | SDRAM_MCOPT2_XSRP_MASK |
  455. SDRAM_MCOPT2_ISIE_MASK))
  456. | (SDRAM_MCOPT2_SREN_ENTER | SDRAM_MCOPT2_PMEN_DISABLE |
  457. SDRAM_MCOPT2_IPTR_IDLE | SDRAM_MCOPT2_XSRP_ALLOW |
  458. SDRAM_MCOPT2_ISIE_ENABLE));
  459. /*------------------------------------------------------------------
  460. * Program SDRAM controller options 1 register
  461. * Note: Does not enable the memory controller.
  462. *-----------------------------------------------------------------*/
  463. program_copt1(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  464. /*------------------------------------------------------------------
  465. * Set the SDRAM Controller On Die Termination Register
  466. *-----------------------------------------------------------------*/
  467. program_codt(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  468. /*------------------------------------------------------------------
  469. * Program SDRAM refresh register.
  470. *-----------------------------------------------------------------*/
  471. program_rtr(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  472. /*------------------------------------------------------------------
  473. * Program SDRAM mode register.
  474. *-----------------------------------------------------------------*/
  475. program_mode(dimm_populated, iic0_dimm_addr, num_dimm_banks,
  476. &selected_cas, &write_recovery);
  477. /*------------------------------------------------------------------
  478. * Set the SDRAM Write Data/DM/DQS Clock Timing Reg
  479. *-----------------------------------------------------------------*/
  480. mfsdram(SDRAM_WRDTR, val);
  481. mtsdram(SDRAM_WRDTR, (val & ~(SDRAM_WRDTR_LLWP_MASK | SDRAM_WRDTR_WTR_MASK)) |
  482. ddr_wrdtr(SDRAM_WRDTR_LLWP_1_CYC | SDRAM_WRDTR_WTR_90_DEG_ADV));
  483. /*------------------------------------------------------------------
  484. * Set the SDRAM Clock Timing Register
  485. *-----------------------------------------------------------------*/
  486. mfsdram(SDRAM_CLKTR, val);
  487. mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) |
  488. ddr_clktr(SDRAM_CLKTR_CLKP_0_DEG));
  489. /*------------------------------------------------------------------
  490. * Program the BxCF registers.
  491. *-----------------------------------------------------------------*/
  492. program_bxcf(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  493. /*------------------------------------------------------------------
  494. * Program SDRAM timing registers.
  495. *-----------------------------------------------------------------*/
  496. program_tr(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  497. /*------------------------------------------------------------------
  498. * Set the Extended Mode register
  499. *-----------------------------------------------------------------*/
  500. mfsdram(SDRAM_MEMODE, val);
  501. mtsdram(SDRAM_MEMODE,
  502. (val & ~(SDRAM_MEMODE_DIC_MASK | SDRAM_MEMODE_DLL_MASK |
  503. SDRAM_MEMODE_RTT_MASK | SDRAM_MEMODE_DQS_MASK)) |
  504. (SDRAM_MEMODE_DIC_NORMAL | SDRAM_MEMODE_DLL_ENABLE
  505. | SDRAM_MEMODE_RTT_150OHM | SDRAM_MEMODE_DQS_ENABLE));
  506. /*------------------------------------------------------------------
  507. * Program Initialization preload registers.
  508. *-----------------------------------------------------------------*/
  509. program_initplr(dimm_populated, iic0_dimm_addr, num_dimm_banks,
  510. selected_cas, write_recovery);
  511. /*------------------------------------------------------------------
  512. * Delay to ensure 200usec have elapsed since reset.
  513. *-----------------------------------------------------------------*/
  514. udelay(400);
  515. /*------------------------------------------------------------------
  516. * Set the memory queue core base addr.
  517. *-----------------------------------------------------------------*/
  518. program_memory_queue(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  519. /*------------------------------------------------------------------
  520. * Program SDRAM controller options 2 register
  521. * Enable the memory controller.
  522. *-----------------------------------------------------------------*/
  523. mfsdram(SDRAM_MCOPT2, val);
  524. mtsdram(SDRAM_MCOPT2,
  525. (val & ~(SDRAM_MCOPT2_SREN_MASK | SDRAM_MCOPT2_DCEN_MASK |
  526. SDRAM_MCOPT2_IPTR_MASK | SDRAM_MCOPT2_ISIE_MASK)) |
  527. SDRAM_MCOPT2_IPTR_EXECUTE);
  528. /*------------------------------------------------------------------
  529. * Wait for IPTR_EXECUTE init sequence to complete.
  530. *-----------------------------------------------------------------*/
  531. do {
  532. mfsdram(SDRAM_MCSTAT, val);
  533. } while ((val & SDRAM_MCSTAT_MIC_MASK) == SDRAM_MCSTAT_MIC_NOTCOMP);
  534. /* enable the controller only after init sequence completes */
  535. mfsdram(SDRAM_MCOPT2, val);
  536. mtsdram(SDRAM_MCOPT2, (val | SDRAM_MCOPT2_DCEN_ENABLE));
  537. /* Make sure delay-line calibration is done before proceeding */
  538. do {
  539. mfsdram(SDRAM_DLCR, val);
  540. } while (!(val & SDRAM_DLCR_DLCS_COMPLETE));
  541. /* get installed memory size */
  542. dram_size = sdram_memsize();
  543. /*
  544. * Limit size to 2GB
  545. */
  546. if (dram_size > CONFIG_MAX_MEM_MAPPED)
  547. dram_size = CONFIG_MAX_MEM_MAPPED;
  548. /* and program tlb entries for this size (dynamic) */
  549. /*
  550. * Program TLB entries with caches enabled, for best performace
  551. * while auto-calibrating and ECC generation
  552. */
  553. program_tlb(0, 0, dram_size, 0);
  554. /*------------------------------------------------------------------
  555. * DQS calibration.
  556. *-----------------------------------------------------------------*/
  557. #if defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
  558. DQS_autocalibration();
  559. #else
  560. program_DQS_calibration(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  561. #endif
  562. /*
  563. * Now complete RDSS configuration as mentioned on page 7 of the AMCC
  564. * PowerPC440SP/SPe DDR2 application note:
  565. * "DDR1/DDR2 Initialization Sequence and Dynamic Tuning"
  566. */
  567. update_rdcc();
  568. #ifdef CONFIG_DDR_ECC
  569. /*------------------------------------------------------------------
  570. * If ecc is enabled, initialize the parity bits.
  571. *-----------------------------------------------------------------*/
  572. program_ecc(dimm_populated, iic0_dimm_addr, num_dimm_banks, 0);
  573. #endif
  574. /*
  575. * Now after initialization (auto-calibration and ECC generation)
  576. * remove the TLB entries with caches enabled and program again with
  577. * desired cache functionality
  578. */
  579. remove_tlb(0, dram_size);
  580. program_tlb(0, 0, dram_size, MY_TLB_WORD2_I_ENABLE);
  581. ppc4xx_ibm_ddr2_register_dump();
  582. /*
  583. * Clear potential errors resulting from auto-calibration.
  584. * If not done, then we could get an interrupt later on when
  585. * exceptions are enabled.
  586. */
  587. set_mcsr(get_mcsr());
  588. return sdram_memsize();
  589. }
  590. static void get_spd_info(unsigned long *dimm_populated,
  591. unsigned char *iic0_dimm_addr,
  592. unsigned long num_dimm_banks)
  593. {
  594. unsigned long dimm_num;
  595. unsigned long dimm_found;
  596. unsigned char num_of_bytes;
  597. unsigned char total_size;
  598. dimm_found = FALSE;
  599. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  600. num_of_bytes = 0;
  601. total_size = 0;
  602. num_of_bytes = spd_read(iic0_dimm_addr[dimm_num], 0);
  603. debug("\nspd_read(0x%x) returned %d\n",
  604. iic0_dimm_addr[dimm_num], num_of_bytes);
  605. total_size = spd_read(iic0_dimm_addr[dimm_num], 1);
  606. debug("spd_read(0x%x) returned %d\n",
  607. iic0_dimm_addr[dimm_num], total_size);
  608. if ((num_of_bytes != 0) && (total_size != 0)) {
  609. dimm_populated[dimm_num] = TRUE;
  610. dimm_found = TRUE;
  611. debug("DIMM slot %lu: populated\n", dimm_num);
  612. } else {
  613. dimm_populated[dimm_num] = FALSE;
  614. debug("DIMM slot %lu: Not populated\n", dimm_num);
  615. }
  616. }
  617. if (dimm_found == FALSE) {
  618. printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n");
  619. spd_ddr_init_hang ();
  620. }
  621. }
  622. /*------------------------------------------------------------------
  623. * For the memory DIMMs installed, this routine verifies that they
  624. * really are DDR specific DIMMs.
  625. *-----------------------------------------------------------------*/
  626. static void check_mem_type(unsigned long *dimm_populated,
  627. unsigned char *iic0_dimm_addr,
  628. unsigned long num_dimm_banks)
  629. {
  630. unsigned long dimm_num;
  631. unsigned long dimm_type;
  632. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  633. if (dimm_populated[dimm_num] == TRUE) {
  634. dimm_type = spd_read(iic0_dimm_addr[dimm_num], 2);
  635. switch (dimm_type) {
  636. case 1:
  637. printf("ERROR: Standard Fast Page Mode DRAM DIMM detected in "
  638. "slot %d.\n", (unsigned int)dimm_num);
  639. printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
  640. printf("Replace the DIMM module with a supported DIMM.\n\n");
  641. spd_ddr_init_hang ();
  642. break;
  643. case 2:
  644. printf("ERROR: EDO DIMM detected in slot %d.\n",
  645. (unsigned int)dimm_num);
  646. printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
  647. printf("Replace the DIMM module with a supported DIMM.\n\n");
  648. spd_ddr_init_hang ();
  649. break;
  650. case 3:
  651. printf("ERROR: Pipelined Nibble DIMM detected in slot %d.\n",
  652. (unsigned int)dimm_num);
  653. printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
  654. printf("Replace the DIMM module with a supported DIMM.\n\n");
  655. spd_ddr_init_hang ();
  656. break;
  657. case 4:
  658. printf("ERROR: SDRAM DIMM detected in slot %d.\n",
  659. (unsigned int)dimm_num);
  660. printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
  661. printf("Replace the DIMM module with a supported DIMM.\n\n");
  662. spd_ddr_init_hang ();
  663. break;
  664. case 5:
  665. printf("ERROR: Multiplexed ROM DIMM detected in slot %d.\n",
  666. (unsigned int)dimm_num);
  667. printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
  668. printf("Replace the DIMM module with a supported DIMM.\n\n");
  669. spd_ddr_init_hang ();
  670. break;
  671. case 6:
  672. printf("ERROR: SGRAM DIMM detected in slot %d.\n",
  673. (unsigned int)dimm_num);
  674. printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
  675. printf("Replace the DIMM module with a supported DIMM.\n\n");
  676. spd_ddr_init_hang ();
  677. break;
  678. case 7:
  679. debug("DIMM slot %lu: DDR1 SDRAM detected\n", dimm_num);
  680. dimm_populated[dimm_num] = SDRAM_DDR1;
  681. break;
  682. case 8:
  683. debug("DIMM slot %lu: DDR2 SDRAM detected\n", dimm_num);
  684. dimm_populated[dimm_num] = SDRAM_DDR2;
  685. break;
  686. default:
  687. printf("ERROR: Unknown DIMM detected in slot %d.\n",
  688. (unsigned int)dimm_num);
  689. printf("Only DDR1 and DDR2 SDRAM DIMMs are supported.\n");
  690. printf("Replace the DIMM module with a supported DIMM.\n\n");
  691. spd_ddr_init_hang ();
  692. break;
  693. }
  694. }
  695. }
  696. for (dimm_num = 1; dimm_num < num_dimm_banks; dimm_num++) {
  697. if ((dimm_populated[dimm_num-1] != SDRAM_NONE)
  698. && (dimm_populated[dimm_num] != SDRAM_NONE)
  699. && (dimm_populated[dimm_num-1] != dimm_populated[dimm_num])) {
  700. printf("ERROR: DIMM's DDR1 and DDR2 type can not be mixed.\n");
  701. spd_ddr_init_hang ();
  702. }
  703. }
  704. }
  705. /*------------------------------------------------------------------
  706. * For the memory DIMMs installed, this routine verifies that
  707. * frequency previously calculated is supported.
  708. *-----------------------------------------------------------------*/
  709. static void check_frequency(unsigned long *dimm_populated,
  710. unsigned char *iic0_dimm_addr,
  711. unsigned long num_dimm_banks)
  712. {
  713. unsigned long dimm_num;
  714. unsigned long tcyc_reg;
  715. unsigned long cycle_time;
  716. unsigned long calc_cycle_time;
  717. unsigned long sdram_freq;
  718. unsigned long sdr_ddrpll;
  719. PPC4xx_SYS_INFO board_cfg;
  720. /*------------------------------------------------------------------
  721. * Get the board configuration info.
  722. *-----------------------------------------------------------------*/
  723. get_sys_info(&board_cfg);
  724. mfsdr(SDR0_DDR0, sdr_ddrpll);
  725. sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
  726. /*
  727. * calc_cycle_time is calculated from DDR frequency set by board/chip
  728. * and is expressed in multiple of 10 picoseconds
  729. * to match the way DIMM cycle time is calculated below.
  730. */
  731. calc_cycle_time = MULDIV64(ONE_BILLION, 100, sdram_freq);
  732. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  733. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  734. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
  735. /*
  736. * Byte 9, Cycle time for CAS Latency=X, is split into two nibbles:
  737. * the higher order nibble (bits 4-7) designates the cycle time
  738. * to a granularity of 1ns;
  739. * the value presented by the lower order nibble (bits 0-3)
  740. * has a granularity of .1ns and is added to the value designated
  741. * by the higher nibble. In addition, four lines of the lower order
  742. * nibble are assigned to support +.25,+.33, +.66 and +.75.
  743. */
  744. /* Convert from hex to decimal */
  745. if ((tcyc_reg & 0x0F) == 0x0D)
  746. cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 75;
  747. else if ((tcyc_reg & 0x0F) == 0x0C)
  748. cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 66;
  749. else if ((tcyc_reg & 0x0F) == 0x0B)
  750. cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 33;
  751. else if ((tcyc_reg & 0x0F) == 0x0A)
  752. cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 25;
  753. else
  754. cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) +
  755. ((tcyc_reg & 0x0F)*10);
  756. debug("cycle_time=%lu [10 picoseconds]\n", cycle_time);
  757. if (cycle_time > (calc_cycle_time + 10)) {
  758. /*
  759. * the provided sdram cycle_time is too small
  760. * for the available DIMM cycle_time.
  761. * The additionnal 100ps is here to accept a small incertainty.
  762. */
  763. printf("ERROR: DRAM DIMM detected with cycle_time %d ps in "
  764. "slot %d \n while calculated cycle time is %d ps.\n",
  765. (unsigned int)(cycle_time*10),
  766. (unsigned int)dimm_num,
  767. (unsigned int)(calc_cycle_time*10));
  768. printf("Replace the DIMM, or change DDR frequency via "
  769. "strapping bits.\n\n");
  770. spd_ddr_init_hang ();
  771. }
  772. }
  773. }
  774. }
  775. /*------------------------------------------------------------------
  776. * For the memory DIMMs installed, this routine verifies two
  777. * ranks/banks maximum are availables.
  778. *-----------------------------------------------------------------*/
  779. static void check_rank_number(unsigned long *dimm_populated,
  780. unsigned char *iic0_dimm_addr,
  781. unsigned long num_dimm_banks)
  782. {
  783. unsigned long dimm_num;
  784. unsigned long dimm_rank;
  785. unsigned long total_rank = 0;
  786. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  787. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  788. dimm_rank = spd_read(iic0_dimm_addr[dimm_num], 5);
  789. if (((unsigned long)spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08)
  790. dimm_rank = (dimm_rank & 0x0F) +1;
  791. else
  792. dimm_rank = dimm_rank & 0x0F;
  793. if (dimm_rank > MAXRANKS) {
  794. printf("ERROR: DRAM DIMM detected with %lu ranks in "
  795. "slot %lu is not supported.\n", dimm_rank, dimm_num);
  796. printf("Only %d ranks are supported for all DIMM.\n", MAXRANKS);
  797. printf("Replace the DIMM module with a supported DIMM.\n\n");
  798. spd_ddr_init_hang ();
  799. } else
  800. total_rank += dimm_rank;
  801. }
  802. if (total_rank > MAXRANKS) {
  803. printf("ERROR: DRAM DIMM detected with a total of %d ranks "
  804. "for all slots.\n", (unsigned int)total_rank);
  805. printf("Only %d ranks are supported for all DIMM.\n", MAXRANKS);
  806. printf("Remove one of the DIMM modules.\n\n");
  807. spd_ddr_init_hang ();
  808. }
  809. }
  810. }
  811. /*------------------------------------------------------------------
  812. * only support 2.5V modules.
  813. * This routine verifies this.
  814. *-----------------------------------------------------------------*/
  815. static void check_voltage_type(unsigned long *dimm_populated,
  816. unsigned char *iic0_dimm_addr,
  817. unsigned long num_dimm_banks)
  818. {
  819. unsigned long dimm_num;
  820. unsigned long voltage_type;
  821. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  822. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  823. voltage_type = spd_read(iic0_dimm_addr[dimm_num], 8);
  824. switch (voltage_type) {
  825. case 0x00:
  826. printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
  827. printf("This DIMM is 5.0 Volt/TTL.\n");
  828. printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
  829. (unsigned int)dimm_num);
  830. spd_ddr_init_hang ();
  831. break;
  832. case 0x01:
  833. printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
  834. printf("This DIMM is LVTTL.\n");
  835. printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
  836. (unsigned int)dimm_num);
  837. spd_ddr_init_hang ();
  838. break;
  839. case 0x02:
  840. printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
  841. printf("This DIMM is 1.5 Volt.\n");
  842. printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
  843. (unsigned int)dimm_num);
  844. spd_ddr_init_hang ();
  845. break;
  846. case 0x03:
  847. printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
  848. printf("This DIMM is 3.3 Volt/TTL.\n");
  849. printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
  850. (unsigned int)dimm_num);
  851. spd_ddr_init_hang ();
  852. break;
  853. case 0x04:
  854. /* 2.5 Voltage only for DDR1 */
  855. break;
  856. case 0x05:
  857. /* 1.8 Voltage only for DDR2 */
  858. break;
  859. default:
  860. printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
  861. printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
  862. (unsigned int)dimm_num);
  863. spd_ddr_init_hang ();
  864. break;
  865. }
  866. }
  867. }
  868. }
  869. /*-----------------------------------------------------------------------------+
  870. * program_copt1.
  871. *-----------------------------------------------------------------------------*/
  872. static void program_copt1(unsigned long *dimm_populated,
  873. unsigned char *iic0_dimm_addr,
  874. unsigned long num_dimm_banks)
  875. {
  876. unsigned long dimm_num;
  877. unsigned long mcopt1;
  878. unsigned long ecc_enabled;
  879. unsigned long ecc = 0;
  880. unsigned long data_width = 0;
  881. unsigned long dimm_32bit;
  882. unsigned long dimm_64bit;
  883. unsigned long registered = 0;
  884. unsigned long attribute = 0;
  885. unsigned long buf0, buf1; /* TODO: code to be changed for IOP1.6 to support 4 DIMMs */
  886. unsigned long bankcount;
  887. unsigned long ddrtype;
  888. unsigned long val;
  889. #ifdef CONFIG_DDR_ECC
  890. ecc_enabled = TRUE;
  891. #else
  892. ecc_enabled = FALSE;
  893. #endif
  894. dimm_32bit = FALSE;
  895. dimm_64bit = FALSE;
  896. buf0 = FALSE;
  897. buf1 = FALSE;
  898. /*------------------------------------------------------------------
  899. * Set memory controller options reg 1, SDRAM_MCOPT1.
  900. *-----------------------------------------------------------------*/
  901. mfsdram(SDRAM_MCOPT1, val);
  902. mcopt1 = val & ~(SDRAM_MCOPT1_MCHK_MASK | SDRAM_MCOPT1_RDEN_MASK |
  903. SDRAM_MCOPT1_PMU_MASK | SDRAM_MCOPT1_DMWD_MASK |
  904. SDRAM_MCOPT1_UIOS_MASK | SDRAM_MCOPT1_BCNT_MASK |
  905. SDRAM_MCOPT1_DDR_TYPE_MASK | SDRAM_MCOPT1_RWOO_MASK |
  906. SDRAM_MCOPT1_WOOO_MASK | SDRAM_MCOPT1_DCOO_MASK |
  907. SDRAM_MCOPT1_DREF_MASK);
  908. mcopt1 |= SDRAM_MCOPT1_QDEP;
  909. mcopt1 |= SDRAM_MCOPT1_PMU_OPEN;
  910. mcopt1 |= SDRAM_MCOPT1_RWOO_DISABLED;
  911. mcopt1 |= SDRAM_MCOPT1_WOOO_DISABLED;
  912. mcopt1 |= SDRAM_MCOPT1_DCOO_DISABLED;
  913. mcopt1 |= SDRAM_MCOPT1_DREF_NORMAL;
  914. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  915. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  916. /* test ecc support */
  917. ecc = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 11);
  918. if (ecc != 0x02) /* ecc not supported */
  919. ecc_enabled = FALSE;
  920. /* test bank count */
  921. bankcount = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 17);
  922. if (bankcount == 0x04) /* bank count = 4 */
  923. mcopt1 |= SDRAM_MCOPT1_4_BANKS;
  924. else /* bank count = 8 */
  925. mcopt1 |= SDRAM_MCOPT1_8_BANKS;
  926. /* test DDR type */
  927. ddrtype = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 2);
  928. /* test for buffered/unbuffered, registered, differential clocks */
  929. registered = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 20);
  930. attribute = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 21);
  931. /* TODO: code to be changed for IOP1.6 to support 4 DIMMs */
  932. if (dimm_num == 0) {
  933. if (dimm_populated[dimm_num] == SDRAM_DDR1) /* DDR1 type */
  934. mcopt1 |= SDRAM_MCOPT1_DDR1_TYPE;
  935. if (dimm_populated[dimm_num] == SDRAM_DDR2) /* DDR2 type */
  936. mcopt1 |= SDRAM_MCOPT1_DDR2_TYPE;
  937. if (registered == 1) { /* DDR2 always buffered */
  938. /* TODO: what about above comments ? */
  939. mcopt1 |= SDRAM_MCOPT1_RDEN;
  940. buf0 = TRUE;
  941. } else {
  942. /* TODO: the mask 0x02 doesn't match Samsung def for byte 21. */
  943. if ((attribute & 0x02) == 0x00) {
  944. /* buffered not supported */
  945. buf0 = FALSE;
  946. } else {
  947. mcopt1 |= SDRAM_MCOPT1_RDEN;
  948. buf0 = TRUE;
  949. }
  950. }
  951. }
  952. else if (dimm_num == 1) {
  953. if (dimm_populated[dimm_num] == SDRAM_DDR1) /* DDR1 type */
  954. mcopt1 |= SDRAM_MCOPT1_DDR1_TYPE;
  955. if (dimm_populated[dimm_num] == SDRAM_DDR2) /* DDR2 type */
  956. mcopt1 |= SDRAM_MCOPT1_DDR2_TYPE;
  957. if (registered == 1) {
  958. /* DDR2 always buffered */
  959. mcopt1 |= SDRAM_MCOPT1_RDEN;
  960. buf1 = TRUE;
  961. } else {
  962. if ((attribute & 0x02) == 0x00) {
  963. /* buffered not supported */
  964. buf1 = FALSE;
  965. } else {
  966. mcopt1 |= SDRAM_MCOPT1_RDEN;
  967. buf1 = TRUE;
  968. }
  969. }
  970. }
  971. /* Note that for DDR2 the byte 7 is reserved, but OK to keep code as is. */
  972. data_width = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 6) +
  973. (((unsigned long)spd_read(iic0_dimm_addr[dimm_num], 7)) << 8);
  974. switch (data_width) {
  975. case 72:
  976. case 64:
  977. dimm_64bit = TRUE;
  978. break;
  979. case 40:
  980. case 32:
  981. dimm_32bit = TRUE;
  982. break;
  983. default:
  984. printf("WARNING: Detected a DIMM with a data width of %lu bits.\n",
  985. data_width);
  986. printf("Only DIMMs with 32 or 64 bit DDR-SDRAM widths are supported.\n");
  987. break;
  988. }
  989. }
  990. }
  991. /* verify matching properties */
  992. if ((dimm_populated[0] != SDRAM_NONE) && (dimm_populated[1] != SDRAM_NONE)) {
  993. if (buf0 != buf1) {
  994. printf("ERROR: DIMM's buffered/unbuffered, registered, clocking don't match.\n");
  995. spd_ddr_init_hang ();
  996. }
  997. }
  998. if ((dimm_64bit == TRUE) && (dimm_32bit == TRUE)) {
  999. printf("ERROR: Cannot mix 32 bit and 64 bit DDR-SDRAM DIMMs together.\n");
  1000. spd_ddr_init_hang ();
  1001. }
  1002. else if ((dimm_64bit == TRUE) && (dimm_32bit == FALSE)) {
  1003. mcopt1 |= SDRAM_MCOPT1_DMWD_64;
  1004. } else if ((dimm_64bit == FALSE) && (dimm_32bit == TRUE)) {
  1005. mcopt1 |= SDRAM_MCOPT1_DMWD_32;
  1006. } else {
  1007. printf("ERROR: Please install only 32 or 64 bit DDR-SDRAM DIMMs.\n\n");
  1008. spd_ddr_init_hang ();
  1009. }
  1010. if (ecc_enabled == TRUE)
  1011. mcopt1 |= SDRAM_MCOPT1_MCHK_GEN;
  1012. else
  1013. mcopt1 |= SDRAM_MCOPT1_MCHK_NON;
  1014. mtsdram(SDRAM_MCOPT1, mcopt1);
  1015. }
  1016. /*-----------------------------------------------------------------------------+
  1017. * program_codt.
  1018. *-----------------------------------------------------------------------------*/
  1019. static void program_codt(unsigned long *dimm_populated,
  1020. unsigned char *iic0_dimm_addr,
  1021. unsigned long num_dimm_banks)
  1022. {
  1023. unsigned long codt;
  1024. unsigned long modt0 = 0;
  1025. unsigned long modt1 = 0;
  1026. unsigned long modt2 = 0;
  1027. unsigned long modt3 = 0;
  1028. unsigned char dimm_num;
  1029. unsigned char dimm_rank;
  1030. unsigned char total_rank = 0;
  1031. unsigned char total_dimm = 0;
  1032. unsigned char dimm_type = 0;
  1033. unsigned char firstSlot = 0;
  1034. /*------------------------------------------------------------------
  1035. * Set the SDRAM Controller On Die Termination Register
  1036. *-----------------------------------------------------------------*/
  1037. mfsdram(SDRAM_CODT, codt);
  1038. codt &= ~(SDRAM_CODT_DQS_SINGLE_END | SDRAM_CODT_CKSE_SINGLE_END);
  1039. codt |= SDRAM_CODT_IO_NMODE;
  1040. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  1041. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  1042. dimm_rank = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 5);
  1043. if (((unsigned long)spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08) {
  1044. dimm_rank = (dimm_rank & 0x0F) + 1;
  1045. dimm_type = SDRAM_DDR2;
  1046. } else {
  1047. dimm_rank = dimm_rank & 0x0F;
  1048. dimm_type = SDRAM_DDR1;
  1049. }
  1050. total_rank += dimm_rank;
  1051. total_dimm++;
  1052. if ((dimm_num == 0) && (total_dimm == 1))
  1053. firstSlot = TRUE;
  1054. else
  1055. firstSlot = FALSE;
  1056. }
  1057. }
  1058. if (dimm_type == SDRAM_DDR2) {
  1059. codt |= SDRAM_CODT_DQS_1_8_V_DDR2;
  1060. if ((total_dimm == 1) && (firstSlot == TRUE)) {
  1061. if (total_rank == 1) { /* PUUU */
  1062. codt |= CALC_ODT_R(0);
  1063. modt0 = CALC_ODT_W(0);
  1064. modt1 = 0x00000000;
  1065. modt2 = 0x00000000;
  1066. modt3 = 0x00000000;
  1067. }
  1068. if (total_rank == 2) { /* PPUU */
  1069. codt |= CALC_ODT_R(0) | CALC_ODT_R(1);
  1070. modt0 = CALC_ODT_W(0) | CALC_ODT_W(1);
  1071. modt1 = 0x00000000;
  1072. modt2 = 0x00000000;
  1073. modt3 = 0x00000000;
  1074. }
  1075. } else if ((total_dimm == 1) && (firstSlot != TRUE)) {
  1076. if (total_rank == 1) { /* UUPU */
  1077. codt |= CALC_ODT_R(2);
  1078. modt0 = 0x00000000;
  1079. modt1 = 0x00000000;
  1080. modt2 = CALC_ODT_W(2);
  1081. modt3 = 0x00000000;
  1082. }
  1083. if (total_rank == 2) { /* UUPP */
  1084. codt |= CALC_ODT_R(2) | CALC_ODT_R(3);
  1085. modt0 = 0x00000000;
  1086. modt1 = 0x00000000;
  1087. modt2 = CALC_ODT_W(2) | CALC_ODT_W(3);
  1088. modt3 = 0x00000000;
  1089. }
  1090. }
  1091. if (total_dimm == 2) {
  1092. if (total_rank == 2) { /* PUPU */
  1093. codt |= CALC_ODT_R(0) | CALC_ODT_R(2);
  1094. modt0 = CALC_ODT_RW(2);
  1095. modt1 = 0x00000000;
  1096. modt2 = CALC_ODT_RW(0);
  1097. modt3 = 0x00000000;
  1098. }
  1099. if (total_rank == 4) { /* PPPP */
  1100. codt |= CALC_ODT_R(0) | CALC_ODT_R(1) |
  1101. CALC_ODT_R(2) | CALC_ODT_R(3);
  1102. modt0 = CALC_ODT_RW(2) | CALC_ODT_RW(3);
  1103. modt1 = 0x00000000;
  1104. modt2 = CALC_ODT_RW(0) | CALC_ODT_RW(1);
  1105. modt3 = 0x00000000;
  1106. }
  1107. }
  1108. } else {
  1109. codt |= SDRAM_CODT_DQS_2_5_V_DDR1;
  1110. modt0 = 0x00000000;
  1111. modt1 = 0x00000000;
  1112. modt2 = 0x00000000;
  1113. modt3 = 0x00000000;
  1114. if (total_dimm == 1) {
  1115. if (total_rank == 1)
  1116. codt |= 0x00800000;
  1117. if (total_rank == 2)
  1118. codt |= 0x02800000;
  1119. }
  1120. if (total_dimm == 2) {
  1121. if (total_rank == 2)
  1122. codt |= 0x08800000;
  1123. if (total_rank == 4)
  1124. codt |= 0x2a800000;
  1125. }
  1126. }
  1127. debug("nb of dimm %d\n", total_dimm);
  1128. debug("nb of rank %d\n", total_rank);
  1129. if (total_dimm == 1)
  1130. debug("dimm in slot %d\n", firstSlot);
  1131. mtsdram(SDRAM_CODT, codt);
  1132. mtsdram(SDRAM_MODT0, modt0);
  1133. mtsdram(SDRAM_MODT1, modt1);
  1134. mtsdram(SDRAM_MODT2, modt2);
  1135. mtsdram(SDRAM_MODT3, modt3);
  1136. }
  1137. /*-----------------------------------------------------------------------------+
  1138. * program_initplr.
  1139. *-----------------------------------------------------------------------------*/
  1140. static void program_initplr(unsigned long *dimm_populated,
  1141. unsigned char *iic0_dimm_addr,
  1142. unsigned long num_dimm_banks,
  1143. ddr_cas_id_t selected_cas,
  1144. int write_recovery)
  1145. {
  1146. u32 cas = 0;
  1147. u32 odt = 0;
  1148. u32 ods = 0;
  1149. u32 mr;
  1150. u32 wr;
  1151. u32 emr;
  1152. u32 emr2;
  1153. u32 emr3;
  1154. int dimm_num;
  1155. int total_dimm = 0;
  1156. /******************************************************
  1157. ** Assumption: if more than one DIMM, all DIMMs are the same
  1158. ** as already checked in check_memory_type
  1159. ******************************************************/
  1160. if ((dimm_populated[0] == SDRAM_DDR1) || (dimm_populated[1] == SDRAM_DDR1)) {
  1161. mtsdram(SDRAM_INITPLR0, 0x81B80000);
  1162. mtsdram(SDRAM_INITPLR1, 0x81900400);
  1163. mtsdram(SDRAM_INITPLR2, 0x81810000);
  1164. mtsdram(SDRAM_INITPLR3, 0xff800162);
  1165. mtsdram(SDRAM_INITPLR4, 0x81900400);
  1166. mtsdram(SDRAM_INITPLR5, 0x86080000);
  1167. mtsdram(SDRAM_INITPLR6, 0x86080000);
  1168. mtsdram(SDRAM_INITPLR7, 0x81000062);
  1169. } else if ((dimm_populated[0] == SDRAM_DDR2) || (dimm_populated[1] == SDRAM_DDR2)) {
  1170. switch (selected_cas) {
  1171. case DDR_CAS_3:
  1172. cas = 3 << 4;
  1173. break;
  1174. case DDR_CAS_4:
  1175. cas = 4 << 4;
  1176. break;
  1177. case DDR_CAS_5:
  1178. cas = 5 << 4;
  1179. break;
  1180. default:
  1181. printf("ERROR: ucode error on selected_cas value %d", selected_cas);
  1182. spd_ddr_init_hang ();
  1183. break;
  1184. }
  1185. #if 0
  1186. /*
  1187. * ToDo - Still a problem with the write recovery:
  1188. * On the Corsair CM2X512-5400C4 module, setting write recovery
  1189. * in the INITPLR reg to the value calculated in program_mode()
  1190. * results in not correctly working DDR2 memory (crash after
  1191. * relocation).
  1192. *
  1193. * So for now, set the write recovery to 3. This seems to work
  1194. * on the Corair module too.
  1195. *
  1196. * 2007-03-01, sr
  1197. */
  1198. switch (write_recovery) {
  1199. case 3:
  1200. wr = WRITE_RECOV_3;
  1201. break;
  1202. case 4:
  1203. wr = WRITE_RECOV_4;
  1204. break;
  1205. case 5:
  1206. wr = WRITE_RECOV_5;
  1207. break;
  1208. case 6:
  1209. wr = WRITE_RECOV_6;
  1210. break;
  1211. default:
  1212. printf("ERROR: write recovery not support (%d)", write_recovery);
  1213. spd_ddr_init_hang ();
  1214. break;
  1215. }
  1216. #else
  1217. wr = WRITE_RECOV_3; /* test-only, see description above */
  1218. #endif
  1219. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++)
  1220. if (dimm_populated[dimm_num] != SDRAM_NONE)
  1221. total_dimm++;
  1222. if (total_dimm == 1) {
  1223. odt = ODT_150_OHM;
  1224. ods = ODS_FULL;
  1225. } else if (total_dimm == 2) {
  1226. odt = ODT_75_OHM;
  1227. ods = ODS_REDUCED;
  1228. } else {
  1229. printf("ERROR: Unsupported number of DIMM's (%d)", total_dimm);
  1230. spd_ddr_init_hang ();
  1231. }
  1232. mr = CMD_EMR | SELECT_MR | BURST_LEN_4 | wr | cas;
  1233. emr = CMD_EMR | SELECT_EMR | odt | ods;
  1234. emr2 = CMD_EMR | SELECT_EMR2;
  1235. emr3 = CMD_EMR | SELECT_EMR3;
  1236. /* NOP - Wait 106 MemClk cycles */
  1237. mtsdram(SDRAM_INITPLR0, SDRAM_INITPLR_ENABLE | CMD_NOP |
  1238. SDRAM_INITPLR_IMWT_ENCODE(106));
  1239. udelay(1000);
  1240. /* precharge 4 MemClk cycles */
  1241. mtsdram(SDRAM_INITPLR1, SDRAM_INITPLR_ENABLE | CMD_PRECHARGE |
  1242. SDRAM_INITPLR_IMWT_ENCODE(4));
  1243. /* EMR2 - Wait tMRD (2 MemClk cycles) */
  1244. mtsdram(SDRAM_INITPLR2, SDRAM_INITPLR_ENABLE | emr2 |
  1245. SDRAM_INITPLR_IMWT_ENCODE(2));
  1246. /* EMR3 - Wait tMRD (2 MemClk cycles) */
  1247. mtsdram(SDRAM_INITPLR3, SDRAM_INITPLR_ENABLE | emr3 |
  1248. SDRAM_INITPLR_IMWT_ENCODE(2));
  1249. /* EMR DLL ENABLE - Wait tMRD (2 MemClk cycles) */
  1250. mtsdram(SDRAM_INITPLR4, SDRAM_INITPLR_ENABLE | emr |
  1251. SDRAM_INITPLR_IMWT_ENCODE(2));
  1252. /* MR w/ DLL reset - 200 cycle wait for DLL reset */
  1253. mtsdram(SDRAM_INITPLR5, SDRAM_INITPLR_ENABLE | mr | DLL_RESET |
  1254. SDRAM_INITPLR_IMWT_ENCODE(200));
  1255. udelay(1000);
  1256. /* precharge 4 MemClk cycles */
  1257. mtsdram(SDRAM_INITPLR6, SDRAM_INITPLR_ENABLE | CMD_PRECHARGE |
  1258. SDRAM_INITPLR_IMWT_ENCODE(4));
  1259. /* Refresh 25 MemClk cycles */
  1260. mtsdram(SDRAM_INITPLR7, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
  1261. SDRAM_INITPLR_IMWT_ENCODE(25));
  1262. /* Refresh 25 MemClk cycles */
  1263. mtsdram(SDRAM_INITPLR8, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
  1264. SDRAM_INITPLR_IMWT_ENCODE(25));
  1265. /* Refresh 25 MemClk cycles */
  1266. mtsdram(SDRAM_INITPLR9, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
  1267. SDRAM_INITPLR_IMWT_ENCODE(25));
  1268. /* Refresh 25 MemClk cycles */
  1269. mtsdram(SDRAM_INITPLR10, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
  1270. SDRAM_INITPLR_IMWT_ENCODE(25));
  1271. /* MR w/o DLL reset - Wait tMRD (2 MemClk cycles) */
  1272. mtsdram(SDRAM_INITPLR11, SDRAM_INITPLR_ENABLE | mr |
  1273. SDRAM_INITPLR_IMWT_ENCODE(2));
  1274. /* EMR OCD Default - Wait tMRD (2 MemClk cycles) */
  1275. mtsdram(SDRAM_INITPLR12, SDRAM_INITPLR_ENABLE | OCD_CALIB_DEF |
  1276. SDRAM_INITPLR_IMWT_ENCODE(2) | emr);
  1277. /* EMR OCD Exit */
  1278. mtsdram(SDRAM_INITPLR13, SDRAM_INITPLR_ENABLE | emr |
  1279. SDRAM_INITPLR_IMWT_ENCODE(2));
  1280. } else {
  1281. printf("ERROR: ucode error as unknown DDR type in program_initplr");
  1282. spd_ddr_init_hang ();
  1283. }
  1284. }
  1285. /*------------------------------------------------------------------
  1286. * This routine programs the SDRAM_MMODE register.
  1287. * the selected_cas is an output parameter, that will be passed
  1288. * by caller to call the above program_initplr( )
  1289. *-----------------------------------------------------------------*/
  1290. static void program_mode(unsigned long *dimm_populated,
  1291. unsigned char *iic0_dimm_addr,
  1292. unsigned long num_dimm_banks,
  1293. ddr_cas_id_t *selected_cas,
  1294. int *write_recovery)
  1295. {
  1296. unsigned long dimm_num;
  1297. unsigned long sdram_ddr1;
  1298. unsigned long t_wr_ns;
  1299. unsigned long t_wr_clk;
  1300. unsigned long cas_bit;
  1301. unsigned long cas_index;
  1302. unsigned long sdram_freq;
  1303. unsigned long ddr_check;
  1304. unsigned long mmode;
  1305. unsigned long tcyc_reg;
  1306. unsigned long cycle_2_0_clk;
  1307. unsigned long cycle_2_5_clk;
  1308. unsigned long cycle_3_0_clk;
  1309. unsigned long cycle_4_0_clk;
  1310. unsigned long cycle_5_0_clk;
  1311. unsigned long max_2_0_tcyc_ns_x_100;
  1312. unsigned long max_2_5_tcyc_ns_x_100;
  1313. unsigned long max_3_0_tcyc_ns_x_100;
  1314. unsigned long max_4_0_tcyc_ns_x_100;
  1315. unsigned long max_5_0_tcyc_ns_x_100;
  1316. unsigned long cycle_time_ns_x_100[3];
  1317. PPC4xx_SYS_INFO board_cfg;
  1318. unsigned char cas_2_0_available;
  1319. unsigned char cas_2_5_available;
  1320. unsigned char cas_3_0_available;
  1321. unsigned char cas_4_0_available;
  1322. unsigned char cas_5_0_available;
  1323. unsigned long sdr_ddrpll;
  1324. /*------------------------------------------------------------------
  1325. * Get the board configuration info.
  1326. *-----------------------------------------------------------------*/
  1327. get_sys_info(&board_cfg);
  1328. mfsdr(SDR0_DDR0, sdr_ddrpll);
  1329. sdram_freq = MULDIV64((board_cfg.freqPLB), SDR0_DDR0_DDRM_DECODE(sdr_ddrpll), 1);
  1330. debug("sdram_freq=%lu\n", sdram_freq);
  1331. /*------------------------------------------------------------------
  1332. * Handle the timing. We need to find the worst case timing of all
  1333. * the dimm modules installed.
  1334. *-----------------------------------------------------------------*/
  1335. t_wr_ns = 0;
  1336. cas_2_0_available = TRUE;
  1337. cas_2_5_available = TRUE;
  1338. cas_3_0_available = TRUE;
  1339. cas_4_0_available = TRUE;
  1340. cas_5_0_available = TRUE;
  1341. max_2_0_tcyc_ns_x_100 = 10;
  1342. max_2_5_tcyc_ns_x_100 = 10;
  1343. max_3_0_tcyc_ns_x_100 = 10;
  1344. max_4_0_tcyc_ns_x_100 = 10;
  1345. max_5_0_tcyc_ns_x_100 = 10;
  1346. sdram_ddr1 = TRUE;
  1347. /* loop through all the DIMM slots on the board */
  1348. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  1349. /* If a dimm is installed in a particular slot ... */
  1350. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  1351. if (dimm_populated[dimm_num] == SDRAM_DDR1)
  1352. sdram_ddr1 = TRUE;
  1353. else
  1354. sdram_ddr1 = FALSE;
  1355. /* t_wr_ns = max(t_wr_ns, (unsigned long)dimm_spd[dimm_num][36] >> 2); */ /* not used in this loop. */
  1356. cas_bit = spd_read(iic0_dimm_addr[dimm_num], 18);
  1357. debug("cas_bit[SPD byte 18]=%02lx\n", cas_bit);
  1358. /* For a particular DIMM, grab the three CAS values it supports */
  1359. for (cas_index = 0; cas_index < 3; cas_index++) {
  1360. switch (cas_index) {
  1361. case 0:
  1362. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
  1363. break;
  1364. case 1:
  1365. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 23);
  1366. break;
  1367. default:
  1368. tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 25);
  1369. break;
  1370. }
  1371. if ((tcyc_reg & 0x0F) >= 10) {
  1372. if ((tcyc_reg & 0x0F) == 0x0D) {
  1373. /* Convert from hex to decimal */
  1374. cycle_time_ns_x_100[cas_index] =
  1375. (((tcyc_reg & 0xF0) >> 4) * 100) + 75;
  1376. } else {
  1377. printf("ERROR: SPD reported Tcyc is incorrect for DIMM "
  1378. "in slot %d\n", (unsigned int)dimm_num);
  1379. spd_ddr_init_hang ();
  1380. }
  1381. } else {
  1382. /* Convert from hex to decimal */
  1383. cycle_time_ns_x_100[cas_index] =
  1384. (((tcyc_reg & 0xF0) >> 4) * 100) +
  1385. ((tcyc_reg & 0x0F)*10);
  1386. }
  1387. debug("cas_index=%lu: cycle_time_ns_x_100=%lu\n", cas_index,
  1388. cycle_time_ns_x_100[cas_index]);
  1389. }
  1390. /* The rest of this routine determines if CAS 2.0, 2.5, 3.0, 4.0 and 5.0 are */
  1391. /* supported for a particular DIMM. */
  1392. cas_index = 0;
  1393. if (sdram_ddr1) {
  1394. /*
  1395. * DDR devices use the following bitmask for CAS latency:
  1396. * Bit 7 6 5 4 3 2 1 0
  1397. * TBD 4.0 3.5 3.0 2.5 2.0 1.5 1.0
  1398. */
  1399. if (((cas_bit & 0x40) == 0x40) && (cas_index < 3) &&
  1400. (cycle_time_ns_x_100[cas_index] != 0)) {
  1401. max_4_0_tcyc_ns_x_100 = max(max_4_0_tcyc_ns_x_100,
  1402. cycle_time_ns_x_100[cas_index]);
  1403. cas_index++;
  1404. } else {
  1405. if (cas_index != 0)
  1406. cas_index++;
  1407. cas_4_0_available = FALSE;
  1408. }
  1409. if (((cas_bit & 0x10) == 0x10) && (cas_index < 3) &&
  1410. (cycle_time_ns_x_100[cas_index] != 0)) {
  1411. max_3_0_tcyc_ns_x_100 = max(max_3_0_tcyc_ns_x_100,
  1412. cycle_time_ns_x_100[cas_index]);
  1413. cas_index++;
  1414. } else {
  1415. if (cas_index != 0)
  1416. cas_index++;
  1417. cas_3_0_available = FALSE;
  1418. }
  1419. if (((cas_bit & 0x08) == 0x08) && (cas_index < 3) &&
  1420. (cycle_time_ns_x_100[cas_index] != 0)) {
  1421. max_2_5_tcyc_ns_x_100 = max(max_2_5_tcyc_ns_x_100,
  1422. cycle_time_ns_x_100[cas_index]);
  1423. cas_index++;
  1424. } else {
  1425. if (cas_index != 0)
  1426. cas_index++;
  1427. cas_2_5_available = FALSE;
  1428. }
  1429. if (((cas_bit & 0x04) == 0x04) && (cas_index < 3) &&
  1430. (cycle_time_ns_x_100[cas_index] != 0)) {
  1431. max_2_0_tcyc_ns_x_100 = max(max_2_0_tcyc_ns_x_100,
  1432. cycle_time_ns_x_100[cas_index]);
  1433. cas_index++;
  1434. } else {
  1435. if (cas_index != 0)
  1436. cas_index++;
  1437. cas_2_0_available = FALSE;
  1438. }
  1439. } else {
  1440. /*
  1441. * DDR2 devices use the following bitmask for CAS latency:
  1442. * Bit 7 6 5 4 3 2 1 0
  1443. * TBD 6.0 5.0 4.0 3.0 2.0 TBD TBD
  1444. */
  1445. if (((cas_bit & 0x20) == 0x20) && (cas_index < 3) &&
  1446. (cycle_time_ns_x_100[cas_index] != 0)) {
  1447. max_5_0_tcyc_ns_x_100 = max(max_5_0_tcyc_ns_x_100,
  1448. cycle_time_ns_x_100[cas_index]);
  1449. cas_index++;
  1450. } else {
  1451. if (cas_index != 0)
  1452. cas_index++;
  1453. cas_5_0_available = FALSE;
  1454. }
  1455. if (((cas_bit & 0x10) == 0x10) && (cas_index < 3) &&
  1456. (cycle_time_ns_x_100[cas_index] != 0)) {
  1457. max_4_0_tcyc_ns_x_100 = max(max_4_0_tcyc_ns_x_100,
  1458. cycle_time_ns_x_100[cas_index]);
  1459. cas_index++;
  1460. } else {
  1461. if (cas_index != 0)
  1462. cas_index++;
  1463. cas_4_0_available = FALSE;
  1464. }
  1465. if (((cas_bit & 0x08) == 0x08) && (cas_index < 3) &&
  1466. (cycle_time_ns_x_100[cas_index] != 0)) {
  1467. max_3_0_tcyc_ns_x_100 = max(max_3_0_tcyc_ns_x_100,
  1468. cycle_time_ns_x_100[cas_index]);
  1469. cas_index++;
  1470. } else {
  1471. if (cas_index != 0)
  1472. cas_index++;
  1473. cas_3_0_available = FALSE;
  1474. }
  1475. }
  1476. }
  1477. }
  1478. /*------------------------------------------------------------------
  1479. * Set the SDRAM mode, SDRAM_MMODE
  1480. *-----------------------------------------------------------------*/
  1481. mfsdram(SDRAM_MMODE, mmode);
  1482. mmode = mmode & ~(SDRAM_MMODE_WR_MASK | SDRAM_MMODE_DCL_MASK);
  1483. /* add 10 here because of rounding problems */
  1484. cycle_2_0_clk = MULDIV64(ONE_BILLION, 100, max_2_0_tcyc_ns_x_100) + 10;
  1485. cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100) + 10;
  1486. cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100) + 10;
  1487. cycle_4_0_clk = MULDIV64(ONE_BILLION, 100, max_4_0_tcyc_ns_x_100) + 10;
  1488. cycle_5_0_clk = MULDIV64(ONE_BILLION, 100, max_5_0_tcyc_ns_x_100) + 10;
  1489. debug("cycle_3_0_clk=%lu\n", cycle_3_0_clk);
  1490. debug("cycle_4_0_clk=%lu\n", cycle_4_0_clk);
  1491. debug("cycle_5_0_clk=%lu\n", cycle_5_0_clk);
  1492. if (sdram_ddr1 == TRUE) { /* DDR1 */
  1493. if ((cas_2_0_available == TRUE) && (sdram_freq <= cycle_2_0_clk)) {
  1494. mmode |= SDRAM_MMODE_DCL_DDR1_2_0_CLK;
  1495. *selected_cas = DDR_CAS_2;
  1496. } else if ((cas_2_5_available == TRUE) && (sdram_freq <= cycle_2_5_clk)) {
  1497. mmode |= SDRAM_MMODE_DCL_DDR1_2_5_CLK;
  1498. *selected_cas = DDR_CAS_2_5;
  1499. } else if ((cas_3_0_available == TRUE) && (sdram_freq <= cycle_3_0_clk)) {
  1500. mmode |= SDRAM_MMODE_DCL_DDR1_3_0_CLK;
  1501. *selected_cas = DDR_CAS_3;
  1502. } else {
  1503. printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n");
  1504. printf("Only DIMMs DDR1 with CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");
  1505. printf("Make sure the PLB speed is within the supported range of the DIMMs.\n\n");
  1506. spd_ddr_init_hang ();
  1507. }
  1508. } else { /* DDR2 */
  1509. debug("cas_3_0_available=%d\n", cas_3_0_available);
  1510. debug("cas_4_0_available=%d\n", cas_4_0_available);
  1511. debug("cas_5_0_available=%d\n", cas_5_0_available);
  1512. if ((cas_3_0_available == TRUE) && (sdram_freq <= cycle_3_0_clk)) {
  1513. mmode |= SDRAM_MMODE_DCL_DDR2_3_0_CLK;
  1514. *selected_cas = DDR_CAS_3;
  1515. } else if ((cas_4_0_available == TRUE) && (sdram_freq <= cycle_4_0_clk)) {
  1516. mmode |= SDRAM_MMODE_DCL_DDR2_4_0_CLK;
  1517. *selected_cas = DDR_CAS_4;
  1518. } else if ((cas_5_0_available == TRUE) && (sdram_freq <= cycle_5_0_clk)) {
  1519. mmode |= SDRAM_MMODE_DCL_DDR2_5_0_CLK;
  1520. *selected_cas = DDR_CAS_5;
  1521. } else {
  1522. printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n");
  1523. printf("Only DIMMs DDR2 with CAS latencies of 3.0, 4.0, and 5.0 are supported.\n");
  1524. printf("Make sure the PLB speed is within the supported range of the DIMMs.\n");
  1525. printf("cas3=%d cas4=%d cas5=%d\n",
  1526. cas_3_0_available, cas_4_0_available, cas_5_0_available);
  1527. printf("sdram_freq=%lu cycle3=%lu cycle4=%lu cycle5=%lu\n\n",
  1528. sdram_freq, cycle_3_0_clk, cycle_4_0_clk, cycle_5_0_clk);
  1529. spd_ddr_init_hang ();
  1530. }
  1531. }
  1532. if (sdram_ddr1 == TRUE)
  1533. mmode |= SDRAM_MMODE_WR_DDR1;
  1534. else {
  1535. /* loop through all the DIMM slots on the board */
  1536. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  1537. /* If a dimm is installed in a particular slot ... */
  1538. if (dimm_populated[dimm_num] != SDRAM_NONE)
  1539. t_wr_ns = max(t_wr_ns,
  1540. spd_read(iic0_dimm_addr[dimm_num], 36) >> 2);
  1541. }
  1542. /*
  1543. * convert from nanoseconds to ddr clocks
  1544. * round up if necessary
  1545. */
  1546. t_wr_clk = MULDIV64(sdram_freq, t_wr_ns, ONE_BILLION);
  1547. ddr_check = MULDIV64(ONE_BILLION, t_wr_clk, t_wr_ns);
  1548. if (sdram_freq != ddr_check)
  1549. t_wr_clk++;
  1550. switch (t_wr_clk) {
  1551. case 0:
  1552. case 1:
  1553. case 2:
  1554. case 3:
  1555. mmode |= SDRAM_MMODE_WR_DDR2_3_CYC;
  1556. break;
  1557. case 4:
  1558. mmode |= SDRAM_MMODE_WR_DDR2_4_CYC;
  1559. break;
  1560. case 5:
  1561. mmode |= SDRAM_MMODE_WR_DDR2_5_CYC;
  1562. break;
  1563. default:
  1564. mmode |= SDRAM_MMODE_WR_DDR2_6_CYC;
  1565. break;
  1566. }
  1567. *write_recovery = t_wr_clk;
  1568. }
  1569. debug("CAS latency = %d\n", *selected_cas);
  1570. debug("Write recovery = %d\n", *write_recovery);
  1571. mtsdram(SDRAM_MMODE, mmode);
  1572. }
  1573. /*-----------------------------------------------------------------------------+
  1574. * program_rtr.
  1575. *-----------------------------------------------------------------------------*/
  1576. static void program_rtr(unsigned long *dimm_populated,
  1577. unsigned char *iic0_dimm_addr,
  1578. unsigned long num_dimm_banks)
  1579. {
  1580. PPC4xx_SYS_INFO board_cfg;
  1581. unsigned long max_refresh_rate;
  1582. unsigned long dimm_num;
  1583. unsigned long refresh_rate_type;
  1584. unsigned long refresh_rate;
  1585. unsigned long rint;
  1586. unsigned long sdram_freq;
  1587. unsigned long sdr_ddrpll;
  1588. unsigned long val;
  1589. /*------------------------------------------------------------------
  1590. * Get the board configuration info.
  1591. *-----------------------------------------------------------------*/
  1592. get_sys_info(&board_cfg);
  1593. /*------------------------------------------------------------------
  1594. * Set the SDRAM Refresh Timing Register, SDRAM_RTR
  1595. *-----------------------------------------------------------------*/
  1596. mfsdr(SDR0_DDR0, sdr_ddrpll);
  1597. sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
  1598. max_refresh_rate = 0;
  1599. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  1600. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  1601. refresh_rate_type = spd_read(iic0_dimm_addr[dimm_num], 12);
  1602. refresh_rate_type &= 0x7F;
  1603. switch (refresh_rate_type) {
  1604. case 0:
  1605. refresh_rate = 15625;
  1606. break;
  1607. case 1:
  1608. refresh_rate = 3906;
  1609. break;
  1610. case 2:
  1611. refresh_rate = 7812;
  1612. break;
  1613. case 3:
  1614. refresh_rate = 31250;
  1615. break;
  1616. case 4:
  1617. refresh_rate = 62500;
  1618. break;
  1619. case 5:
  1620. refresh_rate = 125000;
  1621. break;
  1622. default:
  1623. refresh_rate = 0;
  1624. printf("ERROR: DIMM %d unsupported refresh rate/type.\n",
  1625. (unsigned int)dimm_num);
  1626. printf("Replace the DIMM module with a supported DIMM.\n\n");
  1627. spd_ddr_init_hang ();
  1628. break;
  1629. }
  1630. max_refresh_rate = max(max_refresh_rate, refresh_rate);
  1631. }
  1632. }
  1633. rint = MULDIV64(sdram_freq, max_refresh_rate, ONE_BILLION);
  1634. mfsdram(SDRAM_RTR, val);
  1635. mtsdram(SDRAM_RTR, (val & ~SDRAM_RTR_RINT_MASK) |
  1636. (SDRAM_RTR_RINT_ENCODE(rint)));
  1637. }
  1638. /*------------------------------------------------------------------
  1639. * This routine programs the SDRAM_TRx registers.
  1640. *-----------------------------------------------------------------*/
  1641. static void program_tr(unsigned long *dimm_populated,
  1642. unsigned char *iic0_dimm_addr,
  1643. unsigned long num_dimm_banks)
  1644. {
  1645. unsigned long dimm_num;
  1646. unsigned long sdram_ddr1;
  1647. unsigned long t_rp_ns;
  1648. unsigned long t_rcd_ns;
  1649. unsigned long t_rrd_ns;
  1650. unsigned long t_ras_ns;
  1651. unsigned long t_rc_ns;
  1652. unsigned long t_rfc_ns;
  1653. unsigned long t_wpc_ns;
  1654. unsigned long t_wtr_ns;
  1655. unsigned long t_rpc_ns;
  1656. unsigned long t_rp_clk;
  1657. unsigned long t_rcd_clk;
  1658. unsigned long t_rrd_clk;
  1659. unsigned long t_ras_clk;
  1660. unsigned long t_rc_clk;
  1661. unsigned long t_rfc_clk;
  1662. unsigned long t_wpc_clk;
  1663. unsigned long t_wtr_clk;
  1664. unsigned long t_rpc_clk;
  1665. unsigned long sdtr1, sdtr2, sdtr3;
  1666. unsigned long ddr_check;
  1667. unsigned long sdram_freq;
  1668. unsigned long sdr_ddrpll;
  1669. PPC4xx_SYS_INFO board_cfg;
  1670. /*------------------------------------------------------------------
  1671. * Get the board configuration info.
  1672. *-----------------------------------------------------------------*/
  1673. get_sys_info(&board_cfg);
  1674. mfsdr(SDR0_DDR0, sdr_ddrpll);
  1675. sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
  1676. /*------------------------------------------------------------------
  1677. * Handle the timing. We need to find the worst case timing of all
  1678. * the dimm modules installed.
  1679. *-----------------------------------------------------------------*/
  1680. t_rp_ns = 0;
  1681. t_rrd_ns = 0;
  1682. t_rcd_ns = 0;
  1683. t_ras_ns = 0;
  1684. t_rc_ns = 0;
  1685. t_rfc_ns = 0;
  1686. t_wpc_ns = 0;
  1687. t_wtr_ns = 0;
  1688. t_rpc_ns = 0;
  1689. sdram_ddr1 = TRUE;
  1690. /* loop through all the DIMM slots on the board */
  1691. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  1692. /* If a dimm is installed in a particular slot ... */
  1693. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  1694. if (dimm_populated[dimm_num] == SDRAM_DDR2)
  1695. sdram_ddr1 = TRUE;
  1696. else
  1697. sdram_ddr1 = FALSE;
  1698. t_rcd_ns = max(t_rcd_ns, spd_read(iic0_dimm_addr[dimm_num], 29) >> 2);
  1699. t_rrd_ns = max(t_rrd_ns, spd_read(iic0_dimm_addr[dimm_num], 28) >> 2);
  1700. t_rp_ns = max(t_rp_ns, spd_read(iic0_dimm_addr[dimm_num], 27) >> 2);
  1701. t_ras_ns = max(t_ras_ns, spd_read(iic0_dimm_addr[dimm_num], 30));
  1702. t_rc_ns = max(t_rc_ns, spd_read(iic0_dimm_addr[dimm_num], 41));
  1703. t_rfc_ns = max(t_rfc_ns, spd_read(iic0_dimm_addr[dimm_num], 42));
  1704. }
  1705. }
  1706. /*------------------------------------------------------------------
  1707. * Set the SDRAM Timing Reg 1, SDRAM_TR1
  1708. *-----------------------------------------------------------------*/
  1709. mfsdram(SDRAM_SDTR1, sdtr1);
  1710. sdtr1 &= ~(SDRAM_SDTR1_LDOF_MASK | SDRAM_SDTR1_RTW_MASK |
  1711. SDRAM_SDTR1_WTWO_MASK | SDRAM_SDTR1_RTRO_MASK);
  1712. /* default values */
  1713. sdtr1 |= SDRAM_SDTR1_LDOF_2_CLK;
  1714. sdtr1 |= SDRAM_SDTR1_RTW_2_CLK;
  1715. /* normal operations */
  1716. sdtr1 |= SDRAM_SDTR1_WTWO_0_CLK;
  1717. sdtr1 |= SDRAM_SDTR1_RTRO_1_CLK;
  1718. mtsdram(SDRAM_SDTR1, sdtr1);
  1719. /*------------------------------------------------------------------
  1720. * Set the SDRAM Timing Reg 2, SDRAM_TR2
  1721. *-----------------------------------------------------------------*/
  1722. mfsdram(SDRAM_SDTR2, sdtr2);
  1723. sdtr2 &= ~(SDRAM_SDTR2_RCD_MASK | SDRAM_SDTR2_WTR_MASK |
  1724. SDRAM_SDTR2_XSNR_MASK | SDRAM_SDTR2_WPC_MASK |
  1725. SDRAM_SDTR2_RPC_MASK | SDRAM_SDTR2_RP_MASK |
  1726. SDRAM_SDTR2_RRD_MASK);
  1727. /*
  1728. * convert t_rcd from nanoseconds to ddr clocks
  1729. * round up if necessary
  1730. */
  1731. t_rcd_clk = MULDIV64(sdram_freq, t_rcd_ns, ONE_BILLION);
  1732. ddr_check = MULDIV64(ONE_BILLION, t_rcd_clk, t_rcd_ns);
  1733. if (sdram_freq != ddr_check)
  1734. t_rcd_clk++;
  1735. switch (t_rcd_clk) {
  1736. case 0:
  1737. case 1:
  1738. sdtr2 |= SDRAM_SDTR2_RCD_1_CLK;
  1739. break;
  1740. case 2:
  1741. sdtr2 |= SDRAM_SDTR2_RCD_2_CLK;
  1742. break;
  1743. case 3:
  1744. sdtr2 |= SDRAM_SDTR2_RCD_3_CLK;
  1745. break;
  1746. case 4:
  1747. sdtr2 |= SDRAM_SDTR2_RCD_4_CLK;
  1748. break;
  1749. default:
  1750. sdtr2 |= SDRAM_SDTR2_RCD_5_CLK;
  1751. break;
  1752. }
  1753. if (sdram_ddr1 == TRUE) { /* DDR1 */
  1754. if (sdram_freq < 200000000) {
  1755. sdtr2 |= SDRAM_SDTR2_WTR_1_CLK;
  1756. sdtr2 |= SDRAM_SDTR2_WPC_2_CLK;
  1757. sdtr2 |= SDRAM_SDTR2_RPC_2_CLK;
  1758. } else {
  1759. sdtr2 |= SDRAM_SDTR2_WTR_2_CLK;
  1760. sdtr2 |= SDRAM_SDTR2_WPC_3_CLK;
  1761. sdtr2 |= SDRAM_SDTR2_RPC_2_CLK;
  1762. }
  1763. } else { /* DDR2 */
  1764. /* loop through all the DIMM slots on the board */
  1765. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  1766. /* If a dimm is installed in a particular slot ... */
  1767. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  1768. t_wpc_ns = max(t_wtr_ns, spd_read(iic0_dimm_addr[dimm_num], 36) >> 2);
  1769. t_wtr_ns = max(t_wtr_ns, spd_read(iic0_dimm_addr[dimm_num], 37) >> 2);
  1770. t_rpc_ns = max(t_rpc_ns, spd_read(iic0_dimm_addr[dimm_num], 38) >> 2);
  1771. }
  1772. }
  1773. /*
  1774. * convert from nanoseconds to ddr clocks
  1775. * round up if necessary
  1776. */
  1777. t_wpc_clk = MULDIV64(sdram_freq, t_wpc_ns, ONE_BILLION);
  1778. ddr_check = MULDIV64(ONE_BILLION, t_wpc_clk, t_wpc_ns);
  1779. if (sdram_freq != ddr_check)
  1780. t_wpc_clk++;
  1781. switch (t_wpc_clk) {
  1782. case 0:
  1783. case 1:
  1784. case 2:
  1785. sdtr2 |= SDRAM_SDTR2_WPC_2_CLK;
  1786. break;
  1787. case 3:
  1788. sdtr2 |= SDRAM_SDTR2_WPC_3_CLK;
  1789. break;
  1790. case 4:
  1791. sdtr2 |= SDRAM_SDTR2_WPC_4_CLK;
  1792. break;
  1793. case 5:
  1794. sdtr2 |= SDRAM_SDTR2_WPC_5_CLK;
  1795. break;
  1796. default:
  1797. sdtr2 |= SDRAM_SDTR2_WPC_6_CLK;
  1798. break;
  1799. }
  1800. /*
  1801. * convert from nanoseconds to ddr clocks
  1802. * round up if necessary
  1803. */
  1804. t_wtr_clk = MULDIV64(sdram_freq, t_wtr_ns, ONE_BILLION);
  1805. ddr_check = MULDIV64(ONE_BILLION, t_wtr_clk, t_wtr_ns);
  1806. if (sdram_freq != ddr_check)
  1807. t_wtr_clk++;
  1808. switch (t_wtr_clk) {
  1809. case 0:
  1810. case 1:
  1811. sdtr2 |= SDRAM_SDTR2_WTR_1_CLK;
  1812. break;
  1813. case 2:
  1814. sdtr2 |= SDRAM_SDTR2_WTR_2_CLK;
  1815. break;
  1816. case 3:
  1817. sdtr2 |= SDRAM_SDTR2_WTR_3_CLK;
  1818. break;
  1819. default:
  1820. sdtr2 |= SDRAM_SDTR2_WTR_4_CLK;
  1821. break;
  1822. }
  1823. /*
  1824. * convert from nanoseconds to ddr clocks
  1825. * round up if necessary
  1826. */
  1827. t_rpc_clk = MULDIV64(sdram_freq, t_rpc_ns, ONE_BILLION);
  1828. ddr_check = MULDIV64(ONE_BILLION, t_rpc_clk, t_rpc_ns);
  1829. if (sdram_freq != ddr_check)
  1830. t_rpc_clk++;
  1831. switch (t_rpc_clk) {
  1832. case 0:
  1833. case 1:
  1834. case 2:
  1835. sdtr2 |= SDRAM_SDTR2_RPC_2_CLK;
  1836. break;
  1837. case 3:
  1838. sdtr2 |= SDRAM_SDTR2_RPC_3_CLK;
  1839. break;
  1840. default:
  1841. sdtr2 |= SDRAM_SDTR2_RPC_4_CLK;
  1842. break;
  1843. }
  1844. }
  1845. /* default value */
  1846. sdtr2 |= SDRAM_SDTR2_XSNR_16_CLK;
  1847. /*
  1848. * convert t_rrd from nanoseconds to ddr clocks
  1849. * round up if necessary
  1850. */
  1851. t_rrd_clk = MULDIV64(sdram_freq, t_rrd_ns, ONE_BILLION);
  1852. ddr_check = MULDIV64(ONE_BILLION, t_rrd_clk, t_rrd_ns);
  1853. if (sdram_freq != ddr_check)
  1854. t_rrd_clk++;
  1855. if (t_rrd_clk == 3)
  1856. sdtr2 |= SDRAM_SDTR2_RRD_3_CLK;
  1857. else
  1858. sdtr2 |= SDRAM_SDTR2_RRD_2_CLK;
  1859. /*
  1860. * convert t_rp from nanoseconds to ddr clocks
  1861. * round up if necessary
  1862. */
  1863. t_rp_clk = MULDIV64(sdram_freq, t_rp_ns, ONE_BILLION);
  1864. ddr_check = MULDIV64(ONE_BILLION, t_rp_clk, t_rp_ns);
  1865. if (sdram_freq != ddr_check)
  1866. t_rp_clk++;
  1867. switch (t_rp_clk) {
  1868. case 0:
  1869. case 1:
  1870. case 2:
  1871. case 3:
  1872. sdtr2 |= SDRAM_SDTR2_RP_3_CLK;
  1873. break;
  1874. case 4:
  1875. sdtr2 |= SDRAM_SDTR2_RP_4_CLK;
  1876. break;
  1877. case 5:
  1878. sdtr2 |= SDRAM_SDTR2_RP_5_CLK;
  1879. break;
  1880. case 6:
  1881. sdtr2 |= SDRAM_SDTR2_RP_6_CLK;
  1882. break;
  1883. default:
  1884. sdtr2 |= SDRAM_SDTR2_RP_7_CLK;
  1885. break;
  1886. }
  1887. mtsdram(SDRAM_SDTR2, sdtr2);
  1888. /*------------------------------------------------------------------
  1889. * Set the SDRAM Timing Reg 3, SDRAM_TR3
  1890. *-----------------------------------------------------------------*/
  1891. mfsdram(SDRAM_SDTR3, sdtr3);
  1892. sdtr3 &= ~(SDRAM_SDTR3_RAS_MASK | SDRAM_SDTR3_RC_MASK |
  1893. SDRAM_SDTR3_XCS_MASK | SDRAM_SDTR3_RFC_MASK);
  1894. /*
  1895. * convert t_ras from nanoseconds to ddr clocks
  1896. * round up if necessary
  1897. */
  1898. t_ras_clk = MULDIV64(sdram_freq, t_ras_ns, ONE_BILLION);
  1899. ddr_check = MULDIV64(ONE_BILLION, t_ras_clk, t_ras_ns);
  1900. if (sdram_freq != ddr_check)
  1901. t_ras_clk++;
  1902. sdtr3 |= SDRAM_SDTR3_RAS_ENCODE(t_ras_clk);
  1903. /*
  1904. * convert t_rc from nanoseconds to ddr clocks
  1905. * round up if necessary
  1906. */
  1907. t_rc_clk = MULDIV64(sdram_freq, t_rc_ns, ONE_BILLION);
  1908. ddr_check = MULDIV64(ONE_BILLION, t_rc_clk, t_rc_ns);
  1909. if (sdram_freq != ddr_check)
  1910. t_rc_clk++;
  1911. sdtr3 |= SDRAM_SDTR3_RC_ENCODE(t_rc_clk);
  1912. /* default xcs value */
  1913. sdtr3 |= SDRAM_SDTR3_XCS;
  1914. /*
  1915. * convert t_rfc from nanoseconds to ddr clocks
  1916. * round up if necessary
  1917. */
  1918. t_rfc_clk = MULDIV64(sdram_freq, t_rfc_ns, ONE_BILLION);
  1919. ddr_check = MULDIV64(ONE_BILLION, t_rfc_clk, t_rfc_ns);
  1920. if (sdram_freq != ddr_check)
  1921. t_rfc_clk++;
  1922. sdtr3 |= SDRAM_SDTR3_RFC_ENCODE(t_rfc_clk);
  1923. mtsdram(SDRAM_SDTR3, sdtr3);
  1924. }
  1925. /*-----------------------------------------------------------------------------+
  1926. * program_bxcf.
  1927. *-----------------------------------------------------------------------------*/
  1928. static void program_bxcf(unsigned long *dimm_populated,
  1929. unsigned char *iic0_dimm_addr,
  1930. unsigned long num_dimm_banks)
  1931. {
  1932. unsigned long dimm_num;
  1933. unsigned long num_col_addr;
  1934. unsigned long num_ranks;
  1935. unsigned long num_banks;
  1936. unsigned long mode;
  1937. unsigned long ind_rank;
  1938. unsigned long ind;
  1939. unsigned long ind_bank;
  1940. unsigned long bank_0_populated;
  1941. /*------------------------------------------------------------------
  1942. * Set the BxCF regs. First, wipe out the bank config registers.
  1943. *-----------------------------------------------------------------*/
  1944. mtsdram(SDRAM_MB0CF, 0x00000000);
  1945. mtsdram(SDRAM_MB1CF, 0x00000000);
  1946. mtsdram(SDRAM_MB2CF, 0x00000000);
  1947. mtsdram(SDRAM_MB3CF, 0x00000000);
  1948. mode = SDRAM_BXCF_M_BE_ENABLE;
  1949. bank_0_populated = 0;
  1950. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  1951. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  1952. num_col_addr = spd_read(iic0_dimm_addr[dimm_num], 4);
  1953. num_ranks = spd_read(iic0_dimm_addr[dimm_num], 5);
  1954. if ((spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08)
  1955. num_ranks = (num_ranks & 0x0F) +1;
  1956. else
  1957. num_ranks = num_ranks & 0x0F;
  1958. num_banks = spd_read(iic0_dimm_addr[dimm_num], 17);
  1959. for (ind_bank = 0; ind_bank < 2; ind_bank++) {
  1960. if (num_banks == 4)
  1961. ind = 0;
  1962. else
  1963. ind = 5 << 8;
  1964. switch (num_col_addr) {
  1965. case 0x08:
  1966. mode |= (SDRAM_BXCF_M_AM_0 + ind);
  1967. break;
  1968. case 0x09:
  1969. mode |= (SDRAM_BXCF_M_AM_1 + ind);
  1970. break;
  1971. case 0x0A:
  1972. mode |= (SDRAM_BXCF_M_AM_2 + ind);
  1973. break;
  1974. case 0x0B:
  1975. mode |= (SDRAM_BXCF_M_AM_3 + ind);
  1976. break;
  1977. case 0x0C:
  1978. mode |= (SDRAM_BXCF_M_AM_4 + ind);
  1979. break;
  1980. default:
  1981. printf("DDR-SDRAM: DIMM %d BxCF configuration.\n",
  1982. (unsigned int)dimm_num);
  1983. printf("ERROR: Unsupported value for number of "
  1984. "column addresses: %d.\n", (unsigned int)num_col_addr);
  1985. printf("Replace the DIMM module with a supported DIMM.\n\n");
  1986. spd_ddr_init_hang ();
  1987. }
  1988. }
  1989. if ((dimm_populated[dimm_num] != SDRAM_NONE)&& (dimm_num ==1))
  1990. bank_0_populated = 1;
  1991. for (ind_rank = 0; ind_rank < num_ranks; ind_rank++) {
  1992. mtsdram(SDRAM_MB0CF +
  1993. ((dimm_num + bank_0_populated + ind_rank) << 2),
  1994. mode);
  1995. }
  1996. }
  1997. }
  1998. }
  1999. /*------------------------------------------------------------------
  2000. * program memory queue.
  2001. *-----------------------------------------------------------------*/
  2002. static void program_memory_queue(unsigned long *dimm_populated,
  2003. unsigned char *iic0_dimm_addr,
  2004. unsigned long num_dimm_banks)
  2005. {
  2006. unsigned long dimm_num;
  2007. phys_size_t rank_base_addr;
  2008. unsigned long rank_reg;
  2009. phys_size_t rank_size_bytes;
  2010. unsigned long rank_size_id;
  2011. unsigned long num_ranks;
  2012. unsigned long baseadd_size;
  2013. unsigned long i;
  2014. unsigned long bank_0_populated = 0;
  2015. phys_size_t total_size = 0;
  2016. /*------------------------------------------------------------------
  2017. * Reset the rank_base_address.
  2018. *-----------------------------------------------------------------*/
  2019. rank_reg = SDRAM_R0BAS;
  2020. rank_base_addr = 0x00000000;
  2021. for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
  2022. if (dimm_populated[dimm_num] != SDRAM_NONE) {
  2023. num_ranks = spd_read(iic0_dimm_addr[dimm_num], 5);
  2024. if ((spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08)
  2025. num_ranks = (num_ranks & 0x0F) + 1;
  2026. else
  2027. num_ranks = num_ranks & 0x0F;
  2028. rank_size_id = spd_read(iic0_dimm_addr[dimm_num], 31);
  2029. /*------------------------------------------------------------------
  2030. * Set the sizes
  2031. *-----------------------------------------------------------------*/
  2032. baseadd_size = 0;
  2033. switch (rank_size_id) {
  2034. case 0x01:
  2035. baseadd_size |= SDRAM_RXBAS_SDSZ_1024;
  2036. total_size = 1024;
  2037. break;
  2038. case 0x02:
  2039. baseadd_size |= SDRAM_RXBAS_SDSZ_2048;
  2040. total_size = 2048;
  2041. break;
  2042. case 0x04:
  2043. baseadd_size |= SDRAM_RXBAS_SDSZ_4096;
  2044. total_size = 4096;
  2045. break;
  2046. case 0x08:
  2047. baseadd_size |= SDRAM_RXBAS_SDSZ_32;
  2048. total_size = 32;
  2049. break;
  2050. case 0x10:
  2051. baseadd_size |= SDRAM_RXBAS_SDSZ_64;
  2052. total_size = 64;
  2053. break;
  2054. case 0x20:
  2055. baseadd_size |= SDRAM_RXBAS_SDSZ_128;
  2056. total_size = 128;
  2057. break;
  2058. case 0x40:
  2059. baseadd_size |= SDRAM_RXBAS_SDSZ_256;
  2060. total_size = 256;
  2061. break;
  2062. case 0x80:
  2063. baseadd_size |= SDRAM_RXBAS_SDSZ_512;
  2064. total_size = 512;
  2065. break;
  2066. default:
  2067. printf("DDR-SDRAM: DIMM %d memory queue configuration.\n",
  2068. (unsigned int)dimm_num);
  2069. printf("ERROR: Unsupported value for the banksize: %d.\n",
  2070. (unsigned int)rank_size_id);
  2071. printf("Replace the DIMM module with a supported DIMM.\n\n");
  2072. spd_ddr_init_hang ();
  2073. }
  2074. rank_size_bytes = total_size << 20;
  2075. if ((dimm_populated[dimm_num] != SDRAM_NONE) && (dimm_num == 1))
  2076. bank_0_populated = 1;
  2077. for (i = 0; i < num_ranks; i++) {
  2078. mtdcr_any(rank_reg+i+dimm_num+bank_0_populated,
  2079. (SDRAM_RXBAS_SDBA_ENCODE(rank_base_addr) |
  2080. baseadd_size));
  2081. rank_base_addr += rank_size_bytes;
  2082. }
  2083. }
  2084. }
  2085. #if defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
  2086. defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
  2087. defined(CONFIG_460SX)
  2088. /*
  2089. * Enable high bandwidth access
  2090. * This is currently not used, but with this setup
  2091. * it is possible to use it later on in e.g. the Linux
  2092. * EMAC driver for performance gain.
  2093. */
  2094. mtdcr(SDRAM_PLBADDULL, 0x00000000); /* MQ0_BAUL */
  2095. mtdcr(SDRAM_PLBADDUHB, 0x00000008); /* MQ0_BAUH */
  2096. /*
  2097. * Set optimal value for Memory Queue HB/LL Configuration registers
  2098. */
  2099. mtdcr(SDRAM_CONF1HB, (mfdcr(SDRAM_CONF1HB) & ~SDRAM_CONF1HB_MASK) |
  2100. SDRAM_CONF1HB_AAFR | SDRAM_CONF1HB_RPEN | SDRAM_CONF1HB_RFTE |
  2101. SDRAM_CONF1HB_RPLM | SDRAM_CONF1HB_WRCL);
  2102. mtdcr(SDRAM_CONF1LL, (mfdcr(SDRAM_CONF1LL) & ~SDRAM_CONF1LL_MASK) |
  2103. SDRAM_CONF1LL_AAFR | SDRAM_CONF1LL_RPEN | SDRAM_CONF1LL_RFTE |
  2104. SDRAM_CONF1LL_RPLM);
  2105. mtdcr(SDRAM_CONFPATHB, mfdcr(SDRAM_CONFPATHB) | SDRAM_CONFPATHB_TPEN);
  2106. #endif
  2107. }
  2108. #ifdef CONFIG_DDR_ECC
  2109. /*-----------------------------------------------------------------------------+
  2110. * program_ecc.
  2111. *-----------------------------------------------------------------------------*/
  2112. static void program_ecc(unsigned long *dimm_populated,
  2113. unsigned char *iic0_dimm_addr,
  2114. unsigned long num_dimm_banks,
  2115. unsigned long tlb_word2_i_value)
  2116. {
  2117. unsigned long dimm_num;
  2118. unsigned long ecc;
  2119. ecc = 0;
  2120. /* loop through all the DIMM slots on the board */
  2121. for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) {
  2122. /* If a dimm is installed in a particular slot ... */
  2123. if (dimm_populated[dimm_num] != SDRAM_NONE)
  2124. ecc = max(ecc, spd_read(iic0_dimm_addr[dimm_num], 11));
  2125. }
  2126. if (ecc == 0)
  2127. return;
  2128. do_program_ecc(tlb_word2_i_value);
  2129. }
  2130. #endif
  2131. #if !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
  2132. /*-----------------------------------------------------------------------------+
  2133. * program_DQS_calibration.
  2134. *-----------------------------------------------------------------------------*/
  2135. static void program_DQS_calibration(unsigned long *dimm_populated,
  2136. unsigned char *iic0_dimm_addr,
  2137. unsigned long num_dimm_banks)
  2138. {
  2139. unsigned long val;
  2140. #ifdef HARD_CODED_DQS /* calibration test with hardvalues */
  2141. mtsdram(SDRAM_RQDC, 0x80000037);
  2142. mtsdram(SDRAM_RDCC, 0x40000000);
  2143. mtsdram(SDRAM_RFDC, 0x000001DF);
  2144. test();
  2145. #else
  2146. /*------------------------------------------------------------------
  2147. * Program RDCC register
  2148. * Read sample cycle auto-update enable
  2149. *-----------------------------------------------------------------*/
  2150. mfsdram(SDRAM_RDCC, val);
  2151. mtsdram(SDRAM_RDCC,
  2152. (val & ~(SDRAM_RDCC_RDSS_MASK | SDRAM_RDCC_RSAE_MASK))
  2153. | SDRAM_RDCC_RSAE_ENABLE);
  2154. /*------------------------------------------------------------------
  2155. * Program RQDC register
  2156. * Internal DQS delay mechanism enable
  2157. *-----------------------------------------------------------------*/
  2158. mtsdram(SDRAM_RQDC, (SDRAM_RQDC_RQDE_ENABLE|SDRAM_RQDC_RQFD_ENCODE(0x38)));
  2159. /*------------------------------------------------------------------
  2160. * Program RFDC register
  2161. * Set Feedback Fractional Oversample
  2162. * Auto-detect read sample cycle enable
  2163. * Set RFOS to 1/4 of memclk cycle (0x3f)
  2164. *-----------------------------------------------------------------*/
  2165. mfsdram(SDRAM_RFDC, val);
  2166. mtsdram(SDRAM_RFDC,
  2167. (val & ~(SDRAM_RFDC_ARSE_MASK | SDRAM_RFDC_RFOS_MASK |
  2168. SDRAM_RFDC_RFFD_MASK))
  2169. | (SDRAM_RFDC_ARSE_ENABLE | SDRAM_RFDC_RFOS_ENCODE(0x3f) |
  2170. SDRAM_RFDC_RFFD_ENCODE(0)));
  2171. DQS_calibration_process();
  2172. #endif
  2173. }
  2174. static int short_mem_test(void)
  2175. {
  2176. u32 *membase;
  2177. u32 bxcr_num;
  2178. u32 bxcf;
  2179. int i;
  2180. int j;
  2181. phys_size_t base_addr;
  2182. u32 test[NUMMEMTESTS][NUMMEMWORDS] = {
  2183. {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
  2184. 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF},
  2185. {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
  2186. 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},
  2187. {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
  2188. 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555},
  2189. {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
  2190. 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA},
  2191. {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
  2192. 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A},
  2193. {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
  2194. 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5},
  2195. {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
  2196. 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA},
  2197. {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
  2198. 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55} };
  2199. int l;
  2200. for (bxcr_num = 0; bxcr_num < MAXBXCF; bxcr_num++) {
  2201. mfsdram(SDRAM_MB0CF + (bxcr_num << 2), bxcf);
  2202. /* Banks enabled */
  2203. if ((bxcf & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {
  2204. /* Bank is enabled */
  2205. /*
  2206. * Only run test on accessable memory (below 2GB)
  2207. */
  2208. base_addr = SDRAM_RXBAS_SDBA_DECODE(mfdcr_any(SDRAM_R0BAS+bxcr_num));
  2209. if (base_addr >= CONFIG_MAX_MEM_MAPPED)
  2210. continue;
  2211. /*------------------------------------------------------------------
  2212. * Run the short memory test.
  2213. *-----------------------------------------------------------------*/
  2214. membase = (u32 *)(u32)base_addr;
  2215. for (i = 0; i < NUMMEMTESTS; i++) {
  2216. for (j = 0; j < NUMMEMWORDS; j++) {
  2217. membase[j] = test[i][j];
  2218. ppcDcbf((u32)&(membase[j]));
  2219. }
  2220. sync();
  2221. for (l=0; l<NUMLOOPS; l++) {
  2222. for (j = 0; j < NUMMEMWORDS; j++) {
  2223. if (membase[j] != test[i][j]) {
  2224. ppcDcbf((u32)&(membase[j]));
  2225. return 0;
  2226. }
  2227. ppcDcbf((u32)&(membase[j]));
  2228. }
  2229. sync();
  2230. }
  2231. }
  2232. } /* if bank enabled */
  2233. } /* for bxcf_num */
  2234. return 1;
  2235. }
  2236. #ifndef HARD_CODED_DQS
  2237. /*-----------------------------------------------------------------------------+
  2238. * DQS_calibration_process.
  2239. *-----------------------------------------------------------------------------*/
  2240. static void DQS_calibration_process(void)
  2241. {
  2242. unsigned long rfdc_reg;
  2243. unsigned long rffd;
  2244. unsigned long val;
  2245. long rffd_average;
  2246. long max_start;
  2247. long min_end;
  2248. unsigned long begin_rqfd[MAXRANKS];
  2249. unsigned long begin_rffd[MAXRANKS];
  2250. unsigned long end_rqfd[MAXRANKS];
  2251. unsigned long end_rffd[MAXRANKS];
  2252. char window_found;
  2253. unsigned long dlycal;
  2254. unsigned long dly_val;
  2255. unsigned long max_pass_length;
  2256. unsigned long current_pass_length;
  2257. unsigned long current_fail_length;
  2258. unsigned long current_start;
  2259. long max_end;
  2260. unsigned char fail_found;
  2261. unsigned char pass_found;
  2262. #if !defined(CONFIG_DDR_RQDC_FIXED)
  2263. u32 rqdc_reg;
  2264. u32 rqfd;
  2265. u32 rqfd_start;
  2266. u32 rqfd_average;
  2267. int loopi = 0;
  2268. char str[] = "Auto calibration -";
  2269. char slash[] = "\\|/-\\|/-";
  2270. /*------------------------------------------------------------------
  2271. * Test to determine the best read clock delay tuning bits.
  2272. *
  2273. * Before the DDR controller can be used, the read clock delay needs to be
  2274. * set. This is SDRAM_RQDC[RQFD] and SDRAM_RFDC[RFFD].
  2275. * This value cannot be hardcoded into the program because it changes
  2276. * depending on the board's setup and environment.
  2277. * To do this, all delay values are tested to see if they
  2278. * work or not. By doing this, you get groups of fails with groups of
  2279. * passing values. The idea is to find the start and end of a passing
  2280. * window and take the center of it to use as the read clock delay.
  2281. *
  2282. * A failure has to be seen first so that when we hit a pass, we know
  2283. * that it is truely the start of the window. If we get passing values
  2284. * to start off with, we don't know if we are at the start of the window.
  2285. *
  2286. * The code assumes that a failure will always be found.
  2287. * If a failure is not found, there is no easy way to get the middle
  2288. * of the passing window. I guess we can pretty much pick any value
  2289. * but some values will be better than others. Since the lowest speed
  2290. * we can clock the DDR interface at is 200 MHz (2x 100 MHz PLB speed),
  2291. * from experimentation it is safe to say you will always have a failure.
  2292. *-----------------------------------------------------------------*/
  2293. /* first fix RQDC[RQFD] to an average of 80 degre phase shift to find RFDC[RFFD] */
  2294. rqfd_start = 64; /* test-only: don't know if this is the _best_ start value */
  2295. puts(str);
  2296. calibration_loop:
  2297. mfsdram(SDRAM_RQDC, rqdc_reg);
  2298. mtsdram(SDRAM_RQDC, (rqdc_reg & ~SDRAM_RQDC_RQFD_MASK) |
  2299. SDRAM_RQDC_RQFD_ENCODE(rqfd_start));
  2300. #else /* CONFIG_DDR_RQDC_FIXED */
  2301. /*
  2302. * On Katmai the complete auto-calibration somehow doesn't seem to
  2303. * produce the best results, meaning optimal values for RQFD/RFFD.
  2304. * This was discovered by GDA using a high bandwidth scope,
  2305. * analyzing the DDR2 signals. GDA provided a fixed value for RQFD,
  2306. * so now on Katmai "only" RFFD is auto-calibrated.
  2307. */
  2308. mtsdram(SDRAM_RQDC, CONFIG_DDR_RQDC_FIXED);
  2309. #endif /* CONFIG_DDR_RQDC_FIXED */
  2310. max_start = 0;
  2311. min_end = 0;
  2312. begin_rqfd[0] = 0;
  2313. begin_rffd[0] = 0;
  2314. begin_rqfd[1] = 0;
  2315. begin_rffd[1] = 0;
  2316. end_rqfd[0] = 0;
  2317. end_rffd[0] = 0;
  2318. end_rqfd[1] = 0;
  2319. end_rffd[1] = 0;
  2320. window_found = FALSE;
  2321. max_pass_length = 0;
  2322. max_start = 0;
  2323. max_end = 0;
  2324. current_pass_length = 0;
  2325. current_fail_length = 0;
  2326. current_start = 0;
  2327. window_found = FALSE;
  2328. fail_found = FALSE;
  2329. pass_found = FALSE;
  2330. /*
  2331. * get the delay line calibration register value
  2332. */
  2333. mfsdram(SDRAM_DLCR, dlycal);
  2334. dly_val = SDRAM_DLYCAL_DLCV_DECODE(dlycal) << 2;
  2335. for (rffd = 0; rffd <= SDRAM_RFDC_RFFD_MAX; rffd++) {
  2336. mfsdram(SDRAM_RFDC, rfdc_reg);
  2337. rfdc_reg &= ~(SDRAM_RFDC_RFFD_MASK);
  2338. /*------------------------------------------------------------------
  2339. * Set the timing reg for the test.
  2340. *-----------------------------------------------------------------*/
  2341. mtsdram(SDRAM_RFDC, rfdc_reg | SDRAM_RFDC_RFFD_ENCODE(rffd));
  2342. /*------------------------------------------------------------------
  2343. * See if the rffd value passed.
  2344. *-----------------------------------------------------------------*/
  2345. if (short_mem_test()) {
  2346. if (fail_found == TRUE) {
  2347. pass_found = TRUE;
  2348. if (current_pass_length == 0)
  2349. current_start = rffd;
  2350. current_fail_length = 0;
  2351. current_pass_length++;
  2352. if (current_pass_length > max_pass_length) {
  2353. max_pass_length = current_pass_length;
  2354. max_start = current_start;
  2355. max_end = rffd;
  2356. }
  2357. }
  2358. } else {
  2359. current_pass_length = 0;
  2360. current_fail_length++;
  2361. if (current_fail_length >= (dly_val >> 2)) {
  2362. if (fail_found == FALSE) {
  2363. fail_found = TRUE;
  2364. } else if (pass_found == TRUE) {
  2365. window_found = TRUE;
  2366. break;
  2367. }
  2368. }
  2369. }
  2370. } /* for rffd */
  2371. /*------------------------------------------------------------------
  2372. * Set the average RFFD value
  2373. *-----------------------------------------------------------------*/
  2374. rffd_average = ((max_start + max_end) >> 1);
  2375. if (rffd_average < 0)
  2376. rffd_average = 0;
  2377. if (rffd_average > SDRAM_RFDC_RFFD_MAX)
  2378. rffd_average = SDRAM_RFDC_RFFD_MAX;
  2379. /* now fix RFDC[RFFD] found and find RQDC[RQFD] */
  2380. mtsdram(SDRAM_RFDC, rfdc_reg | SDRAM_RFDC_RFFD_ENCODE(rffd_average));
  2381. #if !defined(CONFIG_DDR_RQDC_FIXED)
  2382. max_pass_length = 0;
  2383. max_start = 0;
  2384. max_end = 0;
  2385. current_pass_length = 0;
  2386. current_fail_length = 0;
  2387. current_start = 0;
  2388. window_found = FALSE;
  2389. fail_found = FALSE;
  2390. pass_found = FALSE;
  2391. for (rqfd = 0; rqfd <= SDRAM_RQDC_RQFD_MAX; rqfd++) {
  2392. mfsdram(SDRAM_RQDC, rqdc_reg);
  2393. rqdc_reg &= ~(SDRAM_RQDC_RQFD_MASK);
  2394. /*------------------------------------------------------------------
  2395. * Set the timing reg for the test.
  2396. *-----------------------------------------------------------------*/
  2397. mtsdram(SDRAM_RQDC, rqdc_reg | SDRAM_RQDC_RQFD_ENCODE(rqfd));
  2398. /*------------------------------------------------------------------
  2399. * See if the rffd value passed.
  2400. *-----------------------------------------------------------------*/
  2401. if (short_mem_test()) {
  2402. if (fail_found == TRUE) {
  2403. pass_found = TRUE;
  2404. if (current_pass_length == 0)
  2405. current_start = rqfd;
  2406. current_fail_length = 0;
  2407. current_pass_length++;
  2408. if (current_pass_length > max_pass_length) {
  2409. max_pass_length = current_pass_length;
  2410. max_start = current_start;
  2411. max_end = rqfd;
  2412. }
  2413. }
  2414. } else {
  2415. current_pass_length = 0;
  2416. current_fail_length++;
  2417. if (fail_found == FALSE) {
  2418. fail_found = TRUE;
  2419. } else if (pass_found == TRUE) {
  2420. window_found = TRUE;
  2421. break;
  2422. }
  2423. }
  2424. }
  2425. rqfd_average = ((max_start + max_end) >> 1);
  2426. /*------------------------------------------------------------------
  2427. * Make sure we found the valid read passing window. Halt if not
  2428. *-----------------------------------------------------------------*/
  2429. if (window_found == FALSE) {
  2430. if (rqfd_start < SDRAM_RQDC_RQFD_MAX) {
  2431. putc('\b');
  2432. putc(slash[loopi++ % 8]);
  2433. /* try again from with a different RQFD start value */
  2434. rqfd_start++;
  2435. goto calibration_loop;
  2436. }
  2437. printf("\nERROR: Cannot determine a common read delay for the "
  2438. "DIMM(s) installed.\n");
  2439. debug("%s[%d] ERROR : \n", __FUNCTION__,__LINE__);
  2440. ppc4xx_ibm_ddr2_register_dump();
  2441. spd_ddr_init_hang ();
  2442. }
  2443. if (rqfd_average < 0)
  2444. rqfd_average = 0;
  2445. if (rqfd_average > SDRAM_RQDC_RQFD_MAX)
  2446. rqfd_average = SDRAM_RQDC_RQFD_MAX;
  2447. mtsdram(SDRAM_RQDC,
  2448. (rqdc_reg & ~SDRAM_RQDC_RQFD_MASK) |
  2449. SDRAM_RQDC_RQFD_ENCODE(rqfd_average));
  2450. blank_string(strlen(str));
  2451. #endif /* CONFIG_DDR_RQDC_FIXED */
  2452. mfsdram(SDRAM_DLCR, val);
  2453. debug("%s[%d] DLCR: 0x%08lX\n", __FUNCTION__, __LINE__, val);
  2454. mfsdram(SDRAM_RQDC, val);
  2455. debug("%s[%d] RQDC: 0x%08lX\n", __FUNCTION__, __LINE__, val);
  2456. mfsdram(SDRAM_RFDC, val);
  2457. debug("%s[%d] RFDC: 0x%08lX\n", __FUNCTION__, __LINE__, val);
  2458. mfsdram(SDRAM_RDCC, val);
  2459. debug("%s[%d] RDCC: 0x%08lX\n", __FUNCTION__, __LINE__, val);
  2460. }
  2461. #else /* calibration test with hardvalues */
  2462. /*-----------------------------------------------------------------------------+
  2463. * DQS_calibration_process.
  2464. *-----------------------------------------------------------------------------*/
  2465. static void test(void)
  2466. {
  2467. unsigned long dimm_num;
  2468. unsigned long ecc_temp;
  2469. unsigned long i, j;
  2470. unsigned long *membase;
  2471. unsigned long bxcf[MAXRANKS];
  2472. unsigned long val;
  2473. char window_found;
  2474. char begin_found[MAXDIMMS];
  2475. char end_found[MAXDIMMS];
  2476. char search_end[MAXDIMMS];
  2477. unsigned long test[NUMMEMTESTS][NUMMEMWORDS] = {
  2478. {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
  2479. 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF},
  2480. {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
  2481. 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},
  2482. {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
  2483. 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555},
  2484. {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
  2485. 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA},
  2486. {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
  2487. 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A},
  2488. {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
  2489. 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5},
  2490. {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
  2491. 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA},
  2492. {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
  2493. 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55} };
  2494. /*------------------------------------------------------------------
  2495. * Test to determine the best read clock delay tuning bits.
  2496. *
  2497. * Before the DDR controller can be used, the read clock delay needs to be
  2498. * set. This is SDRAM_RQDC[RQFD] and SDRAM_RFDC[RFFD].
  2499. * This value cannot be hardcoded into the program because it changes
  2500. * depending on the board's setup and environment.
  2501. * To do this, all delay values are tested to see if they
  2502. * work or not. By doing this, you get groups of fails with groups of
  2503. * passing values. The idea is to find the start and end of a passing
  2504. * window and take the center of it to use as the read clock delay.
  2505. *
  2506. * A failure has to be seen first so that when we hit a pass, we know
  2507. * that it is truely the start of the window. If we get passing values
  2508. * to start off with, we don't know if we are at the start of the window.
  2509. *
  2510. * The code assumes that a failure will always be found.
  2511. * If a failure is not found, there is no easy way to get the middle
  2512. * of the passing window. I guess we can pretty much pick any value
  2513. * but some values will be better than others. Since the lowest speed
  2514. * we can clock the DDR interface at is 200 MHz (2x 100 MHz PLB speed),
  2515. * from experimentation it is safe to say you will always have a failure.
  2516. *-----------------------------------------------------------------*/
  2517. mfsdram(SDRAM_MCOPT1, ecc_temp);
  2518. ecc_temp &= SDRAM_MCOPT1_MCHK_MASK;
  2519. mfsdram(SDRAM_MCOPT1, val);
  2520. mtsdram(SDRAM_MCOPT1, (val & ~SDRAM_MCOPT1_MCHK_MASK) |
  2521. SDRAM_MCOPT1_MCHK_NON);
  2522. window_found = FALSE;
  2523. begin_found[0] = FALSE;
  2524. end_found[0] = FALSE;
  2525. search_end[0] = FALSE;
  2526. begin_found[1] = FALSE;
  2527. end_found[1] = FALSE;
  2528. search_end[1] = FALSE;
  2529. for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) {
  2530. mfsdram(SDRAM_MB0CF + (bxcr_num << 2), bxcf[bxcr_num]);
  2531. /* Banks enabled */
  2532. if ((bxcf[dimm_num] & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {
  2533. /* Bank is enabled */
  2534. membase =
  2535. (unsigned long*)(SDRAM_RXBAS_SDBA_DECODE(mfdcr_any(SDRAM_R0BAS+dimm_num)));
  2536. /*------------------------------------------------------------------
  2537. * Run the short memory test.
  2538. *-----------------------------------------------------------------*/
  2539. for (i = 0; i < NUMMEMTESTS; i++) {
  2540. for (j = 0; j < NUMMEMWORDS; j++) {
  2541. membase[j] = test[i][j];
  2542. ppcDcbf((u32)&(membase[j]));
  2543. }
  2544. sync();
  2545. for (j = 0; j < NUMMEMWORDS; j++) {
  2546. if (membase[j] != test[i][j]) {
  2547. ppcDcbf((u32)&(membase[j]));
  2548. break;
  2549. }
  2550. ppcDcbf((u32)&(membase[j]));
  2551. }
  2552. sync();
  2553. if (j < NUMMEMWORDS)
  2554. break;
  2555. }
  2556. /*------------------------------------------------------------------
  2557. * See if the rffd value passed.
  2558. *-----------------------------------------------------------------*/
  2559. if (i < NUMMEMTESTS) {
  2560. if ((end_found[dimm_num] == FALSE) &&
  2561. (search_end[dimm_num] == TRUE)) {
  2562. end_found[dimm_num] = TRUE;
  2563. }
  2564. if ((end_found[0] == TRUE) &&
  2565. (end_found[1] == TRUE))
  2566. break;
  2567. } else {
  2568. if (begin_found[dimm_num] == FALSE) {
  2569. begin_found[dimm_num] = TRUE;
  2570. search_end[dimm_num] = TRUE;
  2571. }
  2572. }
  2573. } else {
  2574. begin_found[dimm_num] = TRUE;
  2575. end_found[dimm_num] = TRUE;
  2576. }
  2577. }
  2578. if ((begin_found[0] == TRUE) && (begin_found[1] == TRUE))
  2579. window_found = TRUE;
  2580. /*------------------------------------------------------------------
  2581. * Make sure we found the valid read passing window. Halt if not
  2582. *-----------------------------------------------------------------*/
  2583. if (window_found == FALSE) {
  2584. printf("ERROR: Cannot determine a common read delay for the "
  2585. "DIMM(s) installed.\n");
  2586. spd_ddr_init_hang ();
  2587. }
  2588. /*------------------------------------------------------------------
  2589. * Restore the ECC variable to what it originally was
  2590. *-----------------------------------------------------------------*/
  2591. mtsdram(SDRAM_MCOPT1,
  2592. (ppcMfdcr_sdram(SDRAM_MCOPT1) & ~SDRAM_MCOPT1_MCHK_MASK)
  2593. | ecc_temp);
  2594. }
  2595. #endif /* !HARD_CODED_DQS */
  2596. #endif /* !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION) */
  2597. #else /* CONFIG_SPD_EEPROM */
  2598. /*-----------------------------------------------------------------------------
  2599. * Function: initdram
  2600. * Description: Configures the PPC4xx IBM DDR1/DDR2 SDRAM memory controller.
  2601. * The configuration is performed using static, compile-
  2602. * time parameters.
  2603. * Configures the PPC405EX(r) and PPC460EX/GT
  2604. *---------------------------------------------------------------------------*/
  2605. phys_size_t initdram(int board_type)
  2606. {
  2607. /*
  2608. * Only run this SDRAM init code once. For NAND booting
  2609. * targets like Kilauea, we call initdram() early from the
  2610. * 4k NAND booting image (CONFIG_NAND_SPL) from nand_boot().
  2611. * Later on the NAND U-Boot image runs (CONFIG_NAND_U_BOOT)
  2612. * which calls initdram() again. This time the controller
  2613. * mustn't be reconfigured again since we're already running
  2614. * from SDRAM.
  2615. */
  2616. #if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
  2617. unsigned long val;
  2618. #if defined(CONFIG_440)
  2619. mtdcr(SDRAM_R0BAS, CONFIG_SYS_SDRAM_R0BAS);
  2620. mtdcr(SDRAM_R1BAS, CONFIG_SYS_SDRAM_R1BAS);
  2621. mtdcr(SDRAM_R2BAS, CONFIG_SYS_SDRAM_R2BAS);
  2622. mtdcr(SDRAM_R3BAS, CONFIG_SYS_SDRAM_R3BAS);
  2623. mtdcr(SDRAM_PLBADDULL, CONFIG_SYS_SDRAM_PLBADDULL); /* MQ0_BAUL */
  2624. mtdcr(SDRAM_PLBADDUHB, CONFIG_SYS_SDRAM_PLBADDUHB); /* MQ0_BAUH */
  2625. mtdcr(SDRAM_CONF1LL, CONFIG_SYS_SDRAM_CONF1LL);
  2626. mtdcr(SDRAM_CONF1HB, CONFIG_SYS_SDRAM_CONF1HB);
  2627. mtdcr(SDRAM_CONFPATHB, CONFIG_SYS_SDRAM_CONFPATHB);
  2628. #endif
  2629. /* Set Memory Bank Configuration Registers */
  2630. mtsdram(SDRAM_MB0CF, CONFIG_SYS_SDRAM0_MB0CF);
  2631. mtsdram(SDRAM_MB1CF, CONFIG_SYS_SDRAM0_MB1CF);
  2632. mtsdram(SDRAM_MB2CF, CONFIG_SYS_SDRAM0_MB2CF);
  2633. mtsdram(SDRAM_MB3CF, CONFIG_SYS_SDRAM0_MB3CF);
  2634. /* Set Memory Clock Timing Register */
  2635. mtsdram(SDRAM_CLKTR, CONFIG_SYS_SDRAM0_CLKTR);
  2636. /* Set Refresh Time Register */
  2637. mtsdram(SDRAM_RTR, CONFIG_SYS_SDRAM0_RTR);
  2638. /* Set SDRAM Timing Registers */
  2639. mtsdram(SDRAM_SDTR1, CONFIG_SYS_SDRAM0_SDTR1);
  2640. mtsdram(SDRAM_SDTR2, CONFIG_SYS_SDRAM0_SDTR2);
  2641. mtsdram(SDRAM_SDTR3, CONFIG_SYS_SDRAM0_SDTR3);
  2642. /* Set Mode and Extended Mode Registers */
  2643. mtsdram(SDRAM_MMODE, CONFIG_SYS_SDRAM0_MMODE);
  2644. mtsdram(SDRAM_MEMODE, CONFIG_SYS_SDRAM0_MEMODE);
  2645. /* Set Memory Controller Options 1 Register */
  2646. mtsdram(SDRAM_MCOPT1, CONFIG_SYS_SDRAM0_MCOPT1);
  2647. /* Set Manual Initialization Control Registers */
  2648. mtsdram(SDRAM_INITPLR0, CONFIG_SYS_SDRAM0_INITPLR0);
  2649. mtsdram(SDRAM_INITPLR1, CONFIG_SYS_SDRAM0_INITPLR1);
  2650. mtsdram(SDRAM_INITPLR2, CONFIG_SYS_SDRAM0_INITPLR2);
  2651. mtsdram(SDRAM_INITPLR3, CONFIG_SYS_SDRAM0_INITPLR3);
  2652. mtsdram(SDRAM_INITPLR4, CONFIG_SYS_SDRAM0_INITPLR4);
  2653. mtsdram(SDRAM_INITPLR5, CONFIG_SYS_SDRAM0_INITPLR5);
  2654. mtsdram(SDRAM_INITPLR6, CONFIG_SYS_SDRAM0_INITPLR6);
  2655. mtsdram(SDRAM_INITPLR7, CONFIG_SYS_SDRAM0_INITPLR7);
  2656. mtsdram(SDRAM_INITPLR8, CONFIG_SYS_SDRAM0_INITPLR8);
  2657. mtsdram(SDRAM_INITPLR9, CONFIG_SYS_SDRAM0_INITPLR9);
  2658. mtsdram(SDRAM_INITPLR10, CONFIG_SYS_SDRAM0_INITPLR10);
  2659. mtsdram(SDRAM_INITPLR11, CONFIG_SYS_SDRAM0_INITPLR11);
  2660. mtsdram(SDRAM_INITPLR12, CONFIG_SYS_SDRAM0_INITPLR12);
  2661. mtsdram(SDRAM_INITPLR13, CONFIG_SYS_SDRAM0_INITPLR13);
  2662. mtsdram(SDRAM_INITPLR14, CONFIG_SYS_SDRAM0_INITPLR14);
  2663. mtsdram(SDRAM_INITPLR15, CONFIG_SYS_SDRAM0_INITPLR15);
  2664. /* Set On-Die Termination Registers */
  2665. mtsdram(SDRAM_CODT, CONFIG_SYS_SDRAM0_CODT);
  2666. mtsdram(SDRAM_MODT0, CONFIG_SYS_SDRAM0_MODT0);
  2667. mtsdram(SDRAM_MODT1, CONFIG_SYS_SDRAM0_MODT1);
  2668. /* Set Write Timing Register */
  2669. mtsdram(SDRAM_WRDTR, CONFIG_SYS_SDRAM0_WRDTR);
  2670. /*
  2671. * Start Initialization by SDRAM0_MCOPT2[SREN] = 0 and
  2672. * SDRAM0_MCOPT2[IPTR] = 1
  2673. */
  2674. mtsdram(SDRAM_MCOPT2, (SDRAM_MCOPT2_SREN_EXIT |
  2675. SDRAM_MCOPT2_IPTR_EXECUTE));
  2676. /*
  2677. * Poll SDRAM0_MCSTAT[MIC] for assertion to indicate the
  2678. * completion of initialization.
  2679. */
  2680. do {
  2681. mfsdram(SDRAM_MCSTAT, val);
  2682. } while ((val & SDRAM_MCSTAT_MIC_MASK) != SDRAM_MCSTAT_MIC_COMP);
  2683. /* Set Delay Control Registers */
  2684. mtsdram(SDRAM_DLCR, CONFIG_SYS_SDRAM0_DLCR);
  2685. #if !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
  2686. mtsdram(SDRAM_RDCC, CONFIG_SYS_SDRAM0_RDCC);
  2687. mtsdram(SDRAM_RQDC, CONFIG_SYS_SDRAM0_RQDC);
  2688. mtsdram(SDRAM_RFDC, CONFIG_SYS_SDRAM0_RFDC);
  2689. #endif /* !CONFIG_PPC4xx_DDR_AUTOCALIBRATION */
  2690. /*
  2691. * Enable Controller by SDRAM0_MCOPT2[DCEN] = 1:
  2692. */
  2693. mfsdram(SDRAM_MCOPT2, val);
  2694. mtsdram(SDRAM_MCOPT2, val | SDRAM_MCOPT2_DCEN_ENABLE);
  2695. #if defined(CONFIG_440)
  2696. /*
  2697. * Program TLB entries with caches enabled, for best performace
  2698. * while auto-calibrating and ECC generation
  2699. */
  2700. program_tlb(0, 0, (CONFIG_SYS_MBYTES_SDRAM << 20), 0);
  2701. #endif
  2702. #if defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
  2703. #if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
  2704. /*------------------------------------------------------------------
  2705. | DQS calibration.
  2706. +-----------------------------------------------------------------*/
  2707. DQS_autocalibration();
  2708. #endif /* !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL) */
  2709. #endif /* CONFIG_PPC4xx_DDR_AUTOCALIBRATION */
  2710. /*
  2711. * Now complete RDSS configuration as mentioned on page 7 of the AMCC
  2712. * PowerPC440SP/SPe DDR2 application note:
  2713. * "DDR1/DDR2 Initialization Sequence and Dynamic Tuning"
  2714. */
  2715. update_rdcc();
  2716. #if defined(CONFIG_DDR_ECC)
  2717. do_program_ecc(0);
  2718. #endif /* defined(CONFIG_DDR_ECC) */
  2719. #if defined(CONFIG_440)
  2720. /*
  2721. * Now after initialization (auto-calibration and ECC generation)
  2722. * remove the TLB entries with caches enabled and program again with
  2723. * desired cache functionality
  2724. */
  2725. remove_tlb(0, (CONFIG_SYS_MBYTES_SDRAM << 20));
  2726. program_tlb(0, 0, (CONFIG_SYS_MBYTES_SDRAM << 20), MY_TLB_WORD2_I_ENABLE);
  2727. #endif
  2728. ppc4xx_ibm_ddr2_register_dump();
  2729. #if defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
  2730. /*
  2731. * Clear potential errors resulting from auto-calibration.
  2732. * If not done, then we could get an interrupt later on when
  2733. * exceptions are enabled.
  2734. */
  2735. set_mcsr(get_mcsr());
  2736. #endif /* CONFIG_PPC4xx_DDR_AUTOCALIBRATION */
  2737. #endif /* !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL) */
  2738. return (CONFIG_SYS_MBYTES_SDRAM << 20);
  2739. }
  2740. #endif /* CONFIG_SPD_EEPROM */
  2741. #if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
  2742. #if defined(CONFIG_440)
  2743. u32 mfdcr_any(u32 dcr)
  2744. {
  2745. u32 val;
  2746. switch (dcr) {
  2747. case SDRAM_R0BAS + 0:
  2748. val = mfdcr(SDRAM_R0BAS + 0);
  2749. break;
  2750. case SDRAM_R0BAS + 1:
  2751. val = mfdcr(SDRAM_R0BAS + 1);
  2752. break;
  2753. case SDRAM_R0BAS + 2:
  2754. val = mfdcr(SDRAM_R0BAS + 2);
  2755. break;
  2756. case SDRAM_R0BAS + 3:
  2757. val = mfdcr(SDRAM_R0BAS + 3);
  2758. break;
  2759. default:
  2760. printf("DCR %d not defined in case statement!!!\n", dcr);
  2761. val = 0; /* just to satisfy the compiler */
  2762. }
  2763. return val;
  2764. }
  2765. void mtdcr_any(u32 dcr, u32 val)
  2766. {
  2767. switch (dcr) {
  2768. case SDRAM_R0BAS + 0:
  2769. mtdcr(SDRAM_R0BAS + 0, val);
  2770. break;
  2771. case SDRAM_R0BAS + 1:
  2772. mtdcr(SDRAM_R0BAS + 1, val);
  2773. break;
  2774. case SDRAM_R0BAS + 2:
  2775. mtdcr(SDRAM_R0BAS + 2, val);
  2776. break;
  2777. case SDRAM_R0BAS + 3:
  2778. mtdcr(SDRAM_R0BAS + 3, val);
  2779. break;
  2780. default:
  2781. printf("DCR %d not defined in case statement!!!\n", dcr);
  2782. }
  2783. }
  2784. #endif /* defined(CONFIG_440) */
  2785. #endif /* !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL) */
  2786. inline void ppc4xx_ibm_ddr2_register_dump(void)
  2787. {
  2788. #if defined(DEBUG)
  2789. printf("\nPPC4xx IBM DDR2 Register Dump:\n");
  2790. #if (defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
  2791. defined(CONFIG_460EX) || defined(CONFIG_460GT))
  2792. PPC4xx_IBM_DDR2_DUMP_MQ_REGISTER(R0BAS);
  2793. PPC4xx_IBM_DDR2_DUMP_MQ_REGISTER(R1BAS);
  2794. PPC4xx_IBM_DDR2_DUMP_MQ_REGISTER(R2BAS);
  2795. PPC4xx_IBM_DDR2_DUMP_MQ_REGISTER(R3BAS);
  2796. #endif /* (defined(CONFIG_440SP) || ... */
  2797. #if defined(CONFIG_405EX)
  2798. PPC4xx_IBM_DDR2_DUMP_REGISTER(BESR);
  2799. PPC4xx_IBM_DDR2_DUMP_REGISTER(BEARL);
  2800. PPC4xx_IBM_DDR2_DUMP_REGISTER(BEARH);
  2801. PPC4xx_IBM_DDR2_DUMP_REGISTER(WMIRQ);
  2802. PPC4xx_IBM_DDR2_DUMP_REGISTER(PLBOPT);
  2803. PPC4xx_IBM_DDR2_DUMP_REGISTER(PUABA);
  2804. #endif /* defined(CONFIG_405EX) */
  2805. PPC4xx_IBM_DDR2_DUMP_REGISTER(MB0CF);
  2806. PPC4xx_IBM_DDR2_DUMP_REGISTER(MB1CF);
  2807. PPC4xx_IBM_DDR2_DUMP_REGISTER(MB2CF);
  2808. PPC4xx_IBM_DDR2_DUMP_REGISTER(MB3CF);
  2809. PPC4xx_IBM_DDR2_DUMP_REGISTER(MCSTAT);
  2810. PPC4xx_IBM_DDR2_DUMP_REGISTER(MCOPT1);
  2811. PPC4xx_IBM_DDR2_DUMP_REGISTER(MCOPT2);
  2812. PPC4xx_IBM_DDR2_DUMP_REGISTER(MODT0);
  2813. PPC4xx_IBM_DDR2_DUMP_REGISTER(MODT1);
  2814. PPC4xx_IBM_DDR2_DUMP_REGISTER(MODT2);
  2815. PPC4xx_IBM_DDR2_DUMP_REGISTER(MODT3);
  2816. PPC4xx_IBM_DDR2_DUMP_REGISTER(CODT);
  2817. #if (defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
  2818. defined(CONFIG_460EX) || defined(CONFIG_460GT))
  2819. PPC4xx_IBM_DDR2_DUMP_REGISTER(VVPR);
  2820. PPC4xx_IBM_DDR2_DUMP_REGISTER(OPARS);
  2821. /*
  2822. * OPART is only used as a trigger register.
  2823. *
  2824. * No data is contained in this register, and reading or writing
  2825. * to is can cause bad things to happen (hangs). Just skip it and
  2826. * report "N/A".
  2827. */
  2828. printf("%20s = N/A\n", "SDRAM_OPART");
  2829. #endif /* defined(CONFIG_440SP) || ... */
  2830. PPC4xx_IBM_DDR2_DUMP_REGISTER(RTR);
  2831. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR0);
  2832. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR1);
  2833. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR2);
  2834. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR3);
  2835. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR4);
  2836. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR5);
  2837. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR6);
  2838. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR7);
  2839. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR8);
  2840. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR9);
  2841. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR10);
  2842. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR11);
  2843. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR12);
  2844. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR13);
  2845. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR14);
  2846. PPC4xx_IBM_DDR2_DUMP_REGISTER(INITPLR15);
  2847. PPC4xx_IBM_DDR2_DUMP_REGISTER(RQDC);
  2848. PPC4xx_IBM_DDR2_DUMP_REGISTER(RFDC);
  2849. PPC4xx_IBM_DDR2_DUMP_REGISTER(RDCC);
  2850. PPC4xx_IBM_DDR2_DUMP_REGISTER(DLCR);
  2851. PPC4xx_IBM_DDR2_DUMP_REGISTER(CLKTR);
  2852. PPC4xx_IBM_DDR2_DUMP_REGISTER(WRDTR);
  2853. PPC4xx_IBM_DDR2_DUMP_REGISTER(SDTR1);
  2854. PPC4xx_IBM_DDR2_DUMP_REGISTER(SDTR2);
  2855. PPC4xx_IBM_DDR2_DUMP_REGISTER(SDTR3);
  2856. PPC4xx_IBM_DDR2_DUMP_REGISTER(MMODE);
  2857. PPC4xx_IBM_DDR2_DUMP_REGISTER(MEMODE);
  2858. PPC4xx_IBM_DDR2_DUMP_REGISTER(ECCES);
  2859. #if (defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
  2860. defined(CONFIG_460EX) || defined(CONFIG_460GT))
  2861. PPC4xx_IBM_DDR2_DUMP_REGISTER(CID);
  2862. #endif /* defined(CONFIG_440SP) || ... */
  2863. PPC4xx_IBM_DDR2_DUMP_REGISTER(RID);
  2864. PPC4xx_IBM_DDR2_DUMP_REGISTER(FCSR);
  2865. PPC4xx_IBM_DDR2_DUMP_REGISTER(RTSR);
  2866. #endif /* defined(DEBUG) */
  2867. }