162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2003 ARM Limited 462306a36Sopenharmony_ci * Copyright (c) u-boot contributors 562306a36Sopenharmony_ci * Copyright (c) 2012 Pavel Machek <pavel@denx.de> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/linkage.h> 862306a36Sopenharmony_ci#include <linux/init.h> 962306a36Sopenharmony_ci#include <asm/page.h> 1062306a36Sopenharmony_ci#include <asm/assembler.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci .arch armv7-a 1362306a36Sopenharmony_ci .arm 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciENTRY(secondary_trampoline) 1662306a36Sopenharmony_ci /* CPU1 will always fetch from 0x0 when it is brought out of reset. 1762306a36Sopenharmony_ci * Thus, we can just subtract the PAGE_OFFSET to get the physical 1862306a36Sopenharmony_ci * address of &cpu1start_addr. This would not work for platforms 1962306a36Sopenharmony_ci * where the physical memory does not start at 0x0. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ciARM_BE8(setend be) 2262306a36Sopenharmony_ci adr r0, 1f 2362306a36Sopenharmony_ci ldmia r0, {r1, r2} 2462306a36Sopenharmony_ci sub r2, r2, #PAGE_OFFSET 2562306a36Sopenharmony_ci ldr r3, [r2] 2662306a36Sopenharmony_ci ldr r4, [r3] 2762306a36Sopenharmony_ciARM_BE8(rev r4, r4) 2862306a36Sopenharmony_ci bx r4 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci .align 3162306a36Sopenharmony_ci1: .long . 3262306a36Sopenharmony_ci .long socfpga_cpu1start_addr 3362306a36Sopenharmony_ciENTRY(secondary_trampoline_end) 34