util.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * arch/ppc/boot/common/util.S
  3.  *
  4.  * Useful bootup functions, which are more easily done in asm than C.
  5.  *
  6.  * NOTE:  Be very very careful about the registers you use here.
  7.  * We don't follow any ABI calling convention among the
  8.  * assembler functions that call each other, especially early
  9.  * in the initialization.  Please preserve at least r3 and r4
  10.  * for these early functions, as they often contain information
  11.  * passed from boot roms into the C decompress function.
  12.  *
  13.  * Author: Tom Rini
  14.  *    trini@mvista.com
  15.  * Derived from arch/ppc/boot/prep/head.S (Cort Dougan, many others).
  16.  *
  17.  * Copyright 2001 MontaVista Software Inc.
  18.  *
  19.  * This program is free software; you can redistribute  it and/or modify it
  20.  * under  the terms of  the GNU General  Public License as published by the
  21.  * Free Software Foundation;  either version 2 of the  License, or (at your
  22.  * option) any later version.
  23.  */
  24. #include <asm/processor.h>
  25. #include <asm/cache.h>
  26. #include <asm/ppc_asm.h>
  27. .text
  28. .globl disable_6xx_mmu
  29. disable_6xx_mmu:
  30. /* Establish default MSR value, exception prefix 0xFFF.
  31.  * If necessary, this function must fix up the LR if we
  32.  * return to a different address space once the MMU is
  33.  * disabled.
  34.  */
  35. li r8,MSR_IP|MSR_FP
  36. mtmsr r8
  37. /* Clear BATs */
  38. li r8,0
  39. mtspr DBAT0U,r8
  40. mtspr DBAT0L,r8
  41. mtspr DBAT1U,r8
  42. mtspr DBAT1L,r8
  43. mtspr DBAT2U,r8
  44. mtspr DBAT2L,r8
  45. mtspr DBAT3U,r8
  46. mtspr DBAT3L,r8
  47. mtspr IBAT0U,r8
  48. mtspr IBAT0L,r8
  49. mtspr IBAT1U,r8
  50. mtspr IBAT1L,r8
  51. mtspr IBAT2U,r8
  52. mtspr IBAT2L,r8
  53. mtspr IBAT3U,r8
  54. mtspr IBAT3L,r8
  55. isync
  56. sync
  57. sync
  58. /* Set segment registers */
  59. li r8,16 /* load up segment register values */
  60. mtctr r8 /* for context 0 */
  61. lis r8,0x2000 /* Ku = 1, VSID = 0 */
  62. li r10,0
  63. 3: mtsrin r8,r10
  64. addi r8,r8,0x111 /* increment VSID */
  65. addis r10,r10,0x1000 /* address of next segment */
  66. bdnz 3b
  67. .globl disable_6xx_l1cache
  68. disable_6xx_l1cache:
  69. /* Enable, invalidate and then disable the L1 icache/dcache. */
  70. li r8,0
  71. ori r8,r8,(HID0_ICE|HID0_DCE|HID0_ICFI|HID0_DCI)
  72. mfspr r11,HID0
  73. or r11,r11,r8
  74. andc r10,r11,r8
  75. isync
  76. mtspr HID0,r8
  77. sync
  78. isync
  79. mtspr HID0,r10
  80. sync
  81. isync
  82. blr
  83. .globl _setup_L2CR
  84. _setup_L2CR:
  85. /*
  86.  * We should be skipping this section on CPUs where this results in an
  87.  * illegal instruction.  If not, please send trini@kernel.crashing.org
  88.  * the PVR of your CPU.
  89.  */
  90. /* Invalidate/disable L2 cache */
  91. sync
  92. isync
  93. mfspr r8,L2CR
  94. rlwinm r8,r8,0,1,31
  95. oris r8,r8,0x0020
  96. sync
  97. isync
  98. mtspr L2CR,r8
  99. sync
  100. isync
  101. /* Wait for the invalidation to complete */
  102. 1: mfspr r8,L2CR
  103. rlwinm. r9,r8,0,31,31
  104. bne 1b
  105. rlwinm r8,r8,0,11,9 /* Turn off L2I bit */
  106. sync
  107. isync
  108. mtspr L2CR,r8
  109. sync
  110. isync
  111. blr
  112. /*
  113.  * Delay for a number of microseconds
  114.  * -- Use the BUS timer (assumes 66MHz)
  115.  */
  116. .globl udelay
  117. udelay:
  118. mfspr r4,PVR
  119. srwi r4,r4,16
  120. cmpi 0,r4,1 /* 601 ? */
  121. bne .udelay_not_601
  122. 00: li r0,86 /* Instructions / microsecond? */
  123. mtctr r0
  124. 10: addi r0,r0,0 /* NOP */
  125. bdnz 10b
  126. subic. r3,r3,1
  127. bne 00b
  128. blr
  129. .udelay_not_601:
  130. mulli r4,r3,1000 /* nanoseconds */
  131. addi r4,r4,59
  132. li r5,60
  133. divw r4,r4,r5 /* BUS ticks */
  134. 1: mftbu r5
  135. mftb r6
  136. mftbu r7
  137. cmp 0,r5,r7
  138. bne 1b /* Get [synced] base time */
  139. addc r9,r6,r4 /* Compute end time */
  140. addze r8,r5
  141. 2: mftbu r5
  142. cmp 0,r5,r8
  143. blt 2b
  144. bgt 3f
  145. mftb r6
  146. cmp 0,r6,r9
  147. blt 2b
  148. 3: blr
  149. .globl _put_MSR
  150. _put_MSR:
  151. mtmsr r3
  152. blr
  153. .section ".relocate_code","xa"
  154. /*
  155.  * Flush and enable instruction cache
  156.  * First, flush the data cache in case it was enabled and may be
  157.  * holding instructions for copy back.
  158.  */
  159. _GLOBAL(flush_instruction_cache)
  160. mflr r6
  161. bl flush_data_cache
  162. #ifdef CONFIG_8xx
  163. lis r3, IDC_INVALL@h
  164. mtspr IC_CST, r3
  165. lis r3, IDC_ENABLE@h
  166. mtspr IC_CST, r3
  167. lis r3, IDC_DISABLE@h
  168. mtspr DC_CST, r3
  169. #elif CONFIG_4xx
  170. lis r3,start@h # r9 = &_start
  171. lis r4,_etext@ha
  172. addi r4,r4,_etext@l # r8 = &_etext
  173. 1: dcbf r0,r3 # Flush the data cache
  174. icbi r0,r3 # Invalidate the instruction cache
  175. addi r3,r3,0x10 # Increment by one cache line
  176. cmplwi cr0,r3,r4 # Are we at the end yet?
  177. blt 1b # No, keep flushing and invalidating
  178. #else
  179. /* Enable, invalidate and then disable the L1 icache/dcache. */
  180. li r3,0
  181. ori r3,r3,(HID0_ICE|HID0_DCE|HID0_ICFI|HID0_DCI)
  182. mfspr r4,HID0
  183. or r5,r4,r3
  184. isync
  185. mtspr HID0,r5
  186. sync
  187. isync
  188. ori r5,r4,HID0_ICE /* Enable cache */
  189. mtspr HID0,r5
  190. sync
  191. isync
  192. #endif
  193. mtlr r6
  194. blr
  195. #define NUM_CACHE_LINES 128*8
  196. #define cache_flush_buffer 0x1000
  197. /*
  198.  * Flush data cache
  199.  * Do this by just reading lots of stuff into the cache.
  200.  */
  201. _GLOBAL(flush_data_cache)
  202. lis r3,cache_flush_buffer@h
  203. ori r3,r3,cache_flush_buffer@l
  204. li r4,NUM_CACHE_LINES
  205. mtctr r4
  206. 00: lwz r4,0(r3)
  207. addi r3,r3,L1_CACHE_BYTES /* Next line, please */
  208. bdnz 00b
  209. 10: blr
  210. .previous