xref: /openbmc/linux/arch/arm/mach-socfpga/headsmp.S (revision 3a4356c0)
19c4566a1SDinh Nguyen/*
29c4566a1SDinh Nguyen *  Copyright (c) 2003 ARM Limited
39c4566a1SDinh Nguyen *  Copyright (c) u-boot contributors
49c4566a1SDinh Nguyen *  Copyright (c) 2012 Pavel Machek <pavel@denx.de>
59c4566a1SDinh Nguyen *
69c4566a1SDinh Nguyen * This program is free software; you can redistribute it and/or modify
79c4566a1SDinh Nguyen * it under the terms of the GNU General Public License version 2 as
89c4566a1SDinh Nguyen * published by the Free Software Foundation.
99c4566a1SDinh Nguyen */
109c4566a1SDinh Nguyen#include <linux/linkage.h>
119c4566a1SDinh Nguyen#include <linux/init.h>
123a4356c0SDinh Nguyen#include <asm/memory.h>
139c4566a1SDinh Nguyen
14ad208d03SPavel Machek	.arch	armv7-a
159c4566a1SDinh Nguyen
169c4566a1SDinh NguyenENTRY(secondary_trampoline)
173a4356c0SDinh Nguyen	/* CPU1 will always fetch from 0x0 when it is brought out of reset.
183a4356c0SDinh Nguyen	 * Thus, we can just subtract the PAGE_OFFSET to get the physical
193a4356c0SDinh Nguyen	 * address of &cpu1start_addr. This would not work for platforms
203a4356c0SDinh Nguyen	 * where the physical memory does not start at 0x0.
213a4356c0SDinh Nguyen	 */
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]
273a4356c0SDinh Nguyen	bx	r4
289c4566a1SDinh Nguyen
293a4356c0SDinh Nguyen	.align
303a4356c0SDinh Nguyen1:	.long	.
313a4356c0SDinh Nguyen	.long	socfpga_cpu1start_addr
329c4566a1SDinh NguyenENTRY(secondary_trampoline_end)
33d6dd735fSDinh Nguyen
34d6dd735fSDinh NguyenENTRY(socfpga_secondary_startup)
35d6dd735fSDinh Nguyen       bl      v7_invalidate_l1
36d6dd735fSDinh Nguyen       b       secondary_startup
37d6dd735fSDinh NguyenENDPROC(socfpga_secondary_startup)
38