Merge pull request #613 from fabioperez/develop
[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
59 char *cpuname[] = {
60   "UNKNOWN",
61   "POWER3",
62   "POWER4",
63   "PPC970",
64   "POWER5",
65   "POWER6",
66   "CELL",
67   "PPCG4",
68 };
69
70 char *lowercpuname[] = {
71   "unknown",
72   "power3",
73   "power4",
74   "ppc970",
75   "power5",
76   "power6",
77   "cell",
78   "ppcg4",
79 };
80
81 char *corename[] = {
82   "UNKNOWN",
83   "POWER3",
84   "POWER4",
85   "POWER4",
86   "POWER4",
87   "POWER6",
88   "CELL",
89   "PPCG4",
90 };
91
92 int detect(void){
93
94 #ifdef linux
95   FILE *infile;
96   char buffer[512], *p;
97
98   p = (char *)NULL;
99   infile = fopen("/proc/cpuinfo", "r");
100   while (fgets(buffer, sizeof(buffer), infile)){
101     if (!strncmp("cpu", buffer, 3)){
102         p = strchr(buffer, ':') + 2;
103 #if 0
104         fprintf(stderr, "%s\n", p);
105 #endif
106         break;
107       }
108   }
109
110   fclose(infile);
111
112   if (!strncasecmp(p, "POWER3", 6)) return CPUTYPE_POWER3;
113   if (!strncasecmp(p, "POWER4", 6)) return CPUTYPE_POWER4;
114   if (!strncasecmp(p, "PPC970", 6)) return CPUTYPE_PPC970;
115   if (!strncasecmp(p, "POWER5", 6)) return CPUTYPE_POWER5;
116   if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6;
117   if (!strncasecmp(p, "POWER7", 6)) return CPUTYPE_POWER6;
118   if (!strncasecmp(p, "POWER8", 6)) return CPUTYPE_POWER6;
119   if (!strncasecmp(p, "Cell",   4)) return CPUTYPE_CELL;
120   if (!strncasecmp(p, "7447",   4)) return CPUTYPE_PPCG4;
121
122   return CPUTYPE_UNKNOWN;
123 #endif
124
125 #ifdef _AIX
126   return CPUTYPE_POWER5;
127 #endif
128
129 #ifdef __APPLE__
130   host_basic_info_data_t   hostInfo;
131   mach_msg_type_number_t  infoCount;
132
133   infoCount = HOST_BASIC_INFO_COUNT;
134   host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount);
135
136   if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_7450) return CPUTYPE_PPCG4;
137   if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970)  return CPUTYPE_PPC970;
138
139   return  CPUTYPE_PPC970;
140 #endif
141 }
142
143 void get_architecture(void){
144   printf("POWER");
145 }
146
147 void get_subdirname(void){
148     printf("power");
149 }
150
151
152 void get_subarchitecture(void){
153   printf("%s", cpuname[detect()]);
154 }
155
156 void get_cpuconfig(void){
157 #if 0
158 #ifdef _AIX
159   struct vminfo info;
160 #endif
161 #endif
162
163   printf("#define %s\n", cpuname[detect()]);
164   printf("#define CORE_%s\n", corename[detect()]);
165
166   printf("#define L1_DATA_SIZE 32768\n");
167   printf("#define L1_DATA_LINESIZE 128\n");
168   printf("#define L2_SIZE 524288\n");
169   printf("#define L2_LINESIZE 128 \n");
170   printf("#define DTB_DEFAULT_ENTRIES 128\n");
171   printf("#define DTB_SIZE 4096\n");
172   printf("#define L2_ASSOCIATIVE 8\n");
173
174 #if 0
175 #ifdef _AIX
176   if (vmgetinfo(&info, VMINFO, 0) == 0) {
177     if ((info.lgpg_size >> 20) >= 1024) {
178       printf("#define ALLOC_HUGETLB\n");
179     }
180   }
181 #endif
182 #endif
183
184 }
185
186 void get_libname(void){
187   printf("%s", lowercpuname[detect()]);
188 }
189
190 char *get_corename(void){
191   return cpuname[detect()];
192 }