head-uc-fr451.S 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* head-uc-fr451.S: FR451 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 __400_DBR0 0xfe000e00
  19. #define __400_DBR1 0xfe000e08
  20. #define __400_DBR2 0xfe000e10
  21. #define __400_DBR3 0xfe000e18
  22. #define __400_DAM0 0xfe000f00
  23. #define __400_DAM1 0xfe000f08
  24. #define __400_DAM2 0xfe000f10
  25. #define __400_DAM3 0xfe000f18
  26. #define __400_LGCR 0xfe000010
  27. #define __400_LCR 0xfe000100
  28. #define __400_LSBR 0xfe000c00
  29. .section .text.init,"ax"
  30. .balign 4
  31. ###############################################################################
  32. #
  33. # set the protection map with the I/DAMPR registers
  34. #
  35. # ENTRY: EXIT:
  36. # GR25 SDRAM size [saved]
  37. # GR26 &__head_reference [saved]
  38. # GR30 LED address [saved]
  39. #
  40. ###############################################################################
  41. .globl __head_fr451_set_protection
  42. __head_fr451_set_protection:
  43. movsg lr,gr27
  44. movgs gr0,dampr10
  45. movgs gr0,damlr10
  46. movgs gr0,dampr9
  47. movgs gr0,damlr9
  48. movgs gr0,dampr8
  49. movgs gr0,damlr8
  50. # set the I/O region protection registers for FR401/3/5
  51. sethi.p %hi(__region_IO),gr5
  52. setlo %lo(__region_IO),gr5
  53. sethi.p %hi(0x1fffffff),gr7
  54. setlo %lo(0x1fffffff),gr7
  55. ori gr5,#xAMPRx_SS_512Mb|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V,gr5
  56. movgs gr5,dampr11 ; General I/O tile
  57. movgs gr7,damlr11
  58. # need to tile the remaining IAMPR/DAMPR registers to cover as much of the RAM as possible
  59. # - start with the highest numbered registers
  60. sethi.p %hi(__kernel_image_end),gr8
  61. setlo %lo(__kernel_image_end),gr8
  62. sethi.p %hi(32768),gr4 ; allow for a maximal allocator bitmap
  63. setlo %lo(32768),gr4
  64. add gr8,gr4,gr8
  65. sethi.p %hi(1024*2048-1),gr4 ; round up to nearest 2MiB
  66. setlo %lo(1024*2048-1),gr4
  67. add.p gr8,gr4,gr8
  68. not gr4,gr4
  69. and gr8,gr4,gr8
  70. sethi.p %hi(__page_offset),gr9
  71. setlo %lo(__page_offset),gr9
  72. add gr9,gr25,gr9
  73. sethi.p %hi(0xffffc000),gr11
  74. setlo %lo(0xffffc000),gr11
  75. # GR8 = base of uncovered RAM
  76. # GR9 = top of uncovered RAM
  77. # GR11 = xAMLR mask
  78. LEDS 0x3317
  79. call __head_split_region
  80. movgs gr4,iampr7
  81. movgs gr6,iamlr7
  82. movgs gr5,dampr7
  83. movgs gr7,damlr7
  84. LEDS 0x3316
  85. call __head_split_region
  86. movgs gr4,iampr6
  87. movgs gr6,iamlr6
  88. movgs gr5,dampr6
  89. movgs gr7,damlr6
  90. LEDS 0x3315
  91. call __head_split_region
  92. movgs gr4,iampr5
  93. movgs gr6,iamlr5
  94. movgs gr5,dampr5
  95. movgs gr7,damlr5
  96. LEDS 0x3314
  97. call __head_split_region
  98. movgs gr4,iampr4
  99. movgs gr6,iamlr4
  100. movgs gr5,dampr4
  101. movgs gr7,damlr4
  102. LEDS 0x3313
  103. call __head_split_region
  104. movgs gr4,iampr3
  105. movgs gr6,iamlr3
  106. movgs gr5,dampr3
  107. movgs gr7,damlr3
  108. LEDS 0x3312
  109. call __head_split_region
  110. movgs gr4,iampr2
  111. movgs gr6,iamlr2
  112. movgs gr5,dampr2
  113. movgs gr7,damlr2
  114. LEDS 0x3311
  115. call __head_split_region
  116. movgs gr4,iampr1
  117. movgs gr6,iamlr1
  118. movgs gr5,dampr1
  119. movgs gr7,damlr1
  120. # cover kernel core image with kernel-only segment
  121. LEDS 0x3310
  122. sethi.p %hi(__page_offset),gr8
  123. setlo %lo(__page_offset),gr8
  124. call __head_split_region
  125. #ifdef CONFIG_PROTECT_KERNEL
  126. ori.p gr4,#xAMPRx_S_KERNEL,gr4
  127. ori gr5,#xAMPRx_S_KERNEL,gr5
  128. #endif
  129. movgs gr4,iampr0
  130. movgs gr6,iamlr0
  131. movgs gr5,dampr0
  132. movgs gr7,damlr0
  133. # start in TLB context 0 with no page tables
  134. movgs gr0,cxnr
  135. movgs gr0,ttbr
  136. # the FR451 also has an extra trap base register
  137. movsg tbr,gr4
  138. movgs gr4,btbr
  139. # turn on the timers as appropriate
  140. movgs gr0,timerh
  141. movgs gr0,timerl
  142. movgs gr0,timerd
  143. movsg hsr0,gr4
  144. sethi.p %hi(HSR0_ETMI),gr5
  145. setlo %lo(HSR0_ETMI),gr5
  146. or gr4,gr5,gr4
  147. movgs gr4,hsr0
  148. LEDS 0x3300
  149. jmpl @(gr27,gr0)