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 static char *cpuname[] = {
40 static char *cpuname_lower[] = {
46 int get_feature(char *search)
51 char buffer[2048], *p,*t;
54 infile = fopen("/proc/cpuinfo", "r");
56 while (fgets(buffer, sizeof(buffer), infile))
59 if (!strncmp("Features", buffer, 8))
61 p = strchr(buffer, ':') + 2;
69 if( p == NULL ) return 0;
72 while( t = strtok(NULL," "))
74 if (!strcmp(t, search)) { return(1); }
91 infile = fopen("/proc/cpuinfo", "r");
92 while (fgets(buffer, sizeof(buffer), infile))
95 if (!strncmp("CPU part", buffer, 8))
97 p = strchr(buffer, ':') + 2;
104 if (strstr(p, "0xd07")) {
105 return CPU_CORTEXA57;
110 infile = fopen("/proc/cpuinfo", "r");
111 while (fgets(buffer, sizeof(buffer), infile))
114 if ((!strncmp("model name", buffer, 10)) || (!strncmp("Processor", buffer, 9)) ||
115 (!strncmp("CPU architecture", buffer, 16)))
117 p = strchr(buffer, ':') + 2;
127 if (strstr(p, "AArch64"))
140 char *get_corename(void)
142 return cpuname[detect()];
145 void get_architecture(void)
150 void get_subarchitecture(void)
153 printf("%s", cpuname[d]);
156 void get_subdirname(void)
161 void get_cpuconfig(void)
169 printf("#define ARMV8\n");
170 printf("#define L1_DATA_SIZE 32768\n");
171 printf("#define L1_DATA_LINESIZE 64\n");
172 printf("#define L2_SIZE 262144\n");
173 printf("#define L2_LINESIZE 64\n");
174 printf("#define DTB_DEFAULT_ENTRIES 64\n");
175 printf("#define DTB_SIZE 4096\n");
176 printf("#define L2_ASSOCIATIVE 4\n");
180 printf("#define CORTEXA57\n");
181 printf("#define HAVE_VFP\n");
182 printf("#define HAVE_VFPV3\n");
183 printf("#define HAVE_NEON\n");
184 printf("#define HAVE_VFPV4\n");
185 printf("#define L1_CODE_SIZE 49152\n");
186 printf("#define L1_CODE_LINESIZE 64\n");
187 printf("#define L1_CODE_ASSOCIATIVE 3\n");
188 printf("#define L1_DATA_SIZE 32768\n");
189 printf("#define L1_DATA_LINESIZE 64\n");
190 printf("#define L1_DATA_ASSOCIATIVE 2\n");
191 printf("#define L2_SIZE 2097152\n");
192 printf("#define L2_LINESIZE 64\n");
193 printf("#define L2_ASSOCIATIVE 16\n");
199 void get_libname(void)
202 printf("%s", cpuname_lower[d]);
205 void get_features(void)
210 char buffer[2048], *p,*t;
213 infile = fopen("/proc/cpuinfo", "r");
215 while (fgets(buffer, sizeof(buffer), infile))
218 if (!strncmp("Features", buffer, 8))
220 p = strchr(buffer, ':') + 2;
228 if( p == NULL ) return;
231 while( t = strtok(NULL," "))