xref: /dpdk/app/test/test_cpuflags.c (revision 2f1a90f0455b4920df3a767ab5d9be37dcbf0d12)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #include <stdio.h>
6 
7 #include <errno.h>
8 #include <stdint.h>
9 #include <rte_cpuflags.h>
10 #include <rte_debug.h>
11 
12 #include "test.h"
13 
14 
15 /* convenience define */
16 #define CHECK_FOR_FLAG(x) \
17 			result = rte_cpu_get_flag_enabled(x);    \
18 			printf("%s\n", cpu_flag_result(result)); \
19 			if (result == -ENOENT)                   \
20 				return -1;
21 
22 /*
23  * Helper function to display result
24  */
25 static inline const char *
26 cpu_flag_result(int result)
27 {
28 	switch (result) {
29 	case 0:
30 		return "NOT PRESENT";
31 	case 1:
32 		return "OK";
33 	default:
34 		return "ERROR";
35 	}
36 }
37 
38 
39 
40 /*
41  * CPUID test
42  * ===========
43  *
44  * - Check flags from different registers with rte_cpu_get_flag_enabled()
45  */
46 
47 static int
48 test_cpuflags(void)
49 {
50 	int result;
51 	printf("\nChecking for flags from different registers...\n");
52 
53 #ifdef RTE_ARCH_PPC_64
54 	printf("Check for PPC64:\t\t");
55 	CHECK_FOR_FLAG(RTE_CPUFLAG_PPC64);
56 
57 	printf("Check for PPC32:\t\t");
58 	CHECK_FOR_FLAG(RTE_CPUFLAG_PPC32);
59 
60 	printf("Check for VSX:\t\t");
61 	CHECK_FOR_FLAG(RTE_CPUFLAG_VSX);
62 
63 	printf("Check for DFP:\t\t");
64 	CHECK_FOR_FLAG(RTE_CPUFLAG_DFP);
65 
66 	printf("Check for FPU:\t\t");
67 	CHECK_FOR_FLAG(RTE_CPUFLAG_FPU);
68 
69 	printf("Check for SMT:\t\t");
70 	CHECK_FOR_FLAG(RTE_CPUFLAG_SMT);
71 
72 	printf("Check for MMU:\t\t");
73 	CHECK_FOR_FLAG(RTE_CPUFLAG_MMU);
74 
75 	printf("Check for ALTIVEC:\t\t");
76 	CHECK_FOR_FLAG(RTE_CPUFLAG_ALTIVEC);
77 
78 	printf("Check for ARCH_2_06:\t\t");
79 	CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_06);
80 
81 	printf("Check for ARCH_2_07:\t\t");
82 	CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_07);
83 
84 	printf("Check for ICACHE_SNOOP:\t\t");
85 	CHECK_FOR_FLAG(RTE_CPUFLAG_ICACHE_SNOOP);
86 #endif
87 
88 #if defined(RTE_ARCH_ARM) && defined(RTE_ARCH_32)
89 	printf("Check for NEON:\t\t");
90 	CHECK_FOR_FLAG(RTE_CPUFLAG_NEON);
91 #endif
92 
93 #if defined(RTE_ARCH_ARM64)
94 	printf("Check for FP:\t\t");
95 	CHECK_FOR_FLAG(RTE_CPUFLAG_FP);
96 
97 	printf("Check for ASIMD:\t");
98 	CHECK_FOR_FLAG(RTE_CPUFLAG_NEON);
99 
100 	printf("Check for EVTSTRM:\t");
101 	CHECK_FOR_FLAG(RTE_CPUFLAG_EVTSTRM);
102 
103 	printf("Check for AES:\t\t");
104 	CHECK_FOR_FLAG(RTE_CPUFLAG_AES);
105 
106 	printf("Check for PMULL:\t");
107 	CHECK_FOR_FLAG(RTE_CPUFLAG_PMULL);
108 
109 	printf("Check for SHA1:\t\t");
110 	CHECK_FOR_FLAG(RTE_CPUFLAG_SHA1);
111 
112 	printf("Check for SHA2:\t\t");
113 	CHECK_FOR_FLAG(RTE_CPUFLAG_SHA2);
114 
115 	printf("Check for CRC32:\t");
116 	CHECK_FOR_FLAG(RTE_CPUFLAG_CRC32);
117 
118 	printf("Check for ATOMICS:\t");
119 	CHECK_FOR_FLAG(RTE_CPUFLAG_ATOMICS);
120 
121 	printf("Check for SVE:\t\t");
122 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVE);
123 
124 	printf("Check for SVE2:\t\t");
125 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVE2);
126 
127 	printf("Check for SVEAES:\t");
128 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEAES);
129 
130 	printf("Check for SVEPMULL:\t");
131 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEPMULL);
132 
133 	printf("Check for SVEBITPERM:\t");
134 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBITPERM);
135 
136 	printf("Check for SVESHA3:\t");
137 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVESHA3);
138 
139 	printf("Check for SVESM4:\t");
140 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVESM4);
141 
142 	printf("Check for FLAGM2:\t");
143 	CHECK_FOR_FLAG(RTE_CPUFLAG_FLAGM2);
144 
145 	printf("Check for FRINT:\t");
146 	CHECK_FOR_FLAG(RTE_CPUFLAG_FRINT);
147 
148 	printf("Check for SVEI8MM:\t");
149 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEI8MM);
150 
151 	printf("Check for SVEF32MM:\t");
152 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF32MM);
153 
154 	printf("Check for SVEF64MM:\t");
155 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF64MM);
156 
157 	printf("Check for SVEBF16:\t");
158 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBF16);
159 
160 	printf("Check for WFXT:\t");
161 	CHECK_FOR_FLAG(RTE_CPUFLAG_WFXT);
162 #endif
163 
164 #if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686)
165 	printf("Check for SSE:\t\t");
166 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE);
167 
168 	printf("Check for SSE2:\t\t");
169 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE2);
170 
171 	printf("Check for SSE3:\t\t");
172 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE3);
173 
174 	printf("Check for SSE4.1:\t");
175 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_1);
176 
177 	printf("Check for SSE4.2:\t");
178 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_2);
179 
180 	printf("Check for AVX:\t\t");
181 	CHECK_FOR_FLAG(RTE_CPUFLAG_AVX);
182 
183 	printf("Check for AVX2:\t\t");
184 	CHECK_FOR_FLAG(RTE_CPUFLAG_AVX2);
185 
186 	printf("Check for AVX512F:\t");
187 	CHECK_FOR_FLAG(RTE_CPUFLAG_AVX512F);
188 
189 	printf("Check for TRBOBST:\t");
190 	CHECK_FOR_FLAG(RTE_CPUFLAG_TRBOBST);
191 
192 	printf("Check for ENERGY_EFF:\t");
193 	CHECK_FOR_FLAG(RTE_CPUFLAG_ENERGY_EFF);
194 
195 	printf("Check for LAHF_SAHF:\t");
196 	CHECK_FOR_FLAG(RTE_CPUFLAG_LAHF_SAHF);
197 
198 	printf("Check for 1GB_PG:\t");
199 	CHECK_FOR_FLAG(RTE_CPUFLAG_1GB_PG);
200 
201 	printf("Check for INVTSC:\t");
202 	CHECK_FOR_FLAG(RTE_CPUFLAG_INVTSC);
203 #endif
204 
205 #if defined(RTE_ARCH_RISCV)
206 
207 	printf("Check for RISCV_ISA_A:\t");
208 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_A);
209 
210 	printf("Check for RISCV_ISA_B:\t");
211 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_B);
212 
213 	printf("Check for RISCV_ISA_C:\t");
214 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_C);
215 
216 	printf("Check for RISCV_ISA_D:\t");
217 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_D);
218 
219 	printf("Check for RISCV_ISA_E:\t");
220 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_E);
221 
222 	printf("Check for RISCV_ISA_F:\t");
223 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_F);
224 
225 	printf("Check for RISCV_ISA_G:\t");
226 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_G);
227 
228 	printf("Check for RISCV_ISA_H:\t");
229 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_H);
230 
231 	printf("Check for RISCV_ISA_I:\t");
232 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_I);
233 
234 	printf("Check for RISCV_ISA_J:\t");
235 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_J);
236 
237 	printf("Check for RISCV_ISA_K:\t");
238 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_K);
239 
240 	printf("Check for RISCV_ISA_L:\t");
241 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_L);
242 
243 	printf("Check for RISCV_ISA_M:\t");
244 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_M);
245 
246 	printf("Check for RISCV_ISA_N:\t");
247 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_N);
248 
249 	printf("Check for RISCV_ISA_O:\t");
250 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_O);
251 
252 	printf("Check for RISCV_ISA_P:\t");
253 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_P);
254 
255 	printf("Check for RISCV_ISA_Q:\t");
256 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_Q);
257 
258 	printf("Check for RISCV_ISA_R:\t");
259 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_R);
260 
261 	printf("Check for RISCV_ISA_S:\t");
262 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_S);
263 
264 	printf("Check for RISCV_ISA_T:\t");
265 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_T);
266 
267 	printf("Check for RISCV_ISA_U:\t");
268 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_U);
269 
270 	printf("Check for RISCV_ISA_V:\t");
271 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_V);
272 
273 	printf("Check for RISCV_ISA_W:\t");
274 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_W);
275 
276 	printf("Check for RISCV_ISA_X:\t");
277 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_X);
278 
279 	printf("Check for RISCV_ISA_Y:\t");
280 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_Y);
281 
282 	printf("Check for RISCV_ISA_Z:\t");
283 	CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_Z);
284 #endif
285 
286 #if defined(RTE_ARCH_LOONGARCH)
287 	printf("Check for CPUCFG:\t");
288 	CHECK_FOR_FLAG(RTE_CPUFLAG_CPUCFG);
289 
290 	printf("Check for LAM:\t\t");
291 	CHECK_FOR_FLAG(RTE_CPUFLAG_LAM);
292 
293 	printf("Check for UAL:\t\t");
294 	CHECK_FOR_FLAG(RTE_CPUFLAG_UAL);
295 
296 	printf("Check for FPU:\t\t");
297 	CHECK_FOR_FLAG(RTE_CPUFLAG_FPU);
298 
299 	printf("Check for LSX:\t\t");
300 	CHECK_FOR_FLAG(RTE_CPUFLAG_LSX);
301 
302 	printf("Check for LASX:\t\t");
303 	CHECK_FOR_FLAG(RTE_CPUFLAG_LASX);
304 
305 	printf("Check for CRC32:\t");
306 	CHECK_FOR_FLAG(RTE_CPUFLAG_CRC32);
307 
308 	printf("Check for COMPLEX:\t");
309 	CHECK_FOR_FLAG(RTE_CPUFLAG_COMPLEX);
310 
311 	printf("Check for CRYPTO:\t");
312 	CHECK_FOR_FLAG(RTE_CPUFLAG_CRYPTO);
313 
314 	printf("Check for LVZ:\t\t");
315 	CHECK_FOR_FLAG(RTE_CPUFLAG_LVZ);
316 
317 	printf("Check for LBT_X86:\t");
318 	CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_X86);
319 
320 	printf("Check for LBT_ARM:\t");
321 	CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_ARM);
322 
323 	printf("Check for LBT_MIPS:\t");
324 	CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_MIPS);
325 #endif
326 
327 	return 0;
328 }
329 
330 REGISTER_FAST_TEST(cpuflags_autotest, true, true, test_cpuflags);
331