aboutsummaryrefslogtreecommitdiff
path: root/src/arm/uarch.c
diff options
context:
space:
mode:
authorMarat Dukhan <marat@fb.com>2017-08-09 13:49:39 -0700
committerMarat Dukhan <marat@fb.com>2017-08-09 13:49:39 -0700
commita8fb3dd0aa41013e8ec5c93900a1c81e26ef6552 (patch)
tree79de3423eb2c5c76bae4ba04c8f3f7e4973dd8ea /src/arm/uarch.c
parent43576d6ca7c58e9931d068c2e5f878611f55eb2b (diff)
downloadcpuinfo-a8fb3dd0aa41013e8ec5c93900a1c81e26ef6552.tar.gz
Detect big.LITTLE ARM systems
Diffstat (limited to 'src/arm/uarch.c')
-rw-r--r--src/arm/uarch.c53
1 files changed, 31 insertions, 22 deletions
diff --git a/src/arm/uarch.c b/src/arm/uarch.c
index e565f1f..28dbece 100644
--- a/src/arm/uarch.c
+++ b/src/arm/uarch.c
@@ -1,22 +1,22 @@
#include <stdint.h>
#include <arm/api.h>
+#include <arm/midr.h>
#include <log.h>
void cpuinfo_arm_decode_vendor_uarch(
- uint32_t cpu_implementer,
- uint32_t cpu_part,
+ uint32_t midr,
#if CPUINFO_ARCH_ARM
bool has_vfpv4,
#endif /* CPUINFO_ARCH_ARM */
enum cpuinfo_vendor vendor[restrict static 1],
enum cpuinfo_uarch uarch[restrict static 1])
{
- switch (cpu_implementer) {
+ switch (midr_get_implementer(midr)) {
case 'A':
*vendor = cpuinfo_vendor_arm;
- switch (cpu_part) {
+ switch (midr_get_part(midr)) {
#if CPUINFO_ARCH_ARM
case 0xC05:
*uarch = cpuinfo_uarch_cortex_a5;
@@ -49,6 +49,9 @@ void cpuinfo_arm_decode_vendor_uarch(
case 0xD04:
*uarch = cpuinfo_uarch_cortex_a35;
break;
+ case 0xD05:
+ *uarch = cpuinfo_uarch_cortex_a55;
+ break;
case 0xD07:
*uarch = cpuinfo_uarch_cortex_a57;
break;
@@ -58,8 +61,12 @@ void cpuinfo_arm_decode_vendor_uarch(
case 0xD09:
*uarch = cpuinfo_uarch_cortex_a73;
break;
+ case 0xD0A:
+ *uarch = cpuinfo_uarch_cortex_a75;
+ break;
default:
- switch (cpu_part >> 8) {
+ switch (midr_get_part(midr) >> 8) {
+#if CPUINFO_ARCH_ARM
case 7:
*uarch = cpuinfo_uarch_arm7;
break;
@@ -69,38 +76,39 @@ void cpuinfo_arm_decode_vendor_uarch(
case 11:
*uarch = cpuinfo_uarch_arm11;
break;
+#endif /* CPUINFO_ARCH_ARM */
default:
- cpuinfo_log_warning("unknown ARM CPU part 0x%03"PRIx32" ignored", cpu_part);
+ cpuinfo_log_warning("unknown ARM CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
}
}
break;
case 'C':
*vendor = cpuinfo_vendor_cavium;
- switch (cpu_part) {
+ switch (midr_get_part(midr)) {
case 0x0A1:
*uarch = cpuinfo_uarch_thunderx;
break;
default:
- cpuinfo_log_warning("unknown Cavium CPU part 0x%03"PRIx32" ignored", cpu_part);
+ cpuinfo_log_warning("unknown Cavium CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
}
break;
#if CPUINFO_ARCH_ARM
case 'i':
*vendor = cpuinfo_vendor_intel;
- switch (cpu_part >> 8) {
+ switch (midr_get_part(midr_get_part(midr)) >> 8) {
case 2: /* PXA 210/25X/26X */
case 4: /* PXA 27X */
case 6: /* PXA 3XX */
*uarch = cpuinfo_uarch_xscale;
break;
default:
- cpuinfo_log_warning("unknown Intel CPU part 0x%03"PRIx32" ignored", cpu_part);
+ cpuinfo_log_warning("unknown Intel CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
}
break;
#endif /* CPUINFO_ARCH_ARM */
case 'N':
*vendor = cpuinfo_vendor_nvidia;
- switch (cpu_part) {
+ switch (midr_get_part(midr)) {
case 0x000:
*uarch = cpuinfo_uarch_denver;
break;
@@ -113,12 +121,12 @@ void cpuinfo_arm_decode_vendor_uarch(
*uarch = cpuinfo_uarch_denver;
break;
default:
- cpuinfo_log_warning("unknown nVidia CPU part 0x%03"PRIx32" ignored", cpu_part);
+ cpuinfo_log_warning("unknown nVidia CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
}
break;
case 'Q':
*vendor = cpuinfo_vendor_qualcomm;
- switch (cpu_part) {
+ switch (midr_get_part(midr)) {
#if CPUINFO_ARCH_ARM
case 0x00F:
/* Mostly Scorpions, but some Cortex A5 may report this value as well */
@@ -138,40 +146,41 @@ void cpuinfo_arm_decode_vendor_uarch(
*uarch = cpuinfo_uarch_krait;
break;
#endif /* CPUINFO_ARCH_ARM */
- case 0x205: /* Low-power Kryo "Silver" */
- case 0x211: /* High-performance Kryo "Gold" */
+ case 0x201: /* Qualcomm Snapdragon 821: Low-power Kryo "Silver" */
+ case 0x205: /* Qualcomm Snapdragon 820 & 821: High-performance Kryo "Gold" */
+ case 0x211: /* Qualcomm Snapdragon 820: Low-power Kryo "Silver" */
*uarch = cpuinfo_uarch_kryo;
break;
- case 0x800: /* Low-power Kryo 280 -> Cortex-A53 */
+ case 0x800: /* Low-power Kryo 280 "Silver" -> Cortex-A53 */
*vendor = cpuinfo_vendor_arm;
*uarch = cpuinfo_uarch_cortex_a53;
break;
- case 0x801: /* High-performance Kryo 280 -> Cortex-A73 */
+ case 0x801: /* High-performance Kryo 280 "Gold" -> Cortex-A73 */
*vendor = cpuinfo_vendor_arm;
*uarch = cpuinfo_uarch_cortex_a73;
break;
default:
- cpuinfo_log_warning("unknown Qualcomm CPU part 0x%03"PRIx32" ignored", cpu_part);
+ cpuinfo_log_warning("unknown Qualcomm CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
}
break;
case 'S':
*vendor = cpuinfo_vendor_samsung;
- switch (cpu_part) {
+ switch (midr_get_part(midr)) {
case 0x001:
*uarch = cpuinfo_uarch_mongoose;
break;
default:
- cpuinfo_log_warning("unknown Samsung CPU part 0x%03"PRIx32" ignored", cpu_part);
+ cpuinfo_log_warning("unknown Samsung CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
}
break;
#if CPUINFO_ARCH_ARM
case 'V':
*vendor = cpuinfo_vendor_marvell;
- cpuinfo_log_warning("unknown Marvell CPU part 0x%03"PRIx32" ignored", cpu_part);
+ cpuinfo_log_warning("unknown Marvell CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
break;
#endif /* CPUINFO_ARCH_ARM */
default:
cpuinfo_log_warning("unknown CPU implementer '%c' (0x%02"PRIx32") with CPU part 0x%03"PRIx32" ignored",
- (char) cpu_implementer, cpu_implementer, cpu_part);
+ (char) midr_get_implementer(midr), midr_get_implementer(midr), midr_get_part(midr));
}
}