1 /* 2 * __v6_setup 3 * 4 * Initialise TLB, Caches, and MMU state ready to switch the MMU 5 * on. Return in r0 the new CP15 C1 control register setting. 6 * 7 * We automatically detect if we have a Harvard cache, and use the 8 * Harvard cache control instructions insead of the unified cache 9 * control instructions. 10 * 11 * This should be able to cover all ARMv6 cores. 12 * 13 * It is assumed that: 14 * - cache type register is implemented 15 */ 16 __v6_setup: 17 #ifdef CONFIG_SMP 18 ALT_SMP(mrc p15, 0, r0, c1, c0, 1) @ Enable SMP/nAMP mode 19 ALT_UP(nop) 20 orr r0, r0, #0x20 21 ALT_SMP(mcr p15, 0, r0, c1, c0, 1) 22 ALT_UP(nop) 23 #endif 24 25 mov r0, #0 26 mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache 27 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache 28 mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache 29 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer 30 #ifdef CONFIG_MMU 31 mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs 32 mcr p15, 0, r0, c2, c0, 2 @ TTB control register 33 ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) 34 ALT_UP(orr r4, r4, #TTB_FLAGS_UP) 35 ALT_SMP(orr r8, r8, #TTB_FLAGS_SMP) 36 ALT_UP(orr r8, r8, #TTB_FLAGS_UP) 37 mcr p15, 0, r8, c2, c0, 1 @ load TTB1 38 #endif /* CONFIG_MMU */ 39 adr r5, v6_crval 40 ldmia r5, {r5, r6} 41 #ifdef CONFIG_CPU_ENDIAN_BE8 42 orr r6, r6, #1 << 25 @ big-endian page tables 43 #endif 44 mrc p15, 0, r0, c1, c0, 0 @ read control register 45 bic r0, r0, r5 @ clear bits them 46 orr r0, r0, r6 @ set them 47 #ifdef CONFIG_ARM_ERRATA_364296 48 /* 49 * Workaround for the 364296 ARM1136 r0p2 erratum (possible cache data 50 * corruption with hit-under-miss enabled). The conditional code below 51 * (setting the undocumented bit 31 in the auxiliary control register 52 * and the FI bit in the control register) disables hit-under-miss 53 * without putting the processor into full low interrupt latency mode. 54 */ 55 ldr r6, =0x4107b362 @ id for ARM1136 r0p2 56 mrc p15, 0, r5, c0, c0, 0 @ get processor id 57 teq r5, r6 @ check for the faulty core 58 mrceq p15, 0, r5, c1, c0, 1 @ load aux control reg 59 orreq r5, r5, #(1 << 31) @ set the undocumented bit 31 60 mcreq p15, 0, r5, c1, c0, 1 @ write aux control reg 61 orreq r0, r0, #(1 << 21) @ low interrupt latency configuration 62 #endif 63 mov pc, lr @ return to head.S:__ret
浙公网安备 33010602011771号