/* * Copyright (C) 2013 Panasonic Corporation * Author: Masahiro Yamada * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #include /* Entry point of U-Boot main program for the secondary CPU */ LENTRY(secondary_entry) mrc p15, 0, r0, c1, c0, 0 @ SCTLR (System Contrl Register) bic r0, r0, #(CR_C | CR_M) @ MMU and Dcache disable mcr p15, 0, r0, c1, c0, 0 mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs mcr p15, 0, r0, c7, c5, 0 @ invalidate icache dsb led_write(C,0,,) ldr r1, =ROM_BOOT_ROMRSV2 mov r0, #0 str r0, [r1] 0: wfe ldr r4, [r1] @ r4: entry point for secondary CPUs cmp r4, #0 beq 0b led_write(C, P, U, 1) bx r4 @ secondary CPUs jump to linux ENDPROC(secondary_entry) ENTRY(wakeup_secondary) ldr r1, =ROM_BOOT_ROMRSV2 0: ldr r0, [r1] cmp r0, #0 bne 0b /* set entry address and send event to the secondary CPU */ ldr r0, =secondary_entry str r0, [r1] ldr r0, [r1] @ make sure store is complete mov r0, #0x100 0: subs r0, r0, #1 @ I don't know the reason, but without this wait bne 0b @ fails to wake up the secondary CPU sev /* wait until the secondary CPU reach to secondary_entry */ 0: ldr r0, [r1] cmp r0, #0 bne 0b bx lr ENDPROC(wakeup_secondary)