MIPS: c-r4k: Local flush_icache_range cache op override
Allow the permitted cache op types used by local_r4k_flush_icache_range_ipi() to be overridden by the SMP caller. This will allow SMP calls to be avoided under certain circumstances, falling back to a single CPU performing globalized hit cache ops only. Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Paul Burton <paul.burton@imgtec.com> Cc: Leonid Yegoshin <leonid.yegoshin@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/13803/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
		
							parent
							
								
									a9341ae241
								
							
						
					
					
						commit
						27b93d9c1d
					
				| @ -721,12 +721,16 @@ static void r4k_flush_data_cache_page(unsigned long addr) | ||||
| struct flush_icache_range_args { | ||||
| 	unsigned long start; | ||||
| 	unsigned long end; | ||||
| 	unsigned int type; | ||||
| }; | ||||
| 
 | ||||
| static inline void local_r4k_flush_icache_range(unsigned long start, unsigned long end) | ||||
| static inline void __local_r4k_flush_icache_range(unsigned long start, | ||||
| 						  unsigned long end, | ||||
| 						  unsigned int type) | ||||
| { | ||||
| 	if (!cpu_has_ic_fills_f_dc) { | ||||
| 		if (end - start >= dcache_size) { | ||||
| 		if (type == R4K_INDEX || | ||||
| 		    (type & R4K_INDEX && end - start >= dcache_size)) { | ||||
| 			r4k_blast_dcache(); | ||||
| 		} else { | ||||
| 			R4600_HIT_CACHEOP_WAR_IMPL; | ||||
| @ -734,7 +738,8 @@ static inline void local_r4k_flush_icache_range(unsigned long start, unsigned lo | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (end - start > icache_size) | ||||
| 	if (type == R4K_INDEX || | ||||
| 	    (type & R4K_INDEX && end - start > icache_size)) | ||||
| 		r4k_blast_icache(); | ||||
| 	else { | ||||
| 		switch (boot_cpu_type()) { | ||||
| @ -760,13 +765,20 @@ static inline void local_r4k_flush_icache_range(unsigned long start, unsigned lo | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| static inline void local_r4k_flush_icache_range(unsigned long start, | ||||
| 						unsigned long end) | ||||
| { | ||||
| 	__local_r4k_flush_icache_range(start, end, R4K_HIT | R4K_INDEX); | ||||
| } | ||||
| 
 | ||||
| static inline void local_r4k_flush_icache_range_ipi(void *args) | ||||
| { | ||||
| 	struct flush_icache_range_args *fir_args = args; | ||||
| 	unsigned long start = fir_args->start; | ||||
| 	unsigned long end = fir_args->end; | ||||
| 	unsigned int type = fir_args->type; | ||||
| 
 | ||||
| 	local_r4k_flush_icache_range(start, end); | ||||
| 	__local_r4k_flush_icache_range(start, end, type); | ||||
| } | ||||
| 
 | ||||
| static void r4k_flush_icache_range(unsigned long start, unsigned long end) | ||||
| @ -775,9 +787,9 @@ static void r4k_flush_icache_range(unsigned long start, unsigned long end) | ||||
| 
 | ||||
| 	args.start = start; | ||||
| 	args.end = end; | ||||
| 	args.type = R4K_HIT | R4K_INDEX; | ||||
| 
 | ||||
| 	r4k_on_each_cpu(R4K_HIT | R4K_INDEX, local_r4k_flush_icache_range_ipi, | ||||
| 			&args); | ||||
| 	r4k_on_each_cpu(args.type, local_r4k_flush_icache_range_ipi, &args); | ||||
| 	instruction_hazard(); | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user