xref: /xnu-12377.81.4/osfmk/arm/cpuid.h (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
1 /*
2  * Copyright (c) 2007-2016 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * @OSF_COPYRIGHT@
30  */
31 
32 /*
33  * ARM CPU identification
34  */
35 
36 #ifndef _MACHINE_CPUID_H_
37 #define _MACHINE_CPUID_H_
38 
39 #include <stdint.h>
40 #include <mach/boolean.h>
41 #include <machine/machine_cpuid.h>
42 #include <machine/machine_routines.h>
43 
44 typedef struct {
45 	uint32_t arm_rev : 4,  /* 00:03 revision number */
46 	    arm_part         : 12,/* 04:15 primary part number */
47 	    arm_arch         : 4,/* 16:19 architecture */
48 	    arm_variant      : 4,/* 20:23 variant  */
49 	    arm_implementor  : 8;/* 24:31 implementor (0x41) */
50 } arm_cpuid_bits_t;
51 
52 typedef union {
53 	arm_cpuid_bits_t arm_info; /* ARM9xx,  ARM11xx, and later processors */
54 	uint32_t         value;
55 } arm_cpu_info_t;
56 
57 /* Implementor codes */
58 #define CPU_VID_ARM      0x41 // ARM Limited
59 #define CPU_VID_DEC      0x44 // Digital Equipment Corporation
60 #define CPU_VID_MOTOROLA 0x4D // Motorola - Freescale Semiconductor Inc.
61 #define CPU_VID_MARVELL  0x56 // Marvell Semiconductor Inc.
62 #define CPU_VID_INTEL    0x69 // Intel ARM parts.
63 #define CPU_VID_APPLE    0x61 // Apple Inc.
64 
65 
66 /* ARM Architecture Codes */
67 
68 #define CPU_ARCH_ARMv4    0x1 /* ARMv4 */
69 #define CPU_ARCH_ARMv4T   0x2 /* ARMv4 + Thumb */
70 #define CPU_ARCH_ARMv5    0x3 /* ARMv5 */
71 #define CPU_ARCH_ARMv5T   0x4 /* ARMv5 + Thumb */
72 #define CPU_ARCH_ARMv5TE  0x5 /* ARMv5 + Thumb + Extensions(?) */
73 #define CPU_ARCH_ARMv5TEJ 0x6 /* ARMv5 + Thumb + Extensions(?) + //Jazelle(?) XXX */
74 #define CPU_ARCH_ARMv6    0x7 /* ARMv6 */
75 #define CPU_ARCH_ARMv7    0x8 /* ARMv7 */
76 #define CPU_ARCH_ARMv7f   0x9 /* ARMv7 for Cortex A9 */
77 #define CPU_ARCH_ARMv7s   0xa /* ARMv7 for Swift */
78 #define CPU_ARCH_ARMv7k   0xb /* ARMv7 for Cortex A7 */
79 
80 #define CPU_ARCH_ARMv8    0xc /* Subtype for CPU_TYPE_ARM64 */
81 
82 #define CPU_ARCH_ARMv8E   0xd /* ARMv8.3a + Apple Private ISA Subtype for CPU_TYPE_ARM64 */
83 
84 /* special code indicating we need to look somewhere else for the architecture version */
85 #define CPU_ARCH_EXTENDED 0xF
86 
87 /* ARM Part Numbers */
88 /*
89  * XXX: ARM Todo
90  * Fill out these part numbers more completely
91  */
92 
93 /* ARM9 (ARMv4T architecture) */
94 #define CPU_PART_920T               0x920
95 #define CPU_PART_926EJS             0x926 /* ARM926EJ-S */
96 
97 /* ARM11  (ARMv6 architecture) */
98 #define CPU_PART_1136JFS            0xB36 /* ARM1136JF-S or ARM1136J-S */
99 #define CPU_PART_1176JZFS           0xB76 /* ARM1176JZF-S */
100 
101 /* G1 (ARMv7 architecture) */
102 #define CPU_PART_CORTEXA5           0xC05
103 
104 /* M7 (ARMv7 architecture) */
105 #define CPU_PART_CORTEXA7           0xC07
106 
107 /* H2 H3 (ARMv7 architecture) */
108 #define CPU_PART_CORTEXA8           0xC08
109 
110 /* H4 (ARMv7 architecture) */
111 #define CPU_PART_CORTEXA9           0xC09
112 
113 /* H7 (ARMv8 architecture) */
114 #define CPU_PART_TYPHOON            0x2
115 
116 /* H7G (ARMv8 architecture) */
117 #define CPU_PART_TYPHOON_CAPRI      0x3
118 
119 /* H8 (ARMv8 architecture) */
120 #define CPU_PART_TWISTER            0x4
121 
122 /* H8G H8M (ARMv8 architecture) */
123 #define CPU_PART_TWISTER_ELBA_MALTA 0x5
124 
125 /* H9 (ARMv8 architecture) */
126 #define CPU_PART_HURRICANE          0x6
127 
128 /* H9G (ARMv8 architecture) */
129 #define CPU_PART_HURRICANE_MYST     0x7
130 
131 /* H10 p-Core (ARMv8 architecture) */
132 #define CPU_PART_MONSOON            0x8
133 
134 /* H10 e-Core (ARMv8 architecture) */
135 #define CPU_PART_MISTRAL            0x9
136 
137 /* H11 p-Core (ARMv8 architecture) */
138 #define CPU_PART_VORTEX             0xB
139 
140 /* H11 e-Core (ARMv8 architecture) */
141 #define CPU_PART_TEMPEST            0xC
142 
143 /* M9 e-Core (ARMv8 architecture) */
144 #define CPU_PART_TEMPEST_M9         0xF
145 
146 /* H11G p-Core (ARMv8 architecture) */
147 #define CPU_PART_VORTEX_ARUBA       0x10
148 
149 /* H11G e-Core (ARMv8 architecture) */
150 #define CPU_PART_TEMPEST_ARUBA      0x11
151 
152 /* H12 p-Core (ARMv8 architecture) */
153 #define CPU_PART_LIGHTNING          0x12
154 
155 /* H12 e-Core (ARMv8 architecture) */
156 #define CPU_PART_THUNDER            0x13
157 
158 /* M10 e-Core (ARMv8 architecture) */
159 #define CPU_PART_THUNDER_M10        0x26
160 
161 /* H13P e-Core */
162 #define CPU_PART_ICESTORM           0x20 /* Prefer CPU_PART_ICESTORM_SICILY. */
163 #define CPU_PART_ICESTORM_SICILY    0x20
164 
165 /* H13P p-Core */
166 #define CPU_PART_FIRESTORM          0x21 /* Prefer CPU_PART_FIRESTORM_SICILY. */
167 #define CPU_PART_FIRESTORM_SICILY   0x21
168 
169 /* H13G e-Core */
170 #define CPU_PART_ICESTORM_TONGA     0x22
171 
172 /* H13G p-Core */
173 #define CPU_PART_FIRESTORM_TONGA    0x23
174 
175 /* H13J e-Core */
176 #define CPU_PART_ICESTORM_JADE_CHOP    0x24
177 #define CPU_PART_ICESTORM_JADE_DIE     0x28
178 
179 /* H13J p-Core */
180 #define CPU_PART_FIRESTORM_JADE_CHOP   0x25
181 #define CPU_PART_FIRESTORM_JADE_DIE    0x29
182 
183 /* H14P e-Core */
184 #define CPU_PART_BLIZZARD           0x30 /* Prefer CPU_PART_BLIZZARD_ELLIS. */
185 #define CPU_PART_BLIZZARD_ELLIS     0x30
186 
187 /* H14P p-Core */
188 #define CPU_PART_AVALANCHE          0x31 /* Prefer CPU_PART_AVALANCHE_ELLIS. */
189 #define CPU_PART_AVALANCHE_ELLIS    0x31
190 
191 /* H14G e-Core */
192 #define CPU_PART_BLIZZARD_STATEN    0x32
193 
194 /* H14G p-Core */
195 #define CPU_PART_AVALANCHE_STATEN   0x33
196 
197 /* H14S e-Core */
198 #define CPU_PART_BLIZZARD_RHODES_CHOP   0x34
199 
200 /* H14S p-Core */
201 #define CPU_PART_AVALANCHE_RHODES_CHOP  0x35
202 
203 /* H14C e-Core */
204 #define CPU_PART_BLIZZARD_RHODES_DIE    0x38
205 
206 /* H14C p-Core */
207 #define CPU_PART_AVALANCHE_RHODES_DIE   0x39
208 
209 /* H15 e-Core */
210 #define CPU_PART_SAWTOOTH           0x40
211 
212 /* H15 p-Core */
213 #define CPU_PART_EVEREST            0x41
214 
215 /* H15 Ibiza e-Core */
216 #define CPU_PART_ECORE_IBIZA        0x42
217 
218 /* H15 Ibiza p-Core */
219 #define CPU_PART_PCORE_IBIZA        0x43
220 
221 /* H15 Palma e-Core. */
222 #define CPU_PART_ECORE_PALMA 0x48
223 
224 /* H15 Palma p-Core. */
225 #define CPU_PART_PCORE_PALMA 0x49
226 
227 /* H15 Coll e-Core. */
228 #define CPU_PART_ECORE_COLL    0x50
229 
230 /* H15 Coll p-Core. */
231 #define CPU_PART_PCORE_COLL    0x51
232 
233 /* H15 Lobos e-Core. */
234 #define CPU_PART_ECORE_LOBOS 0x44
235 
236 /* H15 Lobos p-Core. */
237 #define CPU_PART_PCORE_LOBOS 0x45
238 
239 /* M11 e-Core */
240 #define CPU_PART_SAWTOOTH_M11       0x46
241 
242 /* H16G Donan e-Core. */
243 #define CPU_PART_ECORE_DONAN 0x52
244 
245 /* H16H Donan p-Core. */
246 #define CPU_PART_PCORE_DONAN 0x53
247 
248 /* H16S Brava S e-Core. */
249 #define CPU_PART_ECORE_BRAVA_S 0x54
250 
251 /* H16S Brava S p-Core. */
252 #define CPU_PART_PCORE_BRAVA_S 0x55
253 
254 /* H16C Brava C e-Core. */
255 #define CPU_PART_ECORE_BRAVA_C 0x58
256 
257 /* H16C Brava C p-Core. */
258 #define CPU_PART_PCORE_BRAVA_C 0x59
259 
260 
261 
262 
263 
264 /* H17G Hidra e-Core. */
265 #define CPU_PART_ECORE_HIDRA 0x62
266 
267 /* H17G Hidra p-Core. */
268 #define CPU_PART_PCORE_HIDRA 0x63
269 
270 
271 
272 
273 
274 
275 
276 
277 
278 /* Cache type identification */
279 
280 /* Supported Cache Types */
281 typedef enum {
282 	CACHE_WRITE_THROUGH,
283 	CACHE_WRITE_BACK,
284 	CACHE_READ_ALLOCATION,
285 	CACHE_WRITE_ALLOCATION,
286 	CACHE_UNKNOWN
287 } cache_type_t;
288 
289 
290 typedef struct {
291 	boolean_t    c_valid;            /* has this cache info been populated? */
292 	boolean_t    c_unified;          /* unified I & D cache? */
293 	uint32_t     c_isize;            /* in Bytes (ARM caches can be 0.5 KB) */
294 	boolean_t    c_i_ppage;          /* protected page restriction for I cache
295 	                                  * (see B6-11 in ARM DDI 0100I document). */
296 	uint32_t     c_dsize;            /* in Bytes (ARM caches can be 0.5 KB) */
297 	boolean_t    c_d_ppage;          /* protected page restriction for I cache
298 	                                  * (see B6-11 in ARM DDI 0100I document). */
299 	cache_type_t c_type;             /* WB or WT */
300 	uint32_t     c_linesz;           /* number of bytes */
301 	uint32_t     c_assoc;            /* n-way associativity */
302 	uint32_t     c_l2size;           /* L2 size, if present */
303 	uint32_t     c_bulksize_op;      /* bulk operation size limit. 0 if disabled */
304 	uint32_t     c_inner_cache_size; /* inner dache size */
305 
306 } cache_info_t;
307 
308 typedef struct {
309 	uint32_t
310 	    RB:4, /* 3:0 - 32x64-bit media register bank supported: 0x2 */
311 	    SP:4, /* 7:4 - Single precision supported in VFPv3: 0x2 */
312 	    DP:4, /* 8:11 - Double precision supported in VFPv3: 0x2 */
313 	    TE:4, /* 12-15 - Only untrapped exception handling can be selected: 0x0 */
314 	    D:4, /* 19:16 - VFP hardware divide supported: 0x1 */
315 	    SR:4, /* 23:20 - VFP hardware square root supported: 0x1 */
316 	    SV:4, /* 27:24 - VFP short vector supported: 0x1 */
317 	    RM:4; /* 31:28 - All VFP rounding modes supported: 0x1 */
318 } arm_mvfr0_t;
319 
320 typedef union {
321 	arm_mvfr0_t bits;
322 	uint32_t    value;
323 } arm_mvfr0_info_t;
324 
325 typedef struct {
326 	uint32_t
327 	    FZ:4, /* 3:0 - Full denormal arithmetic supported for VFP: 0x1 */
328 	    DN:4, /* 7:4 - Propagation of NaN values supported for VFP: 0x1 */
329 	    LS:4, /* 11:8 - Load/store instructions supported for NEON: 0x1 */
330 	    I:4, /* 15:12 - Integer instructions supported for NEON: 0x1 */
331 	    SP:4, /* 19:16 - Single precision floating-point instructions supported for NEON: 0x1 */
332 	    HPFP:4, /* 23:20 - Half precision floating-point instructions supported */
333 	    RSVP:8; /* 31:24 - Reserved */
334 } arm_mvfr1_t;
335 
336 typedef union {
337 	arm_mvfr1_t bits;
338 	uint32_t    value;
339 } arm_mvfr1_info_t;
340 
341 typedef struct {
342 	uint32_t neon;
343 	uint32_t neon_hpfp;
344 	uint32_t neon_fp16;
345 } arm_mvfp_info_t;
346 
347 #ifdef __cplusplus
348 extern "C" {
349 #endif /* __cplusplus */
350 
351 extern void do_cpuid(void);
352 extern arm_cpu_info_t *cpuid_info(void);
353 extern int cpuid_get_cpufamily(void);
354 extern int cpuid_get_cpusubfamily(void);
355 
356 extern void do_debugid(void);
357 extern arm_debug_info_t *arm_debug_info(void);
358 
359 extern void do_cacheid(void);
360 extern cache_info_t *cache_info(void);
361 extern cache_info_t *cache_info_type(cluster_type_t cluster_type);
362 
363 extern void do_mvfpid(void);
364 extern arm_mvfp_info_t *arm_mvfp_info(void);
365 
366 #ifdef __cplusplus
367 }
368 #endif /* __cplusplus */
369 
370 #endif // _MACHINE_CPUID_H_
371