No strncasecmp with MSVC
[platform/upstream/openblas.git] / cpuid_arm64.c
1 /**************************************************************************
2   Copyright (c) 2013, The OpenBLAS Project
3   All rights reserved.
4   Redistribution and use in source and binary forms, with or without
5   modification, are permitted provided that the following conditions are
6   met:
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
12   distribution.
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   *****************************************************************************/
27
28 #include <string.h>
29
30 #define CPU_UNKNOWN             0
31 #define CPU_ARMV8               1
32 #define CPU_CORTEXA57           2
33 #define CPU_VULCAN              3
34 #define CPU_THUNDERX            4
35 #define CPU_THUNDERX2T99        5
36
37 static char *cpuname[] = {
38   "UNKNOWN",
39   "ARMV8" ,
40   "CORTEXA57",
41   "VULCAN",
42   "THUNDERX",
43   "THUNDERX2T99"
44 };
45
46 static char *cpuname_lower[] = {
47   "unknown",
48   "armv8" ,
49   "cortexa57",
50   "vulcan",
51   "thunderx",
52   "thunderx2t99"
53 };
54
55 int get_feature(char *search)
56 {
57
58 #ifdef linux
59         FILE *infile;
60         char buffer[2048], *p,*t;
61         p = (char *) NULL ;
62
63         infile = fopen("/proc/cpuinfo", "r");
64
65         while (fgets(buffer, sizeof(buffer), infile))
66         {
67
68                 if (!strncmp("Features", buffer, 8))
69                 {
70                         p = strchr(buffer, ':') + 2;
71                         break;
72                 }
73         }
74
75         fclose(infile);
76
77
78         if( p == NULL ) return 0;
79
80         t = strtok(p," ");
81         while( t = strtok(NULL," "))
82         {
83                 if (!strcmp(t, search))   { return(1); }
84         }
85
86 #endif
87         return(0);
88 }
89
90
91 int detect(void)
92 {
93
94 #ifdef linux
95
96         FILE *infile;
97         char buffer[512], *p, *cpu_part = NULL, *cpu_implementer = NULL;
98         p = (char *) NULL ;
99
100         infile = fopen("/proc/cpuinfo", "r");
101         while (fgets(buffer, sizeof(buffer), infile)) {
102                 if ((cpu_part != NULL) && (cpu_implementer != NULL)) {
103                         break;
104                 }
105
106                 if ((cpu_part == NULL) && !strncmp("CPU part", buffer, 8)) {
107                         cpu_part = strchr(buffer, ':') + 2;
108                         cpu_part = strdup(cpu_part);
109                 } else if ((cpu_implementer == NULL) && !strncmp("CPU implementer", buffer, 15)) {
110                         cpu_implementer = strchr(buffer, ':') + 2;
111                         cpu_implementer = strdup(cpu_implementer);
112                 }
113         }
114
115         fclose(infile);
116         if(cpu_part != NULL && cpu_implementer != NULL) {
117                 if (strstr(cpu_part, "0xd07") && strstr(cpu_implementer, "0x41"))
118                         return CPU_CORTEXA57;
119                 else if (strstr(cpu_part, "0x516") && strstr(cpu_implementer, "0x42"))
120                         return CPU_VULCAN;
121                 else if (strstr(cpu_part, "0x0a1") && strstr(cpu_implementer, "0x43"))
122                         return CPU_THUNDERX;
123                 else if (strstr(cpu_part, "0xFFF") && strstr(cpu_implementer, "0x43")) /* TODO */
124                         return CPU_THUNDERX2T99;
125         }
126
127         p = (char *) NULL ;
128         infile = fopen("/proc/cpuinfo", "r");
129         while (fgets(buffer, sizeof(buffer), infile))
130         {
131
132                 if ((!strncmp("model name", buffer, 10)) || (!strncmp("Processor", buffer, 9)) ||
133                     (!strncmp("CPU architecture", buffer, 16)))
134                 {
135                         p = strchr(buffer, ':') + 2;
136                         break;
137                 }
138         }
139
140         fclose(infile);
141
142         if(p != NULL)
143         {
144
145                 if (strstr(p, "AArch64"))
146                 {
147                         return CPU_ARMV8;
148
149                 }
150
151
152         }
153 #endif
154
155         return CPU_UNKNOWN;
156 }
157
158 char *get_corename(void)
159 {
160         return cpuname[detect()];
161 }
162
163 void get_architecture(void)
164 {
165         printf("ARM64");
166 }
167
168 void get_subarchitecture(void)
169 {
170         int d = detect();
171         printf("%s", cpuname[d]);
172 }
173
174 void get_subdirname(void)
175 {
176         printf("arm64");
177 }
178
179 void get_cpuconfig(void)
180 {
181
182         int d = detect();
183         switch (d)
184         {
185
186                 case CPU_ARMV8:
187                         printf("#define ARMV8\n");
188                         printf("#define L1_DATA_SIZE 32768\n");
189                         printf("#define L1_DATA_LINESIZE 64\n");
190                         printf("#define L2_SIZE 262144\n");
191                         printf("#define L2_LINESIZE 64\n");
192                         printf("#define DTB_DEFAULT_ENTRIES 64\n");
193                         printf("#define DTB_SIZE 4096\n");
194                         printf("#define L2_ASSOCIATIVE 4\n");
195                         break;
196
197                 case CPU_VULCAN:
198                         printf("#define VULCAN                        \n");
199                         printf("#define HAVE_VFP                      \n");
200                         printf("#define HAVE_VFPV3                    \n");
201                         printf("#define HAVE_NEON                     \n");
202                         printf("#define HAVE_VFPV4                    \n");
203                         printf("#define L1_CODE_SIZE         32768    \n");
204                         printf("#define L1_CODE_LINESIZE     64       \n");
205                         printf("#define L1_CODE_ASSOCIATIVE  8        \n");
206                         printf("#define L1_DATA_SIZE         32768    \n");
207                         printf("#define L1_DATA_LINESIZE     64       \n");
208                         printf("#define L1_DATA_ASSOCIATIVE  8        \n");
209                         printf("#define L2_SIZE              262144   \n");
210                         printf("#define L2_LINESIZE          64       \n");
211                         printf("#define L2_ASSOCIATIVE       8        \n");
212                         printf("#define L3_SIZE              33554432 \n");
213                         printf("#define L3_LINESIZE          64       \n");
214                         printf("#define L3_ASSOCIATIVE       32       \n");
215                         printf("#define DTB_DEFAULT_ENTRIES  64       \n");
216                         printf("#define DTB_SIZE             4096     \n");
217                         break;
218
219                 case CPU_CORTEXA57:
220                         printf("#define CORTEXA57\n");
221                         printf("#define HAVE_VFP\n");
222                         printf("#define HAVE_VFPV3\n");
223                         printf("#define HAVE_NEON\n");
224                         printf("#define HAVE_VFPV4\n");
225                         printf("#define L1_CODE_SIZE 49152\n");
226                         printf("#define L1_CODE_LINESIZE 64\n");
227                         printf("#define L1_CODE_ASSOCIATIVE 3\n");
228                         printf("#define L1_DATA_SIZE 32768\n");
229                         printf("#define L1_DATA_LINESIZE 64\n");
230                         printf("#define L1_DATA_ASSOCIATIVE 2\n");
231                         printf("#define L2_SIZE 2097152\n");
232                         printf("#define L2_LINESIZE 64\n");
233                         printf("#define L2_ASSOCIATIVE 16\n");
234                         printf("#define DTB_DEFAULT_ENTRIES 64\n");
235                         printf("#define DTB_SIZE 4096\n");
236                         break;
237
238                 case CPU_THUNDERX:
239                         printf("#define ARMV8\n");
240                         printf("#define THUNDERX\n");
241                         printf("#define L1_DATA_SIZE 32768\n");
242                         printf("#define L1_DATA_LINESIZE 128\n");
243                         printf("#define L2_SIZE 16777216\n");
244                         printf("#define L2_LINESIZE 128\n");
245                         printf("#define DTB_DEFAULT_ENTRIES 64\n");
246                         printf("#define DTB_SIZE 4096\n");
247                         printf("#define L2_ASSOCIATIVE 16\n");
248                         break;
249
250                 case CPU_THUNDERX2T99:
251                         printf("#define VULCAN                        \n");
252                         printf("#define HAVE_VFP                      \n");
253                         printf("#define HAVE_VFPV3                    \n");
254                         printf("#define HAVE_NEON                     \n");
255                         printf("#define HAVE_VFPV4                    \n");
256                         printf("#define L1_CODE_SIZE         32768    \n");
257                         printf("#define L1_CODE_LINESIZE     64       \n");
258                         printf("#define L1_CODE_ASSOCIATIVE  8        \n");
259                         printf("#define L1_DATA_SIZE         32768    \n");
260                         printf("#define L1_DATA_LINESIZE     64       \n");
261                         printf("#define L1_DATA_ASSOCIATIVE  8        \n");
262                         printf("#define L2_SIZE              262144   \n");
263                         printf("#define L2_LINESIZE          64       \n");
264                         printf("#define L2_ASSOCIATIVE       8        \n");
265                         printf("#define L3_SIZE              33554432 \n");
266                         printf("#define L3_LINESIZE          64       \n");
267                         printf("#define L3_ASSOCIATIVE       32       \n");
268                         printf("#define DTB_DEFAULT_ENTRIES  64       \n");
269                         printf("#define DTB_SIZE             4096     \n");
270                         break;
271         }
272 }
273
274
275 void get_libname(void)
276 {
277         int d = detect();
278         printf("%s", cpuname_lower[d]);
279 }
280
281 void get_features(void)
282 {
283
284 #ifdef linux
285         FILE *infile;
286         char buffer[2048], *p,*t;
287         p = (char *) NULL ;
288
289         infile = fopen("/proc/cpuinfo", "r");
290
291         while (fgets(buffer, sizeof(buffer), infile))
292         {
293
294                 if (!strncmp("Features", buffer, 8))
295                 {
296                         p = strchr(buffer, ':') + 2;
297                         break;
298                 }
299         }
300
301         fclose(infile);
302
303
304         if( p == NULL ) return;
305
306         t = strtok(p," ");
307         while( t = strtok(NULL," "))
308         {
309         }
310
311 #endif
312         return;
313 }
314
315