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