/* SPDX-License-Identifier: GPL-2.0+ */1/*2* Copyright (c) 2013 Samsung Electronics Co., Ltd.3* http://www.samsung.com4*5* Exynos low-level resume code6*/78#include <linux/linkage.h>9#include <asm/asm-offsets.h>10#include <asm/hardware/cache-l2x0.h>11#include "smc.h"1213#define CPU_MASK 0xff0ffff014#define CPU_CORTEX_A9 0x410fc0901516.text17.align1819/*20* sleep magic, to allow the bootloader to check for an valid21* image to resume to. Must be the first word before the22* exynos_cpu_resume entry.23*/2425.word 0x2bedf00d2627/*28* exynos_cpu_resume29*30* resume code entry for bootloader to call31*/3233ENTRY(exynos_cpu_resume)34#ifdef CONFIG_CACHE_L2X035mrc p15, 0, r0, c0, c0, 036ldr r1, =CPU_MASK37and r0, r0, r138ldr r1, =CPU_CORTEX_A939cmp r0, r140bleq l2c310_early_resume41#endif42b cpu_resume43ENDPROC(exynos_cpu_resume)4445.align46.arch armv7-a47.arch_extension sec48ENTRY(exynos_cpu_resume_ns)49mrc p15, 0, r0, c0, c0, 050ldr r1, =CPU_MASK51and r0, r0, r152ldr r1, =CPU_CORTEX_A953cmp r0, r154bne skip_cp155556adr r0, _cp15_save_power57ldr r1, [r0]58ldr r1, [r0, r1]59adr r0, _cp15_save_diag60ldr r2, [r0]61ldr r2, [r0, r2]62mov r0, #SMC_CMD_C15RESUME63dsb64smc #065#ifdef CONFIG_CACHE_L2X066adr r0, 1f67ldr r2, [r0]68add r0, r2, r06970/* Check that the address has been initialised. */71ldr r1, [r0, #L2X0_R_PHY_BASE]72teq r1, #073beq skip_l2x07475/* Check if controller has been enabled. */76ldr r2, [r1, #L2X0_CTRL]77tst r2, #0x178bne skip_l2x07980ldr r1, [r0, #L2X0_R_TAG_LATENCY]81ldr r2, [r0, #L2X0_R_DATA_LATENCY]82ldr r3, [r0, #L2X0_R_PREFETCH_CTRL]83mov r0, #SMC_CMD_L2X0SETUP184smc #08586/* Reload saved regs pointer because smc corrupts registers. */87adr r0, 1f88ldr r2, [r0]89add r0, r2, r09091ldr r1, [r0, #L2X0_R_PWR_CTRL]92ldr r2, [r0, #L2X0_R_AUX_CTRL]93mov r0, #SMC_CMD_L2X0SETUP294smc #09596mov r0, #SMC_CMD_L2X0INVALL97smc #09899mov r1, #1100mov r0, #SMC_CMD_L2X0CTRL101smc #0102skip_l2x0:103#endif /* CONFIG_CACHE_L2X0 */104skip_cp15:105b cpu_resume106ENDPROC(exynos_cpu_resume_ns)107108.align109_cp15_save_power:110.long cp15_save_power - .111_cp15_save_diag:112.long cp15_save_diag - .113#ifdef CONFIG_CACHE_L2X01141: .long l2x0_saved_regs - .115#endif /* CONFIG_CACHE_L2X0 */116117.data118.align 2119.globl cp15_save_diag120cp15_save_diag:121.long 0 @ cp15 diagnostic122.globl cp15_save_power123cp15_save_power:124.long 0 @ cp15 power control125126127