blob: 016a785699c8d5d32cc3cf1ed65387dd68bb7639 [file] [log] [blame]
Marat Dukhan5d676522020-06-01 13:29:15 -07001diff --git include/cpuinfo.h include/cpuinfo.h
Marat Dukhan4e6f9582020-06-09 03:20:42 -07002index 6c67c34..85ce174 100644
Marat Dukhan5d676522020-06-01 13:29:15 -07003--- include/cpuinfo.h
4+++ include/cpuinfo.h
Marat Dukhan4e6f9582020-06-09 03:20:42 -07005@@ -417,6 +417,8 @@ enum cpuinfo_uarch {
Marat Dukhan5d676522020-06-01 13:29:15 -07006 cpuinfo_uarch_cortex_a76 = 0x00300376,
Marat Dukhan5d676522020-06-01 13:29:15 -07007 /** ARM Cortex-A77. */
8 cpuinfo_uarch_cortex_a77 = 0x00300377,
Marat Dukhan4e6f9582020-06-09 03:20:42 -07009+ /** ARM Cortex-A78. */
10+ cpuinfo_uarch_cortex_a78 = 0x00300378,
Marat Dukhan5d676522020-06-01 13:29:15 -070011
Marat Dukhan4e6f9582020-06-09 03:20:42 -070012 /** ARM Neoverse N1. */
13 cpuinfo_uarch_neoverse_n1 = 0x00300400,
14@@ -1434,6 +1436,7 @@ static inline bool cpuinfo_has_x86_sha(void) {
15 bool armv6k;
16 bool armv7;
17 bool armv7mp;
18+ bool armv8;
19 bool idiv;
Marat Dukhan5d676522020-06-01 13:29:15 -070020
Marat Dukhan4e6f9582020-06-09 03:20:42 -070021 bool vfpv2;
22@@ -1521,6 +1524,16 @@ static inline bool cpuinfo_has_arm_v7mp(void) {
23 #endif
24 }
Marat Dukhan5d676522020-06-01 13:29:15 -070025
Marat Dukhan4e6f9582020-06-09 03:20:42 -070026+static inline bool cpuinfo_has_arm_v8(void) {
27+ #if CPUINFO_ARCH_ARM64
28+ return true;
29+ #elif CPUINFO_ARCH_ARM
30+ return cpuinfo_isa.armv8;
31+ #else
32+ return false;
33+ #endif
34+}
35+
36 static inline bool cpuinfo_has_arm_idiv(void) {
37 #if CPUINFO_ARCH_ARM64
38 return true;
39@@ -1645,6 +1658,16 @@ static inline bool cpuinfo_has_arm_neon_fma(void) {
40 #endif
41 }
Marat Dukhan5d676522020-06-01 13:29:15 -070042
Marat Dukhan4e6f9582020-06-09 03:20:42 -070043+static inline bool cpuinfo_has_arm_neon_v8(void) {
44+ #if CPUINFO_ARCH_ARM64
45+ return true;
46+ #elif CPUINFO_ARCH_ARM
47+ return cpuinfo_isa.neon && cpuinfo_isa.armv8;
48+ #else
49+ return false;
50+ #endif
51+}
52+
53 static inline bool cpuinfo_has_arm_atomics(void) {
54 #if CPUINFO_ARCH_ARM64
55 return cpuinfo_isa.atomics;
56diff --git src/arm/linux/aarch32-isa.c src/arm/linux/aarch32-isa.c
57index 64dd168..41f9972 100644
58--- src/arm/linux/aarch32-isa.c
59+++ src/arm/linux/aarch32-isa.c
60@@ -43,6 +43,7 @@ void cpuinfo_arm_linux_decode_isa_from_proc_cpuinfo(
61 isa->armv6k = true;
62 isa->armv7 = true;
63 isa->armv7mp = true;
64+ isa->armv8 = true;
65 isa->thumb = true;
66 isa->thumb2 = true;
67 isa->idiv = true;
Marat Dukhan5d676522020-06-01 13:29:15 -070068diff --git src/arm/mach/init.c src/arm/mach/init.c
Marat Dukhan4e6f9582020-06-09 03:20:42 -070069index 058cfc2..e912de6 100644
Marat Dukhan5d676522020-06-01 13:29:15 -070070--- src/arm/mach/init.c
71+++ src/arm/mach/init.c
Marat Dukhan4e6f9582020-06-09 03:20:42 -070072@@ -307,6 +307,7 @@ void cpuinfo_arm_mach_init(void) {
73 case CPU_TYPE_ARM:
74 switch (cpu_subtype) {
75 case CPU_SUBTYPE_ARM_V8:
76+ cpuinfo_isa.armv8 = true;
77 cpuinfo_isa.aes = true;
78 cpuinfo_isa.sha1 = true;
79 cpuinfo_isa.sha2 = true;
Marat Dukhan5d676522020-06-01 13:29:15 -070080diff --git src/arm/midr.h src/arm/midr.h
Marat Dukhan4e6f9582020-06-09 03:20:42 -070081index 34d7780..2638517 100644
Marat Dukhan5d676522020-06-01 13:29:15 -070082--- src/arm/midr.h
83+++ src/arm/midr.h
Marat Dukhan4e6f9582020-06-09 03:20:42 -070084@@ -183,6 +183,7 @@ inline static uint32_t midr_score_core(uint32_t midr) {
85 case UINT32_C(0x51008000): /* Kryo 260 / 280 Gold */
86 case UINT32_C(0x51002050): /* Kryo Gold */
87 case UINT32_C(0x4800D400): /* Cortex-A76 (HiSilicon) */
88+ case UINT32_C(0x4100D410): /* Cortex-A78 */
89 case UINT32_C(0x4100D0D0): /* Cortex-A77 */
90 case UINT32_C(0x4100D0E0): /* Cortex-A76AE */
91 case UINT32_C(0x4100D0B0): /* Cortex-A76 */
Marat Dukhan5d676522020-06-01 13:29:15 -070092diff --git src/arm/uarch.c src/arm/uarch.c
Marat Dukhan4e6f9582020-06-09 03:20:42 -070093index 55b61df..0d7a7d7 100644
Marat Dukhan5d676522020-06-01 13:29:15 -070094--- src/arm/uarch.c
95+++ src/arm/uarch.c
Marat Dukhan4e6f9582020-06-09 03:20:42 -070096@@ -91,6 +91,9 @@ void cpuinfo_arm_decode_vendor_uarch(
97 case 0xD0E: /* Cortex-A76AE */
98 *uarch = cpuinfo_uarch_cortex_a76;
Marat Dukhan5d676522020-06-01 13:29:15 -070099 break;
Marat Dukhan4e6f9582020-06-09 03:20:42 -0700100+ case 0xD41: /* Cortex-A78 */
101+ *uarch = cpuinfo_uarch_cortex_a78;
102+ break;
Marat Dukhan5d676522020-06-01 13:29:15 -0700103 #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
104 case 0xD4A:
Marat Dukhan4e6f9582020-06-09 03:20:42 -0700105 *uarch = cpuinfo_uarch_neoverse_e1;
Marat Dukhan5d676522020-06-01 13:29:15 -0700106diff --git tools/cpu-info.c tools/cpu-info.c
Marat Dukhan4e6f9582020-06-09 03:20:42 -0700107index 2759068..429bbfa 100644
Marat Dukhan5d676522020-06-01 13:29:15 -0700108--- tools/cpu-info.c
109+++ tools/cpu-info.c
Marat Dukhan4e6f9582020-06-09 03:20:42 -0700110@@ -183,6 +183,8 @@ static const char* uarch_to_string(enum cpuinfo_uarch uarch) {
Marat Dukhan5d676522020-06-01 13:29:15 -0700111 return "Cortex-A76";
Marat Dukhan5d676522020-06-01 13:29:15 -0700112 case cpuinfo_uarch_cortex_a77:
113 return "Cortex-A77";
Marat Dukhan4e6f9582020-06-09 03:20:42 -0700114+ case cpuinfo_uarch_cortex_a78:
115+ return "Cortex-A78";
Marat Dukhan5d676522020-06-01 13:29:15 -0700116 case cpuinfo_uarch_scorpion:
Marat Dukhan4e6f9582020-06-09 03:20:42 -0700117 return "Scorpion";
118 case cpuinfo_uarch_krait:
119diff --git tools/isa-info.c tools/isa-info.c
120index 98ef919..8365846 100644
121--- tools/isa-info.c
122+++ tools/isa-info.c
123@@ -121,6 +121,7 @@ int main(int argc, char** argv) {
124 printf("\tARMv6-K: %s\n", cpuinfo_has_arm_v6k() ? "yes" : "no");
125 printf("\tARMv7: %s\n", cpuinfo_has_arm_v7() ? "yes" : "no");
126 printf("\tARMv7 MP: %s\n", cpuinfo_has_arm_v7mp() ? "yes" : "no");
127+ printf("\tARMv8: %s\n", cpuinfo_has_arm_v8() ? "yes" : "no");
128 printf("\tIDIV: %s\n", cpuinfo_has_arm_idiv() ? "yes" : "no");
129
130 printf("Floating-Point support:\n");