xref: /aosp_15_r20/external/cpu_features/include/cpuinfo_loongarch.h (revision eca53ba6d2e951e174b64682eaf56a36b8204c89)
1*eca53ba6SRoland Levillain // Copyright 2023 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_LOONGARCH_H_
16*eca53ba6SRoland Levillain #define CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH_H_
17*eca53ba6SRoland Levillain 
18*eca53ba6SRoland Levillain #include "cpu_features_cache_info.h"
19*eca53ba6SRoland Levillain #include "cpu_features_macros.h"
20*eca53ba6SRoland Levillain 
21*eca53ba6SRoland Levillain #if !defined(CPU_FEATURES_ARCH_LOONGARCH)
22*eca53ba6SRoland Levillain #error "Including cpuinfo_loongarch.h from a non-loongarch target."
23*eca53ba6SRoland Levillain #endif
24*eca53ba6SRoland Levillain 
25*eca53ba6SRoland Levillain CPU_FEATURES_START_CPP_NAMESPACE
26*eca53ba6SRoland Levillain 
27*eca53ba6SRoland Levillain typedef struct {
28*eca53ba6SRoland Levillain   // Base
29*eca53ba6SRoland Levillain   int CPUCFG : 1;    // Instruction for Identify CPU Features
30*eca53ba6SRoland Levillain 
31*eca53ba6SRoland Levillain   // Extension
32*eca53ba6SRoland Levillain   int LAM : 1;       // Extension for Atomic Memory Access Instructions
33*eca53ba6SRoland Levillain   int UAL : 1;       // Extension for Non-Aligned Memory Access
34*eca53ba6SRoland Levillain   int FPU : 1;       // Extension for Basic Floating-Point Instructions
35*eca53ba6SRoland Levillain   int LSX : 1;       // Extension for Loongson SIMD eXtension
36*eca53ba6SRoland Levillain   int LASX : 1;      // Extension for Loongson Advanced SIMD eXtension
37*eca53ba6SRoland Levillain   int CRC32 : 1;     // Extension for Cyclic Redundancy Check Instructions
38*eca53ba6SRoland Levillain   int COMPLEX : 1;   // Extension for Complex Vector Operation Instructions
39*eca53ba6SRoland Levillain   int CRYPTO : 1;    // Extension for Encryption And Decryption Vector Instructions
40*eca53ba6SRoland Levillain   int LVZ : 1;       // Extension for Virtualization
41*eca53ba6SRoland Levillain   int LBT_X86 : 1;   // Extension for X86 Binary Translation Extension
42*eca53ba6SRoland Levillain   int LBT_ARM : 1;   // Extension for ARM Binary Translation Extension
43*eca53ba6SRoland Levillain   int LBT_MIPS : 1;  // Extension for MIPS Binary Translation Extension
44*eca53ba6SRoland Levillain   int PTW : 1;       // Extension for Page Table Walker
45*eca53ba6SRoland Levillain 
46*eca53ba6SRoland Levillain } LoongArchFeatures;
47*eca53ba6SRoland Levillain 
48*eca53ba6SRoland Levillain typedef struct {
49*eca53ba6SRoland Levillain   LoongArchFeatures features;
50*eca53ba6SRoland Levillain } LoongArchInfo;
51*eca53ba6SRoland Levillain 
52*eca53ba6SRoland Levillain typedef enum {
53*eca53ba6SRoland Levillain   LOONGARCH_CPUCFG,
54*eca53ba6SRoland Levillain   LOONGARCH_LAM,
55*eca53ba6SRoland Levillain   LOONGARCH_UAL,
56*eca53ba6SRoland Levillain   LOONGARCH_FPU,
57*eca53ba6SRoland Levillain   LOONGARCH_LSX,
58*eca53ba6SRoland Levillain   LOONGARCH_LASX,
59*eca53ba6SRoland Levillain   LOONGARCH_CRC32,
60*eca53ba6SRoland Levillain   LOONGARCH_COMPLEX,
61*eca53ba6SRoland Levillain   LOONGARCH_CRYPTO,
62*eca53ba6SRoland Levillain   LOONGARCH_LVZ,
63*eca53ba6SRoland Levillain   LOONGARCH_LBT_X86,
64*eca53ba6SRoland Levillain   LOONGARCH_LBT_ARM,
65*eca53ba6SRoland Levillain   LOONGARCH_LBT_MIPS,
66*eca53ba6SRoland Levillain   LOONGARCH_PTW,
67*eca53ba6SRoland Levillain   LOONGARCH_LAST_,
68*eca53ba6SRoland Levillain } LoongArchFeaturesEnum;
69*eca53ba6SRoland Levillain 
70*eca53ba6SRoland Levillain LoongArchInfo GetLoongArchInfo(void);
71*eca53ba6SRoland Levillain int GetLoongArchFeaturesEnumValue(const LoongArchFeatures* features,
72*eca53ba6SRoland Levillain                               LoongArchFeaturesEnum value);
73*eca53ba6SRoland Levillain const char* GetLoongArchFeaturesEnumName(LoongArchFeaturesEnum);
74*eca53ba6SRoland Levillain 
75*eca53ba6SRoland Levillain CPU_FEATURES_END_CPP_NAMESPACE
76*eca53ba6SRoland Levillain 
77*eca53ba6SRoland Levillain #endif  // CPU_FEATURES_INCLUDE_CPUINFO_LOONGARCH_H_
78