head-mmu-fr451.S 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. /* head-mmu-fr451.S: FR451 mmu-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/mem-layout.h>
  16. #include <asm/spr-regs.h>
  17. #include <asm/mb86943a.h>
  18. #include "head.inc"
  19. #define __400_DBR0 0xfe000e00
  20. #define __400_DBR1 0xfe000e08
  21. #define __400_DBR2 0xfe000e10
  22. #define __400_DBR3 0xfe000e18
  23. #define __400_DAM0 0xfe000f00
  24. #define __400_DAM1 0xfe000f08
  25. #define __400_DAM2 0xfe000f10
  26. #define __400_DAM3 0xfe000f18
  27. #define __400_LGCR 0xfe000010
  28. #define __400_LCR 0xfe000100
  29. #define __400_LSBR 0xfe000c00
  30. .section .text.init,"ax"
  31. .balign 4
  32. ###############################################################################
  33. #
  34. # describe the position and layout of the SDRAM controller registers
  35. #
  36. # ENTRY: EXIT:
  37. # GR5 - cacheline size
  38. # GR11 - displacement of 2nd SDRAM addr reg from GR14
  39. # GR12 - displacement of 3rd SDRAM addr reg from GR14
  40. # GR13 - displacement of 4th SDRAM addr reg from GR14
  41. # GR14 - address of 1st SDRAM addr reg
  42. # GR15 - amount to shift address by to match SDRAM addr reg
  43. # GR26 &__head_reference [saved]
  44. # GR30 LED address [saved]
  45. # CC0 - T if DBR0 is present
  46. # CC1 - T if DBR1 is present
  47. # CC2 - T if DBR2 is present
  48. # CC3 - T if DBR3 is present
  49. #
  50. ###############################################################################
  51. .globl __head_fr451_describe_sdram
  52. __head_fr451_describe_sdram:
  53. sethi.p %hi(__400_DBR0),gr14
  54. setlo %lo(__400_DBR0),gr14
  55. setlos.p #__400_DBR1-__400_DBR0,gr11
  56. setlos #__400_DBR2-__400_DBR0,gr12
  57. setlos.p #__400_DBR3-__400_DBR0,gr13
  58. setlos #32,gr5 ; cacheline size
  59. setlos.p #0,gr15 ; amount to shift addr reg by
  60. setlos #0x00ff,gr4
  61. movgs gr4,cccr ; extant DARS/DAMK regs
  62. bralr
  63. ###############################################################################
  64. #
  65. # rearrange the bus controller registers
  66. #
  67. # ENTRY: EXIT:
  68. # GR26 &__head_reference [saved]
  69. # GR30 LED address revised LED address
  70. #
  71. ###############################################################################
  72. .globl __head_fr451_set_busctl
  73. __head_fr451_set_busctl:
  74. sethi.p %hi(__400_LGCR),gr4
  75. setlo %lo(__400_LGCR),gr4
  76. sethi.p %hi(__400_LSBR),gr10
  77. setlo %lo(__400_LSBR),gr10
  78. sethi.p %hi(__400_LCR),gr11
  79. setlo %lo(__400_LCR),gr11
  80. # set the bus controller
  81. ldi @(gr4,#0),gr5
  82. ori gr5,#0xff,gr5 ; make sure all chip-selects are enabled
  83. sti gr5,@(gr4,#0)
  84. sethi.p %hi(__region_CS1),gr4
  85. setlo %lo(__region_CS1),gr4
  86. sethi.p %hi(__region_CS1_M),gr5
  87. setlo %lo(__region_CS1_M),gr5
  88. sethi.p %hi(__region_CS1_C),gr6
  89. setlo %lo(__region_CS1_C),gr6
  90. sti gr4,@(gr10,#1*0x08)
  91. sti gr5,@(gr10,#1*0x08+0x100)
  92. sti gr6,@(gr11,#1*0x08)
  93. sethi.p %hi(__region_CS2),gr4
  94. setlo %lo(__region_CS2),gr4
  95. sethi.p %hi(__region_CS2_M),gr5
  96. setlo %lo(__region_CS2_M),gr5
  97. sethi.p %hi(__region_CS2_C),gr6
  98. setlo %lo(__region_CS2_C),gr6
  99. sti gr4,@(gr10,#2*0x08)
  100. sti gr5,@(gr10,#2*0x08+0x100)
  101. sti gr6,@(gr11,#2*0x08)
  102. sethi.p %hi(__region_CS3),gr4
  103. setlo %lo(__region_CS3),gr4
  104. sethi.p %hi(__region_CS3_M),gr5
  105. setlo %lo(__region_CS3_M),gr5
  106. sethi.p %hi(__region_CS3_C),gr6
  107. setlo %lo(__region_CS3_C),gr6
  108. sti gr4,@(gr10,#3*0x08)
  109. sti gr5,@(gr10,#3*0x08+0x100)
  110. sti gr6,@(gr11,#3*0x08)
  111. sethi.p %hi(__region_CS4),gr4
  112. setlo %lo(__region_CS4),gr4
  113. sethi.p %hi(__region_CS4_M),gr5
  114. setlo %lo(__region_CS4_M),gr5
  115. sethi.p %hi(__region_CS4_C),gr6
  116. setlo %lo(__region_CS4_C),gr6
  117. sti gr4,@(gr10,#4*0x08)
  118. sti gr5,@(gr10,#4*0x08+0x100)
  119. sti gr6,@(gr11,#4*0x08)
  120. sethi.p %hi(__region_CS5),gr4
  121. setlo %lo(__region_CS5),gr4
  122. sethi.p %hi(__region_CS5_M),gr5
  123. setlo %lo(__region_CS5_M),gr5
  124. sethi.p %hi(__region_CS5_C),gr6
  125. setlo %lo(__region_CS5_C),gr6
  126. sti gr4,@(gr10,#5*0x08)
  127. sti gr5,@(gr10,#5*0x08+0x100)
  128. sti gr6,@(gr11,#5*0x08)
  129. sethi.p %hi(__region_CS6),gr4
  130. setlo %lo(__region_CS6),gr4
  131. sethi.p %hi(__region_CS6_M),gr5
  132. setlo %lo(__region_CS6_M),gr5
  133. sethi.p %hi(__region_CS6_C),gr6
  134. setlo %lo(__region_CS6_C),gr6
  135. sti gr4,@(gr10,#6*0x08)
  136. sti gr5,@(gr10,#6*0x08+0x100)
  137. sti gr6,@(gr11,#6*0x08)
  138. sethi.p %hi(__region_CS7),gr4
  139. setlo %lo(__region_CS7),gr4
  140. sethi.p %hi(__region_CS7_M),gr5
  141. setlo %lo(__region_CS7_M),gr5
  142. sethi.p %hi(__region_CS7_C),gr6
  143. setlo %lo(__region_CS7_C),gr6
  144. sti gr4,@(gr10,#7*0x08)
  145. sti gr5,@(gr10,#7*0x08+0x100)
  146. sti gr6,@(gr11,#7*0x08)
  147. membar
  148. bar
  149. # adjust LED bank address
  150. #ifdef CONFIG_MB93091_VDK
  151. sethi.p %hi(__region_CS2 + 0x01200004),gr30
  152. setlo %lo(__region_CS2 + 0x01200004),gr30
  153. #endif
  154. bralr
  155. ###############################################################################
  156. #
  157. # determine the total SDRAM size
  158. #
  159. # ENTRY: EXIT:
  160. # GR25 - SDRAM size
  161. # GR26 &__head_reference [saved]
  162. # GR30 LED address [saved]
  163. #
  164. ###############################################################################
  165. .globl __head_fr451_survey_sdram
  166. __head_fr451_survey_sdram:
  167. sethi.p %hi(__400_DAM0),gr11
  168. setlo %lo(__400_DAM0),gr11
  169. sethi.p %hi(__400_DBR0),gr12
  170. setlo %lo(__400_DBR0),gr12
  171. sethi.p %hi(0xfe000000),gr17 ; unused SDRAM DBR value
  172. setlo %lo(0xfe000000),gr17
  173. setlos #0,gr25
  174. ldi @(gr12,#0x00),gr4 ; DAR0
  175. subcc gr4,gr17,gr0,icc0
  176. beq icc0,#0,__head_no_DCS0
  177. ldi @(gr11,#0x00),gr6 ; DAM0: bits 31:20 match addr 31:20
  178. add gr25,gr6,gr25
  179. addi gr25,#1,gr25
  180. __head_no_DCS0:
  181. ldi @(gr12,#0x08),gr4 ; DAR1
  182. subcc gr4,gr17,gr0,icc0
  183. beq icc0,#0,__head_no_DCS1
  184. ldi @(gr11,#0x08),gr6 ; DAM1: bits 31:20 match addr 31:20
  185. add gr25,gr6,gr25
  186. addi gr25,#1,gr25
  187. __head_no_DCS1:
  188. ldi @(gr12,#0x10),gr4 ; DAR2
  189. subcc gr4,gr17,gr0,icc0
  190. beq icc0,#0,__head_no_DCS2
  191. ldi @(gr11,#0x10),gr6 ; DAM2: bits 31:20 match addr 31:20
  192. add gr25,gr6,gr25
  193. addi gr25,#1,gr25
  194. __head_no_DCS2:
  195. ldi @(gr12,#0x18),gr4 ; DAR3
  196. subcc gr4,gr17,gr0,icc0
  197. beq icc0,#0,__head_no_DCS3
  198. ldi @(gr11,#0x18),gr6 ; DAM3: bits 31:20 match addr 31:20
  199. add gr25,gr6,gr25
  200. addi gr25,#1,gr25
  201. __head_no_DCS3:
  202. bralr
  203. ###############################################################################
  204. #
  205. # set the protection map with the I/DAMPR registers
  206. #
  207. # ENTRY: EXIT:
  208. # GR25 SDRAM size [saved]
  209. # GR26 &__head_reference [saved]
  210. # GR30 LED address [saved]
  211. #
  212. #
  213. # Using this map:
  214. # REGISTERS ADDRESS RANGE VIEW
  215. # =============== ====================== ===============================
  216. # IAMPR0/DAMPR0 0xC0000000-0xCFFFFFFF Cached kernel RAM Window
  217. # DAMPR11 0xE0000000-0xFFFFFFFF Uncached I/O
  218. #
  219. ###############################################################################
  220. .globl __head_fr451_set_protection
  221. __head_fr451_set_protection:
  222. movsg lr,gr27
  223. # set the I/O region protection registers for FR451 in MMU mode
  224. #define PGPROT_IO xAMPRx_L|xAMPRx_M|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V
  225. sethi.p %hi(__region_IO),gr5
  226. setlo %lo(__region_IO),gr5
  227. setlos #PGPROT_IO|xAMPRx_SS_512Mb,gr4
  228. or gr4,gr5,gr4
  229. movgs gr5,damlr11 ; General I/O tile
  230. movgs gr4,dampr11
  231. # need to open a window onto at least part of the RAM for the kernel's use
  232. sethi.p %hi(__sdram_base),gr8
  233. setlo %lo(__sdram_base),gr8 ; physical address
  234. sethi.p %hi(__page_offset),gr9
  235. setlo %lo(__page_offset),gr9 ; virtual address
  236. setlos #xAMPRx_L|xAMPRx_M|xAMPRx_SS_256Mb|xAMPRx_S_KERNEL|xAMPRx_V,gr11
  237. or gr8,gr11,gr8
  238. movgs gr9,iamlr0 ; mapped from real address 0
  239. movgs gr8,iampr0 ; cached kernel memory at 0xC0000000
  240. movgs gr9,damlr0
  241. movgs gr8,dampr0
  242. # set a temporary mapping for the kernel running at address 0 until we've turned on the MMU
  243. sethi.p %hi(__sdram_base),gr9
  244. setlo %lo(__sdram_base),gr9 ; virtual address
  245. and.p gr4,gr11,gr4
  246. and gr5,gr11,gr5
  247. or.p gr4,gr11,gr4
  248. or gr5,gr11,gr5
  249. movgs gr9,iamlr1 ; mapped from real address 0
  250. movgs gr8,iampr1 ; cached kernel memory at 0x00000000
  251. movgs gr9,damlr1
  252. movgs gr8,dampr1
  253. # we use DAMR2-10 for kmap_atomic(), cache flush and TLB management
  254. # since the DAMLR regs are not going to change, we can set them now
  255. # also set up IAMLR2 to the same as DAMLR5
  256. sethi.p %hi(KMAP_ATOMIC_PRIMARY_FRAME),gr4
  257. setlo %lo(KMAP_ATOMIC_PRIMARY_FRAME),gr4
  258. sethi.p %hi(PAGE_SIZE),gr5
  259. setlo %lo(PAGE_SIZE),gr5
  260. movgs gr4,damlr2
  261. movgs gr4,iamlr2
  262. add gr4,gr5,gr4
  263. movgs gr4,damlr3
  264. add gr4,gr5,gr4
  265. movgs gr4,damlr4
  266. add gr4,gr5,gr4
  267. movgs gr4,damlr5
  268. add gr4,gr5,gr4
  269. movgs gr4,damlr6
  270. add gr4,gr5,gr4
  271. movgs gr4,damlr7
  272. add gr4,gr5,gr4
  273. movgs gr4,damlr8
  274. add gr4,gr5,gr4
  275. movgs gr4,damlr9
  276. add gr4,gr5,gr4
  277. movgs gr4,damlr10
  278. movgs gr0,dampr2
  279. movgs gr0,dampr4
  280. movgs gr0,dampr5
  281. movgs gr0,dampr6
  282. movgs gr0,dampr7
  283. movgs gr0,dampr8
  284. movgs gr0,dampr9
  285. movgs gr0,dampr10
  286. movgs gr0,iamlr3
  287. movgs gr0,iamlr4
  288. movgs gr0,iamlr5
  289. movgs gr0,iamlr6
  290. movgs gr0,iamlr7
  291. movgs gr0,iampr2
  292. movgs gr0,iampr3
  293. movgs gr0,iampr4
  294. movgs gr0,iampr5
  295. movgs gr0,iampr6
  296. movgs gr0,iampr7
  297. # start in TLB context 0 with the swapper's page tables
  298. movgs gr0,cxnr
  299. sethi.p %hi(swapper_pg_dir),gr4
  300. setlo %lo(swapper_pg_dir),gr4
  301. sethi.p %hi(__page_offset),gr5
  302. setlo %lo(__page_offset),gr5
  303. sub gr4,gr5,gr4
  304. movgs gr4,ttbr
  305. setlos #xAMPRx_L|xAMPRx_M|xAMPRx_SS_16Kb|xAMPRx_S|xAMPRx_C|xAMPRx_V,gr5
  306. or gr4,gr5,gr4
  307. movgs gr4,dampr3
  308. # the FR451 also has an extra trap base register
  309. movsg tbr,gr4
  310. movgs gr4,btbr
  311. LEDS 0x3300
  312. jmpl @(gr27,gr0)
  313. ###############################################################################
  314. #
  315. # finish setting up the protection registers
  316. #
  317. ###############################################################################
  318. .globl __head_fr451_finalise_protection
  319. __head_fr451_finalise_protection:
  320. # turn on the timers as appropriate
  321. movgs gr0,timerh
  322. movgs gr0,timerl
  323. movgs gr0,timerd
  324. movsg hsr0,gr4
  325. sethi.p %hi(HSR0_ETMI),gr5
  326. setlo %lo(HSR0_ETMI),gr5
  327. or gr4,gr5,gr4
  328. movgs gr4,hsr0
  329. # clear the TLB entry cache
  330. movgs gr0,iamlr1
  331. movgs gr0,iampr1
  332. movgs gr0,damlr1
  333. movgs gr0,dampr1
  334. # clear the PGE cache
  335. sethi.p %hi(__flush_tlb_all),gr4
  336. setlo %lo(__flush_tlb_all),gr4
  337. jmpl @(gr4,gr0)