1 /**************************************************************************
2 Copyright (c) 2013, The OpenBLAS Project
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
7 1. Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 2. Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
13 3. Neither the name of the OpenBLAS project nor the names of
14 its contributors may be used to endorse or promote products
15 derived from this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
25 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *****************************************************************************/
32 #define CPU_CORTEXA57 2
34 #define CPU_THUNDERX 4
36 static char *cpuname[] = {
44 static char *cpuname_lower[] = {
52 int get_feature(char *search)
57 char buffer[2048], *p,*t;
60 infile = fopen("/proc/cpuinfo", "r");
62 while (fgets(buffer, sizeof(buffer), infile))
65 if (!strncmp("Features", buffer, 8))
67 p = strchr(buffer, ':') + 2;
75 if( p == NULL ) return 0;
78 while( t = strtok(NULL," "))
80 if (!strcmp(t, search)) { return(1); }
94 char buffer[512], *p, *cpu_part, *cpu_implementer;
97 infile = fopen("/proc/cpuinfo", "r");
98 while (fgets(buffer, sizeof(buffer), infile)) {
100 if (!strncmp("CPU part", buffer, 8)) {
101 cpu_part = strchr(buffer, ':') + 2;
103 } else if (!strncmp("CPU implementer", buffer, 15)) {
104 cpu_implementer = strchr(buffer, ':') + 2;
110 if(cpu_part != NULL && cpu_implementer != NULL) {
111 if (strstr(cpu_part, "0xd07") && strstr(cpu_implementer, "0x41"))
112 return CPU_CORTEXA57;
113 else if (strstr(cpu_part, "0x516") && strstr(cpu_implementer, "0x42"))
115 else if (strstr(cpu_part, "0x0a1") && strstr(cpu_implementer, "0x43"))
120 infile = fopen("/proc/cpuinfo", "r");
121 while (fgets(buffer, sizeof(buffer), infile))
124 if ((!strncmp("model name", buffer, 10)) || (!strncmp("Processor", buffer, 9)) ||
125 (!strncmp("CPU architecture", buffer, 16)))
127 p = strchr(buffer, ':') + 2;
137 if (strstr(p, "AArch64"))
150 char *get_corename(void)
152 return cpuname[detect()];
155 void get_architecture(void)
160 void get_subarchitecture(void)
163 printf("%s", cpuname[d]);
166 void get_subdirname(void)
171 void get_cpuconfig(void)
179 printf("#define ARMV8\n");
180 printf("#define L1_DATA_SIZE 32768\n");
181 printf("#define L1_DATA_LINESIZE 64\n");
182 printf("#define L2_SIZE 262144\n");
183 printf("#define L2_LINESIZE 64\n");
184 printf("#define DTB_DEFAULT_ENTRIES 64\n");
185 printf("#define DTB_SIZE 4096\n");
186 printf("#define L2_ASSOCIATIVE 4\n");
190 printf("#define VULCAN \n");
191 printf("#define HAVE_VFP \n");
192 printf("#define HAVE_VFPV3 \n");
193 printf("#define HAVE_NEON \n");
194 printf("#define HAVE_VFPV4 \n");
195 printf("#define L1_CODE_SIZE 32768 \n");
196 printf("#define L1_CODE_LINESIZE 64 \n");
197 printf("#define L1_CODE_ASSOCIATIVE 8 \n");
198 printf("#define L1_DATA_SIZE 32768 \n");
199 printf("#define L1_DATA_LINESIZE 64 \n");
200 printf("#define L1_DATA_ASSOCIATIVE 8 \n");
201 printf("#define L2_SIZE 262144 \n");
202 printf("#define L2_LINESIZE 64 \n");
203 printf("#define L2_ASSOCIATIVE 8 \n");
204 printf("#define L3_SIZE 33554432 \n");
205 printf("#define L3_LINESIZE 64 \n");
206 printf("#define L3_ASSOCIATIVE 32 \n");
207 printf("#define DTB_DEFAULT_ENTRIES 64 \n");
208 printf("#define DTB_SIZE 4096 \n");
212 printf("#define CORTEXA57\n");
213 printf("#define HAVE_VFP\n");
214 printf("#define HAVE_VFPV3\n");
215 printf("#define HAVE_NEON\n");
216 printf("#define HAVE_VFPV4\n");
217 printf("#define L1_CODE_SIZE 49152\n");
218 printf("#define L1_CODE_LINESIZE 64\n");
219 printf("#define L1_CODE_ASSOCIATIVE 3\n");
220 printf("#define L1_DATA_SIZE 32768\n");
221 printf("#define L1_DATA_LINESIZE 64\n");
222 printf("#define L1_DATA_ASSOCIATIVE 2\n");
223 printf("#define L2_SIZE 2097152\n");
224 printf("#define L2_LINESIZE 64\n");
225 printf("#define L2_ASSOCIATIVE 16\n");
226 printf("#define DTB_DEFAULT_ENTRIES 64\n");
227 printf("#define DTB_SIZE 4096\n");
231 printf("#define ARMV8\n");
232 printf("#define THUNDERX\n");
233 printf("#define L1_DATA_SIZE 32768\n");
234 printf("#define L1_DATA_LINESIZE 128\n");
235 printf("#define L2_SIZE 16777216\n");
236 printf("#define L2_LINESIZE 128\n");
237 printf("#define DTB_DEFAULT_ENTRIES 64\n");
238 printf("#define DTB_SIZE 4096\n");
239 printf("#define L2_ASSOCIATIVE 16\n");
245 void get_libname(void)
248 printf("%s", cpuname_lower[d]);
251 void get_features(void)
256 char buffer[2048], *p,*t;
259 infile = fopen("/proc/cpuinfo", "r");
261 while (fgets(buffer, sizeof(buffer), infile))
264 if (!strncmp("Features", buffer, 8))
266 p = strchr(buffer, ':') + 2;
274 if( p == NULL ) return;
277 while( t = strtok(NULL," "))