xref: /aosp_15_r20/external/cpu_features/include/cpuinfo_arm.h (revision eca53ba6d2e951e174b64682eaf56a36b8204c89)
1*eca53ba6SRoland Levillain // Copyright 2017 Google LLC
2*eca53ba6SRoland Levillain //
3*eca53ba6SRoland Levillain // Licensed under the Apache License, Version 2.0 (the "License");
4*eca53ba6SRoland Levillain // you may not use this file except in compliance with the License.
5*eca53ba6SRoland Levillain // You may obtain a copy of the License at
6*eca53ba6SRoland Levillain //
7*eca53ba6SRoland Levillain //    http://www.apache.org/licenses/LICENSE-2.0
8*eca53ba6SRoland Levillain //
9*eca53ba6SRoland Levillain // Unless required by applicable law or agreed to in writing, software
10*eca53ba6SRoland Levillain // distributed under the License is distributed on an "AS IS" BASIS,
11*eca53ba6SRoland Levillain // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*eca53ba6SRoland Levillain // See the License for the specific language governing permissions and
13*eca53ba6SRoland Levillain // limitations under the License.
14*eca53ba6SRoland Levillain 
15*eca53ba6SRoland Levillain #ifndef CPU_FEATURES_INCLUDE_CPUINFO_ARM_H_
16*eca53ba6SRoland Levillain #define CPU_FEATURES_INCLUDE_CPUINFO_ARM_H_
17*eca53ba6SRoland Levillain 
18*eca53ba6SRoland Levillain #include <stdint.h>  // uint32_t
19*eca53ba6SRoland Levillain 
20*eca53ba6SRoland Levillain #include "cpu_features_cache_info.h"
21*eca53ba6SRoland Levillain #include "cpu_features_macros.h"
22*eca53ba6SRoland Levillain 
23*eca53ba6SRoland Levillain CPU_FEATURES_START_CPP_NAMESPACE
24*eca53ba6SRoland Levillain 
25*eca53ba6SRoland Levillain typedef struct {
26*eca53ba6SRoland Levillain   int swp : 1;       // SWP instruction (atomic read-modify-write)
27*eca53ba6SRoland Levillain   int half : 1;      // Half-word loads and stores
28*eca53ba6SRoland Levillain   int thumb : 1;     // Thumb (16-bit instruction set)
29*eca53ba6SRoland Levillain   int _26bit : 1;    // "26 Bit" Model (Processor status register folded into
30*eca53ba6SRoland Levillain                      // program counter)
31*eca53ba6SRoland Levillain   int fastmult : 1;  // 32x32->64-bit multiplication
32*eca53ba6SRoland Levillain   int fpa : 1;       // Floating point accelerator
33*eca53ba6SRoland Levillain   int vfp : 1;       // Vector Floating Point.
34*eca53ba6SRoland Levillain   int edsp : 1;     // DSP extensions (the 'e' variant of the ARM9 CPUs, and all
35*eca53ba6SRoland Levillain                     // others above)
36*eca53ba6SRoland Levillain   int java : 1;     // Jazelle (Java bytecode accelerator)
37*eca53ba6SRoland Levillain   int iwmmxt : 1;   // Intel Wireless MMX Technology.
38*eca53ba6SRoland Levillain   int crunch : 1;   // MaverickCrunch coprocessor
39*eca53ba6SRoland Levillain   int thumbee : 1;  // ThumbEE
40*eca53ba6SRoland Levillain   int neon : 1;     // Advanced SIMD.
41*eca53ba6SRoland Levillain   int vfpv3 : 1;    // VFP version 3
42*eca53ba6SRoland Levillain   int vfpv3d16 : 1;  // VFP version 3 with 16 D-registers
43*eca53ba6SRoland Levillain   int tls : 1;       // TLS register
44*eca53ba6SRoland Levillain   int vfpv4 : 1;     // VFP version 4 with fast context switching
45*eca53ba6SRoland Levillain   int idiva : 1;     // SDIV and UDIV hardware division in ARM mode.
46*eca53ba6SRoland Levillain   int idivt : 1;     // SDIV and UDIV hardware division in Thumb mode.
47*eca53ba6SRoland Levillain   int vfpd32 : 1;    // VFP with 32 D-registers
48*eca53ba6SRoland Levillain   int lpae : 1;     // Large Physical Address Extension (>4GB physical memory on
49*eca53ba6SRoland Levillain                     // 32-bit architecture)
50*eca53ba6SRoland Levillain   int evtstrm : 1;  // kernel event stream using generic architected timer
51*eca53ba6SRoland Levillain   int aes : 1;      // Hardware-accelerated Advanced Encryption Standard.
52*eca53ba6SRoland Levillain   int pmull : 1;    // Polynomial multiply long.
53*eca53ba6SRoland Levillain   int sha1 : 1;     // Hardware-accelerated SHA1.
54*eca53ba6SRoland Levillain   int sha2 : 1;     // Hardware-accelerated SHA2-256.
55*eca53ba6SRoland Levillain   int crc32 : 1;    // Hardware-accelerated CRC-32.
56*eca53ba6SRoland Levillain 
57*eca53ba6SRoland Levillain   // Make sure to update ArmFeaturesEnum below if you add a field here.
58*eca53ba6SRoland Levillain } ArmFeatures;
59*eca53ba6SRoland Levillain 
60*eca53ba6SRoland Levillain typedef struct {
61*eca53ba6SRoland Levillain   ArmFeatures features;
62*eca53ba6SRoland Levillain   int implementer;
63*eca53ba6SRoland Levillain   int architecture;
64*eca53ba6SRoland Levillain   int variant;
65*eca53ba6SRoland Levillain   int part;
66*eca53ba6SRoland Levillain   int revision;
67*eca53ba6SRoland Levillain } ArmInfo;
68*eca53ba6SRoland Levillain 
69*eca53ba6SRoland Levillain // TODO(user): Add macros to know which features are present at compile
70*eca53ba6SRoland Levillain // time.
71*eca53ba6SRoland Levillain 
72*eca53ba6SRoland Levillain ArmInfo GetArmInfo(void);
73*eca53ba6SRoland Levillain 
74*eca53ba6SRoland Levillain // Compute CpuId from ArmInfo.
75*eca53ba6SRoland Levillain uint32_t GetArmCpuId(const ArmInfo* const info);
76*eca53ba6SRoland Levillain 
77*eca53ba6SRoland Levillain ////////////////////////////////////////////////////////////////////////////////
78*eca53ba6SRoland Levillain // Introspection functions
79*eca53ba6SRoland Levillain 
80*eca53ba6SRoland Levillain typedef enum {
81*eca53ba6SRoland Levillain   ARM_SWP,
82*eca53ba6SRoland Levillain   ARM_HALF,
83*eca53ba6SRoland Levillain   ARM_THUMB,
84*eca53ba6SRoland Levillain   ARM_26BIT,
85*eca53ba6SRoland Levillain   ARM_FASTMULT,
86*eca53ba6SRoland Levillain   ARM_FPA,
87*eca53ba6SRoland Levillain   ARM_VFP,
88*eca53ba6SRoland Levillain   ARM_EDSP,
89*eca53ba6SRoland Levillain   ARM_JAVA,
90*eca53ba6SRoland Levillain   ARM_IWMMXT,
91*eca53ba6SRoland Levillain   ARM_CRUNCH,
92*eca53ba6SRoland Levillain   ARM_THUMBEE,
93*eca53ba6SRoland Levillain   ARM_NEON,
94*eca53ba6SRoland Levillain   ARM_VFPV3,
95*eca53ba6SRoland Levillain   ARM_VFPV3D16,
96*eca53ba6SRoland Levillain   ARM_TLS,
97*eca53ba6SRoland Levillain   ARM_VFPV4,
98*eca53ba6SRoland Levillain   ARM_IDIVA,
99*eca53ba6SRoland Levillain   ARM_IDIVT,
100*eca53ba6SRoland Levillain   ARM_VFPD32,
101*eca53ba6SRoland Levillain   ARM_LPAE,
102*eca53ba6SRoland Levillain   ARM_EVTSTRM,
103*eca53ba6SRoland Levillain   ARM_AES,
104*eca53ba6SRoland Levillain   ARM_PMULL,
105*eca53ba6SRoland Levillain   ARM_SHA1,
106*eca53ba6SRoland Levillain   ARM_SHA2,
107*eca53ba6SRoland Levillain   ARM_CRC32,
108*eca53ba6SRoland Levillain   ARM_LAST_,
109*eca53ba6SRoland Levillain } ArmFeaturesEnum;
110*eca53ba6SRoland Levillain 
111*eca53ba6SRoland Levillain int GetArmFeaturesEnumValue(const ArmFeatures* features, ArmFeaturesEnum value);
112*eca53ba6SRoland Levillain 
113*eca53ba6SRoland Levillain const char* GetArmFeaturesEnumName(ArmFeaturesEnum);
114*eca53ba6SRoland Levillain 
115*eca53ba6SRoland Levillain CPU_FEATURES_END_CPP_NAMESPACE
116*eca53ba6SRoland Levillain 
117*eca53ba6SRoland Levillain #if !defined(CPU_FEATURES_ARCH_ARM)
118*eca53ba6SRoland Levillain #error "Including cpuinfo_arm.h from a non-arm target."
119*eca53ba6SRoland Levillain #endif
120*eca53ba6SRoland Levillain 
121*eca53ba6SRoland Levillain #endif  // CPU_FEATURES_INCLUDE_CPUINFO_ARM_H_
122