head-uc-fr555.S 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /* head-uc-fr555.S: FR555 uc-linux specific bits of initialisation
  2. *
  3. * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/threads.h>
  12. #include <linux/linkage.h>
  13. #include <asm/ptrace.h>
  14. #include <asm/page.h>
  15. #include <asm/spr-regs.h>
  16. #include <asm/mb86943a.h>
  17. #include "head.inc"
  18. #define __551_DARS0 0xfeff0100
  19. #define __551_DARS1 0xfeff0104
  20. #define __551_DARS2 0xfeff0108
  21. #define __551_DARS3 0xfeff010c
  22. #define __551_DAMK0 0xfeff0110
  23. #define __551_DAMK1 0xfeff0114
  24. #define __551_DAMK2 0xfeff0118
  25. #define __551_DAMK3 0xfeff011c
  26. #define __551_LCR 0xfeff1100
  27. #define __551_LSBR 0xfeff1c00
  28. .section .text.init,"ax"
  29. .balign 4
  30. ###############################################################################
  31. #
  32. # describe the position and layout of the SDRAM controller registers
  33. #
  34. # ENTRY: EXIT:
  35. # GR5 - cacheline size
  36. # GR11 - displacement of 2nd SDRAM addr reg from GR14
  37. # GR12 - displacement of 3rd SDRAM addr reg from GR14
  38. # GR13 - displacement of 4th SDRAM addr reg from GR14
  39. # GR14 - address of 1st SDRAM addr reg
  40. # GR15 - amount to shift address by to match SDRAM addr reg
  41. # GR26 &__head_reference [saved]
  42. # GR30 LED address [saved]
  43. # CC0 - T if DARS0 is present
  44. # CC1 - T if DARS1 is present
  45. # CC2 - T if DARS2 is present
  46. # CC3 - T if DARS3 is present
  47. #
  48. ###############################################################################
  49. .globl __head_fr555_describe_sdram
  50. __head_fr555_describe_sdram:
  51. sethi.p %hi(__551_DARS0),gr14
  52. setlo %lo(__551_DARS0),gr14
  53. setlos.p #__551_DARS1-__551_DARS0,gr11
  54. setlos #__551_DARS2-__551_DARS0,gr12
  55. setlos.p #__551_DARS3-__551_DARS0,gr13
  56. setlos #64,gr5 ; cacheline size
  57. setlos #20,gr15 ; amount to shift addr by
  58. setlos #0x00ff,gr4
  59. movgs gr4,cccr ; extant DARS/DAMK regs
  60. bralr
  61. ###############################################################################
  62. #
  63. # rearrange the bus controller registers
  64. #
  65. # ENTRY: EXIT:
  66. # GR26 &__head_reference [saved]
  67. # GR30 LED address revised LED address
  68. #
  69. ###############################################################################
  70. .globl __head_fr555_set_busctl
  71. __head_fr555_set_busctl:
  72. LEDS 0x100f
  73. sethi.p %hi(__551_LSBR),gr10
  74. setlo %lo(__551_LSBR),gr10
  75. sethi.p %hi(__551_LCR),gr11
  76. setlo %lo(__551_LCR),gr11
  77. # set the bus controller
  78. sethi.p %hi(__region_CS1),gr4
  79. setlo %lo(__region_CS1),gr4
  80. sethi.p %hi(__region_CS1_M),gr5
  81. setlo %lo(__region_CS1_M),gr5
  82. sethi.p %hi(__region_CS1_C),gr6
  83. setlo %lo(__region_CS1_C),gr6
  84. sti gr4,@(gr10,#1*0x08)
  85. sti gr5,@(gr10,#1*0x08+0x100)
  86. sti gr6,@(gr11,#1*0x08)
  87. sethi.p %hi(__region_CS2),gr4
  88. setlo %lo(__region_CS2),gr4
  89. sethi.p %hi(__region_CS2_M),gr5
  90. setlo %lo(__region_CS2_M),gr5
  91. sethi.p %hi(__region_CS2_C),gr6
  92. setlo %lo(__region_CS2_C),gr6
  93. sti gr4,@(gr10,#2*0x08)
  94. sti gr5,@(gr10,#2*0x08+0x100)
  95. sti gr6,@(gr11,#2*0x08)
  96. sethi.p %hi(__region_CS3),gr4
  97. setlo %lo(__region_CS3),gr4
  98. sethi.p %hi(__region_CS3_M),gr5
  99. setlo %lo(__region_CS3_M),gr5
  100. sethi.p %hi(__region_CS3_C),gr6
  101. setlo %lo(__region_CS3_C),gr6
  102. sti gr4,@(gr10,#3*0x08)
  103. sti gr5,@(gr10,#3*0x08+0x100)
  104. sti gr6,@(gr11,#3*0x08)
  105. sethi.p %hi(__region_CS4),gr4
  106. setlo %lo(__region_CS4),gr4
  107. sethi.p %hi(__region_CS4_M),gr5
  108. setlo %lo(__region_CS4_M),gr5
  109. sethi.p %hi(__region_CS4_C),gr6
  110. setlo %lo(__region_CS4_C),gr6
  111. sti gr4,@(gr10,#4*0x08)
  112. sti gr5,@(gr10,#4*0x08+0x100)
  113. sti gr6,@(gr11,#4*0x08)
  114. sethi.p %hi(__region_CS5),gr4
  115. setlo %lo(__region_CS5),gr4
  116. sethi.p %hi(__region_CS5_M),gr5
  117. setlo %lo(__region_CS5_M),gr5
  118. sethi.p %hi(__region_CS5_C),gr6
  119. setlo %lo(__region_CS5_C),gr6
  120. sti gr4,@(gr10,#5*0x08)
  121. sti gr5,@(gr10,#5*0x08+0x100)
  122. sti gr6,@(gr11,#5*0x08)
  123. sethi.p %hi(__region_CS6),gr4
  124. setlo %lo(__region_CS6),gr4
  125. sethi.p %hi(__region_CS6_M),gr5
  126. setlo %lo(__region_CS6_M),gr5
  127. sethi.p %hi(__region_CS6_C),gr6
  128. setlo %lo(__region_CS6_C),gr6
  129. sti gr4,@(gr10,#6*0x08)
  130. sti gr5,@(gr10,#6*0x08+0x100)
  131. sti gr6,@(gr11,#6*0x08)
  132. sethi.p %hi(__region_CS7),gr4
  133. setlo %lo(__region_CS7),gr4
  134. sethi.p %hi(__region_CS7_M),gr5
  135. setlo %lo(__region_CS7_M),gr5
  136. sethi.p %hi(__region_CS7_C),gr6
  137. setlo %lo(__region_CS7_C),gr6
  138. sti gr4,@(gr10,#7*0x08)
  139. sti gr5,@(gr10,#7*0x08+0x100)
  140. sti gr6,@(gr11,#7*0x08)
  141. membar
  142. bar
  143. # adjust LED bank address
  144. #ifdef CONFIG_MB93091_VDK
  145. sethi.p %hi(LED_ADDR - 0x20000000 +__region_CS2),gr30
  146. setlo %lo(LED_ADDR - 0x20000000 +__region_CS2),gr30
  147. #endif
  148. bralr
  149. ###############################################################################
  150. #
  151. # determine the total SDRAM size
  152. #
  153. # ENTRY: EXIT:
  154. # GR25 - SDRAM size
  155. # GR26 &__head_reference [saved]
  156. # GR30 LED address [saved]
  157. #
  158. ###############################################################################
  159. .globl __head_fr555_survey_sdram
  160. __head_fr555_survey_sdram:
  161. sethi.p %hi(__551_DAMK0),gr11
  162. setlo %lo(__551_DAMK0),gr11
  163. sethi.p %hi(__551_DARS0),gr12
  164. setlo %lo(__551_DARS0),gr12
  165. sethi.p %hi(0xfff),gr17 ; unused SDRAM AMK value
  166. setlo %lo(0xfff),gr17
  167. setlos #0,gr25
  168. ldi @(gr11,#0x00),gr6 ; DAMK0: bits 11:0 match addr 11:0
  169. subcc gr6,gr17,gr0,icc0
  170. beq icc0,#0,__head_no_DCS0
  171. ldi @(gr12,#0x00),gr4 ; DARS0
  172. add gr25,gr6,gr25
  173. addi gr25,#1,gr25
  174. __head_no_DCS0:
  175. ldi @(gr11,#0x04),gr6 ; DAMK1: bits 11:0 match addr 11:0
  176. subcc gr6,gr17,gr0,icc0
  177. beq icc0,#0,__head_no_DCS1
  178. ldi @(gr12,#0x04),gr4 ; DARS1
  179. add gr25,gr6,gr25
  180. addi gr25,#1,gr25
  181. __head_no_DCS1:
  182. ldi @(gr11,#0x8),gr6 ; DAMK2: bits 11:0 match addr 11:0
  183. subcc gr6,gr17,gr0,icc0
  184. beq icc0,#0,__head_no_DCS2
  185. ldi @(gr12,#0x8),gr4 ; DARS2
  186. add gr25,gr6,gr25
  187. addi gr25,#1,gr25
  188. __head_no_DCS2:
  189. ldi @(gr11,#0xc),gr6 ; DAMK3: bits 11:0 match addr 11:0
  190. subcc gr6,gr17,gr0,icc0
  191. beq icc0,#0,__head_no_DCS3
  192. ldi @(gr12,#0xc),gr4 ; DARS3
  193. add gr25,gr6,gr25
  194. addi gr25,#1,gr25
  195. __head_no_DCS3:
  196. slli gr25,#20,gr25 ; shift [11:0] -> [31:20]
  197. bralr
  198. ###############################################################################
  199. #
  200. # set the protection map with the I/DAMPR registers
  201. #
  202. # ENTRY: EXIT:
  203. # GR25 SDRAM size saved
  204. # GR30 LED address saved
  205. #
  206. ###############################################################################
  207. .globl __head_fr555_set_protection
  208. __head_fr555_set_protection:
  209. movsg lr,gr27
  210. sethi.p %hi(0xfff00000),gr11
  211. setlo %lo(0xfff00000),gr11
  212. # set the I/O region protection registers for FR555
  213. sethi.p %hi(__region_IO),gr7
  214. setlo %lo(__region_IO),gr7
  215. ori gr7,#xAMPRx_SS_512Mb|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V,gr5
  216. movgs gr0,iampr15
  217. movgs gr0,iamlr15
  218. movgs gr5,dampr15
  219. movgs gr7,damlr15
  220. # need to tile the remaining IAMPR/DAMPR registers to cover as much of the RAM as possible
  221. # - start with the highest numbered registers
  222. sethi.p %hi(__kernel_image_end),gr8
  223. setlo %lo(__kernel_image_end),gr8
  224. sethi.p %hi(32768),gr4 ; allow for a maximal allocator bitmap
  225. setlo %lo(32768),gr4
  226. add gr8,gr4,gr8
  227. sethi.p %hi(1024*2048-1),gr4 ; round up to nearest 2MiB
  228. setlo %lo(1024*2048-1),gr4
  229. add.p gr8,gr4,gr8
  230. not gr4,gr4
  231. and gr8,gr4,gr8
  232. sethi.p %hi(__page_offset),gr9
  233. setlo %lo(__page_offset),gr9
  234. add gr9,gr25,gr9
  235. # GR8 = base of uncovered RAM
  236. # GR9 = top of uncovered RAM
  237. # GR11 - mask for DAMLR/IAMLR regs
  238. #
  239. call __head_split_region
  240. movgs gr4,iampr14
  241. movgs gr6,iamlr14
  242. movgs gr5,dampr14
  243. movgs gr7,damlr14
  244. call __head_split_region
  245. movgs gr4,iampr13
  246. movgs gr6,iamlr13
  247. movgs gr5,dampr13
  248. movgs gr7,damlr13
  249. call __head_split_region
  250. movgs gr4,iampr12
  251. movgs gr6,iamlr12
  252. movgs gr5,dampr12
  253. movgs gr7,damlr12
  254. call __head_split_region
  255. movgs gr4,iampr11
  256. movgs gr6,iamlr11
  257. movgs gr5,dampr11
  258. movgs gr7,damlr11
  259. call __head_split_region
  260. movgs gr4,iampr10
  261. movgs gr6,iamlr10
  262. movgs gr5,dampr10
  263. movgs gr7,damlr10
  264. call __head_split_region
  265. movgs gr4,iampr9
  266. movgs gr6,iamlr9
  267. movgs gr5,dampr9
  268. movgs gr7,damlr9
  269. call __head_split_region
  270. movgs gr4,iampr8
  271. movgs gr6,iamlr8
  272. movgs gr5,dampr8
  273. movgs gr7,damlr8
  274. call __head_split_region
  275. movgs gr4,iampr7
  276. movgs gr6,iamlr7
  277. movgs gr5,dampr7
  278. movgs gr7,damlr7
  279. call __head_split_region
  280. movgs gr4,iampr6
  281. movgs gr6,iamlr6
  282. movgs gr5,dampr6
  283. movgs gr7,damlr6
  284. call __head_split_region
  285. movgs gr4,iampr5
  286. movgs gr6,iamlr5
  287. movgs gr5,dampr5
  288. movgs gr7,damlr5
  289. call __head_split_region
  290. movgs gr4,iampr4
  291. movgs gr6,iamlr4
  292. movgs gr5,dampr4
  293. movgs gr7,damlr4
  294. call __head_split_region
  295. movgs gr4,iampr3
  296. movgs gr6,iamlr3
  297. movgs gr5,dampr3
  298. movgs gr7,damlr3
  299. call __head_split_region
  300. movgs gr4,iampr2
  301. movgs gr6,iamlr2
  302. movgs gr5,dampr2
  303. movgs gr7,damlr2
  304. call __head_split_region
  305. movgs gr4,iampr1
  306. movgs gr6,iamlr1
  307. movgs gr5,dampr1
  308. movgs gr7,damlr1
  309. # cover kernel core image with kernel-only segment
  310. sethi.p %hi(__page_offset),gr8
  311. setlo %lo(__page_offset),gr8
  312. call __head_split_region
  313. #ifdef CONFIG_PROTECT_KERNEL
  314. ori.p gr4,#xAMPRx_S_KERNEL,gr4
  315. ori gr5,#xAMPRx_S_KERNEL,gr5
  316. #endif
  317. movgs gr4,iampr0
  318. movgs gr6,iamlr0
  319. movgs gr5,dampr0
  320. movgs gr7,damlr0
  321. jmpl @(gr27,gr0)