xref: /netbsd-src/sys/arch/arm/include/cpuconf.h (revision 29299275740e6d437cae3be0478fef97b85b4cd2)
1*29299275Sjmcneill /*	$NetBSD: cpuconf.h,v 1.28 2020/09/29 19:58:50 jmcneill Exp $	*/
232a08607Sthorpej 
332a08607Sthorpej /*
44d402f37Sthorpej  * Copyright (c) 2002 Wasabi Systems, Inc.
532a08607Sthorpej  * All rights reserved.
632a08607Sthorpej  *
732a08607Sthorpej  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
832a08607Sthorpej  *
932a08607Sthorpej  * Redistribution and use in source and binary forms, with or without
1032a08607Sthorpej  * modification, are permitted provided that the following conditions
1132a08607Sthorpej  * are met:
1232a08607Sthorpej  * 1. Redistributions of source code must retain the above copyright
1332a08607Sthorpej  *    notice, this list of conditions and the following disclaimer.
1432a08607Sthorpej  * 2. Redistributions in binary form must reproduce the above copyright
1532a08607Sthorpej  *    notice, this list of conditions and the following disclaimer in the
1632a08607Sthorpej  *    documentation and/or other materials provided with the distribution.
1732a08607Sthorpej  * 3. All advertising materials mentioning features or use of this software
1832a08607Sthorpej  *    must display the following acknowledgement:
1932a08607Sthorpej  *	This product includes software developed for the NetBSD Project by
2032a08607Sthorpej  *	Wasabi Systems, Inc.
2132a08607Sthorpej  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
2232a08607Sthorpej  *    or promote products derived from this software without specific prior
2332a08607Sthorpej  *    written permission.
2432a08607Sthorpej  *
2532a08607Sthorpej  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
2632a08607Sthorpej  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2732a08607Sthorpej  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2832a08607Sthorpej  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
2932a08607Sthorpej  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
3032a08607Sthorpej  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
3132a08607Sthorpej  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3232a08607Sthorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3332a08607Sthorpej  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3432a08607Sthorpej  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3532a08607Sthorpej  * POSSIBILITY OF SUCH DAMAGE.
3632a08607Sthorpej  */
3732a08607Sthorpej 
3832a08607Sthorpej #ifndef _ARM_CPUCONF_H_
3932a08607Sthorpej #define	_ARM_CPUCONF_H_
4032a08607Sthorpej 
4132a08607Sthorpej #if defined(_KERNEL_OPT)
4232a08607Sthorpej #include "opt_cputypes.h"
43d5f7715cSbsh #include "opt_cpuoptions.h"
4432a08607Sthorpej #endif /* _KERNEL_OPT */
4532a08607Sthorpej 
46c61364bfSbsh #if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
47c61364bfSbsh #define	__CPU_XSCALE_PXA2XX
48c61364bfSbsh #endif
49c61364bfSbsh 
50c61364bfSbsh #ifdef CPU_XSCALE_PXA2X0
51c61364bfSbsh #warning option CPU_XSCALE_PXA2X0 is obsolete. Use CPU_XSCALE_PXA250 and/or CPU_XSCALE_PXA270.
52c61364bfSbsh #endif
53c61364bfSbsh 
5432a08607Sthorpej /*
55bbef46a7Sthorpej  * IF YOU CHANGE THIS FILE, MAKE SURE TO UPDATE THE DEFINITION OF
56bbef46a7Sthorpej  * "PMAP_NEEDS_PTE_SYNC" IN <arm/arm32/pmap.h> FOR THE CPU TYPE
57bbef46a7Sthorpej  * YOU ARE ADDING SUPPORT FOR.
58bbef46a7Sthorpej  */
59bbef46a7Sthorpej 
60825088edSmatt #if 0
61bbef46a7Sthorpej /*
6232a08607Sthorpej  * Step 1: Count the number of CPU types configured into the kernel.
6332a08607Sthorpej  */
6432a08607Sthorpej #if defined(_KERNEL_OPT)
65562b79dfSmaxv #define	CPU_NTYPES	(defined(CPU_ARM6) + defined(CPU_ARM7) +	\
6632a08607Sthorpej 			 defined(CPU_ARM7TDMI) +			\
6732a08607Sthorpej 			 defined(CPU_ARM8) + defined(CPU_ARM9) +	\
6887f8f1a9Schristos 			 defined(CPU_ARM9E) +				\
69cfcc3a8aSrearnsha 			 defined(CPU_ARM10) +				\
7080a3b6d0Srearnsha 			 defined(CPU_ARM11) +				\
71825088edSmatt 			 defined(CPU_ARM1136) +				\
72825088edSmatt 			 defined(CPU_ARM1176) +				\
73d5f7715cSbsh 			 defined(CPU_ARM11MPCORE) +			\
7430ce2039Smatt 			 defined(CPU_CORTEX) +				\
7532a08607Sthorpej 			 defined(CPU_SA110) + defined(CPU_SA1100) +	\
7632a08607Sthorpej 			 defined(CPU_SA1110) +				\
77c9a118aaSmatt 			 defined(CPU_FA526) +				\
787374c0afSichiro 			 defined(CPU_IXP12X0) +				\
797550e9f8Smatt 			 defined(CPU_XSCALE) +				\
804f2a5779Skiyohara 			 defined(CPU_SHEEVA))
8132a08607Sthorpej #else
8232a08607Sthorpej #define	CPU_NTYPES	2
8332a08607Sthorpej #endif /* _KERNEL_OPT */
84825088edSmatt #endif
8532a08607Sthorpej 
8632a08607Sthorpej /*
8732a08607Sthorpej  * Step 2: Determine which ARM architecture versions are configured.
8832a08607Sthorpej  */
89562b79dfSmaxv #if !defined(_KERNEL_OPT)
9032a08607Sthorpej #define	ARM_ARCH_2	1
9132a08607Sthorpej #else
9232a08607Sthorpej #define	ARM_ARCH_2	0
9332a08607Sthorpej #endif
9432a08607Sthorpej 
9532a08607Sthorpej #if !defined(_KERNEL_OPT) ||						\
9632a08607Sthorpej     (defined(CPU_ARM6) || defined(CPU_ARM7))
9732a08607Sthorpej #define	ARM_ARCH_3	1
9832a08607Sthorpej #else
9932a08607Sthorpej #define	ARM_ARCH_3	0
10032a08607Sthorpej #endif
10132a08607Sthorpej 
10232a08607Sthorpej #if !defined(_KERNEL_OPT) ||						\
10332a08607Sthorpej     (defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) ||	\
104c9a118aaSmatt      defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_FA526) || \
1055ff1366cSmsaitoh      defined(CPU_SA1110) || defined(CPU_IXP12X0))
10632a08607Sthorpej #define	ARM_ARCH_4	1
10732a08607Sthorpej #else
10832a08607Sthorpej #define	ARM_ARCH_4	0
10932a08607Sthorpej #endif
11032a08607Sthorpej 
11132a08607Sthorpej #if !defined(_KERNEL_OPT) ||						\
11287f8f1a9Schristos     (defined(CPU_ARM9E) || defined(CPU_ARM10) ||			\
1137550e9f8Smatt      defined(CPU_XSCALE) || defined(CPU_SHEEVA))
11432a08607Sthorpej #define	ARM_ARCH_5	1
11532a08607Sthorpej #else
11632a08607Sthorpej #define	ARM_ARCH_5	0
11732a08607Sthorpej #endif
11832a08607Sthorpej 
11902386eb7Sskrll #if defined(CPU_ARM11) || defined(CPU_ARM11MPCORE)
12080a3b6d0Srearnsha #define ARM_ARCH_6	1
12180a3b6d0Srearnsha #else
12280a3b6d0Srearnsha #define ARM_ARCH_6	0
12380a3b6d0Srearnsha #endif
12480a3b6d0Srearnsha 
125a793a9d5Srkujawa #if defined(CPU_CORTEX) || defined(CPU_PJ4B)
12630ce2039Smatt #define ARM_ARCH_7	1
12730ce2039Smatt #else
12830ce2039Smatt #define ARM_ARCH_7	0
12930ce2039Smatt #endif
13030ce2039Smatt 
13180a3b6d0Srearnsha #define	ARM_NARCH	(ARM_ARCH_2 + ARM_ARCH_3 + ARM_ARCH_4 + \
13230ce2039Smatt 			 ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7)
13332a08607Sthorpej #if ARM_NARCH == 0
13432a08607Sthorpej #error ARM_NARCH is 0
13532a08607Sthorpej #endif
13632a08607Sthorpej 
13730ce2039Smatt #if ARM_ARCH_5 || ARM_ARCH_6 || ARM_ARCH_7
13866780d9bSrearnsha /*
13966780d9bSrearnsha  * We could support Thumb code on v4T, but the lack of clean interworking
14066780d9bSrearnsha  * makes that hard.
14166780d9bSrearnsha  */
14266780d9bSrearnsha #define THUMB_CODE
14366780d9bSrearnsha #endif
14466780d9bSrearnsha 
14532a08607Sthorpej /*
14632a08607Sthorpej  * Step 3: Define which MMU classes are configured:
14732a08607Sthorpej  *
14832a08607Sthorpej  *	ARM_MMU_MEMC		Prehistoric, external memory controller
14932a08607Sthorpej  *				and MMU for ARMv2 CPUs.
15032a08607Sthorpej  *
15132a08607Sthorpej  *	ARM_MMU_GENERIC		Generic ARM MMU, compatible with ARM6.
15232a08607Sthorpej  *
153bbef46a7Sthorpej  *	ARM_MMU_SA1		StrongARM SA-1 MMU.  Compatible with generic
154bbef46a7Sthorpej  *				ARM MMU, but has no write-through cache mode.
155bbef46a7Sthorpej  *
15632a08607Sthorpej  *	ARM_MMU_XSCALE		XScale MMU.  Compatible with generic ARM
15732a08607Sthorpej  *				MMU, but also has several extensions which
15832a08607Sthorpej  *				require different PTE layout to use.
159825088edSmatt  *
160d5f7715cSbsh  *	ARM_MMU_V6C		ARM v6 MMU in backward compatible mode.
161d5f7715cSbsh  *                              Compatible with generic ARM MMU, but
162d5f7715cSbsh  *                              also has several extensions which
163825088edSmatt  *				require different PTE layouts to use.
164d5f7715cSbsh  *                              XP bit in CP15 control reg is cleared.
165d5f7715cSbsh  *
166d5f7715cSbsh  *	ARM_MMU_V6N		ARM v6 MMU with XP bit of CP15 control reg
167d5f7715cSbsh  *                              set.  New features such as shared-bit
168d5f7715cSbsh  *                              and excute-never bit are available.
169d5f7715cSbsh  *                              Multiprocessor support needs this mode.
170d5f7715cSbsh  *
171d5f7715cSbsh  *	ARM_MMU_V7		ARM v7 MMU.
17232a08607Sthorpej  */
173562b79dfSmaxv #if !defined(_KERNEL_OPT)
17432a08607Sthorpej #define	ARM_MMU_MEMC		1
17532a08607Sthorpej #else
17632a08607Sthorpej #define	ARM_MMU_MEMC		0
17732a08607Sthorpej #endif
17832a08607Sthorpej 
17932a08607Sthorpej #if !defined(_KERNEL_OPT) ||						\
18032a08607Sthorpej     (defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) ||	\
18187f8f1a9Schristos      defined(CPU_ARM8) || defined(CPU_ARM9) || defined(CPU_ARM9E) ||	\
1824f2a5779Skiyohara      defined(CPU_ARM10) || defined(CPU_FA526)) || defined(CPU_SHEEVA)
18332a08607Sthorpej #define	ARM_MMU_GENERIC		1
18432a08607Sthorpej #else
18532a08607Sthorpej #define	ARM_MMU_GENERIC		0
18632a08607Sthorpej #endif
18732a08607Sthorpej 
18832a08607Sthorpej #if !defined(_KERNEL_OPT) ||						\
189bbef46a7Sthorpej     (defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) ||\
190bbef46a7Sthorpej      defined(CPU_IXP12X0))
191bbef46a7Sthorpej #define	ARM_MMU_SA1		1
192bbef46a7Sthorpej #else
193bbef46a7Sthorpej #define	ARM_MMU_SA1		0
194bbef46a7Sthorpej #endif
195bbef46a7Sthorpej 
196bbef46a7Sthorpej #if !defined(_KERNEL_OPT) ||						\
1977550e9f8Smatt     defined(CPU_XSCALE)
19832a08607Sthorpej #define	ARM_MMU_XSCALE		1
19932a08607Sthorpej #else
20032a08607Sthorpej #define	ARM_MMU_XSCALE		0
20132a08607Sthorpej #endif
20232a08607Sthorpej 
203825088edSmatt #if !defined(_KERNEL_OPT) ||						\
20474093d69Smatt 	(defined(CPU_ARM11) && defined(ARM11_COMPAT_MMU))
205d5f7715cSbsh #define	ARM_MMU_V6C		1
206825088edSmatt #else
207d5f7715cSbsh #define	ARM_MMU_V6C		0
208825088edSmatt #endif
209825088edSmatt 
2105ddffda4Sjmcneill #if !defined(_KERNEL_OPT) ||						\
21174093d69Smatt 	(defined(CPU_ARM11) && !defined(ARM11_COMPAT_MMU))
212d5f7715cSbsh #define	ARM_MMU_V6N		1
213d5f7715cSbsh #else
214d5f7715cSbsh #define	ARM_MMU_V6N		0
215d5f7715cSbsh #endif
216d5f7715cSbsh 
217d5f7715cSbsh #define	ARM_MMU_V6	(ARM_MMU_V6C + ARM_MMU_V6N)
218d5f7715cSbsh 
219d5f7715cSbsh #if !defined(_KERNEL_OPT) ||						\
22074093d69Smatt 	 defined(CPU_ARMV7)
2215ddffda4Sjmcneill #define	ARM_MMU_V7		1
2225ddffda4Sjmcneill #else
2235ddffda4Sjmcneill #define	ARM_MMU_V7		0
2245ddffda4Sjmcneill #endif
2255ddffda4Sjmcneill 
226fe33aa27Sryo #if !defined(_KERNEL_OPT) ||						\
227fe33aa27Sryo 	 defined(CPU_ARMV8)
228fe33aa27Sryo #define	ARM_MMU_V8		1
229fe33aa27Sryo #else
230fe33aa27Sryo #define	ARM_MMU_V8		0
231fe33aa27Sryo #endif
232fe33aa27Sryo 
2336f29cdceSmatt /*
2346f29cdceSmatt  * Can we use the ASID support in armv6+ MMUs?
2356f29cdceSmatt  */
23674093d69Smatt #if !defined(_LOCORE)
237fe33aa27Sryo #define	ARM_MMU_EXTENDED						\
238fe33aa27Sryo     ((ARM_MMU_MEMC + ARM_MMU_GENERIC + ARM_MMU_SA1 + ARM_MMU_XSCALE +	\
239fe33aa27Sryo      ARM_MMU_V6C) == 0 &&						\
240fe33aa27Sryo     (ARM_MMU_V6N + ARM_MMU_V7 + ARM_MMU_V8) > 0)
2416f29cdceSmatt #if ARM_MMU_EXTENDED == 0
2426f29cdceSmatt #undef ARM_MMU_EXTENDED
2436f29cdceSmatt #endif
2446f29cdceSmatt #endif
2456f29cdceSmatt 
246fe33aa27Sryo #define	ARM_NMMUS							\
247fe33aa27Sryo     (ARM_MMU_MEMC + ARM_MMU_GENERIC + ARM_MMU_SA1 + ARM_MMU_XSCALE +	\
248fe33aa27Sryo      ARM_MMU_V6N + ARM_MMU_V6C + ARM_MMU_V7 + ARM_MMU_V8)
24932a08607Sthorpej #if ARM_NMMUS == 0
25032a08607Sthorpej #error ARM_NMMUS is 0
25132a08607Sthorpej #endif
25232a08607Sthorpej 
2530b956d0bSbriggs /*
2540b956d0bSbriggs  * Step 4: Define features that may be present on a subset of CPUs
2550b956d0bSbriggs  *
2560b956d0bSbriggs  *	ARM_XSCALE_PMU		Performance Monitoring Unit on 80200 and 80321
2570b956d0bSbriggs  */
2580b956d0bSbriggs 
2590b956d0bSbriggs #if !defined(_KERNEL_OPT) ||						\
2600b956d0bSbriggs     (defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321))
2610b956d0bSbriggs #define ARM_XSCALE_PMU	1
2620b956d0bSbriggs #else
2630b956d0bSbriggs #define ARM_XSCALE_PMU	0
2640b956d0bSbriggs #endif
2650b956d0bSbriggs 
26632a08607Sthorpej #endif /* _ARM_CPUCONF_H_ */
267