summaryrefslogtreecommitdiff
path: root/cpuid_power.c
diff options
context:
space:
mode:
authorXianyi Zhang <traits.zhang@gmail.com>2011-01-24 14:54:24 +0000
committerXianyi Zhang <traits.zhang@gmail.com>2011-01-24 14:54:24 +0000
commit342bbc3871d1b43f548e9d1ae9d380a1d4989cb3 (patch)
tree385fc6d27e282ae1bb06d685833c5325615c8169 /cpuid_power.c
downloadopenblas-342bbc3871d1b43f548e9d1ae9d380a1d4989cb3.tar.gz
openblas-342bbc3871d1b43f548e9d1ae9d380a1d4989cb3.tar.bz2
openblas-342bbc3871d1b43f548e9d1ae9d380a1d4989cb3.zip
Import GotoBLAS2 1.13 BSD version codes.
Diffstat (limited to 'cpuid_power.c')
-rw-r--r--cpuid_power.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/cpuid_power.c b/cpuid_power.c
new file mode 100644
index 000000000..46ff30a3a
--- /dev/null
+++ b/cpuid_power.c
@@ -0,0 +1,190 @@
+/*********************************************************************/
+/* Copyright 2009, 2010 The University of Texas at Austin. */
+/* All rights reserved. */
+/* */
+/* Redistribution and use in source and binary forms, with or */
+/* without modification, are permitted provided that the following */
+/* conditions are met: */
+/* */
+/* 1. Redistributions of source code must retain the above */
+/* copyright notice, this list of conditions and the following */
+/* disclaimer. */
+/* */
+/* 2. Redistributions in binary form must reproduce the above */
+/* copyright notice, this list of conditions and the following */
+/* disclaimer in the documentation and/or other materials */
+/* provided with the distribution. */
+/* */
+/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
+/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
+/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
+/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
+/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
+/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
+/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
+/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
+/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
+/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
+/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
+/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
+/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
+/* POSSIBILITY OF SUCH DAMAGE. */
+/* */
+/* The views and conclusions contained in the software and */
+/* documentation are those of the authors and should not be */
+/* interpreted as representing official policies, either expressed */
+/* or implied, of The University of Texas at Austin. */
+/*********************************************************************/
+
+#include <sys/utsname.h>
+#ifdef _AIX
+#include <sys/vminfo.h>
+#endif
+#ifdef __APPLE__
+#include <mach/mach.h>
+#include <mach/mach_host.h>
+#include <mach/host_info.h>
+#include <mach/machine.h>
+#endif
+
+#define CPUTYPE_UNKNOWN 0
+#define CPUTYPE_POWER3 1
+#define CPUTYPE_POWER4 2
+#define CPUTYPE_PPC970 3
+#define CPUTYPE_POWER5 4
+#define CPUTYPE_POWER6 5
+#define CPUTYPE_CELL 6
+#define CPUTYPE_PPCG4 7
+
+char *cpuname[] = {
+ "UNKNOWN",
+ "POWER3",
+ "POWER4",
+ "PPC970",
+ "POWER5",
+ "POWER6",
+ "CELL",
+ "PPCG4",
+};
+
+char *lowercpuname[] = {
+ "unknown",
+ "power3",
+ "power4",
+ "ppc970",
+ "power5",
+ "power6",
+ "cell",
+ "ppcg4",
+};
+
+char *corename[] = {
+ "UNKNOWN",
+ "POWER3",
+ "POWER4",
+ "POWER4",
+ "POWER4",
+ "POWER6",
+ "CELL",
+ "PPCG4",
+};
+
+int detect(void){
+
+#ifdef linux
+ FILE *infile;
+ char buffer[512], *p;
+
+ p = (char *)NULL;
+ infile = fopen("/proc/cpuinfo", "r");
+ while (fgets(buffer, sizeof(buffer), infile)){
+ if (!strncmp("cpu", buffer, 3)){
+ p = strchr(buffer, ':') + 2;
+#if 0
+ fprintf(stderr, "%s\n", p);
+#endif
+ break;
+ }
+ }
+
+ fclose(infile);
+
+ if (!strncasecmp(p, "POWER3", 6)) return CPUTYPE_POWER3;
+ if (!strncasecmp(p, "POWER4", 6)) return CPUTYPE_POWER4;
+ if (!strncasecmp(p, "PPC970", 6)) return CPUTYPE_PPC970;
+ if (!strncasecmp(p, "POWER5", 6)) return CPUTYPE_POWER5;
+ if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6;
+ if (!strncasecmp(p, "Cell", 4)) return CPUTYPE_CELL;
+ if (!strncasecmp(p, "7447", 4)) return CPUTYPE_PPCG4;
+
+ return CPUTYPE_UNKNOWN;
+#endif
+
+#ifdef _AIX
+ return CPUTYPE_POWER5;
+#endif
+
+#ifdef __APPLE__
+ host_basic_info_data_t hostInfo;
+ mach_msg_type_number_t infoCount;
+
+ infoCount = HOST_BASIC_INFO_COUNT;
+ host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount);
+
+ if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_7450) return CPUTYPE_PPCG4;
+ if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970) return CPUTYPE_PPC970;
+
+ return CPUTYPE_PPC970;
+#endif
+}
+
+void get_architecture(void){
+ printf("POWER");
+}
+
+void get_subdirname(void){
+ printf("power");
+}
+
+
+void get_subarchitecture(void){
+ printf("%s", cpuname[detect()]);
+}
+
+void get_cpuconfig(void){
+#if 0
+#ifdef _AIX
+ struct vminfo info;
+#endif
+#endif
+
+ printf("#define %s\n", cpuname[detect()]);
+ printf("#define CORE_%s\n", corename[detect()]);
+
+ printf("#define L1_DATA_SIZE 32768\n");
+ printf("#define L1_DATA_LINESIZE 128\n");
+ printf("#define L2_SIZE 524288\n");
+ printf("#define L2_LINESIZE 128 \n");
+ printf("#define DTB_ENTRIES 128\n");
+ printf("#define DTB_SIZE 4096\n");
+ printf("#define L2_ASSOCIATIVE 8\n");
+
+#if 0
+#ifdef _AIX
+ if (vmgetinfo(&info, VMINFO, 0) == 0) {
+ if ((info.lgpg_size >> 20) >= 1024) {
+ printf("#define ALLOC_HUGETLB\n");
+ }
+ }
+#endif
+#endif
+
+}
+
+void get_libname(void){
+ printf("%s", lowercpuname[detect()]);
+}
+
+char *get_corename(void){
+ return cpuname[detect()];
+}