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