mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	ARM: 7691/1: mm: kill unused TLB_CAN_READ_FROM_L1_CACHE and use ALT_SMP instead
Many ARMv7 cores have hardware page table walkers that can read the L1 cache. This is discoverable from the ID_MMFR3 register, although this can be expensive to access from the low-level set_pte functions and is a pain to cache, particularly with multi-cluster systems. A useful observation is that the multi-processing extensions for ARMv7 require coherent table walks, meaning that we can make use of ALT_SMP patching in proc-v7-* to patch away the cache flush safely for these cores. Reported-by: Albin Tonnerre <Albin.Tonnerre@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									b008848020
								
							
						
					
					
						commit
						ae8a8b9553
					
				
					 5 changed files with 7 additions and 7 deletions
				
			
		| 
						 | 
					@ -169,7 +169,7 @@
 | 
				
			||||||
# define v6wbi_always_flags	(-1UL)
 | 
					# define v6wbi_always_flags	(-1UL)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define v7wbi_tlb_flags_smp	(TLB_WB | TLB_DCLEAN | TLB_BARRIER | \
 | 
					#define v7wbi_tlb_flags_smp	(TLB_WB | TLB_BARRIER | \
 | 
				
			||||||
				 TLB_V7_UIS_FULL | TLB_V7_UIS_PAGE | \
 | 
									 TLB_V7_UIS_FULL | TLB_V7_UIS_PAGE | \
 | 
				
			||||||
				 TLB_V7_UIS_ASID | TLB_V7_UIS_BP)
 | 
									 TLB_V7_UIS_ASID | TLB_V7_UIS_BP)
 | 
				
			||||||
#define v7wbi_tlb_flags_up	(TLB_WB | TLB_DCLEAN | TLB_BARRIER | \
 | 
					#define v7wbi_tlb_flags_up	(TLB_WB | TLB_DCLEAN | TLB_BARRIER | \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,12 +80,10 @@ ENTRY(cpu_v6_do_idle)
 | 
				
			||||||
	mov	pc, lr
 | 
						mov	pc, lr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(cpu_v6_dcache_clean_area)
 | 
					ENTRY(cpu_v6_dcache_clean_area)
 | 
				
			||||||
#ifndef TLB_CAN_READ_FROM_L1_CACHE
 | 
					 | 
				
			||||||
1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
 | 
					1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
 | 
				
			||||||
	add	r0, r0, #D_CACHE_LINE_SIZE
 | 
						add	r0, r0, #D_CACHE_LINE_SIZE
 | 
				
			||||||
	subs	r1, r1, #D_CACHE_LINE_SIZE
 | 
						subs	r1, r1, #D_CACHE_LINE_SIZE
 | 
				
			||||||
	bhi	1b
 | 
						bhi	1b
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	mov	pc, lr
 | 
						mov	pc, lr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,8 @@ ENTRY(cpu_v7_set_pte_ext)
 | 
				
			||||||
 ARM(	str	r3, [r0, #2048]! )
 | 
					 ARM(	str	r3, [r0, #2048]! )
 | 
				
			||||||
 THUMB(	add	r0, r0, #2048 )
 | 
					 THUMB(	add	r0, r0, #2048 )
 | 
				
			||||||
 THUMB(	str	r3, [r0] )
 | 
					 THUMB(	str	r3, [r0] )
 | 
				
			||||||
	mcr	p15, 0, r0, c7, c10, 1		@ flush_pte
 | 
						ALT_SMP(mov	pc,lr)
 | 
				
			||||||
 | 
						ALT_UP (mcr	p15, 0, r0, c7, c10, 1)		@ flush_pte
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	mov	pc, lr
 | 
						mov	pc, lr
 | 
				
			||||||
ENDPROC(cpu_v7_set_pte_ext)
 | 
					ENDPROC(cpu_v7_set_pte_ext)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,7 +73,8 @@ ENTRY(cpu_v7_set_pte_ext)
 | 
				
			||||||
	tst	r3, #1 << (55 - 32)		@ L_PTE_DIRTY
 | 
						tst	r3, #1 << (55 - 32)		@ L_PTE_DIRTY
 | 
				
			||||||
	orreq	r2, #L_PTE_RDONLY
 | 
						orreq	r2, #L_PTE_RDONLY
 | 
				
			||||||
1:	strd	r2, r3, [r0]
 | 
					1:	strd	r2, r3, [r0]
 | 
				
			||||||
	mcr	p15, 0, r0, c7, c10, 1		@ flush_pte
 | 
						ALT_SMP(mov	pc, lr)
 | 
				
			||||||
 | 
						ALT_UP (mcr	p15, 0, r0, c7, c10, 1)		@ flush_pte
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	mov	pc, lr
 | 
						mov	pc, lr
 | 
				
			||||||
ENDPROC(cpu_v7_set_pte_ext)
 | 
					ENDPROC(cpu_v7_set_pte_ext)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,14 +75,14 @@ ENTRY(cpu_v7_do_idle)
 | 
				
			||||||
ENDPROC(cpu_v7_do_idle)
 | 
					ENDPROC(cpu_v7_do_idle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(cpu_v7_dcache_clean_area)
 | 
					ENTRY(cpu_v7_dcache_clean_area)
 | 
				
			||||||
#ifndef TLB_CAN_READ_FROM_L1_CACHE
 | 
						ALT_SMP(mov	pc, lr)			@ MP extensions imply L1 PTW
 | 
				
			||||||
 | 
						ALT_UP(W(nop))
 | 
				
			||||||
	dcache_line_size r2, r3
 | 
						dcache_line_size r2, r3
 | 
				
			||||||
1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
 | 
					1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
 | 
				
			||||||
	add	r0, r0, r2
 | 
						add	r0, r0, r2
 | 
				
			||||||
	subs	r1, r1, r2
 | 
						subs	r1, r1, r2
 | 
				
			||||||
	bhi	1b
 | 
						bhi	1b
 | 
				
			||||||
	dsb
 | 
						dsb
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	mov	pc, lr
 | 
						mov	pc, lr
 | 
				
			||||||
ENDPROC(cpu_v7_dcache_clean_area)
 | 
					ENDPROC(cpu_v7_dcache_clean_area)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue