| .text |
| |
| /* |
| * The head of l-loader is defined in below. |
| * struct l_loader_head { |
| * unsigned int first_instr; |
| * unsigned char magic[16]; @ BOOTMAGICNUMBER! |
| * unsigned int l_loader_start; |
| * unsigned int l_loader_end; |
| * }; |
| */ |
| |
| #define CPU0_CTRL_OFFSET 0x100 |
| #define CPU7_CTRL_OFFSET 0x800 |
| #define CPU0_RVBARADDR_OFFSET 0x158 |
| #define CPU7_RVBARADDR_OFFSET 0x858 |
| |
| #define CPU_CTRL_AARCH64_MODE (1 << 7) |
| |
| #define SC_PERIPH_CLKEN3 0x230 |
| #define SC_PERIPH_RSTDIS3 0x334 |
| .global _start |
| _start: |
| b reset |
| @ Android magic number: "BOOTMAGICNUMBER!" |
| android_magic: |
| .word 0x544f4f42 |
| .word 0x4947414d |
| .word 0x4d554e43 |
| .word 0x21524542 |
| .word LLOADER_START @ LLOADER_START in RAM |
| .word 0 @ LLOADER_END in RAM |
| |
| entries: |
| @ 5 entries with 7 words |
| .space 140 |
| |
| .align 7 |
| |
| reset: |
| ldr r8, =(0xf9800000 + 0x700) |
| str r0, [r8] @ download mode (1:usb,2:uart,0:boot) |
| |
| ldr r4, =0xf6504000 @ ACPU_CTRL register base |
| @ set RVBAR for cpu0 |
| ldr r5, =CPU0_RVBARADDR_OFFSET |
| ldr r6, =LLOADER_BL1_BIN |
| mov r6, r6, lsr #2 |
| str r6, [r4, r5] |
| 1: |
| ldr r0, [r4, r5] |
| cmp r0, r6 |
| bne 1b |
| |
| mov r5, #CPU0_CTRL_OFFSET |
| mov r6, #CPU7_CTRL_OFFSET |
| 2: |
| ldr r0, [r4, r5] @ Load ACPU_SC_CPUx_CTRL |
| orr r0, r0, #CPU_CTRL_AARCH64_MODE |
| str r0, [r4, r5] @ Save to ACPU_SC_CPUx_CTRL |
| ldr r0, [r4, r5] |
| |
| add r5, r5, #0x100 @ Iterate ACPU_SC_CPUx_CTRL |
| cmp r5, r6 |
| ble 2b |
| |
| /* |
| * Prepare UART2 & UART3 without baud rate initialization. |
| * So always output on UART0 in l-loader. |
| */ |
| ldr r4, =0xf70100e0 @ UART2_RXD IOMG register |
| mov r0, #0 |
| str r0, [r4] |
| str r0, [r4, #4] @ UART2_TXD IOMG register |
| ldr r0, [r4] |
| |
| ldr r4, =0xf7010188 @ UART3_RXD IOMG register |
| mov r0, #1 |
| str r0, [r4] |
| str r0, [r4, #4] @ UART3_TXD IOMG register |
| ldr r1, [r4] |
| |
| ldr r4, =0xf7030000 @ PERI_CTRL register base |
| @ By default, CLK_TXCO is the parent of CLK_UART3 in SC_CLK_SEL0 |
| |
| ldr r5, =SC_PERIPH_RSTDIS3 @ unreset |
| ldr r6, =SC_PERIPH_CLKEN3 @ enable PCLK |
| mov r0, #(3 << 6) @ bit'6' & bit'7' (UART2 & UART3) |
| str r0, [r4, r5] |
| str r0, [r4, r6] |
| |
| @ execute warm reset to switch aarch64 |
| mov r2, #3 |
| mcr p15, 0, r2, c12, c0, 2 |
| wfi |
| panic: |
| b panic |
| |
| str_aarch64: |
| .asciz "\nSwitch to aarch64 mode. CPU0 executes at 0x" |