6790076f6bb6cbd3ecfa1f3059ccc5f0082146fc
[platform/upstream/openblas.git] / cpuid_power.c
1 /*********************************************************************/
2 /* Copyright 2009, 2010 The University of Texas at Austin.           */
3 /* All rights reserved.                                              */
4 /*                                                                   */
5 /* Redistribution and use in source and binary forms, with or        */
6 /* without modification, are permitted provided that the following   */
7 /* conditions are met:                                               */
8 /*                                                                   */
9 /*   1. Redistributions of source code must retain the above         */
10 /*      copyright notice, this list of conditions and the following  */
11 /*      disclaimer.                                                  */
12 /*                                                                   */
13 /*   2. Redistributions in binary form must reproduce the above      */
14 /*      copyright notice, this list of conditions and the following  */
15 /*      disclaimer in the documentation and/or other materials       */
16 /*      provided with the distribution.                              */
17 /*                                                                   */
18 /*    THIS  SOFTWARE IS PROVIDED  BY THE  UNIVERSITY OF  TEXAS AT    */
19 /*    AUSTIN  ``AS IS''  AND ANY  EXPRESS OR  IMPLIED WARRANTIES,    */
20 /*    INCLUDING, BUT  NOT LIMITED  TO, THE IMPLIED  WARRANTIES OF    */
21 /*    MERCHANTABILITY  AND FITNESS FOR  A PARTICULAR  PURPOSE ARE    */
22 /*    DISCLAIMED.  IN  NO EVENT SHALL THE UNIVERSITY  OF TEXAS AT    */
23 /*    AUSTIN OR CONTRIBUTORS BE  LIABLE FOR ANY DIRECT, INDIRECT,    */
24 /*    INCIDENTAL,  SPECIAL, EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES    */
25 /*    (INCLUDING, BUT  NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE    */
26 /*    GOODS  OR  SERVICES; LOSS  OF  USE,  DATA,  OR PROFITS;  OR    */
27 /*    BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON ANY THEORY OF    */
28 /*    LIABILITY, WHETHER  IN CONTRACT, STRICT  LIABILITY, OR TORT    */
29 /*    (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT    */
30 /*    OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF ADVISED  OF  THE    */
31 /*    POSSIBILITY OF SUCH DAMAGE.                                    */
32 /*                                                                   */
33 /* The views and conclusions contained in the software and           */
34 /* documentation are those of the authors and should not be          */
35 /* interpreted as representing official policies, either expressed   */
36 /* or implied, of The University of Texas at Austin.                 */
37 /*********************************************************************/
38
39 #include  <sys/utsname.h>
40 #ifdef _AIX
41 #include <sys/vminfo.h>
42 #endif
43 #ifdef __APPLE__
44 #include <mach/mach.h>
45 #include <mach/mach_host.h>
46 #include <mach/host_info.h>
47 #include <mach/machine.h>
48 #endif
49
50 #define CPUTYPE_UNKNOWN    0
51 #define CPUTYPE_POWER3     1
52 #define CPUTYPE_POWER4     2
53 #define CPUTYPE_PPC970     3
54 #define CPUTYPE_POWER5     4
55 #define CPUTYPE_POWER6     5
56 #define CPUTYPE_CELL       6
57 #define CPUTYPE_PPCG4      7
58 #define CPUTYPE_POWER8     8
59
60 char *cpuname[] = {
61   "UNKNOWN",
62   "POWER3",
63   "POWER4",
64   "PPC970",
65   "POWER5",
66   "POWER6",
67   "CELL",
68   "PPCG4",
69   "POWER8",
70 };
71
72 char *lowercpuname[] = {
73   "unknown",
74   "power3",
75   "power4",
76   "ppc970",
77   "power5",
78   "power6",
79   "cell",
80   "ppcg4",
81   "power8",
82 };
83
84 char *corename[] = {
85   "UNKNOWN",
86   "POWER3",
87   "POWER4",
88   "POWER4",
89   "POWER4",
90   "POWER6",
91   "CELL",
92   "PPCG4",
93   "POWER8",
94 };
95
96 int detect(void){
97
98 #ifdef linux
99   FILE *infile;
100   char buffer[512], *p;
101
102   p = (char *)NULL;
103   infile = fopen("/proc/cpuinfo", "r");
104   while (fgets(buffer, sizeof(buffer), infile)){
105     if (!strncmp("cpu", buffer, 3)){
106         p = strchr(buffer, ':') + 2;
107 #if 0
108         fprintf(stderr, "%s\n", p);
109 #endif
110         break;
111       }
112   }
113
114   fclose(infile);
115
116   if (!strncasecmp(p, "POWER3", 6)) return CPUTYPE_POWER3;
117   if (!strncasecmp(p, "POWER4", 6)) return CPUTYPE_POWER4;
118   if (!strncasecmp(p, "PPC970", 6)) return CPUTYPE_PPC970;
119   if (!strncasecmp(p, "POWER5", 6)) return CPUTYPE_POWER5;
120   if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6;
121   if (!strncasecmp(p, "POWER7", 6)) return CPUTYPE_POWER6;
122   if (!strncasecmp(p, "POWER8", 6)) return CPUTYPE_POWER8;
123   if (!strncasecmp(p, "Cell",   4)) return CPUTYPE_CELL;
124   if (!strncasecmp(p, "7447",   4)) return CPUTYPE_PPCG4;
125
126   return CPUTYPE_UNKNOWN;
127 #endif
128
129 #ifdef _AIX
130   return CPUTYPE_POWER5;
131 #endif
132
133 #ifdef __APPLE__
134   host_basic_info_data_t   hostInfo;
135   mach_msg_type_number_t  infoCount;
136
137   infoCount = HOST_BASIC_INFO_COUNT;
138   host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount);
139
140   if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_7450) return CPUTYPE_PPCG4;
141   if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970)  return CPUTYPE_PPC970;
142
143   return  CPUTYPE_PPC970;
144 #endif
145 }
146
147 void get_architecture(void){
148   printf("POWER");
149 }
150
151 void get_subdirname(void){
152     printf("power");
153 }
154
155
156 void get_subarchitecture(void){
157   printf("%s", cpuname[detect()]);
158 }
159
160 void get_cpuconfig(void){
161 #if 0
162 #ifdef _AIX
163   struct vminfo info;
164 #endif
165 #endif
166
167   printf("#define %s\n", cpuname[detect()]);
168   printf("#define CORE_%s\n", corename[detect()]);
169
170   printf("#define L1_DATA_SIZE 32768\n");
171   printf("#define L1_DATA_LINESIZE 128\n");
172   printf("#define L2_SIZE 524288\n");
173   printf("#define L2_LINESIZE 128 \n");
174   printf("#define DTB_DEFAULT_ENTRIES 128\n");
175   printf("#define DTB_SIZE 4096\n");
176   printf("#define L2_ASSOCIATIVE 8\n");
177
178 #if 0
179 #ifdef _AIX
180   if (vmgetinfo(&info, VMINFO, 0) == 0) {
181     if ((info.lgpg_size >> 20) >= 1024) {
182       printf("#define ALLOC_HUGETLB\n");
183     }
184   }
185 #endif
186 #endif
187
188 }
189
190 void get_libname(void){
191   printf("%s", lowercpuname[detect()]);
192 }
193
194 char *get_corename(void){
195   return cpuname[detect()];
196 }