head.S 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * This file is subject to the terms and conditions of the GNU General Public
  3. * License. See the file "COPYING" in the main directory of this archive
  4. * for more details.
  5. *
  6. * arch/shmedia/boot/compressed/head.S
  7. *
  8. * Copied from
  9. * arch/shmedia/kernel/head.S
  10. * which carried the copyright:
  11. * Copyright (C) 2000, 2001 Paolo Alberelli
  12. *
  13. * Modification for compressed loader:
  14. * Copyright (C) 2002 Stuart Menefy (stuart.menefy@st.com)
  15. */
  16. #include <linux/linkage.h>
  17. #include <asm/registers.h>
  18. #include <asm/cache.h>
  19. #include <asm/mmu_context.h>
  20. /*
  21. * Fixed TLB entries to identity map the beginning of RAM
  22. */
  23. #define MMUIR_TEXT_H 0x0000000000000003 | CONFIG_MEMORY_START
  24. /* Enabled, Shared, ASID 0, Eff. Add. 0xA0000000 */
  25. #define MMUIR_TEXT_L 0x000000000000009a | CONFIG_MEMORY_START
  26. /* 512 Mb, Cacheable (Write-back), execute, Not User, Ph. Add. */
  27. #define MMUDR_CACHED_H 0x0000000000000003 | CONFIG_MEMORY_START
  28. /* Enabled, Shared, ASID 0, Eff. Add. 0xA0000000 */
  29. #define MMUDR_CACHED_L 0x000000000000015a | CONFIG_MEMORY_START
  30. /* 512 Mb, Cacheable (Write-back), read/write, Not User, Ph. Add. */
  31. #define ICCR0_INIT_VAL ICCR0_ON | ICCR0_ICI /* ICE + ICI */
  32. #define ICCR1_INIT_VAL ICCR1_NOLOCK /* No locking */
  33. #if 1
  34. #define OCCR0_INIT_VAL OCCR0_ON | OCCR0_OCI | OCCR0_WB /* OCE + OCI + WB */
  35. #else
  36. #define OCCR0_INIT_VAL OCCR0_OFF
  37. #endif
  38. #define OCCR1_INIT_VAL OCCR1_NOLOCK /* No locking */
  39. .text
  40. .global startup
  41. startup:
  42. /*
  43. * Prevent speculative fetch on device memory due to
  44. * uninitialized target registers.
  45. * This must be executed before the first branch.
  46. */
  47. ptabs/u ZERO, tr0
  48. ptabs/u ZERO, tr1
  49. ptabs/u ZERO, tr2
  50. ptabs/u ZERO, tr3
  51. ptabs/u ZERO, tr4
  52. ptabs/u ZERO, tr5
  53. ptabs/u ZERO, tr6
  54. ptabs/u ZERO, tr7
  55. synci
  56. /*
  57. * Set initial TLB entries for cached and uncached regions.
  58. * Note: PTA/BLINK is PIC code, PTABS/BLINK isn't !
  59. */
  60. /* Clear ITLBs */
  61. pta 1f, tr1
  62. movi ITLB_FIXED, r21
  63. movi ITLB_LAST_VAR_UNRESTRICTED+TLB_STEP, r22
  64. 1: putcfg r21, 0, ZERO /* Clear MMUIR[n].PTEH.V */
  65. addi r21, TLB_STEP, r21
  66. bne r21, r22, tr1
  67. /* Clear DTLBs */
  68. pta 1f, tr1
  69. movi DTLB_FIXED, r21
  70. movi DTLB_LAST_VAR_UNRESTRICTED+TLB_STEP, r22
  71. 1: putcfg r21, 0, ZERO /* Clear MMUDR[n].PTEH.V */
  72. addi r21, TLB_STEP, r21
  73. bne r21, r22, tr1
  74. /* Map one big (512Mb) page for ITLB */
  75. movi ITLB_FIXED, r21
  76. movi MMUIR_TEXT_L, r22 /* PTEL first */
  77. putcfg r21, 1, r22 /* Set MMUIR[0].PTEL */
  78. movi MMUIR_TEXT_H, r22 /* PTEH last */
  79. putcfg r21, 0, r22 /* Set MMUIR[0].PTEH */
  80. /* Map one big CACHED (512Mb) page for DTLB */
  81. movi DTLB_FIXED, r21
  82. movi MMUDR_CACHED_L, r22 /* PTEL first */
  83. putcfg r21, 1, r22 /* Set MMUDR[0].PTEL */
  84. movi MMUDR_CACHED_H, r22 /* PTEH last */
  85. putcfg r21, 0, r22 /* Set MMUDR[0].PTEH */
  86. /* ICache */
  87. movi ICCR_BASE, r21
  88. movi ICCR0_INIT_VAL, r22
  89. movi ICCR1_INIT_VAL, r23
  90. putcfg r21, ICCR_REG0, r22
  91. putcfg r21, ICCR_REG1, r23
  92. synci
  93. /* OCache */
  94. movi OCCR_BASE, r21
  95. movi OCCR0_INIT_VAL, r22
  96. movi OCCR1_INIT_VAL, r23
  97. putcfg r21, OCCR_REG0, r22
  98. putcfg r21, OCCR_REG1, r23
  99. synco
  100. /*
  101. * Enable the MMU.
  102. * From here-on code can be non-PIC.
  103. */
  104. movi SR_HARMLESS | SR_ENABLE_MMU, r22
  105. putcon r22, SSR
  106. movi 1f, r22
  107. putcon r22, SPC
  108. synco
  109. rte /* And now go into the hyperspace ... */
  110. 1: /* ... that's the next instruction ! */
  111. /* Set initial stack pointer */
  112. movi datalabel stack_start, r0
  113. ld.l r0, 0, r15
  114. /*
  115. * Clear bss
  116. */
  117. pt 1f, tr1
  118. movi datalabel __bss_start, r22
  119. movi datalabel _end, r23
  120. 1: st.l r22, 0, ZERO
  121. addi r22, 4, r22
  122. bne r22, r23, tr1
  123. /*
  124. * Decompress the kernel.
  125. */
  126. pt decompress_kernel, tr0
  127. blink tr0, r18
  128. /*
  129. * Disable the MMU.
  130. */
  131. movi SR_HARMLESS, r22
  132. putcon r22, SSR
  133. movi 1f, r22
  134. putcon r22, SPC
  135. synco
  136. rte /* And now go into the hyperspace ... */
  137. 1: /* ... that's the next instruction ! */
  138. /* Jump into the decompressed kernel */
  139. movi datalabel (CONFIG_MEMORY_START + 0x2000)+1, r19
  140. ptabs r19, tr0
  141. blink tr0, r18
  142. /* Shouldn't return here, but just in case, loop forever */
  143. pt 1f, tr0
  144. 1: blink tr0, ZERO