proc-v7.S revision efbc74ace95338484f8d732037b99c7c77098fce
1bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas/* 2bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * linux/arch/arm/mm/proc-v7.S 3bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 4bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * Copyright (C) 2001 Deep Blue Solutions Ltd. 5bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 6bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * This program is free software; you can redistribute it and/or modify 7bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * it under the terms of the GNU General Public License version 2 as 8bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * published by the Free Software Foundation. 9bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 10bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * This is the "shell" of the ARMv7 processor support. 11bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas */ 12991da17ec0b9f396154c8120ffd10e5d7d7aa361Tim Abbott#include <linux/init.h> 13bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#include <linux/linkage.h> 14bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#include <asm/assembler.h> 15bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#include <asm/asm-offsets.h> 165ec9407dd1196daaf12b427b351e2cd62d2a16a7Russell King#include <asm/hwcap.h> 17bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#include <asm/pgtable-hwdef.h> 18bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#include <asm/pgtable.h> 19bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 20bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#include "proc-macros.S" 21bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 221b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#ifdef CONFIG_ARM_LPAE 231b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#include "proc-v7-3level.S" 241b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#else 258d2cd3a38fd663bd341507f5ac29002ffd81d986Catalin Marinas#include "proc-v7-2level.S" 261b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#endif 2773b63efaac7352c9e2bf1570fac98fd44a99f8f9Jon Callan 28bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin MarinasENTRY(cpu_v7_proc_init) 29bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas mov pc, lr 3093ed3970114983543bbebd195bef65db84444ea2Catalin MarinasENDPROC(cpu_v7_proc_init) 31bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 32bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin MarinasENTRY(cpu_v7_proc_fin) 331f667c690be3ab71036c436d8391105eee23f65bTony Lindgren mrc p15, 0, r0, c1, c0, 0 @ ctrl register 341f667c690be3ab71036c436d8391105eee23f65bTony Lindgren bic r0, r0, #0x1000 @ ...i............ 351f667c690be3ab71036c436d8391105eee23f65bTony Lindgren bic r0, r0, #0x0006 @ .............ca. 361f667c690be3ab71036c436d8391105eee23f65bTony Lindgren mcr p15, 0, r0, c1, c0, 0 @ disable caches 379ca03a21e320a6bf44559323527aba704bcc8772Russell King mov pc, lr 3893ed3970114983543bbebd195bef65db84444ea2Catalin MarinasENDPROC(cpu_v7_proc_fin) 39bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 40bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas/* 41bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * cpu_v7_reset(loc) 42bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 43bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * Perform a soft reset of the system. Put the CPU into the 44bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * same state as it would be if it had been reset, and branch 45bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * to what would be the reset vector. 46bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 47bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * - loc - location to jump to for soft reset 48f4daf06fc23b99df5ca5b3e892428b91e148cc52Will Deacon * 49f4daf06fc23b99df5ca5b3e892428b91e148cc52Will Deacon * This code must be executed using a flat identity mapping with 50f4daf06fc23b99df5ca5b3e892428b91e148cc52Will Deacon * caches disabled. 51bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas */ 52bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .align 5 531a4baafa7d203da1cceb302c2df38f0fea1c17a1Will Deacon .pushsection .idmap.text, "ax" 54bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin MarinasENTRY(cpu_v7_reset) 55f4daf06fc23b99df5ca5b3e892428b91e148cc52Will Deacon mrc p15, 0, r1, c1, c0, 0 @ ctrl register 56f4daf06fc23b99df5ca5b3e892428b91e148cc52Will Deacon bic r1, r1, #0x1 @ ...............m 570f81bb6b051ad760686b5b0fef8c731282c16ef5Will Deacon THUMB( bic r1, r1, #1 << 30 ) @ SCTLR.TE (Thumb exceptions) 58f4daf06fc23b99df5ca5b3e892428b91e148cc52Will Deacon mcr p15, 0, r1, c1, c0, 0 @ disable MMU 59f4daf06fc23b99df5ca5b3e892428b91e148cc52Will Deacon isb 60bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas mov pc, r0 6193ed3970114983543bbebd195bef65db84444ea2Catalin MarinasENDPROC(cpu_v7_reset) 621a4baafa7d203da1cceb302c2df38f0fea1c17a1Will Deacon .popsection 63bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 64bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas/* 65bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * cpu_v7_do_idle() 66bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 67bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * Idle the processor (eg, wait for interrupt). 68bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 69bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * IRQs are already disabled. 70bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas */ 71bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin MarinasENTRY(cpu_v7_do_idle) 728553cb67d2318db327071018fc81084cbabccc46Catalin Marinas dsb @ WFI may enter a low-power mode 73000b50259271c9c14f6e175795f5164e1d51d35bCatalin Marinas wfi 74bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas mov pc, lr 7593ed3970114983543bbebd195bef65db84444ea2Catalin MarinasENDPROC(cpu_v7_do_idle) 76bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 77bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin MarinasENTRY(cpu_v7_dcache_clean_area) 78bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#ifndef TLB_CAN_READ_FROM_L1_CACHE 79bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas dcache_line_size r2, r3 80bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry 81bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas add r0, r0, r2 82bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas subs r1, r1, r2 83bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas bhi 1b 84bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas dsb 85bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas#endif 86bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas mov pc, lr 8793ed3970114983543bbebd195bef65db84444ea2Catalin MarinasENDPROC(cpu_v7_dcache_clean_area) 88bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 8978a8f3c365b8851eb9862c54425e95bfd523f22dDave Martin string cpu_v7_name, "ARMv7 Processor" 90bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .align 91bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 92f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ 93f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King.globl cpu_v7_suspend_size 941b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas.equ cpu_v7_suspend_size, 4 * 8 9515e0d9e37c7fe9711b60f47221c394d45553ad8cArnd Bergmann#ifdef CONFIG_ARM_CPU_SUSPEND 96f6b0fa02e8b0708d17d631afce456524eadf87ffRussell KingENTRY(cpu_v7_do_suspend) 97de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King stmfd sp!, {r4 - r10, lr} 98f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID 991aede681ac159884c77817d33230eed9185b6f6cRussell King mrc p15, 0, r5, c13, c0, 3 @ User r/o thread ID 1001aede681ac159884c77817d33230eed9185b6f6cRussell King stmia r0!, {r4 - r5} 101f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mrc p15, 0, r6, c3, c0, 0 @ Domain ID 102de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mrc p15, 0, r7, c2, c0, 1 @ TTB 1 1031b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas mrc p15, 0, r11, c2, c0, 2 @ TTB control register 104de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mrc p15, 0, r8, c1, c0, 0 @ Control register 105de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register 106de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control 1071b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas stmia r0, {r6 - r11} 108de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King ldmfd sp!, {r4 - r10, pc} 109f6b0fa02e8b0708d17d631afce456524eadf87ffRussell KingENDPROC(cpu_v7_do_suspend) 110f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King 111f6b0fa02e8b0708d17d631afce456524eadf87ffRussell KingENTRY(cpu_v7_do_resume) 112f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mov ip, #0 113f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs 114f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache 1151aede681ac159884c77817d33230eed9185b6f6cRussell King mcr p15, 0, ip, c13, c0, 1 @ set reserved context ID 1161aede681ac159884c77817d33230eed9185b6f6cRussell King ldmia r0!, {r4 - r5} 117f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID 1181aede681ac159884c77817d33230eed9185b6f6cRussell King mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID 1191b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas ldmia r0, {r6 - r11} 120f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mcr p15, 0, r6, c3, c0, 0 @ Domain ID 1211b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#ifndef CONFIG_ARM_LPAE 122de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP) 123de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King ALT_UP(orr r1, r1, #TTB_FLAGS_UP) 1241b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#endif 125de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mcr p15, 0, r1, c2, c0, 0 @ TTB 0 126de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mcr p15, 0, r7, c2, c0, 1 @ TTB 1 1271b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas mcr p15, 0, r11, c2, c0, 2 @ TTB control register 12825904157168ddc8841748a729914f00e53d7e049Russell King mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register 129de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King teq r4, r9 @ Is it already set? 130de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mcrne p15, 0, r9, c1, c0, 1 @ No, so write it 131de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mcr p15, 0, r10, c1, c0, 2 @ Co-processor access control 132f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King ldr r4, =PRRR @ PRRR 133f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King ldr r5, =NMRR @ NMRR 134f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mcr p15, 0, r4, c10, c2, 0 @ write PRRR 135f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King mcr p15, 0, r5, c10, c2, 1 @ write NMRR 136f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King isb 137f35235a315a167e38e8e5bc9e476dcd7c932612cRussell King dsb 138de8e71ca4f2e17329f6718ae88d5c8336cb249eeRussell King mov r0, r8 @ control register 139f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King b cpu_resume_mmu 140f6b0fa02e8b0708d17d631afce456524eadf87ffRussell KingENDPROC(cpu_v7_do_resume) 141f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King#endif 142f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King 1435085f3ff458521045f7e43da62b8c30ea7df2e82Russell King __CPUINIT 144bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 145bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas/* 146bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * __v7_setup 147bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 148bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * Initialise TLB, Caches, and MMU state ready to switch the MMU 149bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * on. Return in r0 the new CP15 C1 control register setting. 150bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 151bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * This should be able to cover all ARMv7 cores. 152bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * 153bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * It is assumed that: 154bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * - cache type register is implemented 155bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas */ 15615eb169bfec291faf25b158cfa9842b72f7803adPawel Moll__v7_ca5mp_setup: 15714eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker__v7_ca9mp_setup: 1587665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon mov r10, #(1 << 0) @ TLB ops broadcasting 1597665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon b 1f 160b4244738d20a631cd27fa105a2db71622618ab4ePawel Moll__v7_ca7mp_setup: 1617665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon__v7_ca15mp_setup: 1627665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon mov r10, #0 1637665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon1: 16473b63efaac7352c9e2bf1570fac98fd44a99f8f9Jon Callan#ifdef CONFIG_SMP 165f00ec48fadf5e37e7889f14cff900aa70d18b644Russell King ALT_SMP(mrc p15, 0, r0, c1, c0, 1) 166f00ec48fadf5e37e7889f14cff900aa70d18b644Russell King ALT_UP(mov r0, #(1 << 6)) @ fake it for UP 1671b3a02eb452354fa9b36a7f33dc4c8307bbc40aaTony Thompson tst r0, #(1 << 6) @ SMP/nAMP mode enabled? 1687665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon orreq r0, r0, #(1 << 6) @ Enable SMP/nAMP mode 1697665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon orreq r0, r0, r10 @ Enable CPU-specific SMP bits 1707665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon mcreq p15, 0, r0, c1, c0, 1 17173b63efaac7352c9e2bf1570fac98fd44a99f8f9Jon Callan#endif 17214eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker__v7_setup: 173bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas adr r12, __v7_setup_stack @ the local stack 174bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas stmia r12, {r0-r5, r7, r9, r11, lr} 175bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas bl v7_flush_dcache_all 176bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas ldmia r12, {r0-r5, r7, r9, r11, lr} 1771946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King 1781946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King mrc p15, 0, r0, c0, c0, 0 @ read main ID register 1791946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King and r10, r0, #0xff000000 @ ARM? 1801946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King teq r10, #0x41000000 1819f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon bne 3f 1821946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King and r5, r0, #0x00f00000 @ variant 1831946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King and r6, r0, #0x0000000f @ revision 1846491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon orr r6, r6, r5, lsr #20-4 @ combine variant and revision 1856491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon ubfx r0, r0, #4, #12 @ primary part number 1861946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King 1876491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon /* Cortex-A8 Errata */ 1886491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon ldr r10, =0x00000c08 @ Cortex-A8 primary part number 1896491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon teq r0, r10 1906491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon bne 2f 1917ce236fcd6fd45b0441a2d49acb2ceb2de2e8a47Catalin Marinas#ifdef CONFIG_ARM_ERRATA_430973 1921946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King teq r5, #0x00100000 @ only present in r1p* 1931946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King mrceq p15, 0, r10, c1, c0, 1 @ read aux control register 1941946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King orreq r10, r10, #(1 << 6) @ set IBE to 1 1951946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King mcreq p15, 0, r10, c1, c0, 1 @ write aux control register 1967ce236fcd6fd45b0441a2d49acb2ceb2de2e8a47Catalin Marinas#endif 197855c551f5b8cc3815d58e1056c1f1e7c461e2d24Catalin Marinas#ifdef CONFIG_ARM_ERRATA_458693 1986491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon teq r6, #0x20 @ only present in r2p0 1991946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King mrceq p15, 0, r10, c1, c0, 1 @ read aux control register 2001946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King orreq r10, r10, #(1 << 5) @ set L1NEON to 1 2011946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King orreq r10, r10, #(1 << 9) @ set PLDNOP to 1 2021946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King mcreq p15, 0, r10, c1, c0, 1 @ write aux control register 203855c551f5b8cc3815d58e1056c1f1e7c461e2d24Catalin Marinas#endif 2040516e4643cd22fc9f535aef02ad1de66c382c93bCatalin Marinas#ifdef CONFIG_ARM_ERRATA_460075 2056491848d1ab246f6d243ddef25085fc1d836ff2cWill Deacon teq r6, #0x20 @ only present in r2p0 2061946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King mrceq p15, 1, r10, c9, c0, 2 @ read L2 cache aux ctrl register 2071946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King tsteq r10, #1 << 22 2081946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King orreq r10, r10, #(1 << 22) @ set the Write Allocate disable bit 2091946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King mcreq p15, 1, r10, c9, c0, 2 @ write the L2 cache aux ctrl register 2100516e4643cd22fc9f535aef02ad1de66c382c93bCatalin Marinas#endif 2119f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon b 3f 2129f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon 2139f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon /* Cortex-A9 Errata */ 2149f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon2: ldr r10, =0x00000c09 @ Cortex-A9 primary part number 2159f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon teq r0, r10 2169f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon bne 3f 2179f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon#ifdef CONFIG_ARM_ERRATA_742230 2189f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon cmp r6, #0x22 @ only present up to r2p2 2199f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register 2209f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon orrle r10, r10, #1 << 4 @ set bit #4 2219f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon mcrle p15, 0, r10, c15, c0, 1 @ write diagnostic register 2229f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon#endif 223a672e99b129e286df2e2697a1b603d82321117f3Will Deacon#ifdef CONFIG_ARM_ERRATA_742231 224a672e99b129e286df2e2697a1b603d82321117f3Will Deacon teq r6, #0x20 @ present in r2p0 225a672e99b129e286df2e2697a1b603d82321117f3Will Deacon teqne r6, #0x21 @ present in r2p1 226a672e99b129e286df2e2697a1b603d82321117f3Will Deacon teqne r6, #0x22 @ present in r2p2 227a672e99b129e286df2e2697a1b603d82321117f3Will Deacon mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register 228a672e99b129e286df2e2697a1b603d82321117f3Will Deacon orreq r10, r10, #1 << 12 @ set bit #12 229a672e99b129e286df2e2697a1b603d82321117f3Will Deacon orreq r10, r10, #1 << 22 @ set bit #22 230a672e99b129e286df2e2697a1b603d82321117f3Will Deacon mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register 231a672e99b129e286df2e2697a1b603d82321117f3Will Deacon#endif 232475d92fc6e72cd123dc5dbb9e70cdb80b0cfdf2dWill Deacon#ifdef CONFIG_ARM_ERRATA_743622 233efbc74ace95338484f8d732037b99c7c77098fceWill Deacon teq r5, #0x00200000 @ only present in r2p* 234475d92fc6e72cd123dc5dbb9e70cdb80b0cfdf2dWill Deacon mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register 235475d92fc6e72cd123dc5dbb9e70cdb80b0cfdf2dWill Deacon orreq r10, r10, #1 << 6 @ set bit #6 236475d92fc6e72cd123dc5dbb9e70cdb80b0cfdf2dWill Deacon mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register 237475d92fc6e72cd123dc5dbb9e70cdb80b0cfdf2dWill Deacon#endif 238ba90c516bae79b5f8184d915bfce7eb280af61b1Dave Martin#if defined(CONFIG_ARM_ERRATA_751472) && defined(CONFIG_SMP) 239ba90c516bae79b5f8184d915bfce7eb280af61b1Dave Martin ALT_SMP(cmp r6, #0x30) @ present prior to r3p0 240ba90c516bae79b5f8184d915bfce7eb280af61b1Dave Martin ALT_UP_B(1f) 2419a27c27ce49df72b1b0062e2ad192a804e1b069bWill Deacon mrclt p15, 0, r10, c15, c0, 1 @ read diagnostic register 2429a27c27ce49df72b1b0062e2ad192a804e1b069bWill Deacon orrlt r10, r10, #1 << 11 @ set bit #11 2439a27c27ce49df72b1b0062e2ad192a804e1b069bWill Deacon mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register 244ba90c516bae79b5f8184d915bfce7eb280af61b1Dave Martin1: 2459a27c27ce49df72b1b0062e2ad192a804e1b069bWill Deacon#endif 2461946d6ef9d7bd4ba97094fe6eb68a9b877bde6b7Russell King 2479f05027c7cb3cfe56a31892bd83391138d41a667Will Deacon3: mov r10, #0 248bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate 249bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas dsb 2502eb8c82bc492d5f185150e63eba5eac4dff24178Catalin Marinas#ifdef CONFIG_MMU 251bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs 2528d2cd3a38fd663bd341507f5ac29002ffd81d986Catalin Marinas v7_ttb_setup r10, r4, r8, r5 @ TTBCR, TTBRx setup 253f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King ldr r5, =PRRR @ PRRR 254f6b0fa02e8b0708d17d631afce456524eadf87ffRussell King ldr r6, =NMRR @ NMRR 2553f69c0c1af288d6b124d0a928a33b51061ebf850Russell King mcr p15, 0, r5, c10, c2, 0 @ write PRRR 2563f69c0c1af288d6b124d0a928a33b51061ebf850Russell King mcr p15, 0, r6, c10, c2, 1 @ write NMRR 257bdaaaec39792ee0035d6c5a5ad2520991e090a3cCatalin Marinas#endif 2582eb8c82bc492d5f185150e63eba5eac4dff24178Catalin Marinas adr r5, v7_crval 2592eb8c82bc492d5f185150e63eba5eac4dff24178Catalin Marinas ldmia r5, {r5, r6} 26026584853a44c58f3d6ac7360d697a2ddcd1a3efaCatalin Marinas#ifdef CONFIG_CPU_ENDIAN_BE8 26126584853a44c58f3d6ac7360d697a2ddcd1a3efaCatalin Marinas orr r6, r6, #1 << 25 @ big-endian page tables 26226584853a44c58f3d6ac7360d697a2ddcd1a3efaCatalin Marinas#endif 26364d2dc384e41e2b7acead6804593ddaaf8aad8e1Leif Lindholm#ifdef CONFIG_SWP_EMULATE 26464d2dc384e41e2b7acead6804593ddaaf8aad8e1Leif Lindholm orr r5, r5, #(1 << 10) @ set SW bit in "clear" 26564d2dc384e41e2b7acead6804593ddaaf8aad8e1Leif Lindholm bic r6, r6, #(1 << 10) @ clear it in "mmuset" 26664d2dc384e41e2b7acead6804593ddaaf8aad8e1Leif Lindholm#endif 2672eb8c82bc492d5f185150e63eba5eac4dff24178Catalin Marinas mrc p15, 0, r0, c1, c0, 0 @ read control register 2682eb8c82bc492d5f185150e63eba5eac4dff24178Catalin Marinas bic r0, r0, r5 @ clear bits them 2692eb8c82bc492d5f185150e63eba5eac4dff24178Catalin Marinas orr r0, r0, r6 @ set them 270347c8b70b1d5256e445e54e736f88d21877616cfCatalin Marinas THUMB( orr r0, r0, #1 << 30 ) @ Thumb exceptions 271bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas mov pc, lr @ return to head.S:__ret 27293ed3970114983543bbebd195bef65db84444ea2Catalin MarinasENDPROC(__v7_setup) 273bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 2748d2cd3a38fd663bd341507f5ac29002ffd81d986Catalin Marinas .align 2 275bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas__v7_setup_stack: 276bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .space 4 * 11 @ 11 registers 277bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 2785085f3ff458521045f7e43da62b8c30ea7df2e82Russell King __INITDATA 2795085f3ff458521045f7e43da62b8c30ea7df2e82Russell King 28078a8f3c365b8851eb9862c54425e95bfd523f22dDave Martin @ define struct processor (see <asm/proc-fns.h> and proc-macros.S) 28178a8f3c365b8851eb9862c54425e95bfd523f22dDave Martin define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1 282bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 2835085f3ff458521045f7e43da62b8c30ea7df2e82Russell King .section ".rodata" 2845085f3ff458521045f7e43da62b8c30ea7df2e82Russell King 28578a8f3c365b8851eb9862c54425e95bfd523f22dDave Martin string cpu_arch_name, "armv7" 28678a8f3c365b8851eb9862c54425e95bfd523f22dDave Martin string cpu_elf_name, "v7" 287bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .align 288bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 289bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .section ".proc.info.init", #alloc, #execinstr 290bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas 291dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll /* 292dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll * Standard v7 proc info content 293dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll */ 294dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll.macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 295dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ 2961b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags) 297dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ 2981b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas PMD_SECT_AF | PMD_FLAGS_UP | \mm_mmuflags) 2991b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas .long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | \ 3001b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas PMD_SECT_AP_READ | PMD_SECT_AF | \io_mmuflags 301dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll W(b) \initfunc 30214eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .long cpu_arch_name 30314eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .long cpu_elf_name 304dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \ 305dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll HWCAP_EDSP | HWCAP_TLS | \hwcaps 30614eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .long cpu_v7_name 30714eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .long v7_processor_functions 30814eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .long v7wbi_tlb_fns 30914eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .long v6_user_fns 31014eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .long v7_cache_fns 311dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll.endm 312dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll 3131b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#ifndef CONFIG_ARM_LPAE 314dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll /* 31515eb169bfec291faf25b158cfa9842b72f7803adPawel Moll * ARM Ltd. Cortex A5 processor. 31615eb169bfec291faf25b158cfa9842b72f7803adPawel Moll */ 31715eb169bfec291faf25b158cfa9842b72f7803adPawel Moll .type __v7_ca5mp_proc_info, #object 31815eb169bfec291faf25b158cfa9842b72f7803adPawel Moll__v7_ca5mp_proc_info: 31915eb169bfec291faf25b158cfa9842b72f7803adPawel Moll .long 0x410fc050 32015eb169bfec291faf25b158cfa9842b72f7803adPawel Moll .long 0xff0ffff0 32115eb169bfec291faf25b158cfa9842b72f7803adPawel Moll __v7_proc __v7_ca5mp_setup 32215eb169bfec291faf25b158cfa9842b72f7803adPawel Moll .size __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info 32315eb169bfec291faf25b158cfa9842b72f7803adPawel Moll 32415eb169bfec291faf25b158cfa9842b72f7803adPawel Moll /* 325dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll * ARM Ltd. Cortex A9 processor. 326dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll */ 327dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll .type __v7_ca9mp_proc_info, #object 328dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll__v7_ca9mp_proc_info: 329dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll .long 0x410fc090 330dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll .long 0xff0ffff0 331dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll __v7_proc __v7_ca9mp_setup 33214eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info 3331b6ba46b7efa31055eb993a6f2c6bbcb8b35b001Catalin Marinas#endif /* CONFIG_ARM_LPAE */ 33414eff1812679c76564b775aa95cdd378965f6cfbDaniel Walker 335bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas /* 336868dbf905245a524496a0535982ed21ad3be5585Will Deacon * ARM Ltd. Cortex A7 processor. 337868dbf905245a524496a0535982ed21ad3be5585Will Deacon */ 338868dbf905245a524496a0535982ed21ad3be5585Will Deacon .type __v7_ca7mp_proc_info, #object 339868dbf905245a524496a0535982ed21ad3be5585Will Deacon__v7_ca7mp_proc_info: 340868dbf905245a524496a0535982ed21ad3be5585Will Deacon .long 0x410fc070 341868dbf905245a524496a0535982ed21ad3be5585Will Deacon .long 0xff0ffff0 342868dbf905245a524496a0535982ed21ad3be5585Will Deacon __v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV 343868dbf905245a524496a0535982ed21ad3be5585Will Deacon .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info 344868dbf905245a524496a0535982ed21ad3be5585Will Deacon 345868dbf905245a524496a0535982ed21ad3be5585Will Deacon /* 3467665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon * ARM Ltd. Cortex A15 processor. 3477665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon */ 3487665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon .type __v7_ca15mp_proc_info, #object 3497665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon__v7_ca15mp_proc_info: 3507665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon .long 0x410fc0f0 3517665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon .long 0xff0ffff0 3527665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon __v7_proc __v7_ca15mp_setup, hwcaps = HWCAP_IDIV 3537665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon .size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info 3547665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon 3557665d9d2df2eb26284467c2f8591004bd511c75fWill Deacon /* 356bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas * Match any ARMv7 processor core. 357bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas */ 358bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .type __v7_proc_info, #object 359bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas__v7_proc_info: 360bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .long 0x000f0000 @ Required ID value 361bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .long 0x000f0000 @ Mask for ID 362dc939cd835d0e2d3ff4197d6e2c017d269616d20Pawel Moll __v7_proc __v7_setup 363bbe888864ec32435e93923c40b9d6ce2bb73844bCatalin Marinas .size __v7_proc_info, . - __v7_proc_info 364