diff options
Diffstat (limited to 'arch/arm/mm/proc-v7.S')
| -rw-r--r-- | arch/arm/mm/proc-v7.S | 95 | 
1 files changed, 73 insertions, 22 deletions
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 3397f1e64d7..180a08d03a0 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S @@ -19,17 +19,23 @@  #include "proc-macros.S" -#define TTB_C		(1 << 0)  #define TTB_S		(1 << 1)  #define TTB_RGN_NC	(0 << 3)  #define TTB_RGN_OC_WBWA	(1 << 3)  #define TTB_RGN_OC_WT	(2 << 3)  #define TTB_RGN_OC_WB	(3 << 3) +#define TTB_NOS		(1 << 5) +#define TTB_IRGN_NC	((0 << 0) | (0 << 6)) +#define TTB_IRGN_WBWA	((0 << 0) | (1 << 6)) +#define TTB_IRGN_WT	((1 << 0) | (0 << 6)) +#define TTB_IRGN_WB	((1 << 0) | (1 << 6))  #ifndef CONFIG_SMP -#define TTB_FLAGS	TTB_C|TTB_RGN_OC_WB		@ mark PTWs cacheable, outer WB +/* PTWs cacheable, inner WB not shareable, outer WB not shareable */ +#define TTB_FLAGS	TTB_IRGN_WB|TTB_RGN_OC_WB  #else -#define TTB_FLAGS	TTB_C|TTB_S|TTB_RGN_OC_WBWA	@ mark PTWs cacheable and shared, outer WBWA +/* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */ +#define TTB_FLAGS	TTB_IRGN_WBWA|TTB_S|TTB_NOS|TTB_RGN_OC_WBWA  #endif  ENTRY(cpu_v7_proc_init) @@ -176,31 +182,45 @@ cpu_v7_name:   */  __v7_setup:  #ifdef CONFIG_SMP -	mrc	p15, 0, r0, c1, c0, 1		@ Enable SMP/nAMP mode -	orr	r0, r0, #(0x1 << 6) +	mrc	p15, 0, r0, c1, c0, 1		@ Enable SMP/nAMP mode and +	orr	r0, r0, #(1 << 6) | (1 << 0)	@ TLB ops broadcasting  	mcr	p15, 0, r0, c1, c0, 1  #endif  	adr	r12, __v7_setup_stack		@ the local stack  	stmia	r12, {r0-r5, r7, r9, r11, lr}  	bl	v7_flush_dcache_all  	ldmia	r12, {r0-r5, r7, r9, r11, lr} + +	mrc	p15, 0, r0, c0, c0, 0		@ read main ID register +	and	r10, r0, #0xff000000		@ ARM? +	teq	r10, #0x41000000 +	bne	2f +	and	r5, r0, #0x00f00000		@ variant +	and	r6, r0, #0x0000000f		@ revision +	orr	r0, r6, r5, lsr #20-4		@ combine variant and revision +  #ifdef CONFIG_ARM_ERRATA_430973 -	mrc	p15, 0, r10, c1, c0, 1		@ read aux control register -	orr	r10, r10, #(1 << 6)		@ set IBE to 1 -	mcr	p15, 0, r10, c1, c0, 1		@ write aux control register +	teq	r5, #0x00100000			@ only present in r1p* +	mrceq	p15, 0, r10, c1, c0, 1		@ read aux control register +	orreq	r10, r10, #(1 << 6)		@ set IBE to 1 +	mcreq	p15, 0, r10, c1, c0, 1		@ write aux control register  #endif  #ifdef CONFIG_ARM_ERRATA_458693 -	mrc	p15, 0, r10, c1, c0, 1		@ read aux control register -	orr	r10, r10, #(1 << 5)		@ set L1NEON to 1 -	orr	r10, r10, #(1 << 9)		@ set PLDNOP to 1 -	mcr	p15, 0, r10, c1, c0, 1		@ write aux control register +	teq	r0, #0x20			@ only present in r2p0 +	mrceq	p15, 0, r10, c1, c0, 1		@ read aux control register +	orreq	r10, r10, #(1 << 5)		@ set L1NEON to 1 +	orreq	r10, r10, #(1 << 9)		@ set PLDNOP to 1 +	mcreq	p15, 0, r10, c1, c0, 1		@ write aux control register  #endif  #ifdef CONFIG_ARM_ERRATA_460075 -	mrc	p15, 1, r10, c9, c0, 2		@ read L2 cache aux ctrl register -	orr	r10, r10, #(1 << 22)		@ set the Write Allocate disable bit -	mcr	p15, 1, r10, c9, c0, 2		@ write the L2 cache aux ctrl register +	teq	r0, #0x20			@ only present in r2p0 +	mrceq	p15, 1, r10, c9, c0, 2		@ read L2 cache aux ctrl register +	tsteq	r10, #1 << 22 +	orreq	r10, r10, #(1 << 22)		@ set the Write Allocate disable bit +	mcreq	p15, 1, r10, c9, c0, 2		@ write the L2 cache aux ctrl register  #endif -	mov	r10, #0 + +2:	mov	r10, #0  #ifdef HARVARD_CACHE  	mcr	p15, 0, r10, c7, c5, 0		@ I+BTB cache invalidate  #endif @@ -213,12 +233,43 @@ __v7_setup:  	mov	r10, #0x1f			@ domains 0, 1 = manager  	mcr	p15, 0, r10, c3, c0, 0		@ load domain access register  #endif -	ldr	r5, =0xff0aa1a8 -	ldr	r6, =0x40e040e0 +	/* +	 * Memory region attributes with SCTLR.TRE=1 +	 * +	 *   n = TEX[0],C,B +	 *   TR = PRRR[2n+1:2n]		- memory type +	 *   IR = NMRR[2n+1:2n]		- inner cacheable property +	 *   OR = NMRR[2n+17:2n+16]	- outer cacheable property +	 * +	 *			n	TR	IR	OR +	 *   UNCACHED		000	00 +	 *   BUFFERABLE		001	10	00	00 +	 *   WRITETHROUGH	010	10	10	10 +	 *   WRITEBACK		011	10	11	11 +	 *   reserved		110 +	 *   WRITEALLOC		111	10	01	01 +	 *   DEV_SHARED		100	01 +	 *   DEV_NONSHARED	100	01 +	 *   DEV_WC		001	10 +	 *   DEV_CACHED		011	10 +	 * +	 * Other attributes: +	 * +	 *   DS0 = PRRR[16] = 0		- device shareable property +	 *   DS1 = PRRR[17] = 1		- device shareable property +	 *   NS0 = PRRR[18] = 0		- normal shareable property +	 *   NS1 = PRRR[19] = 1		- normal shareable property +	 *   NOS = PRRR[24+n] = 1	- not outer shareable +	 */ +	ldr	r5, =0xff0a81a8			@ PRRR +	ldr	r6, =0x40e040e0			@ NMRR  	mcr	p15, 0, r5, c10, c2, 0		@ write PRRR  	mcr	p15, 0, r6, c10, c2, 1		@ write NMRR  	adr	r5, v7_crval  	ldmia	r5, {r5, r6} +#ifdef CONFIG_CPU_ENDIAN_BE8 +	orr	r6, r6, #1 << 25		@ big-endian page tables +#endif     	mrc	p15, 0, r0, c1, c0, 0		@ read control register  	bic	r0, r0, r5			@ clear bits them  	orr	r0, r0, r6			@ set them @@ -226,14 +277,14 @@ __v7_setup:  ENDPROC(__v7_setup)  	/*   AT -	 *  TFR   EV X F   I D LR -	 * .EEE ..EE PUI. .T.T 4RVI ZFRS BLDP WCAM +	 *  TFR   EV X F   I D LR    S +	 * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM  	 * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced -	 *    1    0 110       0011 1.00 .111 1101 < we want +	 *    1    0 110       0011 1100 .111 1101 < we want  	 */  	.type	v7_crval, #object  v7_crval: -	crval	clear=0x0120c302, mmuset=0x10c0387d, ucset=0x00c0187c +	crval	clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c  __v7_setup_stack:  	.space	4 * 11				@ 11 registers  |