1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Copyright (c) 2003 ARM Limited 4*4882a593Smuzhiyun * Copyright (c) u-boot contributors 5*4882a593Smuzhiyun * Copyright (c) 2012 Pavel Machek <pavel@denx.de> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun#include <linux/linkage.h> 8*4882a593Smuzhiyun#include <linux/init.h> 9*4882a593Smuzhiyun#include <asm/memory.h> 10*4882a593Smuzhiyun#include <asm/assembler.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun .arch armv7-a 13*4882a593Smuzhiyun .arm 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunENTRY(secondary_trampoline) 16*4882a593Smuzhiyun /* CPU1 will always fetch from 0x0 when it is brought out of reset. 17*4882a593Smuzhiyun * Thus, we can just subtract the PAGE_OFFSET to get the physical 18*4882a593Smuzhiyun * address of &cpu1start_addr. This would not work for platforms 19*4882a593Smuzhiyun * where the physical memory does not start at 0x0. 20*4882a593Smuzhiyun */ 21*4882a593SmuzhiyunARM_BE8(setend be) 22*4882a593Smuzhiyun adr r0, 1f 23*4882a593Smuzhiyun ldmia r0, {r1, r2} 24*4882a593Smuzhiyun sub r2, r2, #PAGE_OFFSET 25*4882a593Smuzhiyun ldr r3, [r2] 26*4882a593Smuzhiyun ldr r4, [r3] 27*4882a593SmuzhiyunARM_BE8(rev r4, r4) 28*4882a593Smuzhiyun bx r4 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun .align 31*4882a593Smuzhiyun1: .long . 32*4882a593Smuzhiyun .long socfpga_cpu1start_addr 33*4882a593SmuzhiyunENTRY(secondary_trampoline_end) 34