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_CORTEXA15 3
35 static char *cpuname[] = {
43 int get_feature(char *search)
48 char buffer[2048], *p,*t;
51 infile = fopen("/proc/cpuinfo", "r");
53 while (fgets(buffer, sizeof(buffer), infile))
56 if (!strncmp("Features", buffer, 8))
58 p = strchr(buffer, ':') + 2;
66 if( p == NULL ) return;
69 while( t = strtok(NULL," "))
71 if (!strcmp(t, search)) { return(1); }
88 infile = fopen("/proc/cpuinfo", "r");
90 while (fgets(buffer, sizeof(buffer), infile))
93 if ((!strncmp("model name", buffer, 10)) || (!strncmp("Processor", buffer, 9)))
95 p = strchr(buffer, ':') + 2;
105 if (strstr(p, "ARMv7"))
107 if ( get_feature("vfpv4"))
110 if ( get_feature("vfpv3"))
113 if ( get_feature("vfp"))
119 if (strstr(p, "ARMv6"))
121 if ( get_feature("vfp"))
132 char *get_corename(void)
134 return cpuname[detect()];
137 void get_architecture(void)
142 void get_subarchitecture(void)
162 void get_subdirname(void)
167 void get_cpuconfig(void)
175 printf("#define ARMV7\n");
176 printf("#define HAVE_VFP\n");
177 printf("#define HAVE_VFPV3\n");
178 if ( get_feature("neon")) printf("#define HAVE_NEON\n");
179 if ( get_feature("vfpv4")) printf("#define HAVE_VFPV4\n");
180 printf("#define L1_DATA_SIZE 65536\n");
181 printf("#define L1_DATA_LINESIZE 32\n");
182 printf("#define L2_SIZE 512488\n");
183 printf("#define L2_LINESIZE 32\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 ARMV6\n");
191 printf("#define HAVE_VFP\n");
192 printf("#define L1_DATA_SIZE 65536\n");
193 printf("#define L1_DATA_LINESIZE 32\n");
194 printf("#define L2_SIZE 512488\n");
195 printf("#define L2_LINESIZE 32\n");
196 printf("#define DTB_DEFAULT_ENTRIES 64\n");
197 printf("#define DTB_SIZE 4096\n");
198 printf("#define L2_ASSOCIATIVE 4\n");
205 void get_libname(void)
224 void get_features(void)
229 char buffer[2048], *p,*t;
232 infile = fopen("/proc/cpuinfo", "r");
234 while (fgets(buffer, sizeof(buffer), infile))
237 if (!strncmp("Features", buffer, 8))
239 p = strchr(buffer, ':') + 2;
247 if( p == NULL ) return;
250 while( t = strtok(NULL," "))
252 if (!strcmp(t, "vfp")) { printf("HAVE_VFP=1\n"); continue; }
253 if (!strcmp(t, "vfpv3")) { printf("HAVE_VFPV3=1\n"); continue; }
254 if (!strcmp(t, "vfpv4")) { printf("HAVE_VFPV4=1\n"); continue; }
255 if (!strcmp(t, "neon")) { printf("HAVE_NEON=1\n"); continue; }