DDRInit.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  1. #include "headers.h"
  2. #define DDR_DUMP_INTERNAL_DEVICE_MEMORY 0xBFC02B00
  3. #define MIPS_CLOCK_REG 0x0f000820
  4. /* DDR INIT-133Mhz */
  5. #define T3_SKIP_CLOCK_PROGRAM_DUMP_133MHZ 12 /* index for 0x0F007000 */
  6. static struct bcm_ddr_setting asT3_DDRSetting133MHz[] = {
  7. /* DPLL Clock Setting */
  8. {0x0F000800, 0x00007212},
  9. {0x0f000820, 0x07F13FFF},
  10. {0x0f000810, 0x00000F95},
  11. {0x0f000860, 0x00000000},
  12. {0x0f000880, 0x000003DD},
  13. /* Changed source for X-bar and MIPS clock to APLL */
  14. {0x0f000840, 0x0FFF1B00},
  15. {0x0f000870, 0x00000002},
  16. {0x0F00a044, 0x1fffffff},
  17. {0x0F00a040, 0x1f000000},
  18. {0x0F00a084, 0x1Cffffff},
  19. {0x0F00a080, 0x1C000000},
  20. {0x0F00a04C, 0x0000000C},
  21. /* Memcontroller Default values */
  22. {0x0F007000, 0x00010001},
  23. {0x0F007004, 0x01010100},
  24. {0x0F007008, 0x01000001},
  25. {0x0F00700c, 0x00000000},
  26. {0x0F007010, 0x01000000},
  27. {0x0F007014, 0x01000100},
  28. {0x0F007018, 0x01000000},
  29. {0x0F00701c, 0x01020001},
  30. {0x0F007020, 0x04030107},
  31. {0x0F007024, 0x02000007},
  32. {0x0F007028, 0x02020202},
  33. {0x0F00702c, 0x0206060a},
  34. {0x0F007030, 0x05000000},
  35. {0x0F007034, 0x00000003},
  36. {0x0F007038, 0x110a0200},
  37. {0x0F00703C, 0x02101010},
  38. {0x0F007040, 0x45751200},
  39. {0x0F007044, 0x110a0d00},
  40. {0x0F007048, 0x081b0306},
  41. {0x0F00704c, 0x00000000},
  42. {0x0F007050, 0x0000001c},
  43. {0x0F007054, 0x00000000},
  44. {0x0F007058, 0x00000000},
  45. {0x0F00705c, 0x00000000},
  46. {0x0F007060, 0x0010246c},
  47. {0x0F007064, 0x00000010},
  48. {0x0F007068, 0x00000000},
  49. {0x0F00706c, 0x00000001},
  50. {0x0F007070, 0x00007000},
  51. {0x0F007074, 0x00000000},
  52. {0x0F007078, 0x00000000},
  53. {0x0F00707C, 0x00000000},
  54. {0x0F007080, 0x00000000},
  55. {0x0F007084, 0x00000000},
  56. /* Enable BW improvement within memory controller */
  57. {0x0F007094, 0x00000104},
  58. /* Enable 2 ports within X-bar */
  59. {0x0F00A000, 0x00000016},
  60. /* Enable start bit within memory controller */
  61. {0x0F007018, 0x01010000}
  62. };
  63. /* 80Mhz */
  64. #define T3_SKIP_CLOCK_PROGRAM_DUMP_80MHZ 10 /* index for 0x0F007000 */
  65. static struct bcm_ddr_setting asT3_DDRSetting80MHz[] = {
  66. /* DPLL Clock Setting */
  67. {0x0f000810, 0x00000F95},
  68. {0x0f000820, 0x07f1ffff},
  69. {0x0f000860, 0x00000000},
  70. {0x0f000880, 0x000003DD},
  71. {0x0F00a044, 0x1fffffff},
  72. {0x0F00a040, 0x1f000000},
  73. {0x0F00a084, 0x1Cffffff},
  74. {0x0F00a080, 0x1C000000},
  75. {0x0F00a000, 0x00000016},
  76. {0x0F00a04C, 0x0000000C},
  77. /* Memcontroller Default values */
  78. {0x0F007000, 0x00010001},
  79. {0x0F007004, 0x01000000},
  80. {0x0F007008, 0x01000001},
  81. {0x0F00700c, 0x00000000},
  82. {0x0F007010, 0x01000000},
  83. {0x0F007014, 0x01000100},
  84. {0x0F007018, 0x01000000},
  85. {0x0F00701c, 0x01020000},
  86. {0x0F007020, 0x04020107},
  87. {0x0F007024, 0x00000007},
  88. {0x0F007028, 0x02020201},
  89. {0x0F00702c, 0x0204040a},
  90. {0x0F007030, 0x04000000},
  91. {0x0F007034, 0x00000002},
  92. {0x0F007038, 0x1F060200},
  93. {0x0F00703C, 0x1C22221F},
  94. {0x0F007040, 0x8A006600},
  95. {0x0F007044, 0x221a0800},
  96. {0x0F007048, 0x02690204},
  97. {0x0F00704c, 0x00000000},
  98. {0x0F007050, 0x0000001c},
  99. {0x0F007054, 0x00000000},
  100. {0x0F007058, 0x00000000},
  101. {0x0F00705c, 0x00000000},
  102. {0x0F007060, 0x000A15D6},
  103. {0x0F007064, 0x0000000A},
  104. {0x0F007068, 0x00000000},
  105. {0x0F00706c, 0x00000001},
  106. {0x0F007070, 0x00004000},
  107. {0x0F007074, 0x00000000},
  108. {0x0F007078, 0x00000000},
  109. {0x0F00707C, 0x00000000},
  110. {0x0F007080, 0x00000000},
  111. {0x0F007084, 0x00000000},
  112. {0x0F007094, 0x00000104},
  113. /* Enable start bit within memory controller */
  114. {0x0F007018, 0x01010000}
  115. };
  116. /* 100Mhz */
  117. #define T3_SKIP_CLOCK_PROGRAM_DUMP_100MHZ 13 /* index for 0x0F007000 */
  118. static struct bcm_ddr_setting asT3_DDRSetting100MHz[] = {
  119. /* DPLL Clock Setting */
  120. {0x0F000800, 0x00007008},
  121. {0x0f000810, 0x00000F95},
  122. {0x0f000820, 0x07F13E3F},
  123. {0x0f000860, 0x00000000},
  124. {0x0f000880, 0x000003DD},
  125. /* Changed source for X-bar and MIPS clock to APLL */
  126. {0x0f000840, 0x0FFF1B00},
  127. {0x0f000870, 0x00000002},
  128. {0x0F00a044, 0x1fffffff},
  129. {0x0F00a040, 0x1f000000},
  130. {0x0F00a084, 0x1Cffffff},
  131. {0x0F00a080, 0x1C000000},
  132. {0x0F00a04C, 0x0000000C},
  133. /* Enable 2 ports within X-bar */
  134. {0x0F00A000, 0x00000016},
  135. /* Memcontroller Default values */
  136. {0x0F007000, 0x00010001},
  137. {0x0F007004, 0x01010100},
  138. {0x0F007008, 0x01000001},
  139. {0x0F00700c, 0x00000000},
  140. {0x0F007010, 0x01000000},
  141. {0x0F007014, 0x01000100},
  142. {0x0F007018, 0x01000000},
  143. {0x0F00701c, 0x01020001},
  144. {0x0F007020, 0x04020107},
  145. {0x0F007024, 0x00000007},
  146. {0x0F007028, 0x01020201},
  147. {0x0F00702c, 0x0204040A},
  148. {0x0F007030, 0x06000000},
  149. {0x0F007034, 0x00000004},
  150. {0x0F007038, 0x20080200},
  151. {0x0F00703C, 0x02030320},
  152. {0x0F007040, 0x6E7F1200},
  153. {0x0F007044, 0x01190A00},
  154. {0x0F007048, 0x06120305},
  155. {0x0F00704c, 0x00000000},
  156. {0x0F007050, 0x0000001C},
  157. {0x0F007054, 0x00000000},
  158. {0x0F007058, 0x00000000},
  159. {0x0F00705c, 0x00000000},
  160. {0x0F007060, 0x00082ED6},
  161. {0x0F007064, 0x0000000A},
  162. {0x0F007068, 0x00000000},
  163. {0x0F00706c, 0x00000001},
  164. {0x0F007070, 0x00005000},
  165. {0x0F007074, 0x00000000},
  166. {0x0F007078, 0x00000000},
  167. {0x0F00707C, 0x00000000},
  168. {0x0F007080, 0x00000000},
  169. {0x0F007084, 0x00000000},
  170. /* Enable BW improvement within memory controller */
  171. {0x0F007094, 0x00000104},
  172. /* Enable start bit within memory controller */
  173. {0x0F007018, 0x01010000}
  174. };
  175. /* Net T3B DDR Settings
  176. * DDR INIT-133Mhz
  177. */
  178. static struct bcm_ddr_setting asDPLL_266MHZ[] = {
  179. {0x0F000800, 0x00007212},
  180. {0x0f000820, 0x07F13FFF},
  181. {0x0f000810, 0x00000F95},
  182. {0x0f000860, 0x00000000},
  183. {0x0f000880, 0x000003DD},
  184. /* Changed source for X-bar and MIPS clock to APLL */
  185. {0x0f000840, 0x0FFF1B00},
  186. {0x0f000870, 0x00000002}
  187. };
  188. #define T3B_SKIP_CLOCK_PROGRAM_DUMP_133MHZ 11 /* index for 0x0F007000 */
  189. static struct bcm_ddr_setting asT3B_DDRSetting133MHz[] = {
  190. /* DPLL Clock Setting */
  191. {0x0f000810, 0x00000F95},
  192. {0x0f000810, 0x00000F95},
  193. {0x0f000810, 0x00000F95},
  194. {0x0f000820, 0x07F13652},
  195. {0x0f000840, 0x0FFF0800},
  196. /* Changed source for X-bar and MIPS clock to APLL */
  197. {0x0f000880, 0x000003DD},
  198. {0x0f000860, 0x00000000},
  199. /* Changed source for X-bar and MIPS clock to APLL */
  200. {0x0F00a044, 0x1fffffff},
  201. {0x0F00a040, 0x1f000000},
  202. {0x0F00a084, 0x1Cffffff},
  203. {0x0F00a080, 0x1C000000},
  204. /* Enable 2 ports within X-bar */
  205. {0x0F00A000, 0x00000016},
  206. /* Memcontroller Default values */
  207. {0x0F007000, 0x00010001},
  208. {0x0F007004, 0x01010100},
  209. {0x0F007008, 0x01000001},
  210. {0x0F00700c, 0x00000000},
  211. {0x0F007010, 0x01000000},
  212. {0x0F007014, 0x01000100},
  213. {0x0F007018, 0x01000000},
  214. {0x0F00701c, 0x01020001},
  215. {0x0F007020, 0x04030107},
  216. {0x0F007024, 0x02000007},
  217. {0x0F007028, 0x02020202},
  218. {0x0F00702c, 0x0206060a},
  219. {0x0F007030, 0x05000000},
  220. {0x0F007034, 0x00000003},
  221. {0x0F007038, 0x130a0200},
  222. {0x0F00703C, 0x02101012},
  223. {0x0F007040, 0x457D1200},
  224. {0x0F007044, 0x11130d00},
  225. {0x0F007048, 0x040D0306},
  226. {0x0F00704c, 0x00000000},
  227. {0x0F007050, 0x0000001c},
  228. {0x0F007054, 0x00000000},
  229. {0x0F007058, 0x00000000},
  230. {0x0F00705c, 0x00000000},
  231. {0x0F007060, 0x0010246c},
  232. {0x0F007064, 0x00000012},
  233. {0x0F007068, 0x00000000},
  234. {0x0F00706c, 0x00000001},
  235. {0x0F007070, 0x00007000},
  236. {0x0F007074, 0x00000000},
  237. {0x0F007078, 0x00000000},
  238. {0x0F00707C, 0x00000000},
  239. {0x0F007080, 0x00000000},
  240. {0x0F007084, 0x00000000},
  241. /* Enable BW improvement within memory controller */
  242. {0x0F007094, 0x00000104},
  243. /* Enable start bit within memory controller */
  244. {0x0F007018, 0x01010000},
  245. };
  246. #define T3B_SKIP_CLOCK_PROGRAM_DUMP_80MHZ 9 /* index for 0x0F007000 */
  247. static struct bcm_ddr_setting asT3B_DDRSetting80MHz[] = {
  248. /* DPLL Clock Setting */
  249. {0x0f000810, 0x00000F95},
  250. {0x0f000820, 0x07F13FFF},
  251. {0x0f000840, 0x0FFF1F00},
  252. {0x0f000880, 0x000003DD},
  253. {0x0f000860, 0x00000000},
  254. {0x0F00a044, 0x1fffffff},
  255. {0x0F00a040, 0x1f000000},
  256. {0x0F00a084, 0x1Cffffff},
  257. {0x0F00a080, 0x1C000000},
  258. {0x0F00a000, 0x00000016},
  259. /* Memcontroller Default values */
  260. {0x0F007000, 0x00010001},
  261. {0x0F007004, 0x01000000},
  262. {0x0F007008, 0x01000001},
  263. {0x0F00700c, 0x00000000},
  264. {0x0F007010, 0x01000000},
  265. {0x0F007014, 0x01000100},
  266. {0x0F007018, 0x01000000},
  267. {0x0F00701c, 0x01020000},
  268. {0x0F007020, 0x04020107},
  269. {0x0F007024, 0x00000007},
  270. {0x0F007028, 0x02020201},
  271. {0x0F00702c, 0x0204040a},
  272. {0x0F007030, 0x04000000},
  273. {0x0F007034, 0x02000002},
  274. {0x0F007038, 0x1F060202},
  275. {0x0F00703C, 0x1C22221F},
  276. {0x0F007040, 0x8A006600},
  277. {0x0F007044, 0x221a0800},
  278. {0x0F007048, 0x02690204},
  279. {0x0F00704c, 0x00000000},
  280. {0x0F007050, 0x0100001c},
  281. {0x0F007054, 0x00000000},
  282. {0x0F007058, 0x00000000},
  283. {0x0F00705c, 0x00000000},
  284. {0x0F007060, 0x000A15D6},
  285. {0x0F007064, 0x0000000A},
  286. {0x0F007068, 0x00000000},
  287. {0x0F00706c, 0x00000001},
  288. {0x0F007070, 0x00004000},
  289. {0x0F007074, 0x00000000},
  290. {0x0F007078, 0x00000000},
  291. {0x0F00707C, 0x00000000},
  292. {0x0F007080, 0x00000000},
  293. {0x0F007084, 0x00000000},
  294. {0x0F007094, 0x00000104},
  295. /* Enable start bit within memory controller */
  296. {0x0F007018, 0x01010000}
  297. };
  298. /* 100Mhz */
  299. #define T3B_SKIP_CLOCK_PROGRAM_DUMP_100MHZ 9 /* index for 0x0F007000 */
  300. static struct bcm_ddr_setting asT3B_DDRSetting100MHz[] = {
  301. /* DPLL Clock Setting */
  302. {0x0f000810, 0x00000F95},
  303. {0x0f000820, 0x07F1369B},
  304. {0x0f000840, 0x0FFF0800},
  305. {0x0f000880, 0x000003DD},
  306. {0x0f000860, 0x00000000},
  307. {0x0F00a044, 0x1fffffff},
  308. {0x0F00a040, 0x1f000000},
  309. {0x0F00a084, 0x1Cffffff},
  310. {0x0F00a080, 0x1C000000},
  311. /* Enable 2 ports within X-bar */
  312. {0x0F00A000, 0x00000016},
  313. /* Memcontroller Default values */
  314. {0x0F007000, 0x00010001},
  315. {0x0F007004, 0x01010100},
  316. {0x0F007008, 0x01000001},
  317. {0x0F00700c, 0x00000000},
  318. {0x0F007010, 0x01000000},
  319. {0x0F007014, 0x01000100},
  320. {0x0F007018, 0x01000000},
  321. {0x0F00701c, 0x01020000},
  322. {0x0F007020, 0x04020107},
  323. {0x0F007024, 0x00000007},
  324. {0x0F007028, 0x01020201},
  325. {0x0F00702c, 0x0204040A},
  326. {0x0F007030, 0x06000000},
  327. {0x0F007034, 0x02000004},
  328. {0x0F007038, 0x20080200},
  329. {0x0F00703C, 0x02030320},
  330. {0x0F007040, 0x6E7F1200},
  331. {0x0F007044, 0x01190A00},
  332. {0x0F007048, 0x06120305},
  333. {0x0F00704c, 0x00000000},
  334. {0x0F007050, 0x0100001C},
  335. {0x0F007054, 0x00000000},
  336. {0x0F007058, 0x00000000},
  337. {0x0F00705c, 0x00000000},
  338. {0x0F007060, 0x00082ED6},
  339. {0x0F007064, 0x0000000A},
  340. {0x0F007068, 0x00000000},
  341. {0x0F00706c, 0x00000001},
  342. {0x0F007070, 0x00005000},
  343. {0x0F007074, 0x00000000},
  344. {0x0F007078, 0x00000000},
  345. {0x0F00707C, 0x00000000},
  346. {0x0F007080, 0x00000000},
  347. {0x0F007084, 0x00000000},
  348. /* Enable BW improvement within memory controller */
  349. {0x0F007094, 0x00000104},
  350. /* Enable start bit within memory controller */
  351. {0x0F007018, 0x01010000}
  352. };
  353. #define T3LP_SKIP_CLOCK_PROGRAM_DUMP_133MHZ 9 /* index for 0x0F007000 */
  354. static struct bcm_ddr_setting asT3LP_DDRSetting133MHz[] = {
  355. /* DPLL Clock Setting */
  356. {0x0f000820, 0x03F1365B},
  357. {0x0f000810, 0x00002F95},
  358. {0x0f000880, 0x000003DD},
  359. /* Changed source for X-bar and MIPS clock to APLL */
  360. {0x0f000840, 0x0FFF0000},
  361. {0x0f000860, 0x00000000},
  362. {0x0F00a044, 0x1fffffff},
  363. {0x0F00a040, 0x1f000000},
  364. {0x0F00a084, 0x1Cffffff},
  365. {0x0F00a080, 0x1C000000},
  366. {0x0F00A000, 0x00000016},
  367. /* Memcontroller Default values */
  368. {0x0F007000, 0x00010001},
  369. {0x0F007004, 0x01010100},
  370. {0x0F007008, 0x01000001},
  371. {0x0F00700c, 0x00000000},
  372. {0x0F007010, 0x01000000},
  373. {0x0F007014, 0x01000100},
  374. {0x0F007018, 0x01000000},
  375. {0x0F00701c, 0x01020001},
  376. {0x0F007020, 0x04030107},
  377. {0x0F007024, 0x02000007},
  378. {0x0F007028, 0x02020200},
  379. {0x0F00702c, 0x0206060a},
  380. {0x0F007030, 0x05000000},
  381. {0x0F007034, 0x00000003},
  382. {0x0F007038, 0x200a0200},
  383. {0x0F00703C, 0x02101020},
  384. {0x0F007040, 0x45711200},
  385. {0x0F007044, 0x110D0D00},
  386. {0x0F007048, 0x04080306},
  387. {0x0F00704c, 0x00000000},
  388. {0x0F007050, 0x0100001c},
  389. {0x0F007054, 0x00000000},
  390. {0x0F007058, 0x00000000},
  391. {0x0F00705c, 0x00000000},
  392. {0x0F007060, 0x0010245F},
  393. {0x0F007064, 0x00000010},
  394. {0x0F007068, 0x00000000},
  395. {0x0F00706c, 0x00000001},
  396. {0x0F007070, 0x00007000},
  397. {0x0F007074, 0x00000000},
  398. {0x0F007078, 0x00000000},
  399. {0x0F00707C, 0x00000000},
  400. {0x0F007080, 0x00000000},
  401. {0x0F007084, 0x00000000},
  402. {0x0F007088, 0x01000001},
  403. {0x0F00708c, 0x00000101},
  404. {0x0F007090, 0x00000000},
  405. /* Enable BW improvement within memory controller */
  406. {0x0F007094, 0x00040000},
  407. {0x0F007098, 0x00000000},
  408. {0x0F0070c8, 0x00000104},
  409. /* Enable 2 ports within X-bar */
  410. /* Enable start bit within memory controller */
  411. {0x0F007018, 0x01010000}
  412. };
  413. #define T3LP_SKIP_CLOCK_PROGRAM_DUMP_100MHZ 11 /* index for 0x0F007000 */
  414. static struct bcm_ddr_setting asT3LP_DDRSetting100MHz[] = {
  415. /* DPLL Clock Setting */
  416. {0x0f000810, 0x00002F95},
  417. {0x0f000820, 0x03F1369B},
  418. {0x0f000840, 0x0fff0000},
  419. {0x0f000860, 0x00000000},
  420. {0x0f000880, 0x000003DD},
  421. /* Changed source for X-bar and MIPS clock to APLL */
  422. {0x0f000840, 0x0FFF0000},
  423. {0x0F00a044, 0x1fffffff},
  424. {0x0F00a040, 0x1f000000},
  425. {0x0F00a084, 0x1Cffffff},
  426. {0x0F00a080, 0x1C000000},
  427. /* Memcontroller Default values */
  428. {0x0F007000, 0x00010001},
  429. {0x0F007004, 0x01010100},
  430. {0x0F007008, 0x01000001},
  431. {0x0F00700c, 0x00000000},
  432. {0x0F007010, 0x01000000},
  433. {0x0F007014, 0x01000100},
  434. {0x0F007018, 0x01000000},
  435. {0x0F00701c, 0x01020000},
  436. {0x0F007020, 0x04020107},
  437. {0x0F007024, 0x00000007},
  438. {0x0F007028, 0x01020200},
  439. {0x0F00702c, 0x0204040a},
  440. {0x0F007030, 0x06000000},
  441. {0x0F007034, 0x00000004},
  442. {0x0F007038, 0x1F080200},
  443. {0x0F00703C, 0x0203031F},
  444. {0x0F007040, 0x6e001200},
  445. {0x0F007044, 0x011a0a00},
  446. {0x0F007048, 0x03000305},
  447. {0x0F00704c, 0x00000000},
  448. {0x0F007050, 0x0100001c},
  449. {0x0F007054, 0x00000000},
  450. {0x0F007058, 0x00000000},
  451. {0x0F00705c, 0x00000000},
  452. {0x0F007060, 0x00082ED6},
  453. {0x0F007064, 0x0000000A},
  454. {0x0F007068, 0x00000000},
  455. {0x0F00706c, 0x00000001},
  456. {0x0F007070, 0x00005000},
  457. {0x0F007074, 0x00000000},
  458. {0x0F007078, 0x00000000},
  459. {0x0F00707C, 0x00000000},
  460. {0x0F007080, 0x00000000},
  461. {0x0F007084, 0x00000000},
  462. {0x0F007088, 0x01000001},
  463. {0x0F00708c, 0x00000101},
  464. {0x0F007090, 0x00000000},
  465. {0x0F007094, 0x00010000},
  466. {0x0F007098, 0x00000000},
  467. {0x0F0070C8, 0x00000104},
  468. /* Enable 2 ports within X-bar */
  469. {0x0F00A000, 0x00000016},
  470. /* Enable start bit within memory controller */
  471. {0x0F007018, 0x01010000}
  472. };
  473. #define T3LP_SKIP_CLOCK_PROGRAM_DUMP_80MHZ 9 /* index for 0x0F007000 */
  474. static struct bcm_ddr_setting asT3LP_DDRSetting80MHz[] = {
  475. /* DPLL Clock Setting */
  476. {0x0f000820, 0x07F13FFF},
  477. {0x0f000810, 0x00002F95},
  478. {0x0f000860, 0x00000000},
  479. {0x0f000880, 0x000003DD},
  480. {0x0f000840, 0x0FFF1F00},
  481. {0x0F00a044, 0x1fffffff},
  482. {0x0F00a040, 0x1f000000},
  483. {0x0F00a084, 0x1Cffffff},
  484. {0x0F00a080, 0x1C000000},
  485. {0x0F00A000, 0x00000016},
  486. {0x0f007000, 0x00010001},
  487. {0x0f007004, 0x01000000},
  488. {0x0f007008, 0x01000001},
  489. {0x0f00700c, 0x00000000},
  490. {0x0f007010, 0x01000000},
  491. {0x0f007014, 0x01000100},
  492. {0x0f007018, 0x01000000},
  493. {0x0f00701c, 0x01020000},
  494. {0x0f007020, 0x04020107},
  495. {0x0f007024, 0x00000007},
  496. {0x0f007028, 0x02020200},
  497. {0x0f00702c, 0x0204040a},
  498. {0x0f007030, 0x04000000},
  499. {0x0f007034, 0x00000002},
  500. {0x0f007038, 0x1d060200},
  501. {0x0f00703c, 0x1c22221d},
  502. {0x0f007040, 0x8A116600},
  503. {0x0f007044, 0x222d0800},
  504. {0x0f007048, 0x02690204},
  505. {0x0f00704c, 0x00000000},
  506. {0x0f007050, 0x0100001c},
  507. {0x0f007054, 0x00000000},
  508. {0x0f007058, 0x00000000},
  509. {0x0f00705c, 0x00000000},
  510. {0x0f007060, 0x000A15D6},
  511. {0x0f007064, 0x0000000A},
  512. {0x0f007068, 0x00000000},
  513. {0x0f00706c, 0x00000001},
  514. {0x0f007070, 0x00004000},
  515. {0x0f007074, 0x00000000},
  516. {0x0f007078, 0x00000000},
  517. {0x0f00707c, 0x00000000},
  518. {0x0f007080, 0x00000000},
  519. {0x0f007084, 0x00000000},
  520. {0x0f007088, 0x01000001},
  521. {0x0f00708c, 0x00000101},
  522. {0x0f007090, 0x00000000},
  523. {0x0f007094, 0x00010000},
  524. {0x0f007098, 0x00000000},
  525. {0x0F0070C8, 0x00000104},
  526. {0x0F007018, 0x01010000}
  527. };
  528. /* T3 LP-B (UMA-B) */
  529. #define T3LPB_SKIP_CLOCK_PROGRAM_DUMP_160MHZ 7 /* index for 0x0F007000 */
  530. static struct bcm_ddr_setting asT3LPB_DDRSetting160MHz[] = {
  531. /* DPLL Clock Setting */
  532. {0x0f000820, 0x03F137DB},
  533. {0x0f000810, 0x01842795},
  534. {0x0f000860, 0x00000000},
  535. {0x0f000880, 0x000003DD},
  536. {0x0f000840, 0x0FFF0400},
  537. {0x0F00a044, 0x1fffffff},
  538. {0x0F00a040, 0x1f000000},
  539. {0x0f003050, 0x00000021}, /* this is flash/eeprom clock divisor which
  540. * set the flash clock to 20 MHz */
  541. {0x0F00a084, 0x1Cffffff}, /* Now dump from her in internal memory */
  542. {0x0F00a080, 0x1C000000},
  543. {0x0F00A000, 0x00000016},
  544. {0x0f007000, 0x00010001},
  545. {0x0f007004, 0x01000001},
  546. {0x0f007008, 0x01000101},
  547. {0x0f00700c, 0x00000000},
  548. {0x0f007010, 0x01000100},
  549. {0x0f007014, 0x01000100},
  550. {0x0f007018, 0x01000000},
  551. {0x0f00701c, 0x01020000},
  552. {0x0f007020, 0x04030107},
  553. {0x0f007024, 0x02000007},
  554. {0x0f007028, 0x02020200},
  555. {0x0f00702c, 0x0206060a},
  556. {0x0f007030, 0x050d0d00},
  557. {0x0f007034, 0x00000003},
  558. {0x0f007038, 0x170a0200},
  559. {0x0f00703c, 0x02101012},
  560. {0x0f007040, 0x45161200},
  561. {0x0f007044, 0x11250c00},
  562. {0x0f007048, 0x04da0307},
  563. {0x0f00704c, 0x00000000},
  564. {0x0f007050, 0x0000001c},
  565. {0x0f007054, 0x00000000},
  566. {0x0f007058, 0x00000000},
  567. {0x0f00705c, 0x00000000},
  568. {0x0f007060, 0x00142bb6},
  569. {0x0f007064, 0x20430014},
  570. {0x0f007068, 0x00000000},
  571. {0x0f00706c, 0x00000001},
  572. {0x0f007070, 0x00009000},
  573. {0x0f007074, 0x00000000},
  574. {0x0f007078, 0x00000000},
  575. {0x0f00707c, 0x00000000},
  576. {0x0f007080, 0x00000000},
  577. {0x0f007084, 0x00000000},
  578. {0x0f007088, 0x01000001},
  579. {0x0f00708c, 0x00000101},
  580. {0x0f007090, 0x00000000},
  581. {0x0f007094, 0x00040000},
  582. {0x0f007098, 0x00000000},
  583. {0x0F0070C8, 0x00000104},
  584. {0x0F007018, 0x01010000}
  585. };
  586. #define T3LPB_SKIP_CLOCK_PROGRAM_DUMP_133MHZ 7 /* index for 0x0F007000 */
  587. static struct bcm_ddr_setting asT3LPB_DDRSetting133MHz[] = {
  588. /* DPLL Clock Setting */
  589. {0x0f000820, 0x03F1365B},
  590. {0x0f000810, 0x00002F95},
  591. {0x0f000880, 0x000003DD},
  592. /* Changed source for X-bar and MIPS clock to APLL */
  593. {0x0f000840, 0x0FFF0000},
  594. {0x0f000860, 0x00000000},
  595. {0x0F00a044, 0x1fffffff},
  596. {0x0F00a040, 0x1f000000},
  597. {0x0f003050, 0x00000021}, /* flash/eeprom clock divisor which
  598. * set the flash clock to 20 MHz */
  599. {0x0F00a084, 0x1Cffffff}, /* dump from here in internal memory */
  600. {0x0F00a080, 0x1C000000},
  601. {0x0F00A000, 0x00000016},
  602. /* Memcontroller Default values */
  603. {0x0F007000, 0x00010001},
  604. {0x0F007004, 0x01010100},
  605. {0x0F007008, 0x01000001},
  606. {0x0F00700c, 0x00000000},
  607. {0x0F007010, 0x01000000},
  608. {0x0F007014, 0x01000100},
  609. {0x0F007018, 0x01000000},
  610. {0x0F00701c, 0x01020001},
  611. {0x0F007020, 0x04030107},
  612. {0x0F007024, 0x02000007},
  613. {0x0F007028, 0x02020200},
  614. {0x0F00702c, 0x0206060a},
  615. {0x0F007030, 0x05000000},
  616. {0x0F007034, 0x00000003},
  617. {0x0F007038, 0x190a0200},
  618. {0x0F00703C, 0x02101017},
  619. {0x0F007040, 0x45171200},
  620. {0x0F007044, 0x11290D00},
  621. {0x0F007048, 0x04080306},
  622. {0x0F00704c, 0x00000000},
  623. {0x0F007050, 0x0100001c},
  624. {0x0F007054, 0x00000000},
  625. {0x0F007058, 0x00000000},
  626. {0x0F00705c, 0x00000000},
  627. {0x0F007060, 0x0010245F},
  628. {0x0F007064, 0x00000010},
  629. {0x0F007068, 0x00000000},
  630. {0x0F00706c, 0x00000001},
  631. {0x0F007070, 0x00007000},
  632. {0x0F007074, 0x00000000},
  633. {0x0F007078, 0x00000000},
  634. {0x0F00707C, 0x00000000},
  635. {0x0F007080, 0x00000000},
  636. {0x0F007084, 0x00000000},
  637. {0x0F007088, 0x01000001},
  638. {0x0F00708c, 0x00000101},
  639. {0x0F007090, 0x00000000},
  640. /* Enable BW improvement within memory controller */
  641. {0x0F007094, 0x00040000},
  642. {0x0F007098, 0x00000000},
  643. {0x0F0070c8, 0x00000104},
  644. /* Enable 2 ports within X-bar */
  645. /* Enable start bit within memory controller */
  646. {0x0F007018, 0x01010000}
  647. };
  648. #define T3LPB_SKIP_CLOCK_PROGRAM_DUMP_100MHZ 8 /* index for 0x0F007000 */
  649. static struct bcm_ddr_setting asT3LPB_DDRSetting100MHz[] = {
  650. /* DPLL Clock Setting */
  651. {0x0f000810, 0x00002F95},
  652. {0x0f000820, 0x03F1369B},
  653. {0x0f000840, 0x0fff0000},
  654. {0x0f000860, 0x00000000},
  655. {0x0f000880, 0x000003DD},
  656. /* Changed source for X-bar and MIPS clock to APLL */
  657. {0x0f000840, 0x0FFF0000},
  658. {0x0F00a044, 0x1fffffff},
  659. {0x0F00a040, 0x1f000000},
  660. {0x0f003050, 0x00000021}, /* flash/eeprom clock divisor which
  661. * set the flash clock to 20 MHz */
  662. {0x0F00a084, 0x1Cffffff}, /* dump from here in internal memory */
  663. {0x0F00a080, 0x1C000000},
  664. /* Memcontroller Default values */
  665. {0x0F007000, 0x00010001},
  666. {0x0F007004, 0x01010100},
  667. {0x0F007008, 0x01000001},
  668. {0x0F00700c, 0x00000000},
  669. {0x0F007010, 0x01000000},
  670. {0x0F007014, 0x01000100},
  671. {0x0F007018, 0x01000000},
  672. {0x0F00701c, 0x01020000},
  673. {0x0F007020, 0x04020107},
  674. {0x0F007024, 0x00000007},
  675. {0x0F007028, 0x01020200},
  676. {0x0F00702c, 0x0204040a},
  677. {0x0F007030, 0x06000000},
  678. {0x0F007034, 0x00000004},
  679. {0x0F007038, 0x1F080200},
  680. {0x0F00703C, 0x0203031F},
  681. {0x0F007040, 0x6e001200},
  682. {0x0F007044, 0x011a0a00},
  683. {0x0F007048, 0x03000305},
  684. {0x0F00704c, 0x00000000},
  685. {0x0F007050, 0x0100001c},
  686. {0x0F007054, 0x00000000},
  687. {0x0F007058, 0x00000000},
  688. {0x0F00705c, 0x00000000},
  689. {0x0F007060, 0x00082ED6},
  690. {0x0F007064, 0x0000000A},
  691. {0x0F007068, 0x00000000},
  692. {0x0F00706c, 0x00000001},
  693. {0x0F007070, 0x00005000},
  694. {0x0F007074, 0x00000000},
  695. {0x0F007078, 0x00000000},
  696. {0x0F00707C, 0x00000000},
  697. {0x0F007080, 0x00000000},
  698. {0x0F007084, 0x00000000},
  699. {0x0F007088, 0x01000001},
  700. {0x0F00708c, 0x00000101},
  701. {0x0F007090, 0x00000000},
  702. {0x0F007094, 0x00010000},
  703. {0x0F007098, 0x00000000},
  704. {0x0F0070C8, 0x00000104},
  705. /* Enable 2 ports within X-bar */
  706. {0x0F00A000, 0x00000016},
  707. /* Enable start bit within memory controller */
  708. {0x0F007018, 0x01010000}
  709. };
  710. #define T3LPB_SKIP_CLOCK_PROGRAM_DUMP_80MHZ 7 /* index for 0x0F007000 */
  711. static struct bcm_ddr_setting asT3LPB_DDRSetting80MHz[] = {
  712. /* DPLL Clock Setting */
  713. {0x0f000820, 0x07F13FFF},
  714. {0x0f000810, 0x00002F95},
  715. {0x0f000860, 0x00000000},
  716. {0x0f000880, 0x000003DD},
  717. {0x0f000840, 0x0FFF1F00},
  718. {0x0F00a044, 0x1fffffff},
  719. {0x0F00a040, 0x1f000000},
  720. {0x0f003050, 0x00000021}, /* flash/eeprom clock divisor
  721. * which set the flash clock to 20 MHz */
  722. {0x0F00a084, 0x1Cffffff}, /* dump from here in internal memory */
  723. {0x0F00a080, 0x1C000000},
  724. {0x0F00A000, 0x00000016},
  725. {0x0f007000, 0x00010001},
  726. {0x0f007004, 0x01000000},
  727. {0x0f007008, 0x01000001},
  728. {0x0f00700c, 0x00000000},
  729. {0x0f007010, 0x01000000},
  730. {0x0f007014, 0x01000100},
  731. {0x0f007018, 0x01000000},
  732. {0x0f00701c, 0x01020000},
  733. {0x0f007020, 0x04020107},
  734. {0x0f007024, 0x00000007},
  735. {0x0f007028, 0x02020200},
  736. {0x0f00702c, 0x0204040a},
  737. {0x0f007030, 0x04000000},
  738. {0x0f007034, 0x00000002},
  739. {0x0f007038, 0x1d060200},
  740. {0x0f00703c, 0x1c22221d},
  741. {0x0f007040, 0x8A116600},
  742. {0x0f007044, 0x222d0800},
  743. {0x0f007048, 0x02690204},
  744. {0x0f00704c, 0x00000000},
  745. {0x0f007050, 0x0100001c},
  746. {0x0f007054, 0x00000000},
  747. {0x0f007058, 0x00000000},
  748. {0x0f00705c, 0x00000000},
  749. {0x0f007060, 0x000A15D6},
  750. {0x0f007064, 0x0000000A},
  751. {0x0f007068, 0x00000000},
  752. {0x0f00706c, 0x00000001},
  753. {0x0f007070, 0x00004000},
  754. {0x0f007074, 0x00000000},
  755. {0x0f007078, 0x00000000},
  756. {0x0f00707c, 0x00000000},
  757. {0x0f007080, 0x00000000},
  758. {0x0f007084, 0x00000000},
  759. {0x0f007088, 0x01000001},
  760. {0x0f00708c, 0x00000101},
  761. {0x0f007090, 0x00000000},
  762. {0x0f007094, 0x00010000},
  763. {0x0f007098, 0x00000000},
  764. {0x0F0070C8, 0x00000104},
  765. {0x0F007018, 0x01010000}
  766. };
  767. int ddr_init(struct bcm_mini_adapter *Adapter)
  768. {
  769. struct bcm_ddr_setting *psDDRSetting = NULL;
  770. ULONG RegCount = 0;
  771. UINT value = 0;
  772. UINT uiResetValue = 0;
  773. UINT uiClockSetting = 0;
  774. int retval = STATUS_SUCCESS;
  775. switch (Adapter->chip_id) {
  776. case 0xbece3200:
  777. switch (Adapter->DDRSetting) {
  778. case DDR_80_MHZ:
  779. psDDRSetting = asT3LP_DDRSetting80MHz;
  780. RegCount = (sizeof(asT3LP_DDRSetting80MHz) /
  781. sizeof(struct bcm_ddr_setting));
  782. break;
  783. case DDR_100_MHZ:
  784. psDDRSetting = asT3LP_DDRSetting100MHz;
  785. RegCount = (sizeof(asT3LP_DDRSetting100MHz) /
  786. sizeof(struct bcm_ddr_setting));
  787. break;
  788. case DDR_133_MHZ:
  789. psDDRSetting = asT3LP_DDRSetting133MHz;
  790. RegCount = (sizeof(asT3LP_DDRSetting133MHz) /
  791. sizeof(struct bcm_ddr_setting));
  792. if (Adapter->bMipsConfig == MIPS_200_MHZ)
  793. uiClockSetting = 0x03F13652;
  794. else
  795. uiClockSetting = 0x03F1365B;
  796. break;
  797. default:
  798. return -EINVAL;
  799. }
  800. break;
  801. case T3LPB:
  802. case BCS220_2:
  803. case BCS220_2BC:
  804. case BCS250_BC:
  805. case BCS220_3:
  806. /* Set bit 2 and bit 6 to 1 for BBIC 2mA drive
  807. * (please check current value and additionally set these bits)
  808. */
  809. if ((Adapter->chip_id != BCS220_2) &&
  810. (Adapter->chip_id != BCS220_2BC) &&
  811. (Adapter->chip_id != BCS220_3)) {
  812. retval = rdmalt(Adapter, (UINT)0x0f000830, &uiResetValue,
  813. sizeof(uiResetValue));
  814. if (retval < 0) {
  815. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL,
  816. "%s:%d RDM failed\n",
  817. __func__, __LINE__);
  818. return retval;
  819. }
  820. uiResetValue |= 0x44;
  821. retval = wrmalt(Adapter, (UINT)0x0f000830, &uiResetValue,
  822. sizeof(uiResetValue));
  823. if (retval < 0) {
  824. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL,
  825. "%s:%d RDM failed\n",
  826. __func__, __LINE__);
  827. return retval;
  828. }
  829. }
  830. switch (Adapter->DDRSetting) {
  831. case DDR_80_MHZ:
  832. psDDRSetting = asT3LPB_DDRSetting80MHz;
  833. RegCount = (sizeof(asT3B_DDRSetting80MHz) /
  834. sizeof(struct bcm_ddr_setting));
  835. break;
  836. case DDR_100_MHZ:
  837. psDDRSetting = asT3LPB_DDRSetting100MHz;
  838. RegCount = (sizeof(asT3B_DDRSetting100MHz) /
  839. sizeof(struct bcm_ddr_setting));
  840. break;
  841. case DDR_133_MHZ:
  842. psDDRSetting = asT3LPB_DDRSetting133MHz;
  843. RegCount = (sizeof(asT3B_DDRSetting133MHz) /
  844. sizeof(struct bcm_ddr_setting));
  845. if (Adapter->bMipsConfig == MIPS_200_MHZ)
  846. uiClockSetting = 0x03F13652;
  847. else
  848. uiClockSetting = 0x03F1365B;
  849. break;
  850. case DDR_160_MHZ:
  851. psDDRSetting = asT3LPB_DDRSetting160MHz;
  852. RegCount = sizeof(asT3LPB_DDRSetting160MHz) /
  853. sizeof(struct bcm_ddr_setting);
  854. if (Adapter->bMipsConfig == MIPS_200_MHZ)
  855. uiClockSetting = 0x03F137D2;
  856. else
  857. uiClockSetting = 0x03F137DB;
  858. }
  859. break;
  860. case 0xbece0110:
  861. case 0xbece0120:
  862. case 0xbece0121:
  863. case 0xbece0130:
  864. case 0xbece0300:
  865. BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,
  866. "DDR Setting: %x\n", Adapter->DDRSetting);
  867. switch (Adapter->DDRSetting) {
  868. case DDR_80_MHZ:
  869. psDDRSetting = asT3_DDRSetting80MHz;
  870. RegCount = (sizeof(asT3_DDRSetting80MHz) /
  871. sizeof(struct bcm_ddr_setting));
  872. break;
  873. case DDR_100_MHZ:
  874. psDDRSetting = asT3_DDRSetting100MHz;
  875. RegCount = (sizeof(asT3_DDRSetting100MHz) /
  876. sizeof(struct bcm_ddr_setting));
  877. break;
  878. case DDR_133_MHZ:
  879. psDDRSetting = asT3_DDRSetting133MHz;
  880. RegCount = (sizeof(asT3_DDRSetting133MHz) /
  881. sizeof(struct bcm_ddr_setting));
  882. break;
  883. default:
  884. return -EINVAL;
  885. }
  886. case 0xbece0310:
  887. {
  888. switch (Adapter->DDRSetting) {
  889. case DDR_80_MHZ:
  890. psDDRSetting = asT3B_DDRSetting80MHz;
  891. RegCount = (sizeof(asT3B_DDRSetting80MHz) /
  892. sizeof(struct bcm_ddr_setting));
  893. break;
  894. case DDR_100_MHZ:
  895. psDDRSetting = asT3B_DDRSetting100MHz;
  896. RegCount = (sizeof(asT3B_DDRSetting100MHz) /
  897. sizeof(struct bcm_ddr_setting));
  898. break;
  899. case DDR_133_MHZ:
  900. /* 266Mhz PLL selected. */
  901. if (Adapter->bDPLLConfig == PLL_266_MHZ) {
  902. memcpy(asT3B_DDRSetting133MHz, asDPLL_266MHZ,
  903. sizeof(asDPLL_266MHZ));
  904. psDDRSetting = asT3B_DDRSetting133MHz;
  905. RegCount = (sizeof(asT3B_DDRSetting133MHz) /
  906. sizeof(struct bcm_ddr_setting));
  907. } else {
  908. psDDRSetting = asT3B_DDRSetting133MHz;
  909. RegCount = (sizeof(asT3B_DDRSetting133MHz) /
  910. sizeof(struct bcm_ddr_setting));
  911. if (Adapter->bMipsConfig == MIPS_200_MHZ)
  912. uiClockSetting = 0x07F13652;
  913. else
  914. uiClockSetting = 0x07F1365B;
  915. }
  916. break;
  917. default:
  918. return -EINVAL;
  919. }
  920. break;
  921. }
  922. default:
  923. return -EINVAL;
  924. }
  925. value = 0;
  926. BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,
  927. "Register Count is =%lu\n", RegCount);
  928. while (RegCount && !retval) {
  929. if (uiClockSetting
  930. && psDDRSetting->ulRegAddress == MIPS_CLOCK_REG)
  931. value = uiClockSetting;
  932. else
  933. value = psDDRSetting->ulRegValue;
  934. retval = wrmalt(Adapter, psDDRSetting->ulRegAddress, &value,
  935. sizeof(value));
  936. if (STATUS_SUCCESS != retval) {
  937. BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,
  938. "%s:%d\n", __func__, __LINE__);
  939. break;
  940. }
  941. RegCount--;
  942. psDDRSetting++;
  943. }
  944. if (Adapter->chip_id >= 0xbece3300) {
  945. mdelay(3);
  946. if ((Adapter->chip_id != BCS220_2) &&
  947. (Adapter->chip_id != BCS220_2BC) &&
  948. (Adapter->chip_id != BCS220_3)) {
  949. /* drive MDDR to half in case of UMA-B: */
  950. uiResetValue = 0x01010001;
  951. retval = wrmalt(Adapter, (UINT)0x0F007018,
  952. &uiResetValue, sizeof(uiResetValue));
  953. if (retval < 0) {
  954. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  955. DBG_LVL_ALL,
  956. "%s:%d RDM failed\n",
  957. __func__,
  958. __LINE__);
  959. return retval;
  960. }
  961. uiResetValue = 0x00040020;
  962. retval = wrmalt(Adapter, (UINT)0x0F007094,
  963. &uiResetValue, sizeof(uiResetValue));
  964. if (retval < 0) {
  965. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  966. DBG_LVL_ALL,
  967. "%s:%d RDM failed\n",
  968. __func__,
  969. __LINE__);
  970. return retval;
  971. }
  972. uiResetValue = 0x01020101;
  973. retval = wrmalt(Adapter, (UINT)0x0F00701c,
  974. &uiResetValue, sizeof(uiResetValue));
  975. if (retval < 0) {
  976. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  977. DBG_LVL_ALL,
  978. "%s:%d RDM failed\n",
  979. __func__,
  980. __LINE__);
  981. return retval;
  982. }
  983. uiResetValue = 0x01010000;
  984. retval = wrmalt(Adapter, (UINT)0x0F007018,
  985. &uiResetValue, sizeof(uiResetValue));
  986. if (retval < 0) {
  987. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  988. DBG_LVL_ALL,
  989. "%s:%d RDM failed\n",
  990. __func__,
  991. __LINE__);
  992. return retval;
  993. }
  994. }
  995. mdelay(3);
  996. /* DC/DC standby change...
  997. * This is to be done only for Hybrid PMU mode.
  998. * with the current h/w there is no way to detect this.
  999. * and since we dont have internal PMU lets do it under
  1000. * UMA-B chip id. we will change this when we will have
  1001. * internal PMU.
  1002. */
  1003. if (Adapter->PmuMode == HYBRID_MODE_7C) {
  1004. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1005. &uiResetValue, sizeof(uiResetValue));
  1006. if (retval < 0) {
  1007. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1008. DBG_LVL_ALL,
  1009. "%s:%d RDM failed\n",
  1010. __func__,
  1011. __LINE__);
  1012. return retval;
  1013. }
  1014. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1015. &uiResetValue, sizeof(uiResetValue));
  1016. if (retval < 0) {
  1017. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1018. DBG_LVL_ALL,
  1019. "%s:%d RDM failed\n",
  1020. __func__,
  1021. __LINE__);
  1022. return retval;
  1023. }
  1024. uiResetValue = 0x1322a8;
  1025. retval = wrmalt(Adapter, (UINT)0x0f000d1c,
  1026. &uiResetValue, sizeof(uiResetValue));
  1027. if (retval < 0) {
  1028. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1029. DBG_LVL_ALL,
  1030. "%s:%d RDM failed\n",
  1031. __func__,
  1032. __LINE__);
  1033. return retval;
  1034. }
  1035. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1036. &uiResetValue, sizeof(uiResetValue));
  1037. if (retval < 0) {
  1038. BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, RDM,
  1039. DBG_LVL_ALL,
  1040. "%s:%d RDM failed\n",
  1041. __func__,
  1042. __LINE__);
  1043. return retval;
  1044. }
  1045. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1046. &uiResetValue, sizeof(uiResetValue));
  1047. if (retval < 0) {
  1048. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1049. DBG_LVL_ALL,
  1050. "%s:%d RDM failed\n",
  1051. __func__,
  1052. __LINE__);
  1053. return retval;
  1054. }
  1055. uiResetValue = 0x132296;
  1056. retval = wrmalt(Adapter, (UINT)0x0f000d14,
  1057. &uiResetValue, sizeof(uiResetValue));
  1058. if (retval < 0) {
  1059. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1060. DBG_LVL_ALL,
  1061. "%s:%d RDM failed\n",
  1062. __func__,
  1063. __LINE__);
  1064. return retval;
  1065. }
  1066. } else if (Adapter->PmuMode == HYBRID_MODE_6) {
  1067. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1068. &uiResetValue, sizeof(uiResetValue));
  1069. if (retval < 0) {
  1070. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1071. DBG_LVL_ALL,
  1072. "%s:%d RDM failed\n",
  1073. __func__,
  1074. __LINE__);
  1075. return retval;
  1076. }
  1077. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1078. &uiResetValue, sizeof(uiResetValue));
  1079. if (retval < 0) {
  1080. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1081. DBG_LVL_ALL,
  1082. "%s:%d RDM failed\n",
  1083. __func__,
  1084. __LINE__);
  1085. return retval;
  1086. }
  1087. uiResetValue = 0x6003229a;
  1088. retval = wrmalt(Adapter, (UINT)0x0f000d14,
  1089. &uiResetValue, sizeof(uiResetValue));
  1090. if (retval < 0) {
  1091. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1092. DBG_LVL_ALL,
  1093. "%s:%d RDM failed\n",
  1094. __func__,
  1095. __LINE__);
  1096. return retval;
  1097. }
  1098. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1099. &uiResetValue, sizeof(uiResetValue));
  1100. if (retval < 0) {
  1101. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1102. DBG_LVL_ALL,
  1103. "%s:%d RDM failed\n",
  1104. __func__,
  1105. __LINE__);
  1106. return retval;
  1107. }
  1108. retval = rdmalt(Adapter, (UINT)0x0f000c00,
  1109. &uiResetValue, sizeof(uiResetValue));
  1110. if (retval < 0) {
  1111. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1112. DBG_LVL_ALL,
  1113. "%s:%d RDM failed\n",
  1114. __func__,
  1115. __LINE__);
  1116. return retval;
  1117. }
  1118. uiResetValue = 0x1322a8;
  1119. retval = wrmalt(Adapter, (UINT)0x0f000d1c,
  1120. &uiResetValue, sizeof(uiResetValue));
  1121. if (retval < 0) {
  1122. BCM_DEBUG_PRINT(Adapter, CMHOST, RDM,
  1123. DBG_LVL_ALL,
  1124. "%s:%d RDM failed\n",
  1125. __func__,
  1126. __LINE__);
  1127. return retval;
  1128. }
  1129. }
  1130. }
  1131. Adapter->bDDRInitDone = TRUE;
  1132. return retval;
  1133. }
  1134. int download_ddr_settings(struct bcm_mini_adapter *Adapter)
  1135. {
  1136. struct bcm_ddr_setting *psDDRSetting = NULL;
  1137. ULONG RegCount = 0;
  1138. unsigned long ul_ddr_setting_load_addr =
  1139. DDR_DUMP_INTERNAL_DEVICE_MEMORY;
  1140. UINT value = 0;
  1141. int retval = STATUS_SUCCESS;
  1142. bool bOverrideSelfRefresh = false;
  1143. switch (Adapter->chip_id) {
  1144. case 0xbece3200:
  1145. switch (Adapter->DDRSetting) {
  1146. case DDR_80_MHZ:
  1147. psDDRSetting = asT3LP_DDRSetting80MHz;
  1148. RegCount = ARRAY_SIZE(asT3LP_DDRSetting80MHz);
  1149. RegCount -= T3LP_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1150. psDDRSetting += T3LP_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1151. break;
  1152. case DDR_100_MHZ:
  1153. psDDRSetting = asT3LP_DDRSetting100MHz;
  1154. RegCount = ARRAY_SIZE(asT3LP_DDRSetting100MHz);
  1155. RegCount -= T3LP_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1156. psDDRSetting += T3LP_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1157. break;
  1158. case DDR_133_MHZ:
  1159. bOverrideSelfRefresh = TRUE;
  1160. psDDRSetting = asT3LP_DDRSetting133MHz;
  1161. RegCount = ARRAY_SIZE(asT3LP_DDRSetting133MHz);
  1162. RegCount -= T3LP_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1163. psDDRSetting += T3LP_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1164. break;
  1165. default:
  1166. return -EINVAL;
  1167. }
  1168. break;
  1169. case T3LPB:
  1170. case BCS220_2:
  1171. case BCS220_2BC:
  1172. case BCS250_BC:
  1173. case BCS220_3:
  1174. switch (Adapter->DDRSetting) {
  1175. case DDR_80_MHZ:
  1176. psDDRSetting = asT3LPB_DDRSetting80MHz;
  1177. RegCount = ARRAY_SIZE(asT3LPB_DDRSetting80MHz);
  1178. RegCount -= T3LPB_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1179. psDDRSetting += T3LPB_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1180. break;
  1181. case DDR_100_MHZ:
  1182. psDDRSetting = asT3LPB_DDRSetting100MHz;
  1183. RegCount = ARRAY_SIZE(asT3LPB_DDRSetting100MHz);
  1184. RegCount -= T3LPB_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1185. psDDRSetting += T3LPB_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1186. break;
  1187. case DDR_133_MHZ:
  1188. bOverrideSelfRefresh = TRUE;
  1189. psDDRSetting = asT3LPB_DDRSetting133MHz;
  1190. RegCount = ARRAY_SIZE(asT3LPB_DDRSetting133MHz);
  1191. RegCount -= T3LPB_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1192. psDDRSetting += T3LPB_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1193. break;
  1194. case DDR_160_MHZ:
  1195. bOverrideSelfRefresh = TRUE;
  1196. psDDRSetting = asT3LPB_DDRSetting160MHz;
  1197. RegCount = ARRAY_SIZE(asT3LPB_DDRSetting160MHz);
  1198. RegCount -= T3LPB_SKIP_CLOCK_PROGRAM_DUMP_160MHZ;
  1199. psDDRSetting += T3LPB_SKIP_CLOCK_PROGRAM_DUMP_160MHZ;
  1200. break;
  1201. default:
  1202. return -EINVAL;
  1203. }
  1204. break;
  1205. case 0xbece0300:
  1206. switch (Adapter->DDRSetting) {
  1207. case DDR_80_MHZ:
  1208. psDDRSetting = asT3_DDRSetting80MHz;
  1209. RegCount = ARRAY_SIZE(asT3_DDRSetting80MHz);
  1210. RegCount -= T3_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1211. psDDRSetting += T3_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1212. break;
  1213. case DDR_100_MHZ:
  1214. psDDRSetting = asT3_DDRSetting100MHz;
  1215. RegCount = ARRAY_SIZE(asT3_DDRSetting100MHz);
  1216. RegCount -= T3_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1217. psDDRSetting += T3_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1218. break;
  1219. case DDR_133_MHZ:
  1220. psDDRSetting = asT3_DDRSetting133MHz;
  1221. RegCount = ARRAY_SIZE(asT3_DDRSetting133MHz);
  1222. RegCount -= T3_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1223. psDDRSetting += T3_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1224. break;
  1225. default:
  1226. return -EINVAL;
  1227. }
  1228. break;
  1229. case 0xbece0310:
  1230. {
  1231. switch (Adapter->DDRSetting) {
  1232. case DDR_80_MHZ:
  1233. psDDRSetting = asT3B_DDRSetting80MHz;
  1234. RegCount = ARRAY_SIZE(asT3B_DDRSetting80MHz);
  1235. RegCount -= T3B_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1236. psDDRSetting += T3B_SKIP_CLOCK_PROGRAM_DUMP_80MHZ;
  1237. break;
  1238. case DDR_100_MHZ:
  1239. psDDRSetting = asT3B_DDRSetting100MHz;
  1240. RegCount = ARRAY_SIZE(asT3B_DDRSetting100MHz);
  1241. RegCount -= T3B_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1242. psDDRSetting += T3B_SKIP_CLOCK_PROGRAM_DUMP_100MHZ;
  1243. break;
  1244. case DDR_133_MHZ:
  1245. bOverrideSelfRefresh = TRUE;
  1246. psDDRSetting = asT3B_DDRSetting133MHz;
  1247. RegCount = ARRAY_SIZE(asT3B_DDRSetting133MHz);
  1248. RegCount -= T3B_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1249. psDDRSetting += T3B_SKIP_CLOCK_PROGRAM_DUMP_133MHZ;
  1250. break;
  1251. }
  1252. break;
  1253. }
  1254. default:
  1255. return -EINVAL;
  1256. }
  1257. /* total number of Register that has to be dumped */
  1258. value = RegCount;
  1259. retval = wrmalt(Adapter, ul_ddr_setting_load_addr, &value,
  1260. sizeof(value));
  1261. if (retval) {
  1262. BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,
  1263. "%s:%d\n", __func__, __LINE__);
  1264. return retval;
  1265. }
  1266. ul_ddr_setting_load_addr += sizeof(ULONG);
  1267. /* signature */
  1268. value = (0x1d1e0dd0);
  1269. retval = wrmalt(Adapter, ul_ddr_setting_load_addr, &value,
  1270. sizeof(value));
  1271. if (retval) {
  1272. BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,
  1273. "%s:%d\n", __func__, __LINE__);
  1274. return retval;
  1275. }
  1276. ul_ddr_setting_load_addr += sizeof(ULONG);
  1277. RegCount *= (sizeof(struct bcm_ddr_setting)/sizeof(ULONG));
  1278. while (RegCount && !retval) {
  1279. value = psDDRSetting->ulRegAddress;
  1280. retval = wrmalt(Adapter, ul_ddr_setting_load_addr, &value,
  1281. sizeof(value));
  1282. ul_ddr_setting_load_addr += sizeof(ULONG);
  1283. if (!retval) {
  1284. if (bOverrideSelfRefresh
  1285. && (psDDRSetting->ulRegAddress
  1286. == 0x0F007018))
  1287. value = (psDDRSetting->ulRegValue | (1<<8));
  1288. else
  1289. value = psDDRSetting->ulRegValue;
  1290. if (STATUS_SUCCESS != wrmalt(Adapter,
  1291. ul_ddr_setting_load_addr,
  1292. &value,
  1293. sizeof(value))) {
  1294. BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,
  1295. "%s:%d\n", __func__, __LINE__);
  1296. break;
  1297. }
  1298. }
  1299. ul_ddr_setting_load_addr += sizeof(ULONG);
  1300. RegCount--;
  1301. psDDRSetting++;
  1302. }
  1303. return retval;
  1304. }