blob: 445b43391c74bff0503c99879a1ab68f55683ff4 [file] [log] [blame]
Marat Dukhan547fa362017-03-03 02:47:26 -05001#include <stdio.h>
Marat Dukhan12c8e072017-09-21 15:50:41 -07002#include <stdint.h>
3#include <inttypes.h>
Marat Dukhan547fa362017-03-03 02:47:26 -05004
5#include <cpuinfo.h>
6
Marat Dukhan12c8e072017-09-21 15:50:41 -07007
8static const char* vendor_to_string(enum cpuinfo_vendor vendor) {
Marat Dukhan2d37dc42017-09-25 01:32:37 -07009 switch (vendor) {
Marat Dukhan547fa362017-03-03 02:47:26 -050010 case cpuinfo_vendor_unknown:
Marat Dukhan12c8e072017-09-21 15:50:41 -070011 return "unknown";
Marat Dukhan547fa362017-03-03 02:47:26 -050012 case cpuinfo_vendor_intel:
Marat Dukhan12c8e072017-09-21 15:50:41 -070013 return "Intel";
Marat Dukhan547fa362017-03-03 02:47:26 -050014 case cpuinfo_vendor_amd:
Marat Dukhan12c8e072017-09-21 15:50:41 -070015 return "AMD";
Marat Dukhan547fa362017-03-03 02:47:26 -050016 case cpuinfo_vendor_arm:
Marat Dukhan12c8e072017-09-21 15:50:41 -070017 return "ARM";
Marat Dukhan547fa362017-03-03 02:47:26 -050018 case cpuinfo_vendor_qualcomm:
Marat Dukhan12c8e072017-09-21 15:50:41 -070019 return "Qualcomm";
Marat Dukhan547fa362017-03-03 02:47:26 -050020 case cpuinfo_vendor_apple:
Marat Dukhan12c8e072017-09-21 15:50:41 -070021 return "Apple";
Marat Dukhan547fa362017-03-03 02:47:26 -050022 case cpuinfo_vendor_samsung:
Marat Dukhan12c8e072017-09-21 15:50:41 -070023 return "Samsung";
Marat Dukhan547fa362017-03-03 02:47:26 -050024 case cpuinfo_vendor_nvidia:
Marat Dukhan93982f22017-10-20 13:10:23 -070025 return "Nvidia";
Marat Dukhan547fa362017-03-03 02:47:26 -050026 case cpuinfo_vendor_mips:
Marat Dukhan12c8e072017-09-21 15:50:41 -070027 return "MIPS";
Marat Dukhan547fa362017-03-03 02:47:26 -050028 case cpuinfo_vendor_ibm:
Marat Dukhan12c8e072017-09-21 15:50:41 -070029 return "IBM";
Marat Dukhan547fa362017-03-03 02:47:26 -050030 case cpuinfo_vendor_ingenic:
Marat Dukhan12c8e072017-09-21 15:50:41 -070031 return "Ingenic";
Marat Dukhan547fa362017-03-03 02:47:26 -050032 case cpuinfo_vendor_via:
Marat Dukhan12c8e072017-09-21 15:50:41 -070033 return "VIA";
Marat Dukhan92dae312017-05-09 14:10:17 +000034 case cpuinfo_vendor_cavium:
Marat Dukhan12c8e072017-09-21 15:50:41 -070035 return "Cavium";
Marat Dukhan547fa362017-03-03 02:47:26 -050036 default:
Marat Dukhan12c8e072017-09-21 15:50:41 -070037 return NULL;
Marat Dukhan547fa362017-03-03 02:47:26 -050038 }
Marat Dukhan12c8e072017-09-21 15:50:41 -070039}
40
41static const char* uarch_to_string(enum cpuinfo_uarch uarch) {
42 switch (uarch) {
Marat Dukhan547fa362017-03-03 02:47:26 -050043 case cpuinfo_uarch_unknown:
Marat Dukhan12c8e072017-09-21 15:50:41 -070044 return "unknown";
Marat Dukhan547fa362017-03-03 02:47:26 -050045 case cpuinfo_uarch_p5:
Marat Dukhan12c8e072017-09-21 15:50:41 -070046 return "P5";
Marat Dukhan547fa362017-03-03 02:47:26 -050047 case cpuinfo_uarch_quark:
Marat Dukhan12c8e072017-09-21 15:50:41 -070048 return "Quark";
Marat Dukhan547fa362017-03-03 02:47:26 -050049 case cpuinfo_uarch_p6:
Marat Dukhan12c8e072017-09-21 15:50:41 -070050 return "P6";
Marat Dukhan547fa362017-03-03 02:47:26 -050051 case cpuinfo_uarch_dothan:
Marat Dukhan12c8e072017-09-21 15:50:41 -070052 return "Dothan";
Marat Dukhan547fa362017-03-03 02:47:26 -050053 case cpuinfo_uarch_yonah:
Marat Dukhan12c8e072017-09-21 15:50:41 -070054 return "Yonah";
Marat Dukhan547fa362017-03-03 02:47:26 -050055 case cpuinfo_uarch_conroe:
Marat Dukhan12c8e072017-09-21 15:50:41 -070056 return "Conroe";
Marat Dukhan547fa362017-03-03 02:47:26 -050057 case cpuinfo_uarch_penryn:
Marat Dukhan12c8e072017-09-21 15:50:41 -070058 return "Penryn";
Marat Dukhan547fa362017-03-03 02:47:26 -050059 case cpuinfo_uarch_nehalem:
Marat Dukhan12c8e072017-09-21 15:50:41 -070060 return "Nehalem";
Marat Dukhan547fa362017-03-03 02:47:26 -050061 case cpuinfo_uarch_sandy_bridge:
Marat Dukhan12c8e072017-09-21 15:50:41 -070062 return "Sandy Bridge";
Marat Dukhan547fa362017-03-03 02:47:26 -050063 case cpuinfo_uarch_ivy_bridge:
Marat Dukhan12c8e072017-09-21 15:50:41 -070064 return "Ivy Bridge";
Marat Dukhan547fa362017-03-03 02:47:26 -050065 case cpuinfo_uarch_haswell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070066 return "Haswell";
Marat Dukhan547fa362017-03-03 02:47:26 -050067 case cpuinfo_uarch_broadwell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070068 return "Broadwell";
Marat Dukhan547fa362017-03-03 02:47:26 -050069 case cpuinfo_uarch_sky_lake:
Marat Dukhan12c8e072017-09-21 15:50:41 -070070 return "Sky Lake";
Marat Dukhan547fa362017-03-03 02:47:26 -050071 case cpuinfo_uarch_kaby_lake:
Marat Dukhan12c8e072017-09-21 15:50:41 -070072 return "Kaby Lake";
Marat Dukhan547fa362017-03-03 02:47:26 -050073 case cpuinfo_uarch_willamette:
Marat Dukhan12c8e072017-09-21 15:50:41 -070074 return "Willamette";
Marat Dukhan547fa362017-03-03 02:47:26 -050075 case cpuinfo_uarch_prescott:
Marat Dukhan12c8e072017-09-21 15:50:41 -070076 return "Prescott";
Marat Dukhan547fa362017-03-03 02:47:26 -050077 case cpuinfo_uarch_bonnell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070078 return "Bonnell";
Marat Dukhan547fa362017-03-03 02:47:26 -050079 case cpuinfo_uarch_saltwell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070080 return "Saltwell";
Marat Dukhan547fa362017-03-03 02:47:26 -050081 case cpuinfo_uarch_silvermont:
Marat Dukhan12c8e072017-09-21 15:50:41 -070082 return "Silvermont";
Marat Dukhan547fa362017-03-03 02:47:26 -050083 case cpuinfo_uarch_airmont:
Marat Dukhan12c8e072017-09-21 15:50:41 -070084 return "Airmont";
Marat Dukhan547fa362017-03-03 02:47:26 -050085 case cpuinfo_uarch_knights_ferry:
Marat Dukhan12c8e072017-09-21 15:50:41 -070086 return "Knights Ferry";
Marat Dukhan547fa362017-03-03 02:47:26 -050087 case cpuinfo_uarch_knights_corner:
Marat Dukhan12c8e072017-09-21 15:50:41 -070088 return "Knights Corner";
Marat Dukhan547fa362017-03-03 02:47:26 -050089 case cpuinfo_uarch_knights_landing:
Marat Dukhan12c8e072017-09-21 15:50:41 -070090 return "Knights Landing";
Marat Dukhan547fa362017-03-03 02:47:26 -050091 case cpuinfo_uarch_knights_hill:
Marat Dukhan12c8e072017-09-21 15:50:41 -070092 return "Knights Hill";
Marat Dukhan547fa362017-03-03 02:47:26 -050093 case cpuinfo_uarch_knights_mill:
Marat Dukhan12c8e072017-09-21 15:50:41 -070094 return "Knights Mill";
Marat Dukhan547fa362017-03-03 02:47:26 -050095 case cpuinfo_uarch_k5:
Marat Dukhan12c8e072017-09-21 15:50:41 -070096 return "K5";
Marat Dukhan547fa362017-03-03 02:47:26 -050097 case cpuinfo_uarch_k6:
Marat Dukhan12c8e072017-09-21 15:50:41 -070098 return "K6";
Marat Dukhan547fa362017-03-03 02:47:26 -050099 case cpuinfo_uarch_k7:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700100 return "K7";
Marat Dukhan547fa362017-03-03 02:47:26 -0500101 case cpuinfo_uarch_k8:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700102 return "K8";
Marat Dukhan547fa362017-03-03 02:47:26 -0500103 case cpuinfo_uarch_k10:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700104 return "K10";
Marat Dukhan547fa362017-03-03 02:47:26 -0500105 case cpuinfo_uarch_bulldozer:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700106 return "Bulldozer";
Marat Dukhan547fa362017-03-03 02:47:26 -0500107 case cpuinfo_uarch_piledriver:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700108 return "Piledriver";
Marat Dukhan547fa362017-03-03 02:47:26 -0500109 case cpuinfo_uarch_steamroller:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700110 return "Steamroller";
Marat Dukhan547fa362017-03-03 02:47:26 -0500111 case cpuinfo_uarch_excavator:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700112 return "Excavator";
Marat Dukhan547fa362017-03-03 02:47:26 -0500113 case cpuinfo_uarch_zen:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700114 return "Zen";
Marat Dukhane25187d2017-04-16 05:03:07 -0400115 case cpuinfo_uarch_geode:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700116 return "Geode";
Marat Dukhan547fa362017-03-03 02:47:26 -0500117 case cpuinfo_uarch_bobcat:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700118 return "Bobcat";
Marat Dukhan547fa362017-03-03 02:47:26 -0500119 case cpuinfo_uarch_jaguar:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700120 return "Jaguar/Puma";
Marat Dukhan3c982762017-05-08 06:16:45 +0000121 case cpuinfo_uarch_xscale:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700122 return "XScale";
Marat Dukhan547fa362017-03-03 02:47:26 -0500123 case cpuinfo_uarch_arm7:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700124 return "ARM7";
Marat Dukhan547fa362017-03-03 02:47:26 -0500125 case cpuinfo_uarch_arm9:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700126 return "ARM9";
Marat Dukhan547fa362017-03-03 02:47:26 -0500127 case cpuinfo_uarch_arm11:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700128 return "ARM11";
Marat Dukhan547fa362017-03-03 02:47:26 -0500129 case cpuinfo_uarch_cortex_a5:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700130 return "Cortex-A5";
Marat Dukhan547fa362017-03-03 02:47:26 -0500131 case cpuinfo_uarch_cortex_a7:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700132 return "Cortex-A7";
Marat Dukhan547fa362017-03-03 02:47:26 -0500133 case cpuinfo_uarch_cortex_a8:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700134 return "Cortex-A8";
Marat Dukhan547fa362017-03-03 02:47:26 -0500135 case cpuinfo_uarch_cortex_a9:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700136 return "Cortex-A9";
Marat Dukhan547fa362017-03-03 02:47:26 -0500137 case cpuinfo_uarch_cortex_a12:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700138 return "Cortex-A12";
Marat Dukhan547fa362017-03-03 02:47:26 -0500139 case cpuinfo_uarch_cortex_a15:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700140 return "Cortex-A15";
Marat Dukhan547fa362017-03-03 02:47:26 -0500141 case cpuinfo_uarch_cortex_a17:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700142 return "Cortex-A17";
Marat Dukhan547fa362017-03-03 02:47:26 -0500143 case cpuinfo_uarch_cortex_a32:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700144 return "Cortex-A32";
Marat Dukhan547fa362017-03-03 02:47:26 -0500145 case cpuinfo_uarch_cortex_a35:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700146 return "Cortex-A35";
Marat Dukhan547fa362017-03-03 02:47:26 -0500147 case cpuinfo_uarch_cortex_a53:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700148 return "Cortex-A53";
Marat Dukhan547fa362017-03-03 02:47:26 -0500149 case cpuinfo_uarch_cortex_a57:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700150 return "Cortex-A57";
Marat Dukhan547fa362017-03-03 02:47:26 -0500151 case cpuinfo_uarch_cortex_a72:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700152 return "Cortex-A72";
Marat Dukhan547fa362017-03-03 02:47:26 -0500153 case cpuinfo_uarch_cortex_a73:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700154 return "Cortex-A73";
Marat Dukhan547fa362017-03-03 02:47:26 -0500155 case cpuinfo_uarch_scorpion:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700156 return "Scorpion";
Marat Dukhan547fa362017-03-03 02:47:26 -0500157 case cpuinfo_uarch_krait:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700158 return "Krait";
Marat Dukhan547fa362017-03-03 02:47:26 -0500159 case cpuinfo_uarch_kryo:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700160 return "Kryo";
Marat Dukhan3c982762017-05-08 06:16:45 +0000161 case cpuinfo_uarch_denver:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700162 return "Denver";
Marat Dukhan547fa362017-03-03 02:47:26 -0500163 case cpuinfo_uarch_mongoose:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700164 return "Mongoose";
Marat Dukhan547fa362017-03-03 02:47:26 -0500165 case cpuinfo_uarch_swift:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700166 return "Swift";
Marat Dukhan547fa362017-03-03 02:47:26 -0500167 case cpuinfo_uarch_cyclone:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700168 return "Cyclone";
Marat Dukhan547fa362017-03-03 02:47:26 -0500169 case cpuinfo_uarch_typhoon:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700170 return "Typhoon";
Marat Dukhan547fa362017-03-03 02:47:26 -0500171 case cpuinfo_uarch_twister:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700172 return "Twister";
Marat Dukhan547fa362017-03-03 02:47:26 -0500173 case cpuinfo_uarch_hurricane:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700174 return "Hurricane";
Marat Dukhan92dae312017-05-09 14:10:17 +0000175 case cpuinfo_uarch_thunderx:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700176 return "ThunderX";
Marat Dukhan88718322017-08-24 10:12:20 -0700177 case cpuinfo_uarch_pj4:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700178 return "PJ4";
Marat Dukhan547fa362017-03-03 02:47:26 -0500179 default:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700180 return NULL;
181 }
182}
183
184int main(int argc, char** argv) {
185 cpuinfo_initialize();
186 #ifdef __ANDROID__
Marat Dukhan30401972017-09-26 18:35:52 -0700187 printf("SoC name: %s\n", cpuinfo_get_package(0)->name);
188 printf("GPU name: %s\n", cpuinfo_get_package(0)->gpu_name);
Marat Dukhan12c8e072017-09-21 15:50:41 -0700189 #else
190 printf("Packages:\n");
Marat Dukhan30401972017-09-26 18:35:52 -0700191 for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
192 printf("\t%"PRIu32": %s\n", i, cpuinfo_get_package(i)->name);
Marat Dukhan12c8e072017-09-21 15:50:41 -0700193 }
194 #endif
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700195 printf("Cores:\n");
Marat Dukhan30401972017-09-26 18:35:52 -0700196 for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
197 const struct cpuinfo_core* core = cpuinfo_get_core(i);
198 if (core->processor_count == 1) {
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800199 printf("\t%"PRIu32": 1 processor (%"PRIu32")", i, core->processor_start);
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700200 } else {
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800201 printf("\t%"PRIu32": %"PRIu32" processors (%"PRIu32"-%"PRIu32")",
Marat Dukhan30401972017-09-26 18:35:52 -0700202 i, core->processor_count, core->processor_start, core->processor_start + core->processor_count - 1);
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700203 }
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800204 const char* vendor_string = vendor_to_string(core->vendor);
205 const char* uarch_string = uarch_to_string(core->uarch);
206 if (vendor_string == NULL) {
207 printf(", vendor 0x%08"PRIx32" uarch 0x%08"PRIx32"\n",
208 (uint32_t) core->vendor, (uint32_t) core->uarch);
209 }
210 else if (uarch_string == NULL) {
211 printf(", %s uarch 0x%08"PRIx32"\n",
212 vendor_string, (uint32_t) core->uarch);
213 }
214 else {
215 printf(", %s %s\n", vendor_string, uarch_string);
216 }
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700217 }
Marat Dukhan12c8e072017-09-21 15:50:41 -0700218 printf("Logical processors:\n");
Marat Dukhan30401972017-09-26 18:35:52 -0700219 for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
220 const struct cpuinfo_processor* processor = cpuinfo_get_processor(i);
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800221 #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
222 printf("\t%"PRIu32": APIC ID 0x%08"PRIx32"\n", i, processor->apic_id);
223 #else
224 printf("\t%"PRIu32"\n", i);
225 #endif
Marat Dukhan547fa362017-03-03 02:47:26 -0500226 }
227}