@@ -223,6 +223,11 @@ static inline unsigned int __attribute_const__ read_cpuid_implementor(void)
return (read_cpuid_id() & 0xFF000000) >> 24;
}
+static inline unsigned int __attribute_const__ read_cpuid_variant(void)
+{
+ return read_cpuid_id() & 0x00f00000;
+}
+
static inline unsigned int __attribute_const__ read_cpuid_revision(void)
{
return read_cpuid_id() & 0x0000000f;
@@ -501,6 +501,16 @@ static void __init elf_hwcap_fixup(void)
return;
}
+ /*
+ * HWCAP2_AES can get the wrong result due to A57's erratum #1742098 or
+ * A72's #1655431. A57 r0p0 is not affected.
+ */
+ if ((read_cpuid_part() == ARM_CPU_PART_CORTEX_A57 &&
+ read_cpuid_variant() != 0 && read_cpuid_revision() != 0) ||
+ read_cpuid_part() == ARM_CPU_PART_CORTEX_A72) {
+ elf_hwcap2 &= ~HWCAP2_AES;
+ }
+
/* Verify if CPUID scheme is implemented */
if ((id & 0x000f0000) != 0x000f0000)
return;