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
35 static char *cpuname[] = {
42 static char *cpuname_lower[] = {
49 int get_feature(char *search)
54 char buffer[2048], *p,*t;
57 infile = fopen("/proc/cpuinfo", "r");
59 while (fgets(buffer, sizeof(buffer), infile))
62 if (!strncmp("Features", buffer, 8))
64 p = strchr(buffer, ':') + 2;
72 if( p == NULL ) return 0;
75 while( t = strtok(NULL," "))
77 if (!strcmp(t, search)) { return(1); }
91 char buffer[512], *p, *cpu_part, *cpu_implementer;
94 infile = fopen("/proc/cpuinfo", "r");
95 while (fgets(buffer, sizeof(buffer), infile)) {
97 if (!strncmp("CPU part", buffer, 8)) {
98 cpu_part = strchr(buffer, ':') + 2;
100 } else if (!strncmp("CPU implementer", buffer, 15)) {
101 cpu_implementer = strchr(buffer, ':') + 2;
107 if(cpu_part != NULL && cpu_implementer != NULL) {
108 if (strstr(cpu_part, "0xd07") && strstr(cpu_implementer, "0x41"))
109 return CPU_CORTEXA57;
110 else if (strstr(cpu_part, "0x516") && strstr(cpu_implementer, "0x42"))
115 infile = fopen("/proc/cpuinfo", "r");
116 while (fgets(buffer, sizeof(buffer), infile))
119 if ((!strncmp("model name", buffer, 10)) || (!strncmp("Processor", buffer, 9)) ||
120 (!strncmp("CPU architecture", buffer, 16)))
122 p = strchr(buffer, ':') + 2;
132 if (strstr(p, "AArch64"))
145 char *get_corename(void)
147 return cpuname[detect()];
150 void get_architecture(void)
155 void get_subarchitecture(void)
158 printf("%s", cpuname[d]);
161 void get_subdirname(void)
166 void get_cpuconfig(void)
174 printf("#define ARMV8\n");
175 printf("#define L1_DATA_SIZE 32768\n");
176 printf("#define L1_DATA_LINESIZE 64\n");
177 printf("#define L2_SIZE 262144\n");
178 printf("#define L2_LINESIZE 64\n");
179 printf("#define DTB_DEFAULT_ENTRIES 64\n");
180 printf("#define DTB_SIZE 4096\n");
181 printf("#define L2_ASSOCIATIVE 4\n");
185 printf("#define VULCAN \n");
186 printf("#define HAVE_VFP \n");
187 printf("#define HAVE_VFPV3 \n");
188 printf("#define HAVE_NEON \n");
189 printf("#define HAVE_VFPV4 \n");
190 printf("#define L1_CODE_SIZE 32768 \n");
191 printf("#define L1_CODE_LINESIZE 64 \n");
192 printf("#define L1_CODE_ASSOCIATIVE 8 \n");
193 printf("#define L1_DATA_SIZE 32768 \n");
194 printf("#define L1_DATA_LINESIZE 64 \n");
195 printf("#define L1_DATA_ASSOCIATIVE 8 \n");
196 printf("#define L2_SIZE 262144 \n");
197 printf("#define L2_LINESIZE 64 \n");
198 printf("#define L2_ASSOCIATIVE 8 \n");
199 printf("#define L3_SIZE 33554432 \n");
200 printf("#define L3_LINESIZE 64 \n");
201 printf("#define L3_ASSOCIATIVE 32 \n");
202 printf("#define DTB_DEFAULT_ENTRIES 64 \n");
203 printf("#define DTB_SIZE 4096 \n");
207 printf("#define CORTEXA57\n");
208 printf("#define HAVE_VFP\n");
209 printf("#define HAVE_VFPV3\n");
210 printf("#define HAVE_NEON\n");
211 printf("#define HAVE_VFPV4\n");
212 printf("#define L1_CODE_SIZE 49152\n");
213 printf("#define L1_CODE_LINESIZE 64\n");
214 printf("#define L1_CODE_ASSOCIATIVE 3\n");
215 printf("#define L1_DATA_SIZE 32768\n");
216 printf("#define L1_DATA_LINESIZE 64\n");
217 printf("#define L1_DATA_ASSOCIATIVE 2\n");
218 printf("#define L2_SIZE 2097152\n");
219 printf("#define L2_LINESIZE 64\n");
220 printf("#define L2_ASSOCIATIVE 16\n");
221 printf("#define DTB_DEFAULT_ENTRIES 64\n");
222 printf("#define DTB_SIZE 4096\n");
228 void get_libname(void)
231 printf("%s", cpuname_lower[d]);
234 void get_features(void)
239 char buffer[2048], *p,*t;
242 infile = fopen("/proc/cpuinfo", "r");
244 while (fgets(buffer, sizeof(buffer), infile))
247 if (!strncmp("Features", buffer, 8))
249 p = strchr(buffer, ':') + 2;
257 if( p == NULL ) return;
260 while( t = strtok(NULL," "))