| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * arch/sh/kernel/cpu/sh5/probe.c | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * CPU Subtype Probing for SH-5. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2000, 2001  Paolo Alberelli | 
					
						
							|  |  |  |  * Copyright (C) 2003 - 2007  Paul Mundt | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is subject to the terms and conditions of the GNU General Public | 
					
						
							|  |  |  |  * License.  See the file "COPYING" in the main directory of this archive | 
					
						
							|  |  |  |  * for more details. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <linux/io.h>
 | 
					
						
							|  |  |  | #include <linux/string.h>
 | 
					
						
							|  |  |  | #include <asm/processor.h>
 | 
					
						
							|  |  |  | #include <asm/cache.h>
 | 
					
						
							| 
									
										
										
										
											2008-04-25 13:05:17 +09:00
										 |  |  | #include <asm/tlb.h>
 | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-18 17:10:12 -04:00
										 |  |  | void cpu_probe(void) | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | { | 
					
						
							|  |  |  | 	unsigned long long cir; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Do peeks in real mode to avoid having to set up a mapping for | 
					
						
							|  |  |  | 	 * the WPC registers. On SH5-101 cut2, such a mapping would be | 
					
						
							|  |  |  | 	 * exposed to an address translation erratum which would make it | 
					
						
							|  |  |  | 	 * hard to set up correctly. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 	cir = peek_real_address_q(0x0d000008); | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | 	if ((cir & 0xffff) == 0x5103) | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 		boot_cpu_data.type = CPU_SH5_103; | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | 	else if (((cir >> 32) & 0xffff) == 0x51e2) | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 		/* CPU.VCR aliased at CIR address on SH5-101 */ | 
					
						
							|  |  |  | 		boot_cpu_data.type = CPU_SH5_101; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-15 10:48:13 +09:00
										 |  |  | 	boot_cpu_data.family = CPU_FAMILY_SH5; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * First, setup some sane values for the I-cache. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	boot_cpu_data.icache.ways		= 4; | 
					
						
							|  |  |  | 	boot_cpu_data.icache.sets		= 256; | 
					
						
							|  |  |  | 	boot_cpu_data.icache.linesz		= L1_CACHE_BYTES; | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | 	boot_cpu_data.icache.way_incr		= (1 << 13); | 
					
						
							|  |  |  | 	boot_cpu_data.icache.entry_shift	= 5; | 
					
						
							|  |  |  | 	boot_cpu_data.icache.way_size		= boot_cpu_data.icache.sets * | 
					
						
							|  |  |  | 						  boot_cpu_data.icache.linesz; | 
					
						
							|  |  |  | 	boot_cpu_data.icache.entry_mask		= 0x1fe0; | 
					
						
							|  |  |  | 	boot_cpu_data.icache.flags		= 0; | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | 	 * Next, setup some sane values for the D-cache. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * On the SH5, these are pretty consistent with the I-cache settings, | 
					
						
							|  |  |  | 	 * so we just copy over the existing definitions.. these can be fixed | 
					
						
							|  |  |  | 	 * up later, especially if we add runtime CPU probing. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * Though in the meantime it saves us from having to duplicate all of | 
					
						
							|  |  |  | 	 * the above definitions.. | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | 	boot_cpu_data.dcache		= boot_cpu_data.icache; | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | 	 * Setup any cache-related flags here | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2008-02-13 20:14:10 +09:00
										 |  |  | #if defined(CONFIG_CACHE_WRITETHROUGH)
 | 
					
						
							|  |  |  | 	set_bit(SH_CACHE_MODE_WT, &(boot_cpu_data.dcache.flags)); | 
					
						
							|  |  |  | #elif defined(CONFIG_CACHE_WRITEBACK)
 | 
					
						
							|  |  |  | 	set_bit(SH_CACHE_MODE_WB, &(boot_cpu_data.dcache.flags)); | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 13:05:17 +09:00
										 |  |  | 	/* Setup some I/D TLB defaults */ | 
					
						
							|  |  |  | 	sh64_tlb_init(); | 
					
						
							| 
									
										
										
										
											2007-11-20 18:27:20 +09:00
										 |  |  | } |