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