| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2003, 2004 Ralf Baechle | 
					
						
							| 
									
										
										
										
											2005-05-05 16:45:59 +00:00
										 |  |  |  * Copyright (C) 2004  Maciej W. Rozycki | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | #ifndef __ASM_CPU_FEATURES_H
 | 
					
						
							|  |  |  | #define __ASM_CPU_FEATURES_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/cpu.h>
 | 
					
						
							|  |  |  | #include <asm/cpu-info.h>
 | 
					
						
							|  |  |  | #include <cpu-feature-overrides.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-11 23:46:15 +01:00
										 |  |  | #ifndef current_cpu_type
 | 
					
						
							|  |  |  | #define current_cpu_type()      current_cpu_data.cputype
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SMP assumption: Options of CPU 0 are a superset of all processors. | 
					
						
							|  |  |  |  * This is true for all known MIPS systems. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef cpu_has_tlb
 | 
					
						
							|  |  |  | #define cpu_has_tlb		(cpu_data[0].options & MIPS_CPU_TLB)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_4kex
 | 
					
						
							|  |  |  | #define cpu_has_4kex		(cpu_data[0].options & MIPS_CPU_4KEX)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-10-01 13:06:32 +01:00
										 |  |  | #ifndef cpu_has_3k_cache
 | 
					
						
							|  |  |  | #define cpu_has_3k_cache	(cpu_data[0].options & MIPS_CPU_3K_CACHE)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #define cpu_has_6k_cache	0
 | 
					
						
							|  |  |  | #define cpu_has_8k_cache	0
 | 
					
						
							|  |  |  | #ifndef cpu_has_4k_cache
 | 
					
						
							|  |  |  | #define cpu_has_4k_cache	(cpu_data[0].options & MIPS_CPU_4K_CACHE)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_tx39_cache
 | 
					
						
							|  |  |  | #define cpu_has_tx39_cache	(cpu_data[0].options & MIPS_CPU_TX39_CACHE)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-12-11 15:33:27 -08:00
										 |  |  | #ifndef cpu_has_octeon_cache
 | 
					
						
							|  |  |  | #define cpu_has_octeon_cache	0
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #ifndef cpu_has_fpu
 | 
					
						
							| 
									
										
										
										
											2006-04-05 09:45:47 +01:00
										 |  |  | #define cpu_has_fpu		(current_cpu_data.options & MIPS_CPU_FPU)
 | 
					
						
							| 
									
										
										
										
											2007-03-10 01:07:45 +09:00
										 |  |  | #define raw_cpu_has_fpu		(raw_current_cpu_data.options & MIPS_CPU_FPU)
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define raw_cpu_has_fpu		cpu_has_fpu
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_32fpr
 | 
					
						
							|  |  |  | #define cpu_has_32fpr		(cpu_data[0].options & MIPS_CPU_32FPR)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_counter
 | 
					
						
							|  |  |  | #define cpu_has_counter		(cpu_data[0].options & MIPS_CPU_COUNTER)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_watch
 | 
					
						
							|  |  |  | #define cpu_has_watch		(cpu_data[0].options & MIPS_CPU_WATCH)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_divec
 | 
					
						
							|  |  |  | #define cpu_has_divec		(cpu_data[0].options & MIPS_CPU_DIVEC)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_vce
 | 
					
						
							|  |  |  | #define cpu_has_vce		(cpu_data[0].options & MIPS_CPU_VCE)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_cache_cdex_p
 | 
					
						
							|  |  |  | #define cpu_has_cache_cdex_p	(cpu_data[0].options & MIPS_CPU_CACHE_CDEX_P)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_cache_cdex_s
 | 
					
						
							|  |  |  | #define cpu_has_cache_cdex_s	(cpu_data[0].options & MIPS_CPU_CACHE_CDEX_S)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_prefetch
 | 
					
						
							|  |  |  | #define cpu_has_prefetch	(cpu_data[0].options & MIPS_CPU_PREFETCH)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_mcheck
 | 
					
						
							|  |  |  | #define cpu_has_mcheck		(cpu_data[0].options & MIPS_CPU_MCHECK)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_ejtag
 | 
					
						
							|  |  |  | #define cpu_has_ejtag		(cpu_data[0].options & MIPS_CPU_EJTAG)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_llsc
 | 
					
						
							|  |  |  | #define cpu_has_llsc		(cpu_data[0].options & MIPS_CPU_LLSC)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-07-13 11:15:19 -07:00
										 |  |  | #ifndef kernel_uses_llsc
 | 
					
						
							|  |  |  | #define kernel_uses_llsc	cpu_has_llsc
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-05-05 16:45:59 +00:00
										 |  |  | #ifndef cpu_has_mips16
 | 
					
						
							|  |  |  | #define cpu_has_mips16		(cpu_data[0].ases & MIPS_ASE_MIPS16)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_mdmx
 | 
					
						
							|  |  |  | #define cpu_has_mdmx           (cpu_data[0].ases & MIPS_ASE_MDMX)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_mips3d
 | 
					
						
							|  |  |  | #define cpu_has_mips3d         (cpu_data[0].ases & MIPS_ASE_MIPS3D)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_smartmips
 | 
					
						
							|  |  |  | #define cpu_has_smartmips      (cpu_data[0].ases & MIPS_ASE_SMARTMIPS)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-02-10 15:12:47 -08:00
										 |  |  | #ifndef kernel_uses_smartmips_rixi
 | 
					
						
							|  |  |  | #define kernel_uses_smartmips_rixi 0
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #ifndef cpu_has_vtag_icache
 | 
					
						
							|  |  |  | #define cpu_has_vtag_icache	(cpu_data[0].icache.flags & MIPS_CACHE_VTAG)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_dc_aliases
 | 
					
						
							|  |  |  | #define cpu_has_dc_aliases	(cpu_data[0].dcache.flags & MIPS_CACHE_ALIASES)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_has_ic_fills_f_dc
 | 
					
						
							|  |  |  | #define cpu_has_ic_fills_f_dc	(cpu_data[0].icache.flags & MIPS_CACHE_IC_F_DC)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-03-13 18:23:03 +09:00
										 |  |  | #ifndef cpu_has_pindexed_dcache
 | 
					
						
							|  |  |  | #define cpu_has_pindexed_dcache	(cpu_data[0].dcache.flags & MIPS_CACHE_PINDEX)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * I-Cache snoops remote store.  This only matters on SMP.  Some multiprocessors | 
					
						
							|  |  |  |  * such as the R10000 have I-Caches that snoop local stores; the embedded ones | 
					
						
							|  |  |  |  * don't.  For maintaining I-cache coherency this means we need to flush the | 
					
						
							|  |  |  |  * D-cache all the way back to whever the I-cache does refills from, so the | 
					
						
							|  |  |  |  * I-cache has a chance to see the new data at all.  Then we have to flush the | 
					
						
							|  |  |  |  * I-cache also. | 
					
						
							|  |  |  |  * Note we may have been rescheduled and may no longer be running on the CPU | 
					
						
							|  |  |  |  * that did the store so we can't optimize this into only doing the flush on | 
					
						
							|  |  |  |  * the local CPU. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef cpu_icache_snoops_remote_store
 | 
					
						
							|  |  |  | #ifdef CONFIG_SMP
 | 
					
						
							|  |  |  | #define cpu_icache_snoops_remote_store	(cpu_data[0].icache.flags & MIPS_IC_SNOOPS_REMOTE)
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define cpu_icache_snoops_remote_store	1
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-09 12:20:49 +00:00
										 |  |  | # ifndef cpu_has_mips32r1
 | 
					
						
							|  |  |  | # define cpu_has_mips32r1	(cpu_data[0].isa_level & MIPS_CPU_ISA_M32R1)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_mips32r2
 | 
					
						
							|  |  |  | # define cpu_has_mips32r2	(cpu_data[0].isa_level & MIPS_CPU_ISA_M32R2)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_mips64r1
 | 
					
						
							|  |  |  | # define cpu_has_mips64r1	(cpu_data[0].isa_level & MIPS_CPU_ISA_M64R1)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_mips64r2
 | 
					
						
							|  |  |  | # define cpu_has_mips64r2	(cpu_data[0].isa_level & MIPS_CPU_ISA_M64R2)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Shortcuts ... | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define cpu_has_mips32	(cpu_has_mips32r1 | cpu_has_mips32r2)
 | 
					
						
							|  |  |  | #define cpu_has_mips64	(cpu_has_mips64r1 | cpu_has_mips64r2)
 | 
					
						
							|  |  |  | #define cpu_has_mips_r1	(cpu_has_mips32r1 | cpu_has_mips64r1)
 | 
					
						
							|  |  |  | #define cpu_has_mips_r2	(cpu_has_mips32r2 | cpu_has_mips64r2)
 | 
					
						
							| 
									
										
										
										
											2008-10-28 09:37:47 +00:00
										 |  |  | #define cpu_has_mips_r	(cpu_has_mips32r1 | cpu_has_mips32r2 | \
 | 
					
						
							|  |  |  | 			 cpu_has_mips64r1 | cpu_has_mips64r2) | 
					
						
							| 
									
										
										
										
											2005-12-09 12:20:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-12 12:41:53 -07:00
										 |  |  | #ifndef cpu_has_mips_r2_exec_hazard
 | 
					
						
							|  |  |  | #define cpu_has_mips_r2_exec_hazard cpu_has_mips_r2
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-19 03:21:22 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * MIPS32, MIPS64, VR5500, IDT32332, IDT32334 and maybe a few other | 
					
						
							|  |  |  |  * pre-MIPS32/MIPS53 processors have CLO, CLZ.  For 64-bit kernels | 
					
						
							|  |  |  |  * cpu_has_clo_clz also indicates the availability of DCLO and DCLZ. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | # ifndef cpu_has_clo_clz
 | 
					
						
							|  |  |  | # define cpu_has_clo_clz	cpu_has_mips_r
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-05-31 11:49:19 +00:00
										 |  |  | #ifndef cpu_has_dsp
 | 
					
						
							|  |  |  | #define cpu_has_dsp		(cpu_data[0].ases & MIPS_ASE_DSP)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-14 07:34:18 +00:00
										 |  |  | #ifndef cpu_has_mipsmt
 | 
					
						
							| 
									
										
										
										
											2006-06-30 12:32:37 +01:00
										 |  |  | #define cpu_has_mipsmt		(cpu_data[0].ases & MIPS_ASE_MIPSMT)
 | 
					
						
							| 
									
										
										
										
											2005-07-14 07:34:18 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-10 17:33:02 +01:00
										 |  |  | #ifndef cpu_has_userlocal
 | 
					
						
							|  |  |  | #define cpu_has_userlocal	(cpu_data[0].options & MIPS_CPU_ULRI)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-03 15:56:16 -07:00
										 |  |  | #ifdef CONFIG_32BIT
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | # ifndef cpu_has_nofpuex
 | 
					
						
							|  |  |  | # define cpu_has_nofpuex	(cpu_data[0].options & MIPS_CPU_NOFPUEX)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bits
 | 
					
						
							|  |  |  | # define cpu_has_64bits		(cpu_data[0].isa_level & MIPS_CPU_ISA_64BIT)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bit_zero_reg
 | 
					
						
							|  |  |  | # define cpu_has_64bit_zero_reg	(cpu_data[0].isa_level & MIPS_CPU_ISA_64BIT)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bit_gp_regs
 | 
					
						
							|  |  |  | # define cpu_has_64bit_gp_regs		0
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bit_addresses
 | 
					
						
							|  |  |  | # define cpu_has_64bit_addresses	0
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2010-02-02 08:52:20 -08:00
										 |  |  | # ifndef cpu_vmbits
 | 
					
						
							|  |  |  | # define cpu_vmbits 31
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-03 15:56:16 -07:00
										 |  |  | #ifdef CONFIG_64BIT
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | # ifndef cpu_has_nofpuex
 | 
					
						
							|  |  |  | # define cpu_has_nofpuex		0
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bits
 | 
					
						
							|  |  |  | # define cpu_has_64bits			1
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bit_zero_reg
 | 
					
						
							|  |  |  | # define cpu_has_64bit_zero_reg		1
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bit_gp_regs
 | 
					
						
							|  |  |  | # define cpu_has_64bit_gp_regs		1
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | # ifndef cpu_has_64bit_addresses
 | 
					
						
							|  |  |  | # define cpu_has_64bit_addresses	1
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2010-02-02 08:52:20 -08:00
										 |  |  | # ifndef cpu_vmbits
 | 
					
						
							|  |  |  | # define cpu_vmbits cpu_data[0].vmbits
 | 
					
						
							|  |  |  | # define __NEED_VMBITS_PROBE
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-05 17:24:46 +01:00
										 |  |  | #if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint)
 | 
					
						
							|  |  |  | # define cpu_has_vint		(cpu_data[0].options & MIPS_CPU_VINT)
 | 
					
						
							|  |  |  | #elif !defined(cpu_has_vint)
 | 
					
						
							| 
									
										
										
										
											2005-07-14 07:34:18 +00:00
										 |  |  | # define cpu_has_vint			0
 | 
					
						
							| 
									
										
										
										
											2006-06-05 17:24:46 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(CONFIG_CPU_MIPSR2_IRQ_EI) && !defined(cpu_has_veic)
 | 
					
						
							|  |  |  | # define cpu_has_veic		(cpu_data[0].options & MIPS_CPU_VEIC)
 | 
					
						
							|  |  |  | #elif !defined(cpu_has_veic)
 | 
					
						
							| 
									
										
										
										
											2005-07-14 07:34:18 +00:00
										 |  |  | # define cpu_has_veic			0
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-06 13:04:01 +01:00
										 |  |  | #ifndef cpu_has_inclusive_pcaches
 | 
					
						
							|  |  |  | #define cpu_has_inclusive_pcaches	(cpu_data[0].options & MIPS_CPU_INCLUSIVE_CACHES)
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef cpu_dcache_line_size
 | 
					
						
							| 
									
										
										
										
											2007-11-27 19:20:47 +03:00
										 |  |  | #define cpu_dcache_line_size()	cpu_data[0].dcache.linesz
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_icache_line_size
 | 
					
						
							| 
									
										
										
										
											2007-11-27 19:20:47 +03:00
										 |  |  | #define cpu_icache_line_size()	cpu_data[0].icache.linesz
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef cpu_scache_line_size
 | 
					
						
							| 
									
										
										
										
											2007-11-27 19:20:47 +03:00
										 |  |  | #define cpu_scache_line_size()	cpu_data[0].scache.linesz
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-13 15:59:55 -07:00
										 |  |  | #ifndef cpu_hwrena_impl_bits
 | 
					
						
							|  |  |  | #define cpu_hwrena_impl_bits		0
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif /* __ASM_CPU_FEATURES_H */
 |