xref: /openbmc/linux/arch/arm/mach-imx/headsmp.S (revision b4e61537)
11fc593feSArnd Bergmann/*
21fc593feSArnd Bergmann * Copyright 2011 Freescale Semiconductor, Inc.
31fc593feSArnd Bergmann * Copyright 2011 Linaro Ltd.
41fc593feSArnd Bergmann *
51fc593feSArnd Bergmann * The code contained herein is licensed under the GNU General Public
61fc593feSArnd Bergmann * License. You may obtain a copy of the GNU General Public License
71fc593feSArnd Bergmann * Version 2 or later at the following locations:
81fc593feSArnd Bergmann *
91fc593feSArnd Bergmann * http://www.opensource.org/licenses/gpl-license.html
101fc593feSArnd Bergmann * http://www.gnu.org/copyleft/gpl.html
111fc593feSArnd Bergmann */
121fc593feSArnd Bergmann
131fc593feSArnd Bergmann#include <linux/linkage.h>
141fc593feSArnd Bergmann#include <linux/init.h>
151fc593feSArnd Bergmann#include <asm/asm-offsets.h>
161fc593feSArnd Bergmann#include <asm/hardware/cache-l2x0.h>
171fc593feSArnd Bergmann
181fc593feSArnd Bergmann	.section ".text.head", "ax"
191fc593feSArnd Bergmann
201fc593feSArnd Bergmann#ifdef CONFIG_SMP
211fc593feSArnd BergmannENTRY(v7_secondary_startup)
221fc593feSArnd Bergmann	bl	v7_invalidate_l1
231fc593feSArnd Bergmann	b	secondary_startup
241fc593feSArnd BergmannENDPROC(v7_secondary_startup)
251fc593feSArnd Bergmann#endif
261fc593feSArnd Bergmann
271fc593feSArnd Bergmann#ifdef CONFIG_PM
281fc593feSArnd Bergmann/*
29b4e61537SNicolas Pitre * The following code must assume it is running from physical address
30b4e61537SNicolas Pitre * where absolute virtual addresses to the data section have to be
31b4e61537SNicolas Pitre * turned into relative ones.
321fc593feSArnd Bergmann */
331fc593feSArnd Bergmann
341fc593feSArnd Bergmann#ifdef CONFIG_CACHE_L2X0
351fc593feSArnd Bergmann	.macro	pl310_resume
36b4e61537SNicolas Pitre	adr	r0, l2x0_saved_regs_offset
37b4e61537SNicolas Pitre	ldr	r2, [r0]
38b4e61537SNicolas Pitre	add	r2, r2, r0
391fc593feSArnd Bergmann	ldr	r0, [r2, #L2X0_R_PHY_BASE]	@ get physical base of l2x0
401fc593feSArnd Bergmann	ldr	r1, [r2, #L2X0_R_AUX_CTRL]	@ get aux_ctrl value
411fc593feSArnd Bergmann	str	r1, [r0, #L2X0_AUX_CTRL]	@ restore aux_ctrl
421fc593feSArnd Bergmann	mov	r1, #0x1
431fc593feSArnd Bergmann	str	r1, [r0, #L2X0_CTRL]		@ re-enable L2
441fc593feSArnd Bergmann	.endm
451fc593feSArnd Bergmann
46b4e61537SNicolas Pitrel2x0_saved_regs_offset:
47b4e61537SNicolas Pitre	.word	l2x0_saved_regs - .
48b4e61537SNicolas Pitre
491fc593feSArnd Bergmann#else
501fc593feSArnd Bergmann	.macro	pl310_resume
511fc593feSArnd Bergmann	.endm
521fc593feSArnd Bergmann#endif
531fc593feSArnd Bergmann
541fc593feSArnd BergmannENTRY(v7_cpu_resume)
551fc593feSArnd Bergmann	bl	v7_invalidate_l1
561fc593feSArnd Bergmann	pl310_resume
571fc593feSArnd Bergmann	b	cpu_resume
581fc593feSArnd BergmannENDPROC(v7_cpu_resume)
591fc593feSArnd Bergmann#endif
60