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 HAVE_VFP\n");
196 printf("#define HAVE_VFPV3\n");
197 if ( get_feature("neon")) printf("#define HAVE_NEON\n");
198 if ( get_feature("vfpv4")) printf("#define HAVE_VFPV4\n");
199 printf("#define L1_DATA_SIZE 32768\n");
200 printf("#define L1_DATA_LINESIZE 32\n");
201 printf("#define L2_SIZE 1048576\n");
202 printf("#define L2_LINESIZE 32\n");
203 printf("#define DTB_DEFAULT_ENTRIES 128\n");
204 printf("#define DTB_SIZE 4096\n");
205 printf("#define L2_ASSOCIATIVE 4\n");
209 printf("#define CORTEXA15\n");
210 printf("#define HAVE_VFP\n");
211 printf("#define HAVE_VFPV3\n");
212 if ( get_feature("neon")) printf("#define HAVE_NEON\n");
213 if ( get_feature("vfpv4")) printf("#define HAVE_VFPV4\n");
214 printf("#define L1_DATA_SIZE 32768\n");
215 printf("#define L1_DATA_LINESIZE 32\n");
216 printf("#define L2_SIZE 1048576\n");
217 printf("#define L2_LINESIZE 32\n");
218 printf("#define DTB_DEFAULT_ENTRIES 128\n");
219 printf("#define DTB_SIZE 4096\n");
220 printf("#define L2_ASSOCIATIVE 4\n");
225 printf("#define ARMV7\n");
226 printf("#define HAVE_VFP\n");
227 printf("#define HAVE_VFPV3\n");
228 if ( get_feature("neon")) printf("#define HAVE_NEON\n");
229 if ( get_feature("vfpv4")) printf("#define HAVE_VFPV4\n");
230 printf("#define L1_DATA_SIZE 65536\n");
231 printf("#define L1_DATA_LINESIZE 32\n");
232 printf("#define L2_SIZE 512488\n");
233 printf("#define L2_LINESIZE 32\n");
234 printf("#define DTB_DEFAULT_ENTRIES 64\n");
235 printf("#define DTB_SIZE 4096\n");
236 printf("#define L2_ASSOCIATIVE 4\n");
240 printf("#define ARMV6\n");
241 printf("#define HAVE_VFP\n");
242 printf("#define L1_DATA_SIZE 65536\n");
243 printf("#define L1_DATA_LINESIZE 32\n");
244 printf("#define L2_SIZE 512488\n");
245 printf("#define L2_LINESIZE 32\n");
246 printf("#define DTB_DEFAULT_ENTRIES 64\n");
247 printf("#define DTB_SIZE 4096\n");
248 printf("#define L2_ASSOCIATIVE 4\n");
255 void get_libname(void)
259 printf("%s", cpuname_lower[d]);
263 void get_features(void)
268 char buffer[2048], *p,*t;
271 infile = fopen("/proc/cpuinfo", "r");
273 while (fgets(buffer, sizeof(buffer), infile))
276 if (!strncmp("Features", buffer, 8))
278 p = strchr(buffer, ':') + 2;
286 if( p == NULL ) return;
289 while( t = strtok(NULL," "))
291 if (!strcmp(t, "vfp")) { printf("HAVE_VFP=1\n"); continue; }
292 if (!strcmp(t, "vfpv3")) { printf("HAVE_VFPV3=1\n"); continue; }
293 if (!strcmp(t, "vfpv4")) { printf("HAVE_VFPV4=1\n"); continue; }
294 if (!strcmp(t, "neon")) { printf("HAVE_NEON=1\n"); continue; }