blob: 850c22bca19c88c64b247bd479c09bb80ea21b88 [file] [log] [blame]
Catalin Marinasbbe88882007-05-08 22:27:46 +01001/*
2 * linux/arch/arm/mm/proc-v7.S
3 *
4 * Copyright (C) 2001 Deep Blue Solutions Ltd.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This is the "shell" of the ARMv7 processor support.
11 */
Russell Kingbf924642018-11-07 11:43:47 -050012#include <linux/arm-smccc.h>
Tim Abbott991da172009-04-27 14:02:22 -040013#include <linux/init.h>
Catalin Marinasbbe88882007-05-08 22:27:46 +010014#include <linux/linkage.h>
15#include <asm/assembler.h>
16#include <asm/asm-offsets.h>
Russell King5ec94072008-09-07 19:15:31 +010017#include <asm/hwcap.h>
Catalin Marinasbbe88882007-05-08 22:27:46 +010018#include <asm/pgtable-hwdef.h>
19#include <asm/pgtable.h>
Vladimir Murzinf271b772016-08-18 16:28:24 +010020#include <asm/memory.h>
Catalin Marinasbbe88882007-05-08 22:27:46 +010021
22#include "proc-macros.S"
23
Catalin Marinas1b6ba462011-11-22 17:30:29 +000024#ifdef CONFIG_ARM_LPAE
25#include "proc-v7-3level.S"
26#else
Catalin Marinas8d2cd3a2011-11-22 17:30:28 +000027#include "proc-v7-2level.S"
Catalin Marinas1b6ba462011-11-22 17:30:29 +000028#endif
Jon Callan73b63ef2008-11-06 13:23:09 +000029
Catalin Marinasbbe88882007-05-08 22:27:46 +010030ENTRY(cpu_v7_proc_init)
Russell King6ebbf2c2014-06-30 16:29:12 +010031 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +010032ENDPROC(cpu_v7_proc_init)
Catalin Marinasbbe88882007-05-08 22:27:46 +010033
34ENTRY(cpu_v7_proc_fin)
Tony Lindgren1f667c62010-01-19 17:01:33 +010035 mrc p15, 0, r0, c1, c0, 0 @ ctrl register
36 bic r0, r0, #0x1000 @ ...i............
37 bic r0, r0, #0x0006 @ .............ca.
38 mcr p15, 0, r0, c1, c0, 0 @ disable caches
Russell King6ebbf2c2014-06-30 16:29:12 +010039 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +010040ENDPROC(cpu_v7_proc_fin)
Catalin Marinasbbe88882007-05-08 22:27:46 +010041
42/*
43 * cpu_v7_reset(loc)
44 *
45 * Perform a soft reset of the system. Put the CPU into the
46 * same state as it would be if it had been reset, and branch
47 * to what would be the reset vector.
48 *
49 * - loc - location to jump to for soft reset
Will Deaconf4daf062011-06-06 12:27:34 +010050 *
51 * This code must be executed using a flat identity mapping with
52 * caches disabled.
Catalin Marinasbbe88882007-05-08 22:27:46 +010053 */
54 .align 5
Will Deacon1a4baaf2011-11-15 13:25:04 +000055 .pushsection .idmap.text, "ax"
Catalin Marinasbbe88882007-05-08 22:27:46 +010056ENTRY(cpu_v7_reset)
Will Deaconf4daf062011-06-06 12:27:34 +010057 mrc p15, 0, r1, c1, c0, 0 @ ctrl register
58 bic r1, r1, #0x1 @ ...............m
Will Deacon0f81bb62011-08-26 16:34:51 +010059 THUMB( bic r1, r1, #1 << 30 ) @ SCTLR.TE (Thumb exceptions)
Will Deaconf4daf062011-06-06 12:27:34 +010060 mcr p15, 0, r1, c1, c0, 0 @ disable MMU
61 isb
Dave Martin153cd8e2012-10-16 11:54:00 +010062 bx r0
Catalin Marinas93ed3972008-08-28 11:22:32 +010063ENDPROC(cpu_v7_reset)
Will Deacon1a4baaf2011-11-15 13:25:04 +000064 .popsection
Catalin Marinasbbe88882007-05-08 22:27:46 +010065
66/*
67 * cpu_v7_do_idle()
68 *
69 * Idle the processor (eg, wait for interrupt).
70 *
71 * IRQs are already disabled.
72 */
73ENTRY(cpu_v7_do_idle)
Catalin Marinas8553cb62008-11-10 14:14:11 +000074 dsb @ WFI may enter a low-power mode
Catalin Marinas000b5022008-10-03 11:09:10 +010075 wfi
Russell King6ebbf2c2014-06-30 16:29:12 +010076 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +010077ENDPROC(cpu_v7_do_idle)
Catalin Marinasbbe88882007-05-08 22:27:46 +010078
79ENTRY(cpu_v7_dcache_clean_area)
Will Deaconbf3f0f32013-07-15 14:26:19 +010080 ALT_SMP(W(nop)) @ MP extensions imply L1 PTW
81 ALT_UP_B(1f)
Russell King6ebbf2c2014-06-30 16:29:12 +010082 ret lr
Will Deaconbf3f0f32013-07-15 14:26:19 +0100831: dcache_line_size r2, r3
842: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
Catalin Marinasbbe88882007-05-08 22:27:46 +010085 add r0, r0, r2
86 subs r1, r1, r2
Will Deaconbf3f0f32013-07-15 14:26:19 +010087 bhi 2b
Will Deacon6abdd492013-05-13 12:01:12 +010088 dsb ishst
Russell King6ebbf2c2014-06-30 16:29:12 +010089 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +010090ENDPROC(cpu_v7_dcache_clean_area)
Catalin Marinasbbe88882007-05-08 22:27:46 +010091
Russell Kingbf924642018-11-07 11:43:47 -050092#ifdef CONFIG_ARM_PSCI
93 .arch_extension sec
94ENTRY(cpu_v7_smc_switch_mm)
95 stmfd sp!, {r0 - r3}
96 movw r0, #:lower16:ARM_SMCCC_ARCH_WORKAROUND_1
97 movt r0, #:upper16:ARM_SMCCC_ARCH_WORKAROUND_1
98 smc #0
99 ldmfd sp!, {r0 - r3}
100 b cpu_v7_switch_mm
101ENDPROC(cpu_v7_smc_switch_mm)
102 .arch_extension virt
103ENTRY(cpu_v7_hvc_switch_mm)
104 stmfd sp!, {r0 - r3}
105 movw r0, #:lower16:ARM_SMCCC_ARCH_WORKAROUND_1
106 movt r0, #:upper16:ARM_SMCCC_ARCH_WORKAROUND_1
107 hvc #0
108 ldmfd sp!, {r0 - r3}
109 b cpu_v7_switch_mm
110ENDPROC(cpu_v7_hvc_switch_mm)
111#endif
Russell King33efd462018-11-07 11:43:44 -0500112ENTRY(cpu_v7_iciallu_switch_mm)
113 mov r3, #0
114 mcr p15, 0, r3, c7, c5, 0 @ ICIALLU
115 b cpu_v7_switch_mm
116ENDPROC(cpu_v7_iciallu_switch_mm)
117ENTRY(cpu_v7_bpiall_switch_mm)
118 mov r3, #0
119 mcr p15, 0, r3, c7, c5, 6 @ flush BTAC/BTB
120 b cpu_v7_switch_mm
121ENDPROC(cpu_v7_bpiall_switch_mm)
122
Dave Martin78a8f3c2011-06-23 17:26:19 +0100123 string cpu_v7_name, "ARMv7 Processor"
Catalin Marinasbbe88882007-05-08 22:27:46 +0100124 .align
125
Russell Kingf6b0fa02011-02-06 15:48:39 +0000126/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
127.globl cpu_v7_suspend_size
Mahesh Sivasubramanianf3db3f42013-11-08 23:25:20 +0100128.equ cpu_v7_suspend_size, 4 * 9
Arnd Bergmann15e0d9e2011-10-01 21:09:39 +0200129#ifdef CONFIG_ARM_CPU_SUSPEND
Russell Kingf6b0fa02011-02-06 15:48:39 +0000130ENTRY(cpu_v7_do_suspend)
Anson Huangfa0708b2015-12-07 10:09:19 +0100131 stmfd sp!, {r4 - r11, lr}
Russell Kingf6b0fa02011-02-06 15:48:39 +0000132 mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
Russell King1aede682011-08-28 10:30:34 +0100133 mrc p15, 0, r5, c13, c0, 3 @ User r/o thread ID
134 stmia r0!, {r4 - r5}
Will Deaconaa1aadc2012-02-23 13:51:38 +0000135#ifdef CONFIG_MMU
Russell Kingf6b0fa02011-02-06 15:48:39 +0000136 mrc p15, 0, r6, c3, c0, 0 @ Domain ID
Mahesh Sivasubramanianf3db3f42013-11-08 23:25:20 +0100137#ifdef CONFIG_ARM_LPAE
138 mrrc p15, 1, r5, r7, c2 @ TTB 1
139#else
Russell Kingde8e71c2011-08-27 22:39:09 +0100140 mrc p15, 0, r7, c2, c0, 1 @ TTB 1
Mahesh Sivasubramanianf3db3f42013-11-08 23:25:20 +0100141#endif
Catalin Marinas1b6ba462011-11-22 17:30:29 +0000142 mrc p15, 0, r11, c2, c0, 2 @ TTB control register
Will Deaconaa1aadc2012-02-23 13:51:38 +0000143#endif
Russell Kingde8e71c2011-08-27 22:39:09 +0100144 mrc p15, 0, r8, c1, c0, 0 @ Control register
145 mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register
146 mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control
Mahesh Sivasubramanianf3db3f42013-11-08 23:25:20 +0100147 stmia r0, {r5 - r11}
Anson Huangfa0708b2015-12-07 10:09:19 +0100148 ldmfd sp!, {r4 - r11, pc}
Russell Kingf6b0fa02011-02-06 15:48:39 +0000149ENDPROC(cpu_v7_do_suspend)
150
151ENTRY(cpu_v7_do_resume)
152 mov ip, #0
Russell Kingf6b0fa02011-02-06 15:48:39 +0000153 mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
Russell King1aede682011-08-28 10:30:34 +0100154 mcr p15, 0, ip, c13, c0, 1 @ set reserved context ID
155 ldmia r0!, {r4 - r5}
Russell Kingf6b0fa02011-02-06 15:48:39 +0000156 mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
Russell King1aede682011-08-28 10:30:34 +0100157 mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID
Mahesh Sivasubramanianf3db3f42013-11-08 23:25:20 +0100158 ldmia r0, {r5 - r11}
Will Deaconaa1aadc2012-02-23 13:51:38 +0000159#ifdef CONFIG_MMU
160 mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs
Russell Kingf6b0fa02011-02-06 15:48:39 +0000161 mcr p15, 0, r6, c3, c0, 0 @ Domain ID
Mahesh Sivasubramanianf3db3f42013-11-08 23:25:20 +0100162#ifdef CONFIG_ARM_LPAE
163 mcrr p15, 0, r1, ip, c2 @ TTB 0
164 mcrr p15, 1, r5, r7, c2 @ TTB 1
165#else
Russell Kingde8e71c2011-08-27 22:39:09 +0100166 ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP)
167 ALT_UP(orr r1, r1, #TTB_FLAGS_UP)
168 mcr p15, 0, r1, c2, c0, 0 @ TTB 0
169 mcr p15, 0, r7, c2, c0, 1 @ TTB 1
Mahesh Sivasubramanianf3db3f42013-11-08 23:25:20 +0100170#endif
Catalin Marinas1b6ba462011-11-22 17:30:29 +0000171 mcr p15, 0, r11, c2, c0, 2 @ TTB control register
Russell Kingf6b0fa02011-02-06 15:48:39 +0000172 ldr r4, =PRRR @ PRRR
173 ldr r5, =NMRR @ NMRR
174 mcr p15, 0, r4, c10, c2, 0 @ write PRRR
175 mcr p15, 0, r5, c10, c2, 1 @ write NMRR
Will Deaconaa1aadc2012-02-23 13:51:38 +0000176#endif /* CONFIG_MMU */
177 mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register
178 teq r4, r9 @ Is it already set?
179 mcrne p15, 0, r9, c1, c0, 1 @ No, so write it
180 mcr p15, 0, r10, c1, c0, 2 @ Co-processor access control
Russell Kingf6b0fa02011-02-06 15:48:39 +0000181 isb
Russell Kingf35235a2011-08-27 00:37:38 +0100182 dsb
Russell Kingde8e71c2011-08-27 22:39:09 +0100183 mov r0, r8 @ control register
Russell Kingf6b0fa02011-02-06 15:48:39 +0000184 b cpu_resume_mmu
185ENDPROC(cpu_v7_do_resume)
Russell Kingf6b0fa02011-02-06 15:48:39 +0000186#endif
187
Shawn Guoddd0c532014-07-16 07:40:53 +0100188.globl cpu_ca9mp_suspend_size
189.equ cpu_ca9mp_suspend_size, cpu_v7_suspend_size + 4 * 2
190#ifdef CONFIG_ARM_CPU_SUSPEND
191ENTRY(cpu_ca9mp_do_suspend)
192 stmfd sp!, {r4 - r5}
193 mrc p15, 0, r4, c15, c0, 1 @ Diagnostic register
194 mrc p15, 0, r5, c15, c0, 0 @ Power register
195 stmia r0!, {r4 - r5}
196 ldmfd sp!, {r4 - r5}
197 b cpu_v7_do_suspend
198ENDPROC(cpu_ca9mp_do_suspend)
199
200ENTRY(cpu_ca9mp_do_resume)
201 ldmia r0!, {r4 - r5}
202 mrc p15, 0, r10, c15, c0, 1 @ Read Diagnostic register
203 teq r4, r10 @ Already restored?
204 mcrne p15, 0, r4, c15, c0, 1 @ No, so restore it
205 mrc p15, 0, r10, c15, c0, 0 @ Read Power register
206 teq r5, r10 @ Already restored?
207 mcrne p15, 0, r5, c15, c0, 0 @ No, so restore it
208 b cpu_v7_do_resume
209ENDPROC(cpu_ca9mp_do_resume)
210#endif
211
Gregory CLEMENT3e0a07f2013-06-23 10:17:11 +0100212#ifdef CONFIG_CPU_PJ4B
213 globl_equ cpu_pj4b_switch_mm, cpu_v7_switch_mm
214 globl_equ cpu_pj4b_set_pte_ext, cpu_v7_set_pte_ext
215 globl_equ cpu_pj4b_proc_init, cpu_v7_proc_init
216 globl_equ cpu_pj4b_proc_fin, cpu_v7_proc_fin
217 globl_equ cpu_pj4b_reset, cpu_v7_reset
218#ifdef CONFIG_PJ4B_ERRATA_4742
219ENTRY(cpu_pj4b_do_idle)
220 dsb @ WFI may enter a low-power mode
221 wfi
222 dsb @barrier
Russell King6ebbf2c2014-06-30 16:29:12 +0100223 ret lr
Gregory CLEMENT3e0a07f2013-06-23 10:17:11 +0100224ENDPROC(cpu_pj4b_do_idle)
225#else
226 globl_equ cpu_pj4b_do_idle, cpu_v7_do_idle
227#endif
228 globl_equ cpu_pj4b_dcache_clean_area, cpu_v7_dcache_clean_area
Gregory CLEMENT16c79a32014-03-28 12:21:16 +0100229#ifdef CONFIG_ARM_CPU_SUSPEND
230ENTRY(cpu_pj4b_do_suspend)
231 stmfd sp!, {r6 - r10}
232 mrc p15, 1, r6, c15, c1, 0 @ save CP15 - extra features
233 mrc p15, 1, r7, c15, c2, 0 @ save CP15 - Aux Func Modes Ctrl 0
234 mrc p15, 1, r8, c15, c1, 2 @ save CP15 - Aux Debug Modes Ctrl 2
235 mrc p15, 1, r9, c15, c1, 1 @ save CP15 - Aux Debug Modes Ctrl 1
236 mrc p15, 0, r10, c9, c14, 0 @ save CP15 - PMC
237 stmia r0!, {r6 - r10}
238 ldmfd sp!, {r6 - r10}
239 b cpu_v7_do_suspend
240ENDPROC(cpu_pj4b_do_suspend)
241
242ENTRY(cpu_pj4b_do_resume)
243 ldmia r0!, {r6 - r10}
Shawn Guo7ca791c2014-07-03 09:56:59 +0100244 mcr p15, 1, r6, c15, c1, 0 @ restore CP15 - extra features
245 mcr p15, 1, r7, c15, c2, 0 @ restore CP15 - Aux Func Modes Ctrl 0
246 mcr p15, 1, r8, c15, c1, 2 @ restore CP15 - Aux Debug Modes Ctrl 2
247 mcr p15, 1, r9, c15, c1, 1 @ restore CP15 - Aux Debug Modes Ctrl 1
248 mcr p15, 0, r10, c9, c14, 0 @ restore CP15 - PMC
Gregory CLEMENT16c79a32014-03-28 12:21:16 +0100249 b cpu_v7_do_resume
250ENDPROC(cpu_pj4b_do_resume)
251#endif
252.globl cpu_pj4b_suspend_size
Shawn Guo7ca791c2014-07-03 09:56:59 +0100253.equ cpu_pj4b_suspend_size, cpu_v7_suspend_size + 4 * 5
Gregory CLEMENT3e0a07f2013-06-23 10:17:11 +0100254
255#endif
256
Catalin Marinasbbe88882007-05-08 22:27:46 +0100257/*
258 * __v7_setup
259 *
260 * Initialise TLB, Caches, and MMU state ready to switch the MMU
261 * on. Return in r0 the new CP15 C1 control register setting.
262 *
Russell Kingc76f2382015-04-04 21:46:35 +0100263 * r1, r2, r4, r5, r9, r13 must be preserved - r13 is not a stack
Russell King17e7bf82015-04-04 21:34:33 +0100264 * r4: TTBR0 (low word)
265 * r5: TTBR0 (high word if LPAE)
266 * r8: TTBR1
267 * r9: Main ID register
268 *
Catalin Marinasbbe88882007-05-08 22:27:46 +0100269 * This should be able to cover all ARMv7 cores.
270 *
271 * It is assumed that:
272 * - cache type register is implemented
273 */
Pawel Moll15eb1692011-05-20 14:39:29 +0100274__v7_ca5mp_setup:
Daniel Walker14eff182010-09-17 16:42:10 +0100275__v7_ca9mp_setup:
Jonathan Austinc90ad5c2012-03-15 14:27:07 +0000276__v7_cr7mp_setup:
277 mov r10, #(1 << 0) @ Cache/TLB ops broadcasting
Will Deacon7665d9d2011-01-12 17:10:45 +0000278 b 1f
Pawel Mollb4244732011-12-09 20:00:39 +0100279__v7_ca7mp_setup:
Jonathan Austinddb2ff72014-01-13 12:10:57 +0100280__v7_ca12mp_setup:
Will Deacon7665d9d2011-01-12 17:10:45 +0000281__v7_ca15mp_setup:
Marc Carinoc51e78e2014-07-23 00:31:43 +0100282__v7_b15mp_setup:
Will Deaconcd000cf2014-05-02 17:06:02 +0100283__v7_ca17mp_setup:
Will Deacon7665d9d2011-01-12 17:10:45 +0000284 mov r10, #0
Nicolas Pitreb563d062015-12-04 21:36:40 +01002851: adr r0, __v7_setup_stack_ptr
286 ldr r12, [r0]
287 add r12, r12, r0 @ the local stack
288 stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6
Russell Kingbac51ad2015-07-09 00:30:24 +0100289 bl v7_invalidate_l1
Nicolas Pitreb563d062015-12-04 21:36:40 +0100290 ldmia r12, {r1-r6, lr}
Jon Callan73b63ef2008-11-06 13:23:09 +0000291#ifdef CONFIG_SMP
Russell King0fc03d42016-03-29 11:08:22 +0100292 orr r10, r10, #(1 << 6) @ Enable SMP/nAMP mode
Russell Kingf00ec482010-09-04 10:47:48 +0100293 ALT_SMP(mrc p15, 0, r0, c1, c0, 1)
Russell King0fc03d42016-03-29 11:08:22 +0100294 ALT_UP(mov r0, r10) @ fake it for UP
295 orr r10, r10, r0 @ Set required bits
296 teq r10, r0 @ Were they already set?
297 mcrne p15, 0, r10, c1, c0, 1 @ No, update register
Jon Callan73b63ef2008-11-06 13:23:09 +0000298#endif
Russell Kingbac51ad2015-07-09 00:30:24 +0100299 b __v7_setup_cont
Gregory CLEMENTde490192012-10-03 11:58:07 +0200300
Russell Kingc76f2382015-04-04 21:46:35 +0100301/*
302 * Errata:
303 * r0, r10 available for use
304 * r1, r2, r4, r5, r9, r13: must be preserved
305 * r3: contains MIDR rX number in bits 23-20
306 * r6: contains MIDR rXpY as 8-bit XY number
307 * r9: MIDR
308 */
Russell King17e7bf82015-04-04 21:34:33 +0100309__ca8_errata:
310#if defined(CONFIG_ARM_ERRATA_430973) && !defined(CONFIG_ARCH_MULTIPLATFORM)
311 teq r3, #0x00100000 @ only present in r1p*
Russell Kingc76f2382015-04-04 21:46:35 +0100312 mrceq p15, 0, r0, c1, c0, 1 @ read aux control register
313 orreq r0, r0, #(1 << 6) @ set IBE to 1
314 mcreq p15, 0, r0, c1, c0, 1 @ write aux control register
Russell King17e7bf82015-04-04 21:34:33 +0100315#endif
316#ifdef CONFIG_ARM_ERRATA_458693
317 teq r6, #0x20 @ only present in r2p0
Russell Kingc76f2382015-04-04 21:46:35 +0100318 mrceq p15, 0, r0, c1, c0, 1 @ read aux control register
319 orreq r0, r0, #(1 << 5) @ set L1NEON to 1
320 orreq r0, r0, #(1 << 9) @ set PLDNOP to 1
321 mcreq p15, 0, r0, c1, c0, 1 @ write aux control register
Russell King17e7bf82015-04-04 21:34:33 +0100322#endif
323#ifdef CONFIG_ARM_ERRATA_460075
324 teq r6, #0x20 @ only present in r2p0
Russell Kingc76f2382015-04-04 21:46:35 +0100325 mrceq p15, 1, r0, c9, c0, 2 @ read L2 cache aux ctrl register
326 tsteq r0, #1 << 22
327 orreq r0, r0, #(1 << 22) @ set the Write Allocate disable bit
328 mcreq p15, 1, r0, c9, c0, 2 @ write the L2 cache aux ctrl register
Russell King17e7bf82015-04-04 21:34:33 +0100329#endif
330 b __errata_finish
331
332__ca9_errata:
333#ifdef CONFIG_ARM_ERRATA_742230
334 cmp r6, #0x22 @ only present up to r2p2
Russell Kingc76f2382015-04-04 21:46:35 +0100335 mrcle p15, 0, r0, c15, c0, 1 @ read diagnostic register
336 orrle r0, r0, #1 << 4 @ set bit #4
337 mcrle p15, 0, r0, c15, c0, 1 @ write diagnostic register
Russell King17e7bf82015-04-04 21:34:33 +0100338#endif
339#ifdef CONFIG_ARM_ERRATA_742231
340 teq r6, #0x20 @ present in r2p0
341 teqne r6, #0x21 @ present in r2p1
342 teqne r6, #0x22 @ present in r2p2
Russell Kingc76f2382015-04-04 21:46:35 +0100343 mrceq p15, 0, r0, c15, c0, 1 @ read diagnostic register
344 orreq r0, r0, #1 << 12 @ set bit #12
345 orreq r0, r0, #1 << 22 @ set bit #22
346 mcreq p15, 0, r0, c15, c0, 1 @ write diagnostic register
Russell King17e7bf82015-04-04 21:34:33 +0100347#endif
348#ifdef CONFIG_ARM_ERRATA_743622
349 teq r3, #0x00200000 @ only present in r2p*
Russell Kingc76f2382015-04-04 21:46:35 +0100350 mrceq p15, 0, r0, c15, c0, 1 @ read diagnostic register
351 orreq r0, r0, #1 << 6 @ set bit #6
352 mcreq p15, 0, r0, c15, c0, 1 @ write diagnostic register
Russell King17e7bf82015-04-04 21:34:33 +0100353#endif
354#if defined(CONFIG_ARM_ERRATA_751472) && defined(CONFIG_SMP)
355 ALT_SMP(cmp r6, #0x30) @ present prior to r3p0
356 ALT_UP_B(1f)
Russell Kingc76f2382015-04-04 21:46:35 +0100357 mrclt p15, 0, r0, c15, c0, 1 @ read diagnostic register
358 orrlt r0, r0, #1 << 11 @ set bit #11
359 mcrlt p15, 0, r0, c15, c0, 1 @ write diagnostic register
Russell King17e7bf82015-04-04 21:34:33 +01003601:
361#endif
362 b __errata_finish
363
364__ca15_errata:
365#ifdef CONFIG_ARM_ERRATA_773022
366 cmp r6, #0x4 @ only present up to r0p4
Russell Kingc76f2382015-04-04 21:46:35 +0100367 mrcle p15, 0, r0, c1, c0, 1 @ read aux control register
368 orrle r0, r0, #1 << 1 @ disable loop buffer
369 mcrle p15, 0, r0, c1, c0, 1 @ write aux control register
Russell King17e7bf82015-04-04 21:34:33 +0100370#endif
371 b __errata_finish
372
Doug Anderson62c0f4a2016-04-07 00:25:00 +0100373__ca12_errata:
374#ifdef CONFIG_ARM_ERRATA_818325_852422
375 mrc p15, 0, r10, c15, c0, 1 @ read diagnostic register
376 orr r10, r10, #1 << 12 @ set bit #12
377 mcr p15, 0, r10, c15, c0, 1 @ write diagnostic register
378#endif
Doug Anderson416bcf22016-04-07 00:26:05 +0100379#ifdef CONFIG_ARM_ERRATA_821420
380 mrc p15, 0, r10, c15, c0, 2 @ read internal feature reg
381 orr r10, r10, #1 << 1 @ set bit #1
382 mcr p15, 0, r10, c15, c0, 2 @ write internal feature reg
383#endif
Doug Anderson9f6f9352016-04-07 00:27:26 +0100384#ifdef CONFIG_ARM_ERRATA_825619
385 mrc p15, 0, r10, c15, c0, 1 @ read diagnostic register
386 orr r10, r10, #1 << 24 @ set bit #24
387 mcr p15, 0, r10, c15, c0, 1 @ write diagnostic register
388#endif
Doug Anderson62c0f4a2016-04-07 00:25:00 +0100389 b __errata_finish
390
391__ca17_errata:
Doug Anderson9f6f9352016-04-07 00:27:26 +0100392#ifdef CONFIG_ARM_ERRATA_852421
393 cmp r6, #0x12 @ only present up to r1p2
394 mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register
395 orrle r10, r10, #1 << 24 @ set bit #24
396 mcrle p15, 0, r10, c15, c0, 1 @ write diagnostic register
397#endif
Doug Anderson62c0f4a2016-04-07 00:25:00 +0100398#ifdef CONFIG_ARM_ERRATA_852423
399 cmp r6, #0x12 @ only present up to r1p2
400 mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register
401 orrle r10, r10, #1 << 12 @ set bit #12
402 mcrle p15, 0, r10, c15, c0, 1 @ write diagnostic register
403#endif
404 b __errata_finish
405
Gregory CLEMENTde490192012-10-03 11:58:07 +0200406__v7_pj4b_setup:
407#ifdef CONFIG_CPU_PJ4B
408
409/* Auxiliary Debug Modes Control 1 Register */
410#define PJ4B_STATIC_BP (1 << 2) /* Enable Static BP */
411#define PJ4B_INTER_PARITY (1 << 8) /* Disable Internal Parity Handling */
Gregory CLEMENTde490192012-10-03 11:58:07 +0200412#define PJ4B_CLEAN_LINE (1 << 16) /* Disable data transfer for clean line */
413
414/* Auxiliary Debug Modes Control 2 Register */
415#define PJ4B_FAST_LDR (1 << 23) /* Disable fast LDR */
416#define PJ4B_SNOOP_DATA (1 << 25) /* Do not interleave write and snoop data */
417#define PJ4B_CWF (1 << 27) /* Disable Critical Word First feature */
418#define PJ4B_OUTSDNG_NC (1 << 29) /* Disable outstanding non cacheable rqst */
419#define PJ4B_L1_REP_RR (1 << 30) /* L1 replacement - Strict round robin */
420#define PJ4B_AUX_DBG_CTRL2 (PJ4B_SNOOP_DATA | PJ4B_CWF |\
421 PJ4B_OUTSDNG_NC | PJ4B_L1_REP_RR)
422
423/* Auxiliary Functional Modes Control Register 0 */
424#define PJ4B_SMP_CFB (1 << 1) /* Set SMP mode. Join the coherency fabric */
425#define PJ4B_L1_PAR_CHK (1 << 2) /* Support L1 parity checking */
426#define PJ4B_BROADCAST_CACHE (1 << 8) /* Broadcast Cache and TLB maintenance */
427
428/* Auxiliary Debug Modes Control 0 Register */
429#define PJ4B_WFI_WFE (1 << 22) /* WFI/WFE - serve the DVM and back to idle */
430
431 /* Auxiliary Debug Modes Control 1 Register */
432 mrc p15, 1, r0, c15, c1, 1
433 orr r0, r0, #PJ4B_CLEAN_LINE
Gregory CLEMENTde490192012-10-03 11:58:07 +0200434 orr r0, r0, #PJ4B_INTER_PARITY
435 bic r0, r0, #PJ4B_STATIC_BP
436 mcr p15, 1, r0, c15, c1, 1
437
438 /* Auxiliary Debug Modes Control 2 Register */
439 mrc p15, 1, r0, c15, c1, 2
440 bic r0, r0, #PJ4B_FAST_LDR
441 orr r0, r0, #PJ4B_AUX_DBG_CTRL2
442 mcr p15, 1, r0, c15, c1, 2
443
444 /* Auxiliary Functional Modes Control Register 0 */
445 mrc p15, 1, r0, c15, c2, 0
446#ifdef CONFIG_SMP
447 orr r0, r0, #PJ4B_SMP_CFB
448#endif
449 orr r0, r0, #PJ4B_L1_PAR_CHK
450 orr r0, r0, #PJ4B_BROADCAST_CACHE
451 mcr p15, 1, r0, c15, c2, 0
452
453 /* Auxiliary Debug Modes Control 0 Register */
454 mrc p15, 1, r0, c15, c1, 0
455 orr r0, r0, #PJ4B_WFI_WFE
456 mcr p15, 1, r0, c15, c1, 0
457
458#endif /* CONFIG_CPU_PJ4B */
459
Daniel Walker14eff182010-09-17 16:42:10 +0100460__v7_setup:
Nicolas Pitreb563d062015-12-04 21:36:40 +0100461 adr r0, __v7_setup_stack_ptr
462 ldr r12, [r0]
463 add r12, r12, r0 @ the local stack
464 stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6
Russell King02b4e272015-05-19 17:06:44 +0100465 bl v7_invalidate_l1
Nicolas Pitreb563d062015-12-04 21:36:40 +0100466 ldmia r12, {r1-r6, lr}
Russell King1946d6e2009-06-01 12:50:33 +0100467
Russell Kingbac51ad2015-07-09 00:30:24 +0100468__v7_setup_cont:
Russell Kingc76f2382015-04-04 21:46:35 +0100469 and r0, r9, #0xff000000 @ ARM?
470 teq r0, #0x41000000
Russell King17e7bf82015-04-04 21:34:33 +0100471 bne __errata_finish
Russell King44194962015-04-04 21:36:35 +0100472 and r3, r9, #0x00f00000 @ variant
473 and r6, r9, #0x0000000f @ revision
Russell Kingb2c3e382015-04-04 20:09:46 +0100474 orr r6, r6, r3, lsr #20-4 @ combine variant and revision
Russell King44194962015-04-04 21:36:35 +0100475 ubfx r0, r9, #4, #12 @ primary part number
Russell King1946d6e2009-06-01 12:50:33 +0100476
Will Deacon64918482010-09-14 09:50:03 +0100477 /* Cortex-A8 Errata */
478 ldr r10, =0x00000c08 @ Cortex-A8 primary part number
479 teq r0, r10
Russell King17e7bf82015-04-04 21:34:33 +0100480 beq __ca8_errata
Russell King1946d6e2009-06-01 12:50:33 +0100481
Will Deacon9f050272010-09-14 09:51:43 +0100482 /* Cortex-A9 Errata */
Russell King17e7bf82015-04-04 21:34:33 +0100483 ldr r10, =0x00000c09 @ Cortex-A9 primary part number
Will Deacon9f050272010-09-14 09:51:43 +0100484 teq r0, r10
Russell King17e7bf82015-04-04 21:34:33 +0100485 beq __ca9_errata
Will Deacon9f050272010-09-14 09:51:43 +0100486
Doug Anderson62c0f4a2016-04-07 00:25:00 +0100487 /* Cortex-A12 Errata */
488 ldr r10, =0x00000c0d @ Cortex-A12 primary part number
489 teq r0, r10
490 beq __ca12_errata
491
492 /* Cortex-A17 Errata */
493 ldr r10, =0x00000c0e @ Cortex-A17 primary part number
494 teq r0, r10
495 beq __ca17_errata
496
Will Deacon84b65042013-08-20 17:29:55 +0100497 /* Cortex-A15 Errata */
Russell King17e7bf82015-04-04 21:34:33 +0100498 ldr r10, =0x00000c0f @ Cortex-A15 primary part number
Will Deacon84b65042013-08-20 17:29:55 +0100499 teq r0, r10
Russell King17e7bf82015-04-04 21:34:33 +0100500 beq __ca15_errata
Will Deacon84b65042013-08-20 17:29:55 +0100501
Russell King17e7bf82015-04-04 21:34:33 +0100502__errata_finish:
503 mov r10, #0
Catalin Marinasbbe88882007-05-08 22:27:46 +0100504 mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate
Catalin Marinas2eb8c822007-07-20 11:43:02 +0100505#ifdef CONFIG_MMU
Catalin Marinasbbe88882007-05-08 22:27:46 +0100506 mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs
Russell Kingb2c3e382015-04-04 20:09:46 +0100507 v7_ttb_setup r10, r4, r5, r8, r3 @ TTBCR, TTBRx setup
508 ldr r3, =PRRR @ PRRR
Russell Kingf6b0fa02011-02-06 15:48:39 +0000509 ldr r6, =NMRR @ NMRR
Russell Kingb2c3e382015-04-04 20:09:46 +0100510 mcr p15, 0, r3, c10, c2, 0 @ write PRRR
Russell King3f69c0c2008-09-15 17:23:10 +0100511 mcr p15, 0, r6, c10, c2, 1 @ write NMRR
Catalin Marinasbdaaaec2009-07-24 12:35:06 +0100512#endif
Will Deaconbae0ca22014-02-07 19:12:20 +0100513 dsb @ Complete invalidations
Jonathan Austin078c0452012-04-12 17:45:25 +0100514#ifndef CONFIG_ARM_THUMBEE
515 mrc p15, 0, r0, c0, c1, 0 @ read ID_PFR0 for ThumbEE
516 and r0, r0, #(0xf << 12) @ ThumbEE enabled field
517 teq r0, #(1 << 12) @ check if ThumbEE is present
518 bne 1f
Russell Kingb2c3e382015-04-04 20:09:46 +0100519 mov r3, #0
520 mcr p14, 6, r3, c1, c0, 0 @ Initialize TEEHBR to 0
Jonathan Austin078c0452012-04-12 17:45:25 +0100521 mrc p14, 6, r0, c0, c0, 0 @ load TEECR
522 orr r0, r0, #1 @ set the 1st bit in order to
523 mcr p14, 6, r0, c0, c0, 0 @ stop userspace TEEHBR access
5241:
525#endif
Russell Kingb2c3e382015-04-04 20:09:46 +0100526 adr r3, v7_crval
527 ldmia r3, {r3, r6}
Ben Dooks457c2402013-02-12 18:59:57 +0000528 ARM_BE8(orr r6, r6, #1 << 25) @ big-endian page tables
Leif Lindholm64d2dc32010-09-16 18:00:47 +0100529#ifdef CONFIG_SWP_EMULATE
Russell Kingb2c3e382015-04-04 20:09:46 +0100530 orr r3, r3, #(1 << 10) @ set SW bit in "clear"
Leif Lindholm64d2dc32010-09-16 18:00:47 +0100531 bic r6, r6, #(1 << 10) @ clear it in "mmuset"
532#endif
Catalin Marinas2eb8c822007-07-20 11:43:02 +0100533 mrc p15, 0, r0, c1, c0, 0 @ read control register
Russell Kingb2c3e382015-04-04 20:09:46 +0100534 bic r0, r0, r3 @ clear bits them
Catalin Marinas2eb8c822007-07-20 11:43:02 +0100535 orr r0, r0, r6 @ set them
Catalin Marinas347c8b72009-07-24 12:32:56 +0100536 THUMB( orr r0, r0, #1 << 30 ) @ Thumb exceptions
Russell King6ebbf2c2014-06-30 16:29:12 +0100537 ret lr @ return to head.S:__ret
Catalin Marinasbbe88882007-05-08 22:27:46 +0100538
Catalin Marinas8d2cd3a2011-11-22 17:30:28 +0000539 .align 2
Nicolas Pitreb563d062015-12-04 21:36:40 +0100540__v7_setup_stack_ptr:
Russell King8ff97fa2016-02-16 17:33:56 +0000541 .word PHYS_RELATIVE(__v7_setup_stack, .)
Nicolas Pitreb563d062015-12-04 21:36:40 +0100542ENDPROC(__v7_setup)
543
544 .bss
545 .align 2
Catalin Marinasbbe88882007-05-08 22:27:46 +0100546__v7_setup_stack:
Nicolas Pitreb563d062015-12-04 21:36:40 +0100547 .space 4 * 7 @ 7 registers
Catalin Marinasbbe88882007-05-08 22:27:46 +0100548
Russell King5085f3f2010-10-01 15:37:05 +0100549 __INITDATA
550
Russell King26892e72018-11-07 11:43:46 -0500551 .weak cpu_v7_bugs_init
552
Dave Martin78a8f3c2011-06-23 17:26:19 +0100553 @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
Russell King26892e72018-11-07 11:43:46 -0500554 define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_bugs_init
Russell King33efd462018-11-07 11:43:44 -0500555
556#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
557 @ generic v7 bpiall on context switch
558 globl_equ cpu_v7_bpiall_proc_init, cpu_v7_proc_init
559 globl_equ cpu_v7_bpiall_proc_fin, cpu_v7_proc_fin
560 globl_equ cpu_v7_bpiall_reset, cpu_v7_reset
561 globl_equ cpu_v7_bpiall_do_idle, cpu_v7_do_idle
562 globl_equ cpu_v7_bpiall_dcache_clean_area, cpu_v7_dcache_clean_area
563 globl_equ cpu_v7_bpiall_set_pte_ext, cpu_v7_set_pte_ext
564 globl_equ cpu_v7_bpiall_suspend_size, cpu_v7_suspend_size
565#ifdef CONFIG_ARM_CPU_SUSPEND
566 globl_equ cpu_v7_bpiall_do_suspend, cpu_v7_do_suspend
567 globl_equ cpu_v7_bpiall_do_resume, cpu_v7_do_resume
568#endif
Russell King26892e72018-11-07 11:43:46 -0500569 define_processor_functions v7_bpiall, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_bugs_init
Russell King33efd462018-11-07 11:43:44 -0500570
571#define HARDENED_BPIALL_PROCESSOR_FUNCTIONS v7_bpiall_processor_functions
572#else
573#define HARDENED_BPIALL_PROCESSOR_FUNCTIONS v7_processor_functions
574#endif
575
Russell Kinga6d746782015-04-07 15:35:24 +0100576#ifndef CONFIG_ARM_LPAE
Russell King33efd462018-11-07 11:43:44 -0500577 @ Cortex-A8 - always needs bpiall switch_mm implementation
578 globl_equ cpu_ca8_proc_init, cpu_v7_proc_init
579 globl_equ cpu_ca8_proc_fin, cpu_v7_proc_fin
580 globl_equ cpu_ca8_reset, cpu_v7_reset
581 globl_equ cpu_ca8_do_idle, cpu_v7_do_idle
582 globl_equ cpu_ca8_dcache_clean_area, cpu_v7_dcache_clean_area
583 globl_equ cpu_ca8_set_pte_ext, cpu_v7_set_pte_ext
584 globl_equ cpu_ca8_switch_mm, cpu_v7_bpiall_switch_mm
585 globl_equ cpu_ca8_suspend_size, cpu_v7_suspend_size
586#ifdef CONFIG_ARM_CPU_SUSPEND
587 globl_equ cpu_ca8_do_suspend, cpu_v7_do_suspend
588 globl_equ cpu_ca8_do_resume, cpu_v7_do_resume
589#endif
Russell King9bc1ec12018-11-07 11:43:45 -0500590 define_processor_functions ca8, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_ca8_ibe
Russell King33efd462018-11-07 11:43:44 -0500591
592 @ Cortex-A9 - needs more registers preserved across suspend/resume
593 @ and bpiall switch_mm for hardening
594 globl_equ cpu_ca9mp_proc_init, cpu_v7_proc_init
595 globl_equ cpu_ca9mp_proc_fin, cpu_v7_proc_fin
596 globl_equ cpu_ca9mp_reset, cpu_v7_reset
597 globl_equ cpu_ca9mp_do_idle, cpu_v7_do_idle
598 globl_equ cpu_ca9mp_dcache_clean_area, cpu_v7_dcache_clean_area
599#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
600 globl_equ cpu_ca9mp_switch_mm, cpu_v7_bpiall_switch_mm
601#else
602 globl_equ cpu_ca9mp_switch_mm, cpu_v7_switch_mm
603#endif
604 globl_equ cpu_ca9mp_set_pte_ext, cpu_v7_set_pte_ext
Russell King26892e72018-11-07 11:43:46 -0500605 define_processor_functions ca9mp, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_bugs_init
Russell Kinga6d746782015-04-07 15:35:24 +0100606#endif
Russell King33efd462018-11-07 11:43:44 -0500607
608 @ Cortex-A15 - needs iciallu switch_mm for hardening
609 globl_equ cpu_ca15_proc_init, cpu_v7_proc_init
610 globl_equ cpu_ca15_proc_fin, cpu_v7_proc_fin
611 globl_equ cpu_ca15_reset, cpu_v7_reset
612 globl_equ cpu_ca15_do_idle, cpu_v7_do_idle
613 globl_equ cpu_ca15_dcache_clean_area, cpu_v7_dcache_clean_area
614#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
615 globl_equ cpu_ca15_switch_mm, cpu_v7_iciallu_switch_mm
616#else
617 globl_equ cpu_ca15_switch_mm, cpu_v7_switch_mm
618#endif
619 globl_equ cpu_ca15_set_pte_ext, cpu_v7_set_pte_ext
620 globl_equ cpu_ca15_suspend_size, cpu_v7_suspend_size
621 globl_equ cpu_ca15_do_suspend, cpu_v7_do_suspend
622 globl_equ cpu_ca15_do_resume, cpu_v7_do_resume
Russell King9bc1ec12018-11-07 11:43:45 -0500623 define_processor_functions ca15, dabort=v7_early_abort, pabort=v7_pabort, suspend=1, bugs=cpu_v7_ca15_ibe
Gregory CLEMENT3e0a07f2013-06-23 10:17:11 +0100624#ifdef CONFIG_CPU_PJ4B
625 define_processor_functions pj4b, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
626#endif
Catalin Marinasbbe88882007-05-08 22:27:46 +0100627
Russell King5085f3f2010-10-01 15:37:05 +0100628 .section ".rodata"
629
Dave Martin78a8f3c2011-06-23 17:26:19 +0100630 string cpu_arch_name, "armv7"
631 string cpu_elf_name, "v7"
Catalin Marinasbbe88882007-05-08 22:27:46 +0100632 .align
633
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100634 .section ".proc.info.init", #alloc
Catalin Marinasbbe88882007-05-08 22:27:46 +0100635
Pawel Molldc939cd2011-05-20 14:39:28 +0100636 /*
637 * Standard v7 proc info content
638 */
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100639.macro __v7_proc name, initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0, proc_fns = v7_processor_functions
Pawel Molldc939cd2011-05-20 14:39:28 +0100640 ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
Catalin Marinas1b6ba462011-11-22 17:30:29 +0000641 PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags)
Pawel Molldc939cd2011-05-20 14:39:28 +0100642 ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
Catalin Marinas1b6ba462011-11-22 17:30:29 +0000643 PMD_SECT_AF | PMD_FLAGS_UP | \mm_mmuflags)
644 .long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | \
645 PMD_SECT_AP_READ | PMD_SECT_AF | \io_mmuflags
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100646 initfn \initfunc, \name
Daniel Walker14eff182010-09-17 16:42:10 +0100647 .long cpu_arch_name
648 .long cpu_elf_name
Pawel Molldc939cd2011-05-20 14:39:28 +0100649 .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \
650 HWCAP_EDSP | HWCAP_TLS | \hwcaps
Daniel Walker14eff182010-09-17 16:42:10 +0100651 .long cpu_v7_name
Gregory CLEMENT3e0a07f2013-06-23 10:17:11 +0100652 .long \proc_fns
Daniel Walker14eff182010-09-17 16:42:10 +0100653 .long v7wbi_tlb_fns
654 .long v6_user_fns
655 .long v7_cache_fns
Pawel Molldc939cd2011-05-20 14:39:28 +0100656.endm
657
Catalin Marinas1b6ba462011-11-22 17:30:29 +0000658#ifndef CONFIG_ARM_LPAE
Pawel Molldc939cd2011-05-20 14:39:28 +0100659 /*
Pawel Moll15eb1692011-05-20 14:39:29 +0100660 * ARM Ltd. Cortex A5 processor.
661 */
662 .type __v7_ca5mp_proc_info, #object
663__v7_ca5mp_proc_info:
664 .long 0x410fc050
665 .long 0xff0ffff0
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100666 __v7_proc __v7_ca5mp_proc_info, __v7_ca5mp_setup
Pawel Moll15eb1692011-05-20 14:39:29 +0100667 .size __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info
668
669 /*
Pawel Molldc939cd2011-05-20 14:39:28 +0100670 * ARM Ltd. Cortex A9 processor.
671 */
672 .type __v7_ca9mp_proc_info, #object
673__v7_ca9mp_proc_info:
674 .long 0x410fc090
675 .long 0xff0ffff0
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100676 __v7_proc __v7_ca9mp_proc_info, __v7_ca9mp_setup, proc_fns = ca9mp_processor_functions
Daniel Walker14eff182010-09-17 16:42:10 +0100677 .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info
Gregory CLEMENTde490192012-10-03 11:58:07 +0200678
Russell Kinga6d746782015-04-07 15:35:24 +0100679 /*
680 * ARM Ltd. Cortex A8 processor.
681 */
682 .type __v7_ca8_proc_info, #object
683__v7_ca8_proc_info:
684 .long 0x410fc080
685 .long 0xff0ffff0
686 __v7_proc __v7_ca8_proc_info, __v7_setup, proc_fns = ca8_processor_functions
687 .size __v7_ca8_proc_info, . - __v7_ca8_proc_info
688
Gregory CLEMENTb361d612013-04-09 13:37:20 +0100689#endif /* CONFIG_ARM_LPAE */
690
Gregory CLEMENTde490192012-10-03 11:58:07 +0200691 /*
692 * Marvell PJ4B processor.
693 */
Gregory CLEMENT3e0a07f2013-06-23 10:17:11 +0100694#ifdef CONFIG_CPU_PJ4B
Gregory CLEMENTde490192012-10-03 11:58:07 +0200695 .type __v7_pj4b_proc_info, #object
696__v7_pj4b_proc_info:
Gregory CLEMENT049be072013-06-10 18:05:51 +0100697 .long 0x560f5800
698 .long 0xff0fff00
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100699 __v7_proc __v7_pj4b_proc_info, __v7_pj4b_setup, proc_fns = pj4b_processor_functions
Gregory CLEMENTde490192012-10-03 11:58:07 +0200700 .size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info
Gregory CLEMENT3e0a07f2013-06-23 10:17:11 +0100701#endif
Daniel Walker14eff182010-09-17 16:42:10 +0100702
Catalin Marinasbbe88882007-05-08 22:27:46 +0100703 /*
Jonathan Austinc90ad5c2012-03-15 14:27:07 +0000704 * ARM Ltd. Cortex R7 processor.
705 */
706 .type __v7_cr7mp_proc_info, #object
707__v7_cr7mp_proc_info:
708 .long 0x410fc170
709 .long 0xff0ffff0
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100710 __v7_proc __v7_cr7mp_proc_info, __v7_cr7mp_setup
Jonathan Austinc90ad5c2012-03-15 14:27:07 +0000711 .size __v7_cr7mp_proc_info, . - __v7_cr7mp_proc_info
712
713 /*
Will Deacon868dbf92012-01-20 12:01:14 +0100714 * ARM Ltd. Cortex A7 processor.
715 */
716 .type __v7_ca7mp_proc_info, #object
717__v7_ca7mp_proc_info:
718 .long 0x410fc070
719 .long 0xff0ffff0
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100720 __v7_proc __v7_ca7mp_proc_info, __v7_ca7mp_setup
Will Deacon868dbf92012-01-20 12:01:14 +0100721 .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
722
723 /*
Jonathan Austinddb2ff72014-01-13 12:10:57 +0100724 * ARM Ltd. Cortex A12 processor.
725 */
726 .type __v7_ca12mp_proc_info, #object
727__v7_ca12mp_proc_info:
728 .long 0x410fc0d0
729 .long 0xff0ffff0
Russell King33efd462018-11-07 11:43:44 -0500730 __v7_proc __v7_ca12mp_proc_info, __v7_ca12mp_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
Jonathan Austinddb2ff72014-01-13 12:10:57 +0100731 .size __v7_ca12mp_proc_info, . - __v7_ca12mp_proc_info
732
733 /*
Will Deacon7665d9d2011-01-12 17:10:45 +0000734 * ARM Ltd. Cortex A15 processor.
735 */
736 .type __v7_ca15mp_proc_info, #object
737__v7_ca15mp_proc_info:
738 .long 0x410fc0f0
739 .long 0xff0ffff0
Russell King33efd462018-11-07 11:43:44 -0500740 __v7_proc __v7_ca15mp_proc_info, __v7_ca15mp_setup, proc_fns = ca15_processor_functions
Will Deacon7665d9d2011-01-12 17:10:45 +0000741 .size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
742
743 /*
Marc Carinoc51e78e2014-07-23 00:31:43 +0100744 * Broadcom Corporation Brahma-B15 processor.
745 */
746 .type __v7_b15mp_proc_info, #object
747__v7_b15mp_proc_info:
748 .long 0x420f00f0
749 .long 0xff0ffff0
Russell King33efd462018-11-07 11:43:44 -0500750 __v7_proc __v7_b15mp_proc_info, __v7_b15mp_setup, proc_fns = ca15_processor_functions
Marc Carinoc51e78e2014-07-23 00:31:43 +0100751 .size __v7_b15mp_proc_info, . - __v7_b15mp_proc_info
752
753 /*
Will Deaconcd000cf2014-05-02 17:06:02 +0100754 * ARM Ltd. Cortex A17 processor.
755 */
756 .type __v7_ca17mp_proc_info, #object
757__v7_ca17mp_proc_info:
758 .long 0x410fc0e0
759 .long 0xff0ffff0
Russell King33efd462018-11-07 11:43:44 -0500760 __v7_proc __v7_ca17mp_proc_info, __v7_ca17mp_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
Will Deaconcd000cf2014-05-02 17:06:02 +0100761 .size __v7_ca17mp_proc_info, . - __v7_ca17mp_proc_info
762
Russell King33efd462018-11-07 11:43:44 -0500763 /* ARM Ltd. Cortex A73 processor */
764 .type __v7_ca73_proc_info, #object
765__v7_ca73_proc_info:
766 .long 0x410fd090
767 .long 0xff0ffff0
768 __v7_proc __v7_ca73_proc_info, __v7_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
769 .size __v7_ca73_proc_info, . - __v7_ca73_proc_info
770
771 /* ARM Ltd. Cortex A75 processor */
772 .type __v7_ca75_proc_info, #object
773__v7_ca75_proc_info:
774 .long 0x410fd0a0
775 .long 0xff0ffff0
776 __v7_proc __v7_ca75_proc_info, __v7_setup, proc_fns = HARDENED_BPIALL_PROCESSOR_FUNCTIONS
777 .size __v7_ca75_proc_info, . - __v7_ca75_proc_info
778
Will Deaconcd000cf2014-05-02 17:06:02 +0100779 /*
Stepan Moskovchenko120ecfa2013-03-18 19:44:16 +0100780 * Qualcomm Inc. Krait processors.
781 */
782 .type __krait_proc_info, #object
783__krait_proc_info:
784 .long 0x510f0400 @ Required ID value
785 .long 0xff0ffc00 @ Mask for ID
786 /*
787 * Some Krait processors don't indicate support for SDIV and UDIV
788 * instructions in the ARM instruction set, even though they actually
Stephen Boyd6f0f2a92014-11-10 21:56:40 +0100789 * do support them. They also don't indicate support for fused multiply
790 * instructions even though they actually do support them.
Stepan Moskovchenko120ecfa2013-03-18 19:44:16 +0100791 */
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100792 __v7_proc __krait_proc_info, __v7_setup, hwcaps = HWCAP_IDIV | HWCAP_VFPv4
Stepan Moskovchenko120ecfa2013-03-18 19:44:16 +0100793 .size __krait_proc_info, . - __krait_proc_info
794
795 /*
Catalin Marinasbbe88882007-05-08 22:27:46 +0100796 * Match any ARMv7 processor core.
797 */
798 .type __v7_proc_info, #object
799__v7_proc_info:
800 .long 0x000f0000 @ Required ID value
801 .long 0x000f0000 @ Mask for ID
Ard Biesheuvelbf357062015-03-18 07:29:32 +0100802 __v7_proc __v7_proc_info, __v7_setup
Catalin Marinasbbe88882007-05-08 22:27:46 +0100803 .size __v7_proc_info, . - __v7_proc_info