xref: /OK3568_Linux_fs/kernel/arch/arm/mm/proc-v7.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun *  linux/arch/arm/mm/proc-v7.S
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun *  Copyright (C) 2001 Deep Blue Solutions Ltd.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun *  This is the "shell" of the ARMv7 processor support.
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun#include <linux/arm-smccc.h>
10*4882a593Smuzhiyun#include <linux/init.h>
11*4882a593Smuzhiyun#include <linux/linkage.h>
12*4882a593Smuzhiyun#include <linux/pgtable.h>
13*4882a593Smuzhiyun#include <asm/assembler.h>
14*4882a593Smuzhiyun#include <asm/asm-offsets.h>
15*4882a593Smuzhiyun#include <asm/hwcap.h>
16*4882a593Smuzhiyun#include <asm/pgtable-hwdef.h>
17*4882a593Smuzhiyun#include <asm/memory.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun#include "proc-macros.S"
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun#ifdef CONFIG_ARM_LPAE
22*4882a593Smuzhiyun#include "proc-v7-3level.S"
23*4882a593Smuzhiyun#else
24*4882a593Smuzhiyun#include "proc-v7-2level.S"
25*4882a593Smuzhiyun#endif
26*4882a593Smuzhiyun
27*4882a593SmuzhiyunENTRY(cpu_v7_proc_init)
28*4882a593Smuzhiyun	ret	lr
29*4882a593SmuzhiyunENDPROC(cpu_v7_proc_init)
30*4882a593Smuzhiyun
31*4882a593SmuzhiyunENTRY(cpu_v7_proc_fin)
32*4882a593Smuzhiyun	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
33*4882a593Smuzhiyun	bic	r0, r0, #0x1000			@ ...i............
34*4882a593Smuzhiyun	bic	r0, r0, #0x0006			@ .............ca.
35*4882a593Smuzhiyun	mcr	p15, 0, r0, c1, c0, 0		@ disable caches
36*4882a593Smuzhiyun	ret	lr
37*4882a593SmuzhiyunENDPROC(cpu_v7_proc_fin)
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun/*
40*4882a593Smuzhiyun *	cpu_v7_reset(loc, hyp)
41*4882a593Smuzhiyun *
42*4882a593Smuzhiyun *	Perform a soft reset of the system.  Put the CPU into the
43*4882a593Smuzhiyun *	same state as it would be if it had been reset, and branch
44*4882a593Smuzhiyun *	to what would be the reset vector.
45*4882a593Smuzhiyun *
46*4882a593Smuzhiyun *	- loc   - location to jump to for soft reset
47*4882a593Smuzhiyun *	- hyp   - indicate if restart occurs in HYP mode
48*4882a593Smuzhiyun *
49*4882a593Smuzhiyun *	This code must be executed using a flat identity mapping with
50*4882a593Smuzhiyun *      caches disabled.
51*4882a593Smuzhiyun */
52*4882a593Smuzhiyun	.align	5
53*4882a593Smuzhiyun	.pushsection	.idmap.text, "ax"
54*4882a593SmuzhiyunENTRY(cpu_v7_reset)
55*4882a593Smuzhiyun	mrc	p15, 0, r2, c1, c0, 0		@ ctrl register
56*4882a593Smuzhiyun	bic	r2, r2, #0x1			@ ...............m
57*4882a593Smuzhiyun THUMB(	bic	r2, r2, #1 << 30 )		@ SCTLR.TE (Thumb exceptions)
58*4882a593Smuzhiyun	mcr	p15, 0, r2, c1, c0, 0		@ disable MMU
59*4882a593Smuzhiyun	isb
60*4882a593Smuzhiyun#ifdef CONFIG_ARM_VIRT_EXT
61*4882a593Smuzhiyun	teq	r1, #0
62*4882a593Smuzhiyun	bne	__hyp_soft_restart
63*4882a593Smuzhiyun#endif
64*4882a593Smuzhiyun	bx	r0
65*4882a593SmuzhiyunENDPROC(cpu_v7_reset)
66*4882a593Smuzhiyun	.popsection
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun/*
69*4882a593Smuzhiyun *	cpu_v7_do_idle()
70*4882a593Smuzhiyun *
71*4882a593Smuzhiyun *	Idle the processor (eg, wait for interrupt).
72*4882a593Smuzhiyun *
73*4882a593Smuzhiyun *	IRQs are already disabled.
74*4882a593Smuzhiyun */
75*4882a593SmuzhiyunENTRY(cpu_v7_do_idle)
76*4882a593Smuzhiyun	dsb					@ WFI may enter a low-power mode
77*4882a593Smuzhiyun	wfi
78*4882a593Smuzhiyun	ret	lr
79*4882a593SmuzhiyunENDPROC(cpu_v7_do_idle)
80*4882a593Smuzhiyun
81*4882a593SmuzhiyunENTRY(cpu_v7_dcache_clean_area)
82*4882a593Smuzhiyun	ALT_SMP(W(nop))			@ MP extensions imply L1 PTW
83*4882a593Smuzhiyun	ALT_UP_B(1f)
84*4882a593Smuzhiyun	ret	lr
85*4882a593Smuzhiyun1:	dcache_line_size r2, r3
86*4882a593Smuzhiyun2:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
87*4882a593Smuzhiyun	add	r0, r0, r2
88*4882a593Smuzhiyun	subs	r1, r1, r2
89*4882a593Smuzhiyun	bhi	2b
90*4882a593Smuzhiyun	dsb	ishst
91*4882a593Smuzhiyun	ret	lr
92*4882a593SmuzhiyunENDPROC(cpu_v7_dcache_clean_area)
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun#ifdef CONFIG_ARM_PSCI
95*4882a593Smuzhiyun	.arch_extension sec
96*4882a593SmuzhiyunENTRY(cpu_v7_smc_switch_mm)
97*4882a593Smuzhiyun	stmfd	sp!, {r0 - r3}
98*4882a593Smuzhiyun	movw	r0, #:lower16:ARM_SMCCC_ARCH_WORKAROUND_1
99*4882a593Smuzhiyun	movt	r0, #:upper16:ARM_SMCCC_ARCH_WORKAROUND_1
100*4882a593Smuzhiyun	smc	#0
101*4882a593Smuzhiyun	ldmfd	sp!, {r0 - r3}
102*4882a593Smuzhiyun	b	cpu_v7_switch_mm
103*4882a593SmuzhiyunENDPROC(cpu_v7_smc_switch_mm)
104*4882a593Smuzhiyun	.arch_extension virt
105*4882a593SmuzhiyunENTRY(cpu_v7_hvc_switch_mm)
106*4882a593Smuzhiyun	stmfd	sp!, {r0 - r3}
107*4882a593Smuzhiyun	movw	r0, #:lower16:ARM_SMCCC_ARCH_WORKAROUND_1
108*4882a593Smuzhiyun	movt	r0, #:upper16:ARM_SMCCC_ARCH_WORKAROUND_1
109*4882a593Smuzhiyun	hvc	#0
110*4882a593Smuzhiyun	ldmfd	sp!, {r0 - r3}
111*4882a593Smuzhiyun	b	cpu_v7_switch_mm
112*4882a593SmuzhiyunENDPROC(cpu_v7_hvc_switch_mm)
113*4882a593Smuzhiyun#endif
114*4882a593SmuzhiyunENTRY(cpu_v7_iciallu_switch_mm)
115*4882a593Smuzhiyun	mov	r3, #0
116*4882a593Smuzhiyun	mcr	p15, 0, r3, c7, c5, 0		@ ICIALLU
117*4882a593Smuzhiyun	b	cpu_v7_switch_mm
118*4882a593SmuzhiyunENDPROC(cpu_v7_iciallu_switch_mm)
119*4882a593SmuzhiyunENTRY(cpu_v7_bpiall_switch_mm)
120*4882a593Smuzhiyun	mov	r3, #0
121*4882a593Smuzhiyun	mcr	p15, 0, r3, c7, c5, 6		@ flush BTAC/BTB
122*4882a593Smuzhiyun	b	cpu_v7_switch_mm
123*4882a593SmuzhiyunENDPROC(cpu_v7_bpiall_switch_mm)
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun	string	cpu_v7_name, "ARMv7 Processor"
126*4882a593Smuzhiyun	.align
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
129*4882a593Smuzhiyun.globl	cpu_v7_suspend_size
130*4882a593Smuzhiyun.equ	cpu_v7_suspend_size, 4 * 9
131*4882a593Smuzhiyun#ifdef CONFIG_ARM_CPU_SUSPEND
132*4882a593SmuzhiyunENTRY(cpu_v7_do_suspend)
133*4882a593Smuzhiyun	stmfd	sp!, {r4 - r11, lr}
134*4882a593Smuzhiyun	mrc	p15, 0, r4, c13, c0, 0	@ FCSE/PID
135*4882a593Smuzhiyun	mrc	p15, 0, r5, c13, c0, 3	@ User r/o thread ID
136*4882a593Smuzhiyun	stmia	r0!, {r4 - r5}
137*4882a593Smuzhiyun#ifdef CONFIG_MMU
138*4882a593Smuzhiyun	mrc	p15, 0, r6, c3, c0, 0	@ Domain ID
139*4882a593Smuzhiyun#ifdef CONFIG_ARM_LPAE
140*4882a593Smuzhiyun	mrrc	p15, 1, r5, r7, c2	@ TTB 1
141*4882a593Smuzhiyun#else
142*4882a593Smuzhiyun	mrc	p15, 0, r7, c2, c0, 1	@ TTB 1
143*4882a593Smuzhiyun#endif
144*4882a593Smuzhiyun	mrc	p15, 0, r11, c2, c0, 2	@ TTB control register
145*4882a593Smuzhiyun#endif
146*4882a593Smuzhiyun	mrc	p15, 0, r8, c1, c0, 0	@ Control register
147*4882a593Smuzhiyun	mrc	p15, 0, r9, c1, c0, 1	@ Auxiliary control register
148*4882a593Smuzhiyun	mrc	p15, 0, r10, c1, c0, 2	@ Co-processor access control
149*4882a593Smuzhiyun	stmia	r0, {r5 - r11}
150*4882a593Smuzhiyun	ldmfd	sp!, {r4 - r11, pc}
151*4882a593SmuzhiyunENDPROC(cpu_v7_do_suspend)
152*4882a593Smuzhiyun
153*4882a593SmuzhiyunENTRY(cpu_v7_do_resume)
154*4882a593Smuzhiyun	mov	ip, #0
155*4882a593Smuzhiyun	mcr	p15, 0, ip, c7, c5, 0	@ invalidate I cache
156*4882a593Smuzhiyun	mcr	p15, 0, ip, c13, c0, 1	@ set reserved context ID
157*4882a593Smuzhiyun	ldmia	r0!, {r4 - r5}
158*4882a593Smuzhiyun	mcr	p15, 0, r4, c13, c0, 0	@ FCSE/PID
159*4882a593Smuzhiyun	mcr	p15, 0, r5, c13, c0, 3	@ User r/o thread ID
160*4882a593Smuzhiyun	ldmia	r0, {r5 - r11}
161*4882a593Smuzhiyun#ifdef CONFIG_MMU
162*4882a593Smuzhiyun	mcr	p15, 0, ip, c8, c7, 0	@ invalidate TLBs
163*4882a593Smuzhiyun	mcr	p15, 0, r6, c3, c0, 0	@ Domain ID
164*4882a593Smuzhiyun#ifdef CONFIG_ARM_LPAE
165*4882a593Smuzhiyun	mcrr	p15, 0, r1, ip, c2	@ TTB 0
166*4882a593Smuzhiyun	mcrr	p15, 1, r5, r7, c2	@ TTB 1
167*4882a593Smuzhiyun#else
168*4882a593Smuzhiyun	ALT_SMP(orr	r1, r1, #TTB_FLAGS_SMP)
169*4882a593Smuzhiyun	ALT_UP(orr	r1, r1, #TTB_FLAGS_UP)
170*4882a593Smuzhiyun	mcr	p15, 0, r1, c2, c0, 0	@ TTB 0
171*4882a593Smuzhiyun	mcr	p15, 0, r7, c2, c0, 1	@ TTB 1
172*4882a593Smuzhiyun#endif
173*4882a593Smuzhiyun	mcr	p15, 0, r11, c2, c0, 2	@ TTB control register
174*4882a593Smuzhiyun	ldr	r4, =PRRR		@ PRRR
175*4882a593Smuzhiyun	ldr	r5, =NMRR		@ NMRR
176*4882a593Smuzhiyun	mcr	p15, 0, r4, c10, c2, 0	@ write PRRR
177*4882a593Smuzhiyun	mcr	p15, 0, r5, c10, c2, 1	@ write NMRR
178*4882a593Smuzhiyun#endif	/* CONFIG_MMU */
179*4882a593Smuzhiyun	mrc	p15, 0, r4, c1, c0, 1	@ Read Auxiliary control register
180*4882a593Smuzhiyun	teq	r4, r9			@ Is it already set?
181*4882a593Smuzhiyun	mcrne	p15, 0, r9, c1, c0, 1	@ No, so write it
182*4882a593Smuzhiyun	mcr	p15, 0, r10, c1, c0, 2	@ Co-processor access control
183*4882a593Smuzhiyun	isb
184*4882a593Smuzhiyun	dsb
185*4882a593Smuzhiyun	mov	r0, r8			@ control register
186*4882a593Smuzhiyun	b	cpu_resume_mmu
187*4882a593SmuzhiyunENDPROC(cpu_v7_do_resume)
188*4882a593Smuzhiyun#endif
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun.globl	cpu_ca9mp_suspend_size
191*4882a593Smuzhiyun.equ	cpu_ca9mp_suspend_size, cpu_v7_suspend_size + 4 * 2
192*4882a593Smuzhiyun#ifdef CONFIG_ARM_CPU_SUSPEND
193*4882a593SmuzhiyunENTRY(cpu_ca9mp_do_suspend)
194*4882a593Smuzhiyun	stmfd	sp!, {r4 - r5}
195*4882a593Smuzhiyun	mrc	p15, 0, r4, c15, c0, 1		@ Diagnostic register
196*4882a593Smuzhiyun	mrc	p15, 0, r5, c15, c0, 0		@ Power register
197*4882a593Smuzhiyun	stmia	r0!, {r4 - r5}
198*4882a593Smuzhiyun	ldmfd	sp!, {r4 - r5}
199*4882a593Smuzhiyun	b	cpu_v7_do_suspend
200*4882a593SmuzhiyunENDPROC(cpu_ca9mp_do_suspend)
201*4882a593Smuzhiyun
202*4882a593SmuzhiyunENTRY(cpu_ca9mp_do_resume)
203*4882a593Smuzhiyun	ldmia	r0!, {r4 - r5}
204*4882a593Smuzhiyun	mrc	p15, 0, r10, c15, c0, 1		@ Read Diagnostic register
205*4882a593Smuzhiyun	teq	r4, r10				@ Already restored?
206*4882a593Smuzhiyun	mcrne	p15, 0, r4, c15, c0, 1		@ No, so restore it
207*4882a593Smuzhiyun	mrc	p15, 0, r10, c15, c0, 0		@ Read Power register
208*4882a593Smuzhiyun	teq	r5, r10				@ Already restored?
209*4882a593Smuzhiyun	mcrne	p15, 0, r5, c15, c0, 0		@ No, so restore it
210*4882a593Smuzhiyun	b	cpu_v7_do_resume
211*4882a593SmuzhiyunENDPROC(cpu_ca9mp_do_resume)
212*4882a593Smuzhiyun#endif
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun#ifdef CONFIG_CPU_PJ4B
215*4882a593Smuzhiyun	globl_equ	cpu_pj4b_switch_mm,     cpu_v7_switch_mm
216*4882a593Smuzhiyun	globl_equ	cpu_pj4b_set_pte_ext,	cpu_v7_set_pte_ext
217*4882a593Smuzhiyun	globl_equ	cpu_pj4b_proc_init,	cpu_v7_proc_init
218*4882a593Smuzhiyun	globl_equ	cpu_pj4b_proc_fin, 	cpu_v7_proc_fin
219*4882a593Smuzhiyun	globl_equ	cpu_pj4b_reset,	   	cpu_v7_reset
220*4882a593Smuzhiyun#ifdef CONFIG_PJ4B_ERRATA_4742
221*4882a593SmuzhiyunENTRY(cpu_pj4b_do_idle)
222*4882a593Smuzhiyun	dsb					@ WFI may enter a low-power mode
223*4882a593Smuzhiyun	wfi
224*4882a593Smuzhiyun	dsb					@barrier
225*4882a593Smuzhiyun	ret	lr
226*4882a593SmuzhiyunENDPROC(cpu_pj4b_do_idle)
227*4882a593Smuzhiyun#else
228*4882a593Smuzhiyun	globl_equ	cpu_pj4b_do_idle,  	cpu_v7_do_idle
229*4882a593Smuzhiyun#endif
230*4882a593Smuzhiyun	globl_equ	cpu_pj4b_dcache_clean_area,	cpu_v7_dcache_clean_area
231*4882a593Smuzhiyun#ifdef CONFIG_ARM_CPU_SUSPEND
232*4882a593SmuzhiyunENTRY(cpu_pj4b_do_suspend)
233*4882a593Smuzhiyun	stmfd	sp!, {r6 - r10}
234*4882a593Smuzhiyun	mrc	p15, 1, r6, c15, c1, 0  @ save CP15 - extra features
235*4882a593Smuzhiyun	mrc	p15, 1, r7, c15, c2, 0	@ save CP15 - Aux Func Modes Ctrl 0
236*4882a593Smuzhiyun	mrc	p15, 1, r8, c15, c1, 2	@ save CP15 - Aux Debug Modes Ctrl 2
237*4882a593Smuzhiyun	mrc	p15, 1, r9, c15, c1, 1  @ save CP15 - Aux Debug Modes Ctrl 1
238*4882a593Smuzhiyun	mrc	p15, 0, r10, c9, c14, 0  @ save CP15 - PMC
239*4882a593Smuzhiyun	stmia	r0!, {r6 - r10}
240*4882a593Smuzhiyun	ldmfd	sp!, {r6 - r10}
241*4882a593Smuzhiyun	b cpu_v7_do_suspend
242*4882a593SmuzhiyunENDPROC(cpu_pj4b_do_suspend)
243*4882a593Smuzhiyun
244*4882a593SmuzhiyunENTRY(cpu_pj4b_do_resume)
245*4882a593Smuzhiyun	ldmia	r0!, {r6 - r10}
246*4882a593Smuzhiyun	mcr	p15, 1, r6, c15, c1, 0  @ restore CP15 - extra features
247*4882a593Smuzhiyun	mcr	p15, 1, r7, c15, c2, 0	@ restore CP15 - Aux Func Modes Ctrl 0
248*4882a593Smuzhiyun	mcr	p15, 1, r8, c15, c1, 2	@ restore CP15 - Aux Debug Modes Ctrl 2
249*4882a593Smuzhiyun	mcr	p15, 1, r9, c15, c1, 1  @ restore CP15 - Aux Debug Modes Ctrl 1
250*4882a593Smuzhiyun	mcr	p15, 0, r10, c9, c14, 0  @ restore CP15 - PMC
251*4882a593Smuzhiyun	b cpu_v7_do_resume
252*4882a593SmuzhiyunENDPROC(cpu_pj4b_do_resume)
253*4882a593Smuzhiyun#endif
254*4882a593Smuzhiyun.globl	cpu_pj4b_suspend_size
255*4882a593Smuzhiyun.equ	cpu_pj4b_suspend_size, cpu_v7_suspend_size + 4 * 5
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun#endif
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun/*
260*4882a593Smuzhiyun *	__v7_setup
261*4882a593Smuzhiyun *
262*4882a593Smuzhiyun *	Initialise TLB, Caches, and MMU state ready to switch the MMU
263*4882a593Smuzhiyun *	on.  Return in r0 the new CP15 C1 control register setting.
264*4882a593Smuzhiyun *
265*4882a593Smuzhiyun *	r1, r2, r4, r5, r9, r13 must be preserved - r13 is not a stack
266*4882a593Smuzhiyun *	r4: TTBR0 (low word)
267*4882a593Smuzhiyun *	r5: TTBR0 (high word if LPAE)
268*4882a593Smuzhiyun *	r8: TTBR1
269*4882a593Smuzhiyun *	r9: Main ID register
270*4882a593Smuzhiyun *
271*4882a593Smuzhiyun *	This should be able to cover all ARMv7 cores.
272*4882a593Smuzhiyun *
273*4882a593Smuzhiyun *	It is assumed that:
274*4882a593Smuzhiyun *	- cache type register is implemented
275*4882a593Smuzhiyun */
276*4882a593Smuzhiyun__v7_ca5mp_setup:
277*4882a593Smuzhiyun__v7_ca9mp_setup:
278*4882a593Smuzhiyun__v7_cr7mp_setup:
279*4882a593Smuzhiyun__v7_cr8mp_setup:
280*4882a593Smuzhiyun	mov	r10, #(1 << 0)			@ Cache/TLB ops broadcasting
281*4882a593Smuzhiyun	b	1f
282*4882a593Smuzhiyun__v7_ca7mp_setup:
283*4882a593Smuzhiyun__v7_ca12mp_setup:
284*4882a593Smuzhiyun__v7_ca15mp_setup:
285*4882a593Smuzhiyun__v7_b15mp_setup:
286*4882a593Smuzhiyun__v7_ca17mp_setup:
287*4882a593Smuzhiyun	mov	r10, #0
288*4882a593Smuzhiyun1:	adr	r0, __v7_setup_stack_ptr
289*4882a593Smuzhiyun	ldr	r12, [r0]
290*4882a593Smuzhiyun	add	r12, r12, r0			@ the local stack
291*4882a593Smuzhiyun	stmia	r12, {r1-r6, lr}		@ v7_invalidate_l1 touches r0-r6
292*4882a593Smuzhiyun	bl      v7_invalidate_l1
293*4882a593Smuzhiyun	ldmia	r12, {r1-r6, lr}
294*4882a593Smuzhiyun#ifdef CONFIG_SMP
295*4882a593Smuzhiyun	orr	r10, r10, #(1 << 6)		@ Enable SMP/nAMP mode
296*4882a593Smuzhiyun	ALT_SMP(mrc	p15, 0, r0, c1, c0, 1)
297*4882a593Smuzhiyun	ALT_UP(mov	r0, r10)		@ fake it for UP
298*4882a593Smuzhiyun	orr	r10, r10, r0			@ Set required bits
299*4882a593Smuzhiyun	teq	r10, r0				@ Were they already set?
300*4882a593Smuzhiyun	mcrne	p15, 0, r10, c1, c0, 1		@ No, update register
301*4882a593Smuzhiyun#endif
302*4882a593Smuzhiyun	b	__v7_setup_cont
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun/*
305*4882a593Smuzhiyun * Errata:
306*4882a593Smuzhiyun *  r0, r10 available for use
307*4882a593Smuzhiyun *  r1, r2, r4, r5, r9, r13: must be preserved
308*4882a593Smuzhiyun *  r3: contains MIDR rX number in bits 23-20
309*4882a593Smuzhiyun *  r6: contains MIDR rXpY as 8-bit XY number
310*4882a593Smuzhiyun *  r9: MIDR
311*4882a593Smuzhiyun */
312*4882a593Smuzhiyun__ca8_errata:
313*4882a593Smuzhiyun#if defined(CONFIG_ARM_ERRATA_430973) && !defined(CONFIG_ARCH_MULTIPLATFORM)
314*4882a593Smuzhiyun	teq	r3, #0x00100000			@ only present in r1p*
315*4882a593Smuzhiyun	mrceq	p15, 0, r0, c1, c0, 1		@ read aux control register
316*4882a593Smuzhiyun	orreq	r0, r0, #(1 << 6)		@ set IBE to 1
317*4882a593Smuzhiyun	mcreq	p15, 0, r0, c1, c0, 1		@ write aux control register
318*4882a593Smuzhiyun#endif
319*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_458693
320*4882a593Smuzhiyun	teq	r6, #0x20			@ only present in r2p0
321*4882a593Smuzhiyun	mrceq	p15, 0, r0, c1, c0, 1		@ read aux control register
322*4882a593Smuzhiyun	orreq	r0, r0, #(1 << 5)		@ set L1NEON to 1
323*4882a593Smuzhiyun	orreq	r0, r0, #(1 << 9)		@ set PLDNOP to 1
324*4882a593Smuzhiyun	mcreq	p15, 0, r0, c1, c0, 1		@ write aux control register
325*4882a593Smuzhiyun#endif
326*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_460075
327*4882a593Smuzhiyun	teq	r6, #0x20			@ only present in r2p0
328*4882a593Smuzhiyun	mrceq	p15, 1, r0, c9, c0, 2		@ read L2 cache aux ctrl register
329*4882a593Smuzhiyun	tsteq	r0, #1 << 22
330*4882a593Smuzhiyun	orreq	r0, r0, #(1 << 22)		@ set the Write Allocate disable bit
331*4882a593Smuzhiyun	mcreq	p15, 1, r0, c9, c0, 2		@ write the L2 cache aux ctrl register
332*4882a593Smuzhiyun#endif
333*4882a593Smuzhiyun	b	__errata_finish
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun__ca9_errata:
336*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_742230
337*4882a593Smuzhiyun	cmp	r6, #0x22			@ only present up to r2p2
338*4882a593Smuzhiyun	mrcle	p15, 0, r0, c15, c0, 1		@ read diagnostic register
339*4882a593Smuzhiyun	orrle	r0, r0, #1 << 4			@ set bit #4
340*4882a593Smuzhiyun	mcrle	p15, 0, r0, c15, c0, 1		@ write diagnostic register
341*4882a593Smuzhiyun#endif
342*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_742231
343*4882a593Smuzhiyun	teq	r6, #0x20			@ present in r2p0
344*4882a593Smuzhiyun	teqne	r6, #0x21			@ present in r2p1
345*4882a593Smuzhiyun	teqne	r6, #0x22			@ present in r2p2
346*4882a593Smuzhiyun	mrceq	p15, 0, r0, c15, c0, 1		@ read diagnostic register
347*4882a593Smuzhiyun	orreq	r0, r0, #1 << 12		@ set bit #12
348*4882a593Smuzhiyun	orreq	r0, r0, #1 << 22		@ set bit #22
349*4882a593Smuzhiyun	mcreq	p15, 0, r0, c15, c0, 1		@ write diagnostic register
350*4882a593Smuzhiyun#endif
351*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_743622
352*4882a593Smuzhiyun	teq	r3, #0x00200000			@ only present in r2p*
353*4882a593Smuzhiyun	mrceq	p15, 0, r0, c15, c0, 1		@ read diagnostic register
354*4882a593Smuzhiyun	orreq	r0, r0, #1 << 6			@ set bit #6
355*4882a593Smuzhiyun	mcreq	p15, 0, r0, c15, c0, 1		@ write diagnostic register
356*4882a593Smuzhiyun#endif
357*4882a593Smuzhiyun#if defined(CONFIG_ARM_ERRATA_751472) && defined(CONFIG_SMP)
358*4882a593Smuzhiyun	ALT_SMP(cmp r6, #0x30)			@ present prior to r3p0
359*4882a593Smuzhiyun	ALT_UP_B(1f)
360*4882a593Smuzhiyun	mrclt	p15, 0, r0, c15, c0, 1		@ read diagnostic register
361*4882a593Smuzhiyun	orrlt	r0, r0, #1 << 11		@ set bit #11
362*4882a593Smuzhiyun	mcrlt	p15, 0, r0, c15, c0, 1		@ write diagnostic register
363*4882a593Smuzhiyun1:
364*4882a593Smuzhiyun#endif
365*4882a593Smuzhiyun	b	__errata_finish
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun__ca15_errata:
368*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_773022
369*4882a593Smuzhiyun	cmp	r6, #0x4			@ only present up to r0p4
370*4882a593Smuzhiyun	mrcle	p15, 0, r0, c1, c0, 1		@ read aux control register
371*4882a593Smuzhiyun	orrle	r0, r0, #1 << 1			@ disable loop buffer
372*4882a593Smuzhiyun	mcrle	p15, 0, r0, c1, c0, 1		@ write aux control register
373*4882a593Smuzhiyun#endif
374*4882a593Smuzhiyun	b	__errata_finish
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun__ca12_errata:
377*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_818325_852422
378*4882a593Smuzhiyun	mrc	p15, 0, r10, c15, c0, 1		@ read diagnostic register
379*4882a593Smuzhiyun	orr	r10, r10, #1 << 12		@ set bit #12
380*4882a593Smuzhiyun	mcr	p15, 0, r10, c15, c0, 1		@ write diagnostic register
381*4882a593Smuzhiyun#endif
382*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_821420
383*4882a593Smuzhiyun	mrc	p15, 0, r10, c15, c0, 2		@ read internal feature reg
384*4882a593Smuzhiyun	orr	r10, r10, #1 << 1		@ set bit #1
385*4882a593Smuzhiyun	mcr	p15, 0, r10, c15, c0, 2		@ write internal feature reg
386*4882a593Smuzhiyun#endif
387*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_825619
388*4882a593Smuzhiyun	mrc	p15, 0, r10, c15, c0, 1		@ read diagnostic register
389*4882a593Smuzhiyun	orr	r10, r10, #1 << 24		@ set bit #24
390*4882a593Smuzhiyun	mcr	p15, 0, r10, c15, c0, 1		@ write diagnostic register
391*4882a593Smuzhiyun#endif
392*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_857271
393*4882a593Smuzhiyun	mrc	p15, 0, r10, c15, c0, 1		@ read diagnostic register
394*4882a593Smuzhiyun	orr	r10, r10, #3 << 10		@ set bits #10 and #11
395*4882a593Smuzhiyun	mcr	p15, 0, r10, c15, c0, 1		@ write diagnostic register
396*4882a593Smuzhiyun#endif
397*4882a593Smuzhiyun	b	__errata_finish
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun__ca17_errata:
400*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_852421
401*4882a593Smuzhiyun	cmp	r6, #0x12			@ only present up to r1p2
402*4882a593Smuzhiyun	mrcle	p15, 0, r10, c15, c0, 1		@ read diagnostic register
403*4882a593Smuzhiyun	orrle	r10, r10, #1 << 24		@ set bit #24
404*4882a593Smuzhiyun	mcrle	p15, 0, r10, c15, c0, 1		@ write diagnostic register
405*4882a593Smuzhiyun#endif
406*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_852423
407*4882a593Smuzhiyun	cmp	r6, #0x12			@ only present up to r1p2
408*4882a593Smuzhiyun	mrcle	p15, 0, r10, c15, c0, 1		@ read diagnostic register
409*4882a593Smuzhiyun	orrle	r10, r10, #1 << 12		@ set bit #12
410*4882a593Smuzhiyun	mcrle	p15, 0, r10, c15, c0, 1		@ write diagnostic register
411*4882a593Smuzhiyun#endif
412*4882a593Smuzhiyun#ifdef CONFIG_ARM_ERRATA_857272
413*4882a593Smuzhiyun	mrc	p15, 0, r10, c15, c0, 1		@ read diagnostic register
414*4882a593Smuzhiyun	orr	r10, r10, #3 << 10		@ set bits #10 and #11
415*4882a593Smuzhiyun	mcr	p15, 0, r10, c15, c0, 1		@ write diagnostic register
416*4882a593Smuzhiyun#endif
417*4882a593Smuzhiyun	b	__errata_finish
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun__v7_pj4b_setup:
420*4882a593Smuzhiyun#ifdef CONFIG_CPU_PJ4B
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun/* Auxiliary Debug Modes Control 1 Register */
423*4882a593Smuzhiyun#define PJ4B_STATIC_BP (1 << 2) /* Enable Static BP */
424*4882a593Smuzhiyun#define PJ4B_INTER_PARITY (1 << 8) /* Disable Internal Parity Handling */
425*4882a593Smuzhiyun#define PJ4B_CLEAN_LINE (1 << 16) /* Disable data transfer for clean line */
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun/* Auxiliary Debug Modes Control 2 Register */
428*4882a593Smuzhiyun#define PJ4B_FAST_LDR (1 << 23) /* Disable fast LDR */
429*4882a593Smuzhiyun#define PJ4B_SNOOP_DATA (1 << 25) /* Do not interleave write and snoop data */
430*4882a593Smuzhiyun#define PJ4B_CWF (1 << 27) /* Disable Critical Word First feature */
431*4882a593Smuzhiyun#define PJ4B_OUTSDNG_NC (1 << 29) /* Disable outstanding non cacheable rqst */
432*4882a593Smuzhiyun#define PJ4B_L1_REP_RR (1 << 30) /* L1 replacement - Strict round robin */
433*4882a593Smuzhiyun#define PJ4B_AUX_DBG_CTRL2 (PJ4B_SNOOP_DATA | PJ4B_CWF |\
434*4882a593Smuzhiyun			    PJ4B_OUTSDNG_NC | PJ4B_L1_REP_RR)
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun/* Auxiliary Functional Modes Control Register 0 */
437*4882a593Smuzhiyun#define PJ4B_SMP_CFB (1 << 1) /* Set SMP mode. Join the coherency fabric */
438*4882a593Smuzhiyun#define PJ4B_L1_PAR_CHK (1 << 2) /* Support L1 parity checking */
439*4882a593Smuzhiyun#define PJ4B_BROADCAST_CACHE (1 << 8) /* Broadcast Cache and TLB maintenance */
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun/* Auxiliary Debug Modes Control 0 Register */
442*4882a593Smuzhiyun#define PJ4B_WFI_WFE (1 << 22) /* WFI/WFE - serve the DVM and back to idle */
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun	/* Auxiliary Debug Modes Control 1 Register */
445*4882a593Smuzhiyun	mrc	p15, 1,	r0, c15, c1, 1
446*4882a593Smuzhiyun	orr     r0, r0, #PJ4B_CLEAN_LINE
447*4882a593Smuzhiyun	orr     r0, r0, #PJ4B_INTER_PARITY
448*4882a593Smuzhiyun	bic	r0, r0, #PJ4B_STATIC_BP
449*4882a593Smuzhiyun	mcr	p15, 1,	r0, c15, c1, 1
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun	/* Auxiliary Debug Modes Control 2 Register */
452*4882a593Smuzhiyun	mrc	p15, 1,	r0, c15, c1, 2
453*4882a593Smuzhiyun	bic	r0, r0, #PJ4B_FAST_LDR
454*4882a593Smuzhiyun	orr	r0, r0, #PJ4B_AUX_DBG_CTRL2
455*4882a593Smuzhiyun	mcr	p15, 1,	r0, c15, c1, 2
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun	/* Auxiliary Functional Modes Control Register 0 */
458*4882a593Smuzhiyun	mrc	p15, 1,	r0, c15, c2, 0
459*4882a593Smuzhiyun#ifdef CONFIG_SMP
460*4882a593Smuzhiyun	orr	r0, r0, #PJ4B_SMP_CFB
461*4882a593Smuzhiyun#endif
462*4882a593Smuzhiyun	orr	r0, r0, #PJ4B_L1_PAR_CHK
463*4882a593Smuzhiyun	orr	r0, r0, #PJ4B_BROADCAST_CACHE
464*4882a593Smuzhiyun	mcr	p15, 1,	r0, c15, c2, 0
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun	/* Auxiliary Debug Modes Control 0 Register */
467*4882a593Smuzhiyun	mrc	p15, 1,	r0, c15, c1, 0
468*4882a593Smuzhiyun	orr	r0, r0, #PJ4B_WFI_WFE
469*4882a593Smuzhiyun	mcr	p15, 1,	r0, c15, c1, 0
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun#endif /* CONFIG_CPU_PJ4B */
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun__v7_setup:
474*4882a593Smuzhiyun	adr	r0, __v7_setup_stack_ptr
475*4882a593Smuzhiyun	ldr	r12, [r0]
476*4882a593Smuzhiyun	add	r12, r12, r0			@ the local stack
477*4882a593Smuzhiyun	stmia	r12, {r1-r6, lr}		@ v7_invalidate_l1 touches r0-r6
478*4882a593Smuzhiyun	bl      v7_invalidate_l1
479*4882a593Smuzhiyun	ldmia	r12, {r1-r6, lr}
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun__v7_setup_cont:
482*4882a593Smuzhiyun	and	r0, r9, #0xff000000		@ ARM?
483*4882a593Smuzhiyun	teq	r0, #0x41000000
484*4882a593Smuzhiyun	bne	__errata_finish
485*4882a593Smuzhiyun	and	r3, r9, #0x00f00000		@ variant
486*4882a593Smuzhiyun	and	r6, r9, #0x0000000f		@ revision
487*4882a593Smuzhiyun	orr	r6, r6, r3, lsr #20-4		@ combine variant and revision
488*4882a593Smuzhiyun	ubfx	r0, r9, #4, #12			@ primary part number
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun	/* Cortex-A8 Errata */
491*4882a593Smuzhiyun	ldr	r10, =0x00000c08		@ Cortex-A8 primary part number
492*4882a593Smuzhiyun	teq	r0, r10
493*4882a593Smuzhiyun	beq	__ca8_errata
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun	/* Cortex-A9 Errata */
496*4882a593Smuzhiyun	ldr	r10, =0x00000c09		@ Cortex-A9 primary part number
497*4882a593Smuzhiyun	teq	r0, r10
498*4882a593Smuzhiyun	beq	__ca9_errata
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun	/* Cortex-A12 Errata */
501*4882a593Smuzhiyun	ldr	r10, =0x00000c0d		@ Cortex-A12 primary part number
502*4882a593Smuzhiyun	teq	r0, r10
503*4882a593Smuzhiyun	beq	__ca12_errata
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun	/* Cortex-A17 Errata */
506*4882a593Smuzhiyun	ldr	r10, =0x00000c0e		@ Cortex-A17 primary part number
507*4882a593Smuzhiyun	teq	r0, r10
508*4882a593Smuzhiyun	beq	__ca17_errata
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun	/* Cortex-A15 Errata */
511*4882a593Smuzhiyun	ldr	r10, =0x00000c0f		@ Cortex-A15 primary part number
512*4882a593Smuzhiyun	teq	r0, r10
513*4882a593Smuzhiyun	beq	__ca15_errata
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun__errata_finish:
516*4882a593Smuzhiyun	mov	r10, #0
517*4882a593Smuzhiyun	mcr	p15, 0, r10, c7, c5, 0		@ I+BTB cache invalidate
518*4882a593Smuzhiyun#ifdef CONFIG_MMU
519*4882a593Smuzhiyun	mcr	p15, 0, r10, c8, c7, 0		@ invalidate I + D TLBs
520*4882a593Smuzhiyun	v7_ttb_setup r10, r4, r5, r8, r3	@ TTBCR, TTBRx setup
521*4882a593Smuzhiyun	ldr	r3, =PRRR			@ PRRR
522*4882a593Smuzhiyun	ldr	r6, =NMRR			@ NMRR
523*4882a593Smuzhiyun	mcr	p15, 0, r3, c10, c2, 0		@ write PRRR
524*4882a593Smuzhiyun	mcr	p15, 0, r6, c10, c2, 1		@ write NMRR
525*4882a593Smuzhiyun#endif
526*4882a593Smuzhiyun	dsb					@ Complete invalidations
527*4882a593Smuzhiyun#ifndef CONFIG_ARM_THUMBEE
528*4882a593Smuzhiyun	mrc	p15, 0, r0, c0, c1, 0		@ read ID_PFR0 for ThumbEE
529*4882a593Smuzhiyun	and	r0, r0, #(0xf << 12)		@ ThumbEE enabled field
530*4882a593Smuzhiyun	teq	r0, #(1 << 12)			@ check if ThumbEE is present
531*4882a593Smuzhiyun	bne	1f
532*4882a593Smuzhiyun	mov	r3, #0
533*4882a593Smuzhiyun	mcr	p14, 6, r3, c1, c0, 0		@ Initialize TEEHBR to 0
534*4882a593Smuzhiyun	mrc	p14, 6, r0, c0, c0, 0		@ load TEECR
535*4882a593Smuzhiyun	orr	r0, r0, #1			@ set the 1st bit in order to
536*4882a593Smuzhiyun	mcr	p14, 6, r0, c0, c0, 0		@ stop userspace TEEHBR access
537*4882a593Smuzhiyun1:
538*4882a593Smuzhiyun#endif
539*4882a593Smuzhiyun	adr	r3, v7_crval
540*4882a593Smuzhiyun	ldmia	r3, {r3, r6}
541*4882a593Smuzhiyun ARM_BE8(orr	r6, r6, #1 << 25)		@ big-endian page tables
542*4882a593Smuzhiyun#ifdef CONFIG_SWP_EMULATE
543*4882a593Smuzhiyun	orr     r3, r3, #(1 << 10)              @ set SW bit in "clear"
544*4882a593Smuzhiyun	bic     r6, r6, #(1 << 10)              @ clear it in "mmuset"
545*4882a593Smuzhiyun#endif
546*4882a593Smuzhiyun   	mrc	p15, 0, r0, c1, c0, 0		@ read control register
547*4882a593Smuzhiyun	bic	r0, r0, r3			@ clear bits them
548*4882a593Smuzhiyun	orr	r0, r0, r6			@ set them
549*4882a593Smuzhiyun THUMB(	orr	r0, r0, #1 << 30	)	@ Thumb exceptions
550*4882a593Smuzhiyun	ret	lr				@ return to head.S:__ret
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun	.align	2
553*4882a593Smuzhiyun__v7_setup_stack_ptr:
554*4882a593Smuzhiyun	.word	PHYS_RELATIVE(__v7_setup_stack, .)
555*4882a593SmuzhiyunENDPROC(__v7_setup)
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun	.bss
558*4882a593Smuzhiyun	.align	2
559*4882a593Smuzhiyun__v7_setup_stack:
560*4882a593Smuzhiyun	.space	4 * 7				@ 7 registers
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun	__INITDATA
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun	.weak cpu_v7_bugs_init
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun	@ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
567*4882a593Smuzhiyun	define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_bugs_init
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
570*4882a593Smuzhiyun	@ generic v7 bpiall on context switch
571*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_proc_init,	cpu_v7_proc_init
572*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_proc_fin,		cpu_v7_proc_fin
573*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_reset,		cpu_v7_reset
574*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_do_idle,		cpu_v7_do_idle
575*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_dcache_clean_area, cpu_v7_dcache_clean_area
576*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_set_pte_ext,	cpu_v7_set_pte_ext
577*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_suspend_size,	cpu_v7_suspend_size
578*4882a593Smuzhiyun#ifdef CONFIG_ARM_CPU_SUSPEND
579*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_do_suspend,	cpu_v7_do_suspend
580*4882a593Smuzhiyun	globl_equ	cpu_v7_bpiall_do_resume,	cpu_v7_do_resume
581*4882a593Smuzhiyun#endif
582*4882a593Smuzhiyun	define_processor_functions v7_bpiall, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_bugs_init
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun#define HARDENED_BPIALL_PROCESSOR_FUNCTIONS v7_bpiall_processor_functions
585*4882a593Smuzhiyun#else
586*4882a593Smuzhiyun#define HARDENED_BPIALL_PROCESSOR_FUNCTIONS v7_processor_functions
587*4882a593Smuzhiyun#endif
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun#ifndef CONFIG_ARM_LPAE
590*4882a593Smuzhiyun	@ Cortex-A8 - always needs bpiall switch_mm implementation
591*4882a593Smuzhiyun	globl_equ	cpu_ca8_proc_init,	cpu_v7_proc_init
592*4882a593Smuzhiyun	globl_equ	cpu_ca8_proc_fin,	cpu_v7_proc_fin
593*4882a593Smuzhiyun	globl_equ	cpu_ca8_reset,		cpu_v7_reset
594*4882a593Smuzhiyun	globl_equ	cpu_ca8_do_idle,	cpu_v7_do_idle
595*4882a593Smuzhiyun	globl_equ	cpu_ca8_dcache_clean_area, cpu_v7_dcache_clean_area
596*4882a593Smuzhiyun	globl_equ	cpu_ca8_set_pte_ext,	cpu_v7_set_pte_ext
597*4882a593Smuzhiyun	globl_equ	cpu_ca8_switch_mm,	cpu_v7_bpiall_switch_mm
598*4882a593Smuzhiyun	globl_equ	cpu_ca8_suspend_size,	cpu_v7_suspend_size
599*4882a593Smuzhiyun#ifdef CONFIG_ARM_CPU_SUSPEND
600*4882a593Smuzhiyun	globl_equ	cpu_ca8_do_suspend,	cpu_v7_do_suspend
601*4882a593Smuzhiyun	globl_equ	cpu_ca8_do_resume,	cpu_v7_do_resume
602*4882a593Smuzhiyun#endif
603*4882a593Smuzhiyun	define_processor_functions ca8, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_ca8_ibe
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun	@ Cortex-A9 - needs more registers preserved across suspend/resume
606*4882a593Smuzhiyun	@ and bpiall switch_mm for hardening
607*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_proc_init,	cpu_v7_proc_init
608*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_proc_fin,	cpu_v7_proc_fin
609*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_reset,	cpu_v7_reset
610*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_do_idle,	cpu_v7_do_idle
611*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_dcache_clean_area, cpu_v7_dcache_clean_area
612*4882a593Smuzhiyun#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
613*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_switch_mm,	cpu_v7_bpiall_switch_mm
614*4882a593Smuzhiyun#else
615*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_switch_mm,	cpu_v7_switch_mm
616*4882a593Smuzhiyun#endif
617*4882a593Smuzhiyun	globl_equ	cpu_ca9mp_set_pte_ext,	cpu_v7_set_pte_ext
618*4882a593Smuzhiyun	define_processor_functions ca9mp, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_bugs_init
619*4882a593Smuzhiyun#endif
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun	@ Cortex-A15 - needs iciallu switch_mm for hardening
622*4882a593Smuzhiyun	globl_equ	cpu_ca15_proc_init,	cpu_v7_proc_init
623*4882a593Smuzhiyun	globl_equ	cpu_ca15_proc_fin,	cpu_v7_proc_fin
624*4882a593Smuzhiyun	globl_equ	cpu_ca15_reset,		cpu_v7_reset
625*4882a593Smuzhiyun	globl_equ	cpu_ca15_do_idle,	cpu_v7_do_idle
626*4882a593Smuzhiyun	globl_equ	cpu_ca15_dcache_clean_area, cpu_v7_dcache_clean_area
627*4882a593Smuzhiyun#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
628*4882a593Smuzhiyun	globl_equ	cpu_ca15_switch_mm,	cpu_v7_iciallu_switch_mm
629*4882a593Smuzhiyun#else
630*4882a593Smuzhiyun	globl_equ	cpu_ca15_switch_mm,	cpu_v7_switch_mm
631*4882a593Smuzhiyun#endif
632*4882a593Smuzhiyun	globl_equ	cpu_ca15_set_pte_ext,	cpu_v7_set_pte_ext
633*4882a593Smuzhiyun	globl_equ	cpu_ca15_suspend_size,	cpu_v7_suspend_size
634*4882a593Smuzhiyun	globl_equ	cpu_ca15_do_suspend,	cpu_v7_do_suspend
635*4882a593Smuzhiyun	globl_equ	cpu_ca15_do_resume,	cpu_v7_do_resume
636*4882a593Smuzhiyun	define_processor_functions ca15, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_ca15_ibe
637*4882a593Smuzhiyun#ifdef CONFIG_CPU_PJ4B
638*4882a593Smuzhiyun	define_processor_functions pj4b, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
639*4882a593Smuzhiyun#endif
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun	.section ".rodata"
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun	string	cpu_arch_name, "armv7"
644*4882a593Smuzhiyun	string	cpu_elf_name, "v7"
645*4882a593Smuzhiyun	.align
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun	.section ".proc.info.init", "a"
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun	/*
650*4882a593Smuzhiyun	 * Standard v7 proc info content
651*4882a593Smuzhiyun	 */
652*4882a593Smuzhiyun.macro __v7_proc name, initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0, proc_fns = v7_processor_functions, cache_fns = v7_cache_fns
653*4882a593Smuzhiyun	ALT_SMP(.long	PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
654*4882a593Smuzhiyun			PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags)
655*4882a593Smuzhiyun	ALT_UP(.long	PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
656*4882a593Smuzhiyun			PMD_SECT_AF | PMD_FLAGS_UP | \mm_mmuflags)
657*4882a593Smuzhiyun	.long	PMD_TYPE_SECT | PMD_SECT_AP_WRITE | \
658*4882a593Smuzhiyun		PMD_SECT_AP_READ | PMD_SECT_AF | \io_mmuflags
659*4882a593Smuzhiyun	initfn	\initfunc, \name
660*4882a593Smuzhiyun	.long	cpu_arch_name
661*4882a593Smuzhiyun	.long	cpu_elf_name
662*4882a593Smuzhiyun	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \
663*4882a593Smuzhiyun		HWCAP_EDSP | HWCAP_TLS | \hwcaps
664*4882a593Smuzhiyun	.long	cpu_v7_name
665*4882a593Smuzhiyun	.long	\proc_fns
666*4882a593Smuzhiyun	.long	v7wbi_tlb_fns
667*4882a593Smuzhiyun	.long	v6_user_fns
668*4882a593Smuzhiyun	.long	\cache_fns
669*4882a593Smuzhiyun.endm
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun#ifndef CONFIG_ARM_LPAE
672*4882a593Smuzhiyun	/*
673*4882a593Smuzhiyun	 * ARM Ltd. Cortex A5 processor.
674*4882a593Smuzhiyun	 */
675*4882a593Smuzhiyun	.type   __v7_ca5mp_proc_info, #object
676*4882a593Smuzhiyun__v7_ca5mp_proc_info:
677*4882a593Smuzhiyun	.long	0x410fc050
678*4882a593Smuzhiyun	.long	0xff0ffff0
679*4882a593Smuzhiyun	__v7_proc __v7_ca5mp_proc_info, __v7_ca5mp_setup
680*4882a593Smuzhiyun	.size	__v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun	/*
683*4882a593Smuzhiyun	 * ARM Ltd. Cortex A9 processor.
684*4882a593Smuzhiyun	 */
685*4882a593Smuzhiyun	.type   __v7_ca9mp_proc_info, #object
686*4882a593Smuzhiyun__v7_ca9mp_proc_info:
687*4882a593Smuzhiyun	.long	0x410fc090
688*4882a593Smuzhiyun	.long	0xff0ffff0
689*4882a593Smuzhiyun	__v7_proc __v7_ca9mp_proc_info, __v7_ca9mp_setup, proc_fns = ca9mp_processor_functions
690*4882a593Smuzhiyun	.size	__v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun	/*
693*4882a593Smuzhiyun	 * ARM Ltd. Cortex A8 processor.
694*4882a593Smuzhiyun	 */
695*4882a593Smuzhiyun	.type	__v7_ca8_proc_info, #object
696*4882a593Smuzhiyun__v7_ca8_proc_info:
697*4882a593Smuzhiyun	.long	0x410fc080
698*4882a593Smuzhiyun	.long	0xff0ffff0
699*4882a593Smuzhiyun	__v7_proc __v7_ca8_proc_info, __v7_setup, proc_fns = ca8_processor_functions
700*4882a593Smuzhiyun	.size	__v7_ca8_proc_info, . - __v7_ca8_proc_info
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun#endif	/* CONFIG_ARM_LPAE */
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun	/*
705*4882a593Smuzhiyun	 * Marvell PJ4B processor.
706*4882a593Smuzhiyun	 */
707*4882a593Smuzhiyun#ifdef CONFIG_CPU_PJ4B
708*4882a593Smuzhiyun	.type   __v7_pj4b_proc_info, #object
709*4882a593Smuzhiyun__v7_pj4b_proc_info:
710*4882a593Smuzhiyun	.long	0x560f5800
711*4882a593Smuzhiyun	.long	0xff0fff00
712*4882a593Smuzhiyun	__v7_proc __v7_pj4b_proc_info, __v7_pj4b_setup, proc_fns = pj4b_processor_functions
713*4882a593Smuzhiyun	.size	__v7_pj4b_proc_info, . - __v7_pj4b_proc_info
714*4882a593Smuzhiyun#endif
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun	/*
717*4882a593Smuzhiyun	 * ARM Ltd. Cortex R7 processor.
718*4882a593Smuzhiyun	 */
719*4882a593Smuzhiyun	.type	__v7_cr7mp_proc_info, #object
720*4882a593Smuzhiyun__v7_cr7mp_proc_info:
721*4882a593Smuzhiyun	.long	0x410fc170
722*4882a593Smuzhiyun	.long	0xff0ffff0
723*4882a593Smuzhiyun	__v7_proc __v7_cr7mp_proc_info, __v7_cr7mp_setup
724*4882a593Smuzhiyun	.size	__v7_cr7mp_proc_info, . - __v7_cr7mp_proc_info
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun	/*
727*4882a593Smuzhiyun	 * ARM Ltd. Cortex R8 processor.
728*4882a593Smuzhiyun	 */
729*4882a593Smuzhiyun	.type	__v7_cr8mp_proc_info, #object
730*4882a593Smuzhiyun__v7_cr8mp_proc_info:
731*4882a593Smuzhiyun	.long	0x410fc180
732*4882a593Smuzhiyun	.long	0xff0ffff0
733*4882a593Smuzhiyun	__v7_proc __v7_cr8mp_proc_info, __v7_cr8mp_setup
734*4882a593Smuzhiyun	.size	__v7_cr8mp_proc_info, . - __v7_cr8mp_proc_info
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun	/*
737*4882a593Smuzhiyun	 * ARM Ltd. Cortex A7 processor.
738*4882a593Smuzhiyun	 */
739*4882a593Smuzhiyun	.type	__v7_ca7mp_proc_info, #object
740*4882a593Smuzhiyun__v7_ca7mp_proc_info:
741*4882a593Smuzhiyun	.long	0x410fc070
742*4882a593Smuzhiyun	.long	0xff0ffff0
743*4882a593Smuzhiyun	__v7_proc __v7_ca7mp_proc_info, __v7_ca7mp_setup
744*4882a593Smuzhiyun	.size	__v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun	/*
747*4882a593Smuzhiyun	 * ARM Ltd. Cortex A12 processor.
748*4882a593Smuzhiyun	 */
749*4882a593Smuzhiyun	.type	__v7_ca12mp_proc_info, #object
750*4882a593Smuzhiyun__v7_ca12mp_proc_info:
751*4882a593Smuzhiyun	.long	0x410fc0d0
752*4882a593Smuzhiyun	.long	0xff0ffff0
753*4882a593Smuzhiyun	__v7_proc __v7_ca12mp_proc_info, __v7_ca12mp_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
754*4882a593Smuzhiyun	.size	__v7_ca12mp_proc_info, . - __v7_ca12mp_proc_info
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun	/*
757*4882a593Smuzhiyun	 * ARM Ltd. Cortex A15 processor.
758*4882a593Smuzhiyun	 */
759*4882a593Smuzhiyun	.type	__v7_ca15mp_proc_info, #object
760*4882a593Smuzhiyun__v7_ca15mp_proc_info:
761*4882a593Smuzhiyun	.long	0x410fc0f0
762*4882a593Smuzhiyun	.long	0xff0ffff0
763*4882a593Smuzhiyun	__v7_proc __v7_ca15mp_proc_info, __v7_ca15mp_setup, proc_fns = ca15_processor_functions
764*4882a593Smuzhiyun	.size	__v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun	/*
767*4882a593Smuzhiyun	 * Broadcom Corporation Brahma-B15 processor.
768*4882a593Smuzhiyun	 */
769*4882a593Smuzhiyun	.type	__v7_b15mp_proc_info, #object
770*4882a593Smuzhiyun__v7_b15mp_proc_info:
771*4882a593Smuzhiyun	.long	0x420f00f0
772*4882a593Smuzhiyun	.long	0xff0ffff0
773*4882a593Smuzhiyun	__v7_proc __v7_b15mp_proc_info, __v7_b15mp_setup, proc_fns = ca15_processor_functions, cache_fns = b15_cache_fns
774*4882a593Smuzhiyun	.size	__v7_b15mp_proc_info, . - __v7_b15mp_proc_info
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun	/*
777*4882a593Smuzhiyun	 * ARM Ltd. Cortex A17 processor.
778*4882a593Smuzhiyun	 */
779*4882a593Smuzhiyun	.type	__v7_ca17mp_proc_info, #object
780*4882a593Smuzhiyun__v7_ca17mp_proc_info:
781*4882a593Smuzhiyun	.long	0x410fc0e0
782*4882a593Smuzhiyun	.long	0xff0ffff0
783*4882a593Smuzhiyun	__v7_proc __v7_ca17mp_proc_info, __v7_ca17mp_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
784*4882a593Smuzhiyun	.size	__v7_ca17mp_proc_info, . - __v7_ca17mp_proc_info
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun	/* ARM Ltd. Cortex A73 processor */
787*4882a593Smuzhiyun	.type	__v7_ca73_proc_info, #object
788*4882a593Smuzhiyun__v7_ca73_proc_info:
789*4882a593Smuzhiyun	.long	0x410fd090
790*4882a593Smuzhiyun	.long	0xff0ffff0
791*4882a593Smuzhiyun	__v7_proc __v7_ca73_proc_info, __v7_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
792*4882a593Smuzhiyun	.size	__v7_ca73_proc_info, . - __v7_ca73_proc_info
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun	/* ARM Ltd. Cortex A75 processor */
795*4882a593Smuzhiyun	.type	__v7_ca75_proc_info, #object
796*4882a593Smuzhiyun__v7_ca75_proc_info:
797*4882a593Smuzhiyun	.long	0x410fd0a0
798*4882a593Smuzhiyun	.long	0xff0ffff0
799*4882a593Smuzhiyun	__v7_proc __v7_ca75_proc_info, __v7_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
800*4882a593Smuzhiyun	.size	__v7_ca75_proc_info, . - __v7_ca75_proc_info
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun	/*
803*4882a593Smuzhiyun	 * Qualcomm Inc. Krait processors.
804*4882a593Smuzhiyun	 */
805*4882a593Smuzhiyun	.type	__krait_proc_info, #object
806*4882a593Smuzhiyun__krait_proc_info:
807*4882a593Smuzhiyun	.long	0x510f0400		@ Required ID value
808*4882a593Smuzhiyun	.long	0xff0ffc00		@ Mask for ID
809*4882a593Smuzhiyun	/*
810*4882a593Smuzhiyun	 * Some Krait processors don't indicate support for SDIV and UDIV
811*4882a593Smuzhiyun	 * instructions in the ARM instruction set, even though they actually
812*4882a593Smuzhiyun	 * do support them. They also don't indicate support for fused multiply
813*4882a593Smuzhiyun	 * instructions even though they actually do support them.
814*4882a593Smuzhiyun	 */
815*4882a593Smuzhiyun	__v7_proc __krait_proc_info, __v7_setup, hwcaps = HWCAP_IDIV | HWCAP_VFPv4
816*4882a593Smuzhiyun	.size	__krait_proc_info, . - __krait_proc_info
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun	/*
819*4882a593Smuzhiyun	 * Match any ARMv7 processor core.
820*4882a593Smuzhiyun	 */
821*4882a593Smuzhiyun	.type	__v7_proc_info, #object
822*4882a593Smuzhiyun__v7_proc_info:
823*4882a593Smuzhiyun	.long	0x000f0000		@ Required ID value
824*4882a593Smuzhiyun	.long	0x000f0000		@ Mask for ID
825*4882a593Smuzhiyun	__v7_proc __v7_proc_info, __v7_setup
826*4882a593Smuzhiyun	.size	__v7_proc_info, . - __v7_proc_info
827