static const struct arm64_ftr_bits ftr_id_aa64isar1[] = {
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_SB_SHIFT, 4, 0),
+       ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH),
+                      FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_GPI_SHIFT, 4, 0),
+       ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH),
+                      FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_GPA_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_LRCPC_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_FCMA_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_JSCVT_SHIFT, 4, 0),
+       ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH),
+                      FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_API_SHIFT, 4, 0),
+       ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH),
+                      FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_APA_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_DPB_SHIFT, 4, 0),
        ARM64_FTR_END,
 };
 }
 #endif /* CONFIG_ARM64_RAS_EXTN */
 
+#ifdef CONFIG_ARM64_PTR_AUTH
+static bool has_address_auth(const struct arm64_cpu_capabilities *entry,
+                            int __unused)
+{
+       u64 isar1 = read_sanitised_ftr_reg(SYS_ID_AA64ISAR1_EL1);
+       bool api, apa;
+
+       apa = cpuid_feature_extract_unsigned_field(isar1,
+                                       ID_AA64ISAR1_APA_SHIFT) > 0;
+       api = cpuid_feature_extract_unsigned_field(isar1,
+                                       ID_AA64ISAR1_API_SHIFT) > 0;
+
+       return apa || api;
+}
+
+static bool has_generic_auth(const struct arm64_cpu_capabilities *entry,
+                            int __unused)
+{
+       u64 isar1 = read_sanitised_ftr_reg(SYS_ID_AA64ISAR1_EL1);
+       bool gpi, gpa;
+
+       gpa = cpuid_feature_extract_unsigned_field(isar1,
+                                       ID_AA64ISAR1_GPA_SHIFT) > 0;
+       gpi = cpuid_feature_extract_unsigned_field(isar1,
+                                       ID_AA64ISAR1_GPI_SHIFT) > 0;
+
+       return gpa || gpi;
+}
+#endif /* CONFIG_ARM64_PTR_AUTH */
+
 static const struct arm64_cpu_capabilities arm64_features[] = {
        {
                .desc = "GIC system register CPU interface",
                .sign = FTR_UNSIGNED,
                .min_field_value = 1,
        },
+#ifdef CONFIG_ARM64_PTR_AUTH
+       {
+               .desc = "Address authentication (architected algorithm)",
+               .capability = ARM64_HAS_ADDRESS_AUTH_ARCH,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .sys_reg = SYS_ID_AA64ISAR1_EL1,
+               .sign = FTR_UNSIGNED,
+               .field_pos = ID_AA64ISAR1_APA_SHIFT,
+               .min_field_value = ID_AA64ISAR1_APA_ARCHITECTED,
+               .matches = has_cpuid_feature,
+       },
+       {
+               .desc = "Address authentication (IMP DEF algorithm)",
+               .capability = ARM64_HAS_ADDRESS_AUTH_IMP_DEF,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .sys_reg = SYS_ID_AA64ISAR1_EL1,
+               .sign = FTR_UNSIGNED,
+               .field_pos = ID_AA64ISAR1_API_SHIFT,
+               .min_field_value = ID_AA64ISAR1_API_IMP_DEF,
+               .matches = has_cpuid_feature,
+       },
+       {
+               .capability = ARM64_HAS_ADDRESS_AUTH,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .matches = has_address_auth,
+       },
+       {
+               .desc = "Generic authentication (architected algorithm)",
+               .capability = ARM64_HAS_GENERIC_AUTH_ARCH,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .sys_reg = SYS_ID_AA64ISAR1_EL1,
+               .sign = FTR_UNSIGNED,
+               .field_pos = ID_AA64ISAR1_GPA_SHIFT,
+               .min_field_value = ID_AA64ISAR1_GPA_ARCHITECTED,
+               .matches = has_cpuid_feature,
+       },
+       {
+               .desc = "Generic authentication (IMP DEF algorithm)",
+               .capability = ARM64_HAS_GENERIC_AUTH_IMP_DEF,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .sys_reg = SYS_ID_AA64ISAR1_EL1,
+               .sign = FTR_UNSIGNED,
+               .field_pos = ID_AA64ISAR1_GPI_SHIFT,
+               .min_field_value = ID_AA64ISAR1_GPI_IMP_DEF,
+               .matches = has_cpuid_feature,
+       },
+       {
+               .capability = ARM64_HAS_GENERIC_AUTH,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .matches = has_generic_auth,
+       },
+#endif /* CONFIG_ARM64_PTR_AUTH */
        {},
 };