1 1.28 jmcneill /* $NetBSD: cpuconf.h,v 1.28 2020/09/29 19:58:50 jmcneill Exp $ */ 2 1.1 thorpej 3 1.1 thorpej /* 4 1.5 thorpej * Copyright (c) 2002 Wasabi Systems, Inc. 5 1.1 thorpej * All rights reserved. 6 1.1 thorpej * 7 1.1 thorpej * Written by Jason R. Thorpe for Wasabi Systems, Inc. 8 1.1 thorpej * 9 1.1 thorpej * Redistribution and use in source and binary forms, with or without 10 1.1 thorpej * modification, are permitted provided that the following conditions 11 1.1 thorpej * are met: 12 1.1 thorpej * 1. Redistributions of source code must retain the above copyright 13 1.1 thorpej * notice, this list of conditions and the following disclaimer. 14 1.1 thorpej * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 thorpej * notice, this list of conditions and the following disclaimer in the 16 1.1 thorpej * documentation and/or other materials provided with the distribution. 17 1.1 thorpej * 3. All advertising materials mentioning features or use of this software 18 1.1 thorpej * must display the following acknowledgement: 19 1.1 thorpej * This product includes software developed for the NetBSD Project by 20 1.1 thorpej * Wasabi Systems, Inc. 21 1.1 thorpej * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 1.1 thorpej * or promote products derived from this software without specific prior 23 1.1 thorpej * written permission. 24 1.1 thorpej * 25 1.1 thorpej * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 1.1 thorpej * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 1.1 thorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 1.1 thorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 1.1 thorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 1.1 thorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 1.1 thorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 1.1 thorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 1.1 thorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 1.1 thorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 1.1 thorpej * POSSIBILITY OF SUCH DAMAGE. 36 1.1 thorpej */ 37 1.1 thorpej 38 1.1 thorpej #ifndef _ARM_CPUCONF_H_ 39 1.1 thorpej #define _ARM_CPUCONF_H_ 40 1.1 thorpej 41 1.1 thorpej #if defined(_KERNEL_OPT) 42 1.1 thorpej #include "opt_cputypes.h" 43 1.20 bsh #include "opt_cpuoptions.h" 44 1.1 thorpej #endif /* _KERNEL_OPT */ 45 1.1 thorpej 46 1.11 bsh #if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270) 47 1.11 bsh #define __CPU_XSCALE_PXA2XX 48 1.11 bsh #endif 49 1.11 bsh 50 1.11 bsh #ifdef CPU_XSCALE_PXA2X0 51 1.11 bsh #warning option CPU_XSCALE_PXA2X0 is obsolete. Use CPU_XSCALE_PXA250 and/or CPU_XSCALE_PXA270. 52 1.11 bsh #endif 53 1.11 bsh 54 1.1 thorpej /* 55 1.6 thorpej * IF YOU CHANGE THIS FILE, MAKE SURE TO UPDATE THE DEFINITION OF 56 1.6 thorpej * "PMAP_NEEDS_PTE_SYNC" IN <arm/arm32/pmap.h> FOR THE CPU TYPE 57 1.6 thorpej * YOU ARE ADDING SUPPORT FOR. 58 1.6 thorpej */ 59 1.6 thorpej 60 1.14 matt #if 0 61 1.6 thorpej /* 62 1.1 thorpej * Step 1: Count the number of CPU types configured into the kernel. 63 1.1 thorpej */ 64 1.1 thorpej #if defined(_KERNEL_OPT) 65 1.27 maxv #define CPU_NTYPES (defined(CPU_ARM6) + defined(CPU_ARM7) + \ 66 1.1 thorpej defined(CPU_ARM7TDMI) + \ 67 1.1 thorpej defined(CPU_ARM8) + defined(CPU_ARM9) + \ 68 1.13 christos defined(CPU_ARM9E) + \ 69 1.8 rearnsha defined(CPU_ARM10) + \ 70 1.10 rearnsha defined(CPU_ARM11) + \ 71 1.14 matt defined(CPU_ARM1136) + \ 72 1.14 matt defined(CPU_ARM1176) + \ 73 1.20 bsh defined(CPU_ARM11MPCORE) + \ 74 1.18 matt defined(CPU_CORTEX) + \ 75 1.1 thorpej defined(CPU_SA110) + defined(CPU_SA1100) + \ 76 1.1 thorpej defined(CPU_SA1110) + \ 77 1.15 matt defined(CPU_FA526) + \ 78 1.3 ichiro defined(CPU_IXP12X0) + \ 79 1.24 matt defined(CPU_XSCALE) + \ 80 1.19 kiyohara defined(CPU_SHEEVA)) 81 1.1 thorpej #else 82 1.1 thorpej #define CPU_NTYPES 2 83 1.1 thorpej #endif /* _KERNEL_OPT */ 84 1.14 matt #endif 85 1.1 thorpej 86 1.1 thorpej /* 87 1.1 thorpej * Step 2: Determine which ARM architecture versions are configured. 88 1.1 thorpej */ 89 1.27 maxv #if !defined(_KERNEL_OPT) 90 1.1 thorpej #define ARM_ARCH_2 1 91 1.1 thorpej #else 92 1.1 thorpej #define ARM_ARCH_2 0 93 1.1 thorpej #endif 94 1.1 thorpej 95 1.1 thorpej #if !defined(_KERNEL_OPT) || \ 96 1.1 thorpej (defined(CPU_ARM6) || defined(CPU_ARM7)) 97 1.1 thorpej #define ARM_ARCH_3 1 98 1.1 thorpej #else 99 1.1 thorpej #define ARM_ARCH_3 0 100 1.1 thorpej #endif 101 1.1 thorpej 102 1.1 thorpej #if !defined(_KERNEL_OPT) || \ 103 1.1 thorpej (defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) || \ 104 1.15 matt defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_FA526) || \ 105 1.16 msaitoh defined(CPU_SA1110) || defined(CPU_IXP12X0)) 106 1.1 thorpej #define ARM_ARCH_4 1 107 1.1 thorpej #else 108 1.1 thorpej #define ARM_ARCH_4 0 109 1.1 thorpej #endif 110 1.1 thorpej 111 1.1 thorpej #if !defined(_KERNEL_OPT) || \ 112 1.13 christos (defined(CPU_ARM9E) || defined(CPU_ARM10) || \ 113 1.24 matt defined(CPU_XSCALE) || defined(CPU_SHEEVA)) 114 1.1 thorpej #define ARM_ARCH_5 1 115 1.1 thorpej #else 116 1.1 thorpej #define ARM_ARCH_5 0 117 1.1 thorpej #endif 118 1.1 thorpej 119 1.25 skrll #if defined(CPU_ARM11) || defined(CPU_ARM11MPCORE) 120 1.10 rearnsha #define ARM_ARCH_6 1 121 1.10 rearnsha #else 122 1.10 rearnsha #define ARM_ARCH_6 0 123 1.10 rearnsha #endif 124 1.10 rearnsha 125 1.21 rkujawa #if defined(CPU_CORTEX) || defined(CPU_PJ4B) 126 1.18 matt #define ARM_ARCH_7 1 127 1.18 matt #else 128 1.18 matt #define ARM_ARCH_7 0 129 1.18 matt #endif 130 1.18 matt 131 1.10 rearnsha #define ARM_NARCH (ARM_ARCH_2 + ARM_ARCH_3 + ARM_ARCH_4 + \ 132 1.18 matt ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) 133 1.1 thorpej #if ARM_NARCH == 0 134 1.1 thorpej #error ARM_NARCH is 0 135 1.1 thorpej #endif 136 1.1 thorpej 137 1.18 matt #if ARM_ARCH_5 || ARM_ARCH_6 || ARM_ARCH_7 138 1.9 rearnsha /* 139 1.9 rearnsha * We could support Thumb code on v4T, but the lack of clean interworking 140 1.9 rearnsha * makes that hard. 141 1.9 rearnsha */ 142 1.9 rearnsha #define THUMB_CODE 143 1.9 rearnsha #endif 144 1.9 rearnsha 145 1.1 thorpej /* 146 1.1 thorpej * Step 3: Define which MMU classes are configured: 147 1.1 thorpej * 148 1.1 thorpej * ARM_MMU_MEMC Prehistoric, external memory controller 149 1.1 thorpej * and MMU for ARMv2 CPUs. 150 1.1 thorpej * 151 1.1 thorpej * ARM_MMU_GENERIC Generic ARM MMU, compatible with ARM6. 152 1.1 thorpej * 153 1.6 thorpej * ARM_MMU_SA1 StrongARM SA-1 MMU. Compatible with generic 154 1.6 thorpej * ARM MMU, but has no write-through cache mode. 155 1.6 thorpej * 156 1.1 thorpej * ARM_MMU_XSCALE XScale MMU. Compatible with generic ARM 157 1.1 thorpej * MMU, but also has several extensions which 158 1.1 thorpej * require different PTE layout to use. 159 1.14 matt * 160 1.20 bsh * ARM_MMU_V6C ARM v6 MMU in backward compatible mode. 161 1.20 bsh * Compatible with generic ARM MMU, but 162 1.20 bsh * also has several extensions which 163 1.14 matt * require different PTE layouts to use. 164 1.20 bsh * XP bit in CP15 control reg is cleared. 165 1.20 bsh * 166 1.20 bsh * ARM_MMU_V6N ARM v6 MMU with XP bit of CP15 control reg 167 1.20 bsh * set. New features such as shared-bit 168 1.20 bsh * and excute-never bit are available. 169 1.20 bsh * Multiprocessor support needs this mode. 170 1.20 bsh * 171 1.20 bsh * ARM_MMU_V7 ARM v7 MMU. 172 1.1 thorpej */ 173 1.27 maxv #if !defined(_KERNEL_OPT) 174 1.1 thorpej #define ARM_MMU_MEMC 1 175 1.1 thorpej #else 176 1.1 thorpej #define ARM_MMU_MEMC 0 177 1.1 thorpej #endif 178 1.1 thorpej 179 1.1 thorpej #if !defined(_KERNEL_OPT) || \ 180 1.1 thorpej (defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) || \ 181 1.13 christos defined(CPU_ARM8) || defined(CPU_ARM9) || defined(CPU_ARM9E) || \ 182 1.19 kiyohara defined(CPU_ARM10) || defined(CPU_FA526)) || defined(CPU_SHEEVA) 183 1.1 thorpej #define ARM_MMU_GENERIC 1 184 1.1 thorpej #else 185 1.1 thorpej #define ARM_MMU_GENERIC 0 186 1.1 thorpej #endif 187 1.1 thorpej 188 1.1 thorpej #if !defined(_KERNEL_OPT) || \ 189 1.6 thorpej (defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) ||\ 190 1.6 thorpej defined(CPU_IXP12X0)) 191 1.6 thorpej #define ARM_MMU_SA1 1 192 1.6 thorpej #else 193 1.6 thorpej #define ARM_MMU_SA1 0 194 1.6 thorpej #endif 195 1.6 thorpej 196 1.6 thorpej #if !defined(_KERNEL_OPT) || \ 197 1.24 matt defined(CPU_XSCALE) 198 1.1 thorpej #define ARM_MMU_XSCALE 1 199 1.1 thorpej #else 200 1.1 thorpej #define ARM_MMU_XSCALE 0 201 1.1 thorpej #endif 202 1.1 thorpej 203 1.14 matt #if !defined(_KERNEL_OPT) || \ 204 1.23 matt (defined(CPU_ARM11) && defined(ARM11_COMPAT_MMU)) 205 1.20 bsh #define ARM_MMU_V6C 1 206 1.14 matt #else 207 1.20 bsh #define ARM_MMU_V6C 0 208 1.14 matt #endif 209 1.14 matt 210 1.17 jmcneill #if !defined(_KERNEL_OPT) || \ 211 1.23 matt (defined(CPU_ARM11) && !defined(ARM11_COMPAT_MMU)) 212 1.20 bsh #define ARM_MMU_V6N 1 213 1.20 bsh #else 214 1.20 bsh #define ARM_MMU_V6N 0 215 1.20 bsh #endif 216 1.20 bsh 217 1.20 bsh #define ARM_MMU_V6 (ARM_MMU_V6C + ARM_MMU_V6N) 218 1.20 bsh 219 1.20 bsh #if !defined(_KERNEL_OPT) || \ 220 1.23 matt defined(CPU_ARMV7) 221 1.17 jmcneill #define ARM_MMU_V7 1 222 1.17 jmcneill #else 223 1.17 jmcneill #define ARM_MMU_V7 0 224 1.17 jmcneill #endif 225 1.17 jmcneill 226 1.26 ryo #if !defined(_KERNEL_OPT) || \ 227 1.26 ryo defined(CPU_ARMV8) 228 1.26 ryo #define ARM_MMU_V8 1 229 1.26 ryo #else 230 1.26 ryo #define ARM_MMU_V8 0 231 1.26 ryo #endif 232 1.26 ryo 233 1.22 matt /* 234 1.22 matt * Can we use the ASID support in armv6+ MMUs? 235 1.22 matt */ 236 1.23 matt #if !defined(_LOCORE) 237 1.26 ryo #define ARM_MMU_EXTENDED \ 238 1.26 ryo ((ARM_MMU_MEMC + ARM_MMU_GENERIC + ARM_MMU_SA1 + ARM_MMU_XSCALE + \ 239 1.26 ryo ARM_MMU_V6C) == 0 && \ 240 1.26 ryo (ARM_MMU_V6N + ARM_MMU_V7 + ARM_MMU_V8) > 0) 241 1.22 matt #if ARM_MMU_EXTENDED == 0 242 1.22 matt #undef ARM_MMU_EXTENDED 243 1.22 matt #endif 244 1.22 matt #endif 245 1.22 matt 246 1.26 ryo #define ARM_NMMUS \ 247 1.26 ryo (ARM_MMU_MEMC + ARM_MMU_GENERIC + ARM_MMU_SA1 + ARM_MMU_XSCALE + \ 248 1.26 ryo ARM_MMU_V6N + ARM_MMU_V6C + ARM_MMU_V7 + ARM_MMU_V8) 249 1.1 thorpej #if ARM_NMMUS == 0 250 1.1 thorpej #error ARM_NMMUS is 0 251 1.4 briggs #endif 252 1.4 briggs 253 1.4 briggs /* 254 1.4 briggs * Step 4: Define features that may be present on a subset of CPUs 255 1.4 briggs * 256 1.4 briggs * ARM_XSCALE_PMU Performance Monitoring Unit on 80200 and 80321 257 1.4 briggs */ 258 1.4 briggs 259 1.4 briggs #if !defined(_KERNEL_OPT) || \ 260 1.4 briggs (defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321)) 261 1.4 briggs #define ARM_XSCALE_PMU 1 262 1.4 briggs #else 263 1.4 briggs #define ARM_XSCALE_PMU 0 264 1.1 thorpej #endif 265 1.1 thorpej 266 1.1 thorpej #endif /* _ARM_CPUCONF_H_ */ 267