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 *****************************************************************************/
33 #define CPU_CORTEXA9 3
34 #define CPU_CORTEXA15 4
36 static char *cpuname[] = {
45 static char *cpuname_lower[] = {
54 int get_feature(char *search)
59 char buffer[2048], *p,*t;
62 infile = fopen("/proc/cpuinfo", "r");
64 while (fgets(buffer, sizeof(buffer), infile))
67 if (!strncmp("Features", buffer, 8))
69 p = strchr(buffer, ':') + 2;
77 if( p == NULL ) return;
80 while( t = strtok(NULL," "))
82 if (!strcmp(t, search)) { return(1); }
99 infile = fopen("/proc/cpuinfo", "r");
100 while (fgets(buffer, sizeof(buffer), infile))
103 if (!strncmp("CPU part", buffer, 8))
105 p = strchr(buffer, ':') + 2;
112 if (strstr(p, "0xc09")) {
115 if (strstr(p, "0xc0f")) {
116 return CPU_CORTEXA15;
122 infile = fopen("/proc/cpuinfo", "r");
124 while (fgets(buffer, sizeof(buffer), infile))
127 if ((!strncmp("model name", buffer, 10)) || (!strncmp("Processor", buffer, 9)))
129 p = strchr(buffer, ':') + 2;
139 if (strstr(p, "ARMv7"))
141 if ( get_feature("vfpv4"))
144 if ( get_feature("vfpv3"))
147 if ( get_feature("vfp"))
153 if (strstr(p, "ARMv6"))
155 if ( get_feature("vfp"))
166 char *get_corename(void)
168 return cpuname[detect()];
171 void get_architecture(void)
176 void get_subarchitecture(void)
179 printf("%s", cpuname[d]);
182 void get_subdirname(void)
187 void get_cpuconfig(void)
194 printf("#define CORTEXA9\n");
195 printf("#define ARMV7\n");
196 printf("#define HAVE_VFP\n");
197 printf("#define HAVE_VFPV3\n");
198 if ( get_feature("neon")) printf("#define HAVE_NEON\n");
199 if ( get_feature("vfpv4")) printf("#define HAVE_VFPV4\n");
200 printf("#define L1_DATA_SIZE 32768\n");
201 printf("#define L1_DATA_LINESIZE 32\n");
202 printf("#define L2_SIZE 1048576\n");
203 printf("#define L2_LINESIZE 32\n");
204 printf("#define DTB_DEFAULT_ENTRIES 128\n");
205 printf("#define DTB_SIZE 4096\n");
206 printf("#define L2_ASSOCIATIVE 4\n");
210 printf("#define CORTEXA15\n");
211 printf("#define ARMV7\n");
212 printf("#define HAVE_VFP\n");
213 printf("#define HAVE_VFPV3\n");
214 if ( get_feature("neon")) printf("#define HAVE_NEON\n");
215 if ( get_feature("vfpv4")) printf("#define HAVE_VFPV4\n");
216 printf("#define L1_DATA_SIZE 32768\n");
217 printf("#define L1_DATA_LINESIZE 32\n");
218 printf("#define L2_SIZE 1048576\n");
219 printf("#define L2_LINESIZE 32\n");
220 printf("#define DTB_DEFAULT_ENTRIES 128\n");
221 printf("#define DTB_SIZE 4096\n");
222 printf("#define L2_ASSOCIATIVE 4\n");
227 printf("#define ARMV7\n");
228 printf("#define HAVE_VFP\n");
229 printf("#define HAVE_VFPV3\n");
230 if ( get_feature("neon")) printf("#define HAVE_NEON\n");
231 if ( get_feature("vfpv4")) printf("#define HAVE_VFPV4\n");
232 printf("#define L1_DATA_SIZE 65536\n");
233 printf("#define L1_DATA_LINESIZE 32\n");
234 printf("#define L2_SIZE 512488\n");
235 printf("#define L2_LINESIZE 32\n");
236 printf("#define DTB_DEFAULT_ENTRIES 64\n");
237 printf("#define DTB_SIZE 4096\n");
238 printf("#define L2_ASSOCIATIVE 4\n");
242 printf("#define ARMV6\n");
243 printf("#define HAVE_VFP\n");
244 printf("#define L1_DATA_SIZE 65536\n");
245 printf("#define L1_DATA_LINESIZE 32\n");
246 printf("#define L2_SIZE 512488\n");
247 printf("#define L2_LINESIZE 32\n");
248 printf("#define DTB_DEFAULT_ENTRIES 64\n");
249 printf("#define DTB_SIZE 4096\n");
250 printf("#define L2_ASSOCIATIVE 4\n");
257 void get_libname(void)
261 printf("%s", cpuname_lower[d]);
265 void get_features(void)
270 char buffer[2048], *p,*t;
273 infile = fopen("/proc/cpuinfo", "r");
275 while (fgets(buffer, sizeof(buffer), infile))
278 if (!strncmp("Features", buffer, 8))
280 p = strchr(buffer, ':') + 2;
288 if( p == NULL ) return;
291 while( t = strtok(NULL," "))
293 if (!strcmp(t, "vfp")) { printf("HAVE_VFP=1\n"); continue; }
294 if (!strcmp(t, "vfpv3")) { printf("HAVE_VFPV3=1\n"); continue; }
295 if (!strcmp(t, "vfpv4")) { printf("HAVE_VFPV4=1\n"); continue; }
296 if (!strcmp(t, "neon")) { printf("HAVE_NEON=1\n"); continue; }