xref: /aosp_15_r20/external/ComputeLibrary/src/common/cpuinfo/CpuModel.cpp (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1*c217d954SCole Faust /*
2*c217d954SCole Faust  * Copyright (c) 2021-2022 Arm Limited.
3*c217d954SCole Faust  *
4*c217d954SCole Faust  * SPDX-License-Identifier: MIT
5*c217d954SCole Faust  *
6*c217d954SCole Faust  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust  * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust  * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust  * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust  * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust  *
13*c217d954SCole Faust  * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust  * copies or substantial portions of the Software.
15*c217d954SCole Faust  *
16*c217d954SCole Faust  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust  * SOFTWARE.
23*c217d954SCole Faust  */
24*c217d954SCole Faust #include "src/common/cpuinfo/CpuModel.h"
25*c217d954SCole Faust 
26*c217d954SCole Faust namespace arm_compute
27*c217d954SCole Faust {
28*c217d954SCole Faust namespace cpuinfo
29*c217d954SCole Faust {
cpu_model_to_string(CpuModel model)30*c217d954SCole Faust std::string cpu_model_to_string(CpuModel model)
31*c217d954SCole Faust {
32*c217d954SCole Faust     switch(model)
33*c217d954SCole Faust     {
34*c217d954SCole Faust #define X(MODEL)          \
35*c217d954SCole Faust case CpuModel::MODEL: \
36*c217d954SCole Faust     return #MODEL;
37*c217d954SCole Faust             ARM_COMPUTE_CPU_MODEL_LIST
38*c217d954SCole Faust #undef X
39*c217d954SCole Faust         default:
40*c217d954SCole Faust         {
41*c217d954SCole Faust             return std::string("GENERIC");
42*c217d954SCole Faust         }
43*c217d954SCole Faust     };
44*c217d954SCole Faust }
45*c217d954SCole Faust 
model_supports_fp16(CpuModel model)46*c217d954SCole Faust bool model_supports_fp16(CpuModel model)
47*c217d954SCole Faust {
48*c217d954SCole Faust     switch(model)
49*c217d954SCole Faust     {
50*c217d954SCole Faust         case CpuModel::GENERIC_FP16:
51*c217d954SCole Faust         case CpuModel::GENERIC_FP16_DOT:
52*c217d954SCole Faust         case CpuModel::A55r1:
53*c217d954SCole Faust         case CpuModel::A510:
54*c217d954SCole Faust         case CpuModel::X1:
55*c217d954SCole Faust         case CpuModel::V1:
56*c217d954SCole Faust         case CpuModel::A64FX:
57*c217d954SCole Faust         case CpuModel::N1:
58*c217d954SCole Faust             return true;
59*c217d954SCole Faust         default:
60*c217d954SCole Faust             return false;
61*c217d954SCole Faust     }
62*c217d954SCole Faust }
63*c217d954SCole Faust 
model_supports_dot(CpuModel model)64*c217d954SCole Faust bool model_supports_dot(CpuModel model)
65*c217d954SCole Faust {
66*c217d954SCole Faust     switch(model)
67*c217d954SCole Faust     {
68*c217d954SCole Faust         case CpuModel::GENERIC_FP16_DOT:
69*c217d954SCole Faust         case CpuModel::A55r1:
70*c217d954SCole Faust         case CpuModel::A510:
71*c217d954SCole Faust         case CpuModel::X1:
72*c217d954SCole Faust         case CpuModel::V1:
73*c217d954SCole Faust         case CpuModel::N1:
74*c217d954SCole Faust             return true;
75*c217d954SCole Faust         default:
76*c217d954SCole Faust             return false;
77*c217d954SCole Faust     }
78*c217d954SCole Faust }
79*c217d954SCole Faust 
midr_to_model(uint32_t midr)80*c217d954SCole Faust CpuModel midr_to_model(uint32_t midr)
81*c217d954SCole Faust {
82*c217d954SCole Faust     CpuModel model = CpuModel::GENERIC;
83*c217d954SCole Faust 
84*c217d954SCole Faust     // Unpack variant and CPU ID
85*c217d954SCole Faust     const int implementer = (midr >> 24) & 0xFF;
86*c217d954SCole Faust     const int variant     = (midr >> 20) & 0xF;
87*c217d954SCole Faust     const int cpunum      = (midr >> 4) & 0xFFF;
88*c217d954SCole Faust 
89*c217d954SCole Faust     // Only CPUs we have code paths for are detected.  All other CPUs can be safely classed as "GENERIC"
90*c217d954SCole Faust     if(implementer == 0x41) // Arm CPUs
91*c217d954SCole Faust     {
92*c217d954SCole Faust         switch(cpunum)
93*c217d954SCole Faust         {
94*c217d954SCole Faust             case 0xd03: // A53
95*c217d954SCole Faust             case 0xd04: // A35
96*c217d954SCole Faust                 model = CpuModel::A53;
97*c217d954SCole Faust                 break;
98*c217d954SCole Faust             case 0xd05: // A55
99*c217d954SCole Faust                 if(variant != 0)
100*c217d954SCole Faust                 {
101*c217d954SCole Faust                     model = CpuModel::A55r1;
102*c217d954SCole Faust                 }
103*c217d954SCole Faust                 else
104*c217d954SCole Faust                 {
105*c217d954SCole Faust                     model = CpuModel::A55r0;
106*c217d954SCole Faust                 }
107*c217d954SCole Faust                 break;
108*c217d954SCole Faust             case 0xd09: // A73
109*c217d954SCole Faust                 model = CpuModel::A73;
110*c217d954SCole Faust                 break;
111*c217d954SCole Faust             case 0xd0a: // A75
112*c217d954SCole Faust                 if(variant != 0)
113*c217d954SCole Faust                 {
114*c217d954SCole Faust                     model = CpuModel::GENERIC_FP16_DOT;
115*c217d954SCole Faust                 }
116*c217d954SCole Faust                 else
117*c217d954SCole Faust                 {
118*c217d954SCole Faust                     model = CpuModel::GENERIC_FP16;
119*c217d954SCole Faust                 }
120*c217d954SCole Faust                 break;
121*c217d954SCole Faust             case 0xd0c: // N1
122*c217d954SCole Faust                 model = CpuModel::N1;
123*c217d954SCole Faust                 break;
124*c217d954SCole Faust             case 0xd06: // A65
125*c217d954SCole Faust             case 0xd0b: // A76
126*c217d954SCole Faust             case 0xd0d: // A77
127*c217d954SCole Faust             case 0xd0e: // A76AE
128*c217d954SCole Faust             case 0xd41: // A78
129*c217d954SCole Faust             case 0xd42: // A78AE
130*c217d954SCole Faust             case 0xd4a: // E1
131*c217d954SCole Faust                 model = CpuModel::GENERIC_FP16_DOT;
132*c217d954SCole Faust                 break;
133*c217d954SCole Faust             case 0xd40: // V1
134*c217d954SCole Faust                 model = CpuModel::V1;
135*c217d954SCole Faust                 break;
136*c217d954SCole Faust             case 0xd44: // X1
137*c217d954SCole Faust                 model = CpuModel::X1;
138*c217d954SCole Faust                 break;
139*c217d954SCole Faust             case 0xd46:
140*c217d954SCole Faust                 model = CpuModel::A510;
141*c217d954SCole Faust                 break;
142*c217d954SCole Faust             default:
143*c217d954SCole Faust                 model = CpuModel::GENERIC;
144*c217d954SCole Faust                 break;
145*c217d954SCole Faust         }
146*c217d954SCole Faust     }
147*c217d954SCole Faust     else if(implementer == 0x46)
148*c217d954SCole Faust     {
149*c217d954SCole Faust         switch(cpunum)
150*c217d954SCole Faust         {
151*c217d954SCole Faust             case 0x001: // A64FX
152*c217d954SCole Faust                 model = CpuModel::A64FX;
153*c217d954SCole Faust                 break;
154*c217d954SCole Faust             default:
155*c217d954SCole Faust                 model = CpuModel::GENERIC;
156*c217d954SCole Faust                 break;
157*c217d954SCole Faust         }
158*c217d954SCole Faust     }
159*c217d954SCole Faust     else if(implementer == 0x48)
160*c217d954SCole Faust     {
161*c217d954SCole Faust         switch(cpunum)
162*c217d954SCole Faust         {
163*c217d954SCole Faust             case 0xd40: // A76
164*c217d954SCole Faust                 model = CpuModel::GENERIC_FP16_DOT;
165*c217d954SCole Faust                 break;
166*c217d954SCole Faust             default:
167*c217d954SCole Faust                 model = CpuModel::GENERIC;
168*c217d954SCole Faust                 break;
169*c217d954SCole Faust         }
170*c217d954SCole Faust     }
171*c217d954SCole Faust     else if(implementer == 0x51)
172*c217d954SCole Faust     {
173*c217d954SCole Faust         switch(cpunum)
174*c217d954SCole Faust         {
175*c217d954SCole Faust             case 0x800: // A73
176*c217d954SCole Faust                 model = CpuModel::A73;
177*c217d954SCole Faust                 break;
178*c217d954SCole Faust             case 0x801: // A53
179*c217d954SCole Faust                 model = CpuModel::A53;
180*c217d954SCole Faust                 break;
181*c217d954SCole Faust             case 0x803: // A55r0
182*c217d954SCole Faust                 model = CpuModel::A55r0;
183*c217d954SCole Faust                 break;
184*c217d954SCole Faust             case 0x804: // A76
185*c217d954SCole Faust                 model = CpuModel::GENERIC_FP16_DOT;
186*c217d954SCole Faust                 break;
187*c217d954SCole Faust             case 0x805: // A55r1
188*c217d954SCole Faust                 model = CpuModel::A55r1;
189*c217d954SCole Faust                 break;
190*c217d954SCole Faust             default:
191*c217d954SCole Faust                 model = CpuModel::GENERIC;
192*c217d954SCole Faust                 break;
193*c217d954SCole Faust         }
194*c217d954SCole Faust     }
195*c217d954SCole Faust 
196*c217d954SCole Faust     return model;
197*c217d954SCole Faust }
198*c217d954SCole Faust } // namespace cpuinfo
199*c217d954SCole Faust } // namespace arm_compute