Top 10.4 KB
Newer Older
Jeffrey Lee's avatar
Jeffrey Lee committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
; Copyright 2009 Castle Technology Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
15 16 17 18

        GET     Hdr:ListOpts
        GET     Hdr:Macros
        GET     Hdr:System
Jeffrey Lee's avatar
Jeffrey Lee committed
19
        GET     Hdr:Machine.<Machine>
20
        GET     Hdr:HALSize.<HALSize>
Jeffrey Lee's avatar
Jeffrey Lee committed
21

22
        GET     Hdr:MEMM.VMSAv6
Jeffrey Lee's avatar
Jeffrey Lee committed
23

24 25 26
        GET     Hdr:Proc
        GET     Hdr:OSEntries
        GET     Hdr:HALEntries
27
        GET     Hdr:VIDCList
28

Jeffrey Lee's avatar
Jeffrey Lee committed
29
        GET     hdr.omap3530
30
        GET     hdr.StaticWS
Jeffrey Lee's avatar
Jeffrey Lee committed
31 32 33
        GET     hdr.UART
        GET     hdr.Post
        GET     hdr.SDRC
34
        GET     hdr.GPIO
Jeffrey Lee's avatar
Jeffrey Lee committed
35

36 37
        AREA    |!!!ROMStart|, CODE, READONLY, PIC

Jeffrey Lee's avatar
Jeffrey Lee committed
38
        IMPORT  rom_checkedout_ok
39
        EXPORT  HAL_Base
Jeffrey Lee's avatar
Jeffrey Lee committed
40
        IMPORT  HAL_DebugTX
41 42 43 44 45 46
        IMPORT  DebugHALPrint
        IMPORT  DebugHALPrintReg

; Using the DMA controller to relocate the ROM image is much faster than doing it with the CPU
             GBLL Use_DMA_Copy
Use_DMA_Copy SETL {TRUE}
47

48 49 50 51 52 53
        MACRO
        CallOSM $entry, $reg
        LDR     ip, [v8, #$entry*4]
        MOV     lr, pc
        ADD     pc, v8, ip
        MEND
54

55 56 57 58 59 60 61 62 63
        ; Jump table used to select board config on startup
        ; See board.s for ordering of configs, and therefore what entry corresponds to what board
HAL_Base
        BL      selectconfig
        BL      selectconfig
        BL      selectconfig
        BL      selectconfig
        BL      selectconfig
        BL      selectconfig
64
        BL      selectconfig
65
JumpTableEnd
66 67
        ASSERT  . - HAL_Base < 0x60
        %       0x60 - (. - HAL_Base)
68
        DCD     0 ; Empty - was ROMsize
69
        B       selectconfig_linux ; offset &64 - for booting as a uImage/Linux kernel. Uses Linux machine type ID to select board config.
70 71

        ENTRY
72 73 74 75 76 77 78
selectconfig
        ; Get pointer to board config
        ADR     v1, HAL_Base+4
        SUB     v1, lr, v1
        ADR     a1, BoardConfigTable
        MOV     a2, #BoardConfig_Size>>2
        MLA     v1, a2, v1, a1
79 80
foundconfig
        ; v1 = board config
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
        MSR     CPSR_c, #F32_bit+I32_bit+SVC32_mode ; Get into SVC mode now, so we can write to sb without much fear of losing it (we may have been in FIQ)
 [ Debug
        ; Announce ourselves if debug
        ADR     v2, HelloWorld
        MOV     sb, v1
10      LDRB    a1, [v2], #1
        CMP     a1, #0
        ADRNE   lr, %BT10
        BNE     HAL_DebugTX
        ADD     v2, v1, #BoardConfig_Name
10      LDRB    a1, [v2], #1
        CMP     a1, #0
        ADRNE   lr, %BT10
        BNE     HAL_DebugTX
        MOV     a1, #13
        BL      HAL_DebugTX
        MOV     a1, #10
        BL      HAL_DebugTX
 ]
        ; Now copy the config to SRAM
        ; We'll assume that the L3 interconnect has been correctly configured to give us access
        LDR     sb, =IntSRAM_Base
        MOV     a2, #BoardConfig_Size
10      SUBS    a2, a2, #4
        LDR     a3, [v1, a2]
        STR     a3, [sb, a2]
        BGT     %BT10
108 109 110 111 112 113 114 115 116 117 118 119
 [ DebugTiming
        ADD     sp, sb, #32768 ; Temp stack for debug code
        ; Ensure debug UART FIFO is enabled (assuming UART 3)
        MOV     a1, #0
        STRB    a1, UARTFCRSoftCopy+2
        MOV     a1, #2
        STRB    a1, [sb, #BoardConfig_NumUART] ; Hide UART from RO
        MOV     a2, #1
        IMPORT  HAL_UARTFIFOEnable
        BL      HAL_UARTFIFOEnable
        DebugTimeNoMMU a1, "@ "
 ]
120
        ; Now do common init
Jeffrey Lee's avatar
Jeffrey Lee committed
121 122
        B       restart

123 124 125 126
 [ Debug
HelloWorld DCB "OMAP3 HAL init",13,10,"Board config=",0
        ALIGN
 ]
127

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
        ; Entry point for masquerading as a Linux kernel
        ; r0=0
        ; r1=machine type ID
        ; r2=ptr to tag list (linux/include/asm/setup.h)
selectconfig_linux
        ADR     v1, BoardConfigTable_End-BoardConfig_Size
        ADR     a3, BoardConfigTable
10
        LDR     a1, [v1, #BoardConfig_MachID]
        CMP     a1, a2
        CMPNE   v1, a3 ; If we can't find a config, abort and use default? (i.e. beagleboard)
        BEQ     foundconfig
        SUB     v1, v1, #BoardConfig_Size
        B       %BT10

Jeffrey Lee's avatar
Jeffrey Lee committed
143
        LTORG
144 145
        GET     board.s
        ASSERT  ((JumpTableEnd-HAL_Base)/4) >= (BoardConfigTable_End-BoardConfigTable)/BoardConfig_Size ; If this fires, we need a bigger jump table!
Jeffrey Lee's avatar
Jeffrey Lee committed
146 147

; ------------------------------------------------------------------------------
148 149
; Perform some Cortex-A8 specific CPU setup
; Then start looking for RAM
150
; In: sb = board config ptr
Jeffrey Lee's avatar
Jeffrey Lee committed
151
restart
152
        DebugChar a3,a4,48
Jeffrey Lee's avatar
Jeffrey Lee committed
153
        MSR     CPSR_c, #F32_bit+I32_bit+SVC32_mode
154
        DebugChar a3,a4,49
Jeffrey Lee's avatar
Jeffrey Lee committed
155

156
        ADRL    v1, HAL_Base + OSROM_HALSize    ; v1 -> RISC OS image
Jeffrey Lee's avatar
Jeffrey Lee committed
157 158 159 160

        LDR     v8, [v1, #OSHdr_Entries]
        ADD     v8, v8, v1                      ; v8 -> RISC OS entry table

Jeffrey Lee's avatar
Jeffrey Lee committed
161 162 163 164
        ; Ensure CPU is set up
        MOV     a1, #0
        CallOSM OS_InitARM
        DebugChar a3,a4,50
Jeffrey Lee's avatar
Jeffrey Lee committed
165

166 167 168 169
        ; Initialise RAM
        BL      init_ram

        ; The first 4K of the first registered block of RAM is used by RISC OS's init code, and also contains the stack
Jeffrey Lee's avatar
Jeffrey Lee committed
170
        ; To keep things simple and safe, we'll relocate the HAL and OS image to the top end of RAM
171
        ; Although with the beagleboard we know we'll be booted from RAM, this code has been written so that it should work if running from ROM
Jeffrey Lee's avatar
Jeffrey Lee committed
172 173 174 175 176 177

        ; First, identify the top end of RAM
        ; Then check if we intersect it
        ; If we do, first copy ourselves down
        ; Then copy ourselves up

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
 [ Use_DMA_Copy
        ; We'll use DMA for extra speed, so start by resetting the DMA controller
        LDR     v5, =L4_sDMA
        MOV     v1, #2
        STR     v1, [v5, #DMA4_OCP_SYSCONFIG]
5
        LDR     v1, [v5, #DMA4_SYSSTATUS]
        TST     v1, #1
        BEQ     %BT5
        ; Set a sensible FIFO budget (as per SDMACReset)
        LDR     a2, =&100080
        STR     a2, [v5, #DMA4_GCR]
        ; Configure channel 0 for the right settings
        ADD     v5, v5, #DMA4_i
        LDR     v1, [v5, #DMA4_CLNK_CTRLi]
        BIC     v1, v1, #&8000 ; Disable channel linking
        STR     v1, [v5, #DMA4_CLNK_CTRLi]
        MOV     v1, #1<<4
        STR     v1, [v5, #DMA4_CICRi] ; frame end interrupt enabled
        LDR     v1, =&2E1C2 ; 32bit elements, 64 byte bursts with packing, last write non-posted
        STR     v1, [v5, #DMA4_CSDPi]
        MOV     v1, #1
        STR     v1, [v5, #DMA4_CFNi] ; 1 frame
 ]

Jeffrey Lee's avatar
Jeffrey Lee committed
203
relocate_code
204
        DebugChar a1,a2,66
Jeffrey Lee's avatar
Jeffrey Lee committed
205
        BL      get_end_of_ram
206
        DebugChar v1,v2,67
Jeffrey Lee's avatar
Jeffrey Lee committed
207 208

        ; How big are we?
209
        ADRL    v1, HAL_Base + OSROM_HALSize
Jeffrey Lee's avatar
Jeffrey Lee committed
210
        LDR     v2, [v1, #OSHdr_ImageSize]
211 212 213
        LDR     lr, [v1, #OSHdr_Flags]
        TST     lr, #OSHdrFlag_SupportsCompression
        LDRNE   lr, [v1, #OSHdr_CompressedSize]
214
        MOVEQ   lr, v2
215 216
        SUB     v1, v1, #OSROM_HALSize ; Start of HAL
        ADD     v2, v2, #OSROM_HALSize ; Size of HAL+OS
217 218
        ADD     lr, lr, #OSROM_HALSize ; Size of compressed HAL+OS
        ADD     v3, v1, lr ; End of OS
Jeffrey Lee's avatar
Jeffrey Lee committed
219 220 221 222
        MOV     v4, a1 ; End of RAM
        SUB     v5, v4, v2 ; New start address of HAL
        CMP     v1, v5
        BEQ     %FT10 ; No copy needed
223
        CMP     v1, v4
224
        BHI     %FT20 ; We're in some ROM above RAM. OK to continue with copy.
Jeffrey Lee's avatar
Jeffrey Lee committed
225
        CMP     v3, v5
226
        BLS     %FT20 ; We're in some ROM/RAM below our copy destination. OK to continue with copy.
Jeffrey Lee's avatar
Jeffrey Lee committed
227
        ; Else we currently overlap the area we want to copy ourselves into.
228
        SUB     v5, v1, lr ; Copy the HAL+OS to just before itself. TODO - This will fail with big ROMs (128MB beagleboard with >42MB ROM size)
Jeffrey Lee's avatar
Jeffrey Lee committed
229
20
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
 [ Use_DMA_Copy
        ; Transfer everything in one DMA frame; this gives us a max ROM size of 64MB-4 bytes
        LDR     a3, =L4_sDMA+DMA4_i
        LDR     a1, [a3, #DMA4_CSRi]
        STR     a1, [a3, #DMA4_CSRi] ; Clear status register
        MOV     a1, lr, LSR #2
        STR     a1, [a3, #DMA4_CENi]
        STR     v5, [a3, #DMA4_CDSAi]
        STR     v1, [a3, #DMA4_CSSAi]
        LDR     a1, =&805080 ; Enable channel with post-increment source & destination, prefetch
        STR     a1, [a3, #DMA4_CCRi]
        ; Wait for copy to complete
30
        LDR     a1, [a3, #DMA4_CSRi]
        TST     a1, #1<<4
        BEQ     %BT30
        ; Make doubly sure that it's finished by checking WR_ACTIVE/RD_ACTIVE
40
        LDR     a1, [a3, #DMA4_CCRi]
        TST     a1, #&600
        BNE     %BT40
 |
Jeffrey Lee's avatar
Jeffrey Lee committed
252 253
        MOV     a1, v5
        MOV     a2, v1 ; Copy source
254
        MOV     a3, lr
Jeffrey Lee's avatar
Jeffrey Lee committed
255 256 257
30
        LDR     a4, [a2], #4
        SUBS    a3, a3, #4
258
        STR     a4, [a1], #4
Jeffrey Lee's avatar
Jeffrey Lee committed
259
        BGT     %BT30
260
 ]
261
        ; Invalidate I-cache, branch predictors
Jeffrey Lee's avatar
Jeffrey Lee committed
262
        MOV     a1, #0
263
        MCR     p15, 0, a1, c7, c5, 0
264
        MCR     p15, 0, a1, c7, c5, 6
Robert Sprowson's avatar
Robert Sprowson committed
265 266
        DSB     SY ; Wait for I-cache invalidation to complete
        ISB     SY ; Wait for branch predictor invalidation to complete?
267
        DebugChar a1,a2,68
Jeffrey Lee's avatar
Jeffrey Lee committed
268 269 270 271 272 273 274 275 276 277 278
        ; Jump to our new copy
        ADR     a1, relocate_code ; Keep things simple by just running through the same code again
        SUB     a2, v5, v1
        ADD     a1, a1, a2 ; relocate our branch target
        ADD     v8, v8, a2 ; Update OS entry table ptr
        MOV     pc, a1
10
        ; Copy completed OK.
        ; v2 = size of HAL+OS
        ; v4 = end of OS/RAM
        ; v5 = start of HAL
279
        ; v8 = OS entry table ptr
280
        DebugChar a1,a2,69
281
        DebugTimeNoMMU a1, "ROM relocated @ "
Jeffrey Lee's avatar
Jeffrey Lee committed
282 283 284 285
        ; Clear RAM up to v5
        MOV     a1, v5
        BL      clear_ram

286
        DebugChar a1,a2,70
287
        DebugTimeNoMMU a1, "RAM cleared @ "
Jeffrey Lee's avatar
Jeffrey Lee committed
288

289 290 291 292 293 294 295 296 297 298 299
; TODO - NEON seems to be on by default, need to work out how to turn it off before I can test code to turn it on!
;        ; Enable power to the NEON unit, if present
;        LDR     a1, =&4800244C ; 'control OMAP status register'
;        LDR     a1, [a1]
;        TST     a1, #1<<4
;        BNE     %FT10
;;        ; NEON is available, make sure it's turned on
;        ; Enable CP10/CP11 access
;        MRC     p15, 0, a1, c1, c0, 2
;        ORR     a1, a1, #&F<<20
;        MCR     p15, 0, a1, c1, c0, 2
Robert Sprowson's avatar
Robert Sprowson committed
300
;        ISB     SY
301 302 303 304
;        ; Now enable the unit
;        MOV     a1, #1<<30 ; EN bit
;        DCI     &EEE80A10 ; VMSR FPEXC, a1

Jeffrey Lee's avatar
Jeffrey Lee committed
305
        B       rom_checkedout_ok
306

Ben Avison's avatar
Ben Avison committed
307
        GET     RAM.s
308 309 310
        LTORG

        END