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