2 * Copyright 2015 Freescale Semiconductor, Inc.
3 * Author: Wang Dongsheng <dongsheng.wang@freescale.com>
5 * SPDX-License-Identifier: GPL-2.0+
9 #include <linux/linkage.h>
11 #include <asm/armv7.h>
12 #include <asm/arch-armv7/generictimer.h>
15 #define SCFG_CORE0_SFT_RST 0x130
16 #define SCFG_CORESRENCR 0x204
18 #define DCFG_CCSR_BRR 0x0E4
19 #define DCFG_CCSR_SCRATCHRW1 0x200
21 .pushsection ._secure.text, "ax"
25 #define ONE_MS (GENERIC_TIMER_CLK / 1000)
26 #define RESET_WAIT (30 * ONE_MS)
28 @ r0: return value ARM_PSCI_RET_SUCCESS or ARM_PSCI_RET_INVAL
29 @ r1: input target CPU ID in MPIDR format, original value in r1 may be dropped
30 @ r4: output validated CPU ID if ARM_PSCI_RET_SUCCESS returns, meaningless for
31 @ ARM_PSCI_RET_INVAL,suppose caller saves r4 before calling
32 LENTRY(psci_check_target_cpu_id)
33 @ Get the real CPU number
35 mov r0, #ARM_PSCI_RET_INVAL
37 @ Bit[31:24], bits must be zero.
41 @ Affinity level 2 - Cluster: only one cluster in LS1021xa.
45 @ Affinity level 1 - Processors: should be in 0xf00 format.
50 @ Affinity level 0 - CPU: only 0, 1 are valid in LS1021xa.
54 mov r0, #ARM_PSCI_RET_SUCCESS
56 ENDPROC(psci_check_target_cpu_id)
64 @ Clear and Get the correct CPU number
66 bl psci_check_target_cpu_id
67 cmp r0, #ARM_PSCI_RET_INVAL
72 bl psci_save_target_pc
75 @ Get DCFG base address
76 movw r4, #(CONFIG_SYS_FSL_GUTS_ADDR & 0xffff)
77 movt r4, #(CONFIG_SYS_FSL_GUTS_ADDR >> 16)
79 @ Detect target CPU state
80 ldr r2, [r4, #DCFG_CCSR_BRR]
87 @ Get SCFG base address
88 movw r0, #(CONFIG_SYS_FSL_SCFG_ADDR & 0xffff)
89 movt r0, #(CONFIG_SYS_FSL_SCFG_ADDR >> 16)
91 @ Enable CORE Soft Reset
95 str r5, [r0, #SCFG_CORESRENCR]
97 @ Get CPUx offset register
102 @ Do reset on target CPU
106 str r5, [r2, #SCFG_CORE0_SFT_RST]
109 timer_wait r2, RESET_WAIT
111 @ Disable CORE soft reset
113 str r5, [r0, #SCFG_CORESRENCR]
116 @ Release on target CPU
117 ldr r2, [r4, #DCFG_CCSR_BRR]
119 lsl r6, r6, r1 @ 32 bytes per CPU
123 str r2, [r4, #DCFG_CCSR_BRR]
125 @ Set secondary boot entry
126 ldr r6, =psci_cpu_entry
128 str r6, [r4, #DCFG_CCSR_SCRATCHRW1]
134 mov r0, #ARM_PSCI_RET_SUCCESS
142 bl psci_cpu_off_common