Top 10.1 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 20 21 22 23
        GET     Hdr:Machine.<Machine>
        GET     Hdr:ImageSize.<ImageSize>

        GET     Hdr:MEMM.ARM600

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

Jeffrey Lee's avatar
Jeffrey Lee committed
28
        GET     hdr.omap3530
29
        GET     hdr.StaticWS
Jeffrey Lee's avatar
Jeffrey Lee committed
30 31 32
        GET     hdr.UART
        GET     hdr.Post
        GET     hdr.SDRC
33
        GET     hdr.Copro15ops
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 39
        ; Note: there must be only one fixed link from "Top" to "Boot" at +&2000
        IMPORT  rom_checkedout_ok
40
        EXPORT  HAL_Base
Jeffrey Lee's avatar
Jeffrey Lee committed
41
        IMPORT  HAL_DebugTX
42

43 44 45 46 47 48
        MACRO
        CallOSM $entry, $reg
        LDR     ip, [v8, #$entry*4]
        MOV     lr, pc
        ADD     pc, v8, ip
        MEND
49

50 51 52 53 54 55 56 57 58 59
        ; 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
JumpTableEnd
60 61 62 63
        ASSERT  . - HAL_Base < 0x60
        %       0x60 - (. - HAL_Base)
ROMsize
        DCD     0                               ; patched in by build system
64
        B       selectconfig_linux ; offset &64 - for booting as a uImage/Linux kernel. Uses Linux machine type ID to select board config.
65 66

        ENTRY
67 68 69 70 71 72 73
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
74 75
foundconfig
        ; v1 = board config
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
        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
        ; Now do common init
Jeffrey Lee's avatar
Jeffrey Lee committed
104 105
        B       restart

106 107 108 109
 [ Debug
HelloWorld DCB "OMAP3 HAL init",13,10,"Board config=",0
        ALIGN
 ]
110

111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
        ; 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
126
        LTORG
127 128
        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
129 130

; ------------------------------------------------------------------------------
131 132
; Perform some Cortex-A8 specific CPU setup
; Then start looking for RAM
133
; In: sb = board config ptr
Jeffrey Lee's avatar
Jeffrey Lee committed
134
restart
135
        DebugChar a3,a4,48
Jeffrey Lee's avatar
Jeffrey Lee committed
136
        MSR     CPSR_c, #F32_bit+I32_bit+SVC32_mode
137
        DebugChar a3,a4,49
138
        MOV     a1, #&78 ; Matches MMUC_L+MMUC_D+MMUC_P+MMUC_W, which are now reserved bits in the Cortex spec, but should be written as 1
139 140 141 142 143 144 145
        MCR     p15, 0, a1, c1, c0, 0              ; MMU, caches etc off
        DebugChar a3,a4,50
        MRC     p15, 0, a1, c1, c0, 1
        BIC     a1, a1, #2
        MCR     p15, 0, a1, c1, c0, 1 ; Ensure L2 cache disabled
        DebugChar a3,a4,51

Jeffrey Lee's avatar
Jeffrey Lee committed
146
        MOV     a1, #0
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
        MCR     p15, 0, a1, c7, c5, 0           ; invalidate instruction cache
        DebugChar a3,a4,52
        MCR     p15, 0, a1, c8, c7, 0           ; invalidate TLBs
        DebugChar a3,a4,53

        ; Invalidate data caches. To do this we must query their sizes
        ; The register describes up to 8 cache levels, so to provide some future-proofing I might as well implement a full cache clean routine here
        MRC     p15, 1, a1, c0, c0, 1 ; Cache level ID register
        DebugChar a3,a4,54
        BIC     a1, a1, #&FF000000 ; Discard unification/coherency bits
        MOV     a2, #0 ; Current cache level
20
        DebugChar a3,a4,49
        ANDS    a3, a1, #7 ; Get flags
        BEQ     %FT10 ; Cache clean complete
        MCR     p15, 2, a2, c0, c0, 0 ; Program cache size selection register
        MRC     p15, 1, a3, c0, c0, 0 ; Get size info
        AND     v1, a3, #&7 ; log2(Line size)-2
        BIC     a3, a3, #&F0000007 ; Clear flags & line size
        MOV     v2, a3, LSL #19 ; Number of ways-1 in upper 10 bits
Jeffrey Lee's avatar
Jeffrey Lee committed
167
        MOV     v3, a3, LSR #13 ; Number of sets-1 in lower 15 bits
168 169 170
        ; Way number needs to be packed right up at the high end of the data word; shift it up
        CLZ     a4, v2
        MOV     v2, v2, LSL a4
Jeffrey Lee's avatar
Jeffrey Lee committed
171 172 173
        ; Set number needs to start at log2(Line size)+2
        MOV     v3, v3, LSL #4 ; Start at bit 4
        MOV     v3, v3, LSL v1 ; Start at log2(Line size)+2
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
        ; Now calculate the offset numbers we will use to increment sets & ways
        BIC     v4, v2, v2, LSL #1 ; Way increment
        BIC     v5, v3, v3, LSL #1 ; Set increment
        ; Now we can finally clean this cache!
        ORR     a3, a2, v3 ; Current way (0), set (max), and level
30
        MCR     p15, 0, a3, c7, c6, 2 ; Invalidate
        ADDS    a3, a3, v4 ; Increment way
        BCC     %BT30 ; Overflow will occur once ways are enumerated
        TST     a3, v3 ; Are set bits all zero?
        SUBNE   a3, a3, v5 ; No, so decrement set and loop around again
        BNE     %BT30
        ; This cache is now clean. Move on to the next level.
        DebugChar a3,a4,50
        ADD     a2, a2, #2
        MOVS    a1, a1, LSR #3
        BNE     %BT20
10
        DebugChar a1,a2,51
Jeffrey Lee's avatar
Jeffrey Lee committed
193 194 195 196 197 198

        ADRL    v1, HAL_Base + 64*1024          ; v1 -> RISC OS image

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

199
        ARM_read_control a1
Jeffrey Lee's avatar
Jeffrey Lee committed
200 201
        ; We assume that ARMs with an I cache can have it enabled while the MMU is off.
        [ :LNOT:CacheOff
202
        ORR   a1, a1, #MMUC_I
Jeffrey Lee's avatar
Jeffrey Lee committed
203
        ]
204
        ARM_write_control a1                                ; whoosh
Jeffrey Lee's avatar
Jeffrey Lee committed
205 206 207 208 209 210 211

        ; Keep a soft copy of the CR in a banked register (R13_und)
        MSR     CPSR_c, #F32_bit+I32_bit+UND32_mode
        MOV     sp, a1
        ; Switch into SVC32 mode (we may have been in SVC26 before).
        MSR     CPSR_c, #F32_bit+I32_bit+SVC32_mode

212 213 214 215
        ; 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
216
        ; To keep things simple and safe, we'll relocate the HAL and OS image to the top end of RAM
217
        ; 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
218 219 220 221 222 223 224

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

relocate_code
225
        DebugChar a1,a2,66
Jeffrey Lee's avatar
Jeffrey Lee committed
226
        BL      get_end_of_ram
227
        DebugChar v1,v2,67
Jeffrey Lee's avatar
Jeffrey Lee committed
228 229 230 231 232 233 234 235 236 237 238

        ; How big are we?
        ADRL    v1, HAL_Base + 64*1024
        LDR     v2, [v1, #OSHdr_ImageSize]
        SUB     v1, v1, #64*1024 ; Start of HAL
        ADD     v2, v2, #64*1024 ; Size of HAL+OS
        ADD     v3, v1, v2 ; End of OS
        MOV     v4, a1 ; End of RAM
        SUB     v5, v4, v2 ; New start address of HAL
        CMP     v1, v5
        BEQ     %FT10 ; No copy needed
239
        BHI     %FT20 ; We're in some ROM above RAM. OK to continue with copy.
Jeffrey Lee's avatar
Jeffrey Lee committed
240
        CMP     v3, v5
241
        BLS     %FT20 ; We're in some ROM/RAM below our copy destination. OK to continue with copy.
Jeffrey Lee's avatar
Jeffrey Lee committed
242 243 244 245 246 247 248 249 250
        ; Else we currently overlap the area we want to copy ourselves into.
        SUB     v5, v1, v2 ; Copy the HAL+OS to just before itself
20
        MOV     a1, v5
        MOV     a2, v1 ; Copy source
        MOV     a3, v2
30
        LDR     a4, [a2], #4
        SUBS    a3, a3, #4
251
        STR     a4, [a1], #4
Jeffrey Lee's avatar
Jeffrey Lee committed
252 253 254
        BGT     %BT30
        ; Invalidate I-cache
        MOV     a1, #0
255 256
        MCR     p15, 0, a1, c7, c5, 0
        DebugChar a1,a2,68
Jeffrey Lee's avatar
Jeffrey Lee committed
257 258 259 260 261 262 263 264 265 266 267
        ; 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
268
        ; v8 = OS entry table ptr
269
        DebugChar a1,a2,69
Jeffrey Lee's avatar
Jeffrey Lee committed
270 271 272 273
        ; Clear RAM up to v5
        MOV     a1, v5
        BL      clear_ram

274
        DebugChar a1,a2,70
Jeffrey Lee's avatar
Jeffrey Lee committed
275 276

        B       rom_checkedout_ok
277

Jeffrey Lee's avatar
Jeffrey Lee committed
278 279 280
; ------------------------------------------------------------------------------
; The RAM setup is locked in the first 8k of ROM
; as is the flash recovery code
Ben Avison's avatar
Ben Avison committed
281
        GET     RAM.s
282
        LTORG
Jeffrey Lee's avatar
Jeffrey Lee committed
283
        ALIGN   sizeofRecoveryArea
284 285

        END