xref: /openbmc/linux/arch/arm/mach-socfpga/headsmp.S (revision a9ff6961)
1d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
29c4566a1SDinh Nguyen/*
39c4566a1SDinh Nguyen *  Copyright (c) 2003 ARM Limited
49c4566a1SDinh Nguyen *  Copyright (c) u-boot contributors
59c4566a1SDinh Nguyen *  Copyright (c) 2012 Pavel Machek <pavel@denx.de>
69c4566a1SDinh Nguyen */
79c4566a1SDinh Nguyen#include <linux/linkage.h>
89c4566a1SDinh Nguyen#include <linux/init.h>
9*a9ff6961SLinus Walleij#include <asm/page.h>
10bf55e0a4SBen Dooks#include <asm/assembler.h>
119c4566a1SDinh Nguyen
12ad208d03SPavel Machek	.arch	armv7-a
135616f367SSascha Hauer	.arm
149c4566a1SDinh Nguyen
159c4566a1SDinh NguyenENTRY(secondary_trampoline)
163a4356c0SDinh Nguyen	/* CPU1 will always fetch from 0x0 when it is brought out of reset.
173a4356c0SDinh Nguyen	 * Thus, we can just subtract the PAGE_OFFSET to get the physical
183a4356c0SDinh Nguyen	 * address of &cpu1start_addr. This would not work for platforms
193a4356c0SDinh Nguyen	 * where the physical memory does not start at 0x0.
203a4356c0SDinh Nguyen	*/
21bf55e0a4SBen DooksARM_BE8(setend	be)
223a4356c0SDinh Nguyen	adr	r0, 1f
233a4356c0SDinh Nguyen	ldmia	r0, {r1, r2}
243a4356c0SDinh Nguyen	sub	r2, r2, #PAGE_OFFSET
253a4356c0SDinh Nguyen	ldr	r3, [r2]
263a4356c0SDinh Nguyen	ldr	r4, [r3]
27bf55e0a4SBen DooksARM_BE8(rev	r4, r4)
283a4356c0SDinh Nguyen	bx	r4
299c4566a1SDinh Nguyen
303a4356c0SDinh Nguyen	.align
313a4356c0SDinh Nguyen1:	.long	.
323a4356c0SDinh Nguyen	.long	socfpga_cpu1start_addr
339c4566a1SDinh NguyenENTRY(secondary_trampoline_end)
34