|
@@ -975,7 +975,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "GIC system register CPU interface",
|
|
.desc = "GIC system register CPU interface",
|
|
.capability = ARM64_HAS_SYSREG_GIC_CPUIF,
|
|
.capability = ARM64_HAS_SYSREG_GIC_CPUIF,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_useable_gicv3_cpuif,
|
|
.matches = has_useable_gicv3_cpuif,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.field_pos = ID_AA64PFR0_GIC_SHIFT,
|
|
.field_pos = ID_AA64PFR0_GIC_SHIFT,
|
|
@@ -986,7 +986,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "Privileged Access Never",
|
|
.desc = "Privileged Access Never",
|
|
.capability = ARM64_HAS_PAN,
|
|
.capability = ARM64_HAS_PAN,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cpuid_feature,
|
|
.matches = has_cpuid_feature,
|
|
.sys_reg = SYS_ID_AA64MMFR1_EL1,
|
|
.sys_reg = SYS_ID_AA64MMFR1_EL1,
|
|
.field_pos = ID_AA64MMFR1_PAN_SHIFT,
|
|
.field_pos = ID_AA64MMFR1_PAN_SHIFT,
|
|
@@ -999,7 +999,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "LSE atomic instructions",
|
|
.desc = "LSE atomic instructions",
|
|
.capability = ARM64_HAS_LSE_ATOMICS,
|
|
.capability = ARM64_HAS_LSE_ATOMICS,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cpuid_feature,
|
|
.matches = has_cpuid_feature,
|
|
.sys_reg = SYS_ID_AA64ISAR0_EL1,
|
|
.sys_reg = SYS_ID_AA64ISAR0_EL1,
|
|
.field_pos = ID_AA64ISAR0_ATOMICS_SHIFT,
|
|
.field_pos = ID_AA64ISAR0_ATOMICS_SHIFT,
|
|
@@ -1010,14 +1010,14 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "Software prefetching using PRFM",
|
|
.desc = "Software prefetching using PRFM",
|
|
.capability = ARM64_HAS_NO_HW_PREFETCH,
|
|
.capability = ARM64_HAS_NO_HW_PREFETCH,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_no_hw_prefetch,
|
|
.matches = has_no_hw_prefetch,
|
|
},
|
|
},
|
|
#ifdef CONFIG_ARM64_UAO
|
|
#ifdef CONFIG_ARM64_UAO
|
|
{
|
|
{
|
|
.desc = "User Access Override",
|
|
.desc = "User Access Override",
|
|
.capability = ARM64_HAS_UAO,
|
|
.capability = ARM64_HAS_UAO,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cpuid_feature,
|
|
.matches = has_cpuid_feature,
|
|
.sys_reg = SYS_ID_AA64MMFR2_EL1,
|
|
.sys_reg = SYS_ID_AA64MMFR2_EL1,
|
|
.field_pos = ID_AA64MMFR2_UAO_SHIFT,
|
|
.field_pos = ID_AA64MMFR2_UAO_SHIFT,
|
|
@@ -1031,21 +1031,21 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
#ifdef CONFIG_ARM64_PAN
|
|
#ifdef CONFIG_ARM64_PAN
|
|
{
|
|
{
|
|
.capability = ARM64_ALT_PAN_NOT_UAO,
|
|
.capability = ARM64_ALT_PAN_NOT_UAO,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = cpufeature_pan_not_uao,
|
|
.matches = cpufeature_pan_not_uao,
|
|
},
|
|
},
|
|
#endif /* CONFIG_ARM64_PAN */
|
|
#endif /* CONFIG_ARM64_PAN */
|
|
{
|
|
{
|
|
.desc = "Virtualization Host Extensions",
|
|
.desc = "Virtualization Host Extensions",
|
|
.capability = ARM64_HAS_VIRT_HOST_EXTN,
|
|
.capability = ARM64_HAS_VIRT_HOST_EXTN,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = runs_at_el2,
|
|
.matches = runs_at_el2,
|
|
.cpu_enable = cpu_copy_el2regs,
|
|
.cpu_enable = cpu_copy_el2regs,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
.desc = "32-bit EL0 Support",
|
|
.desc = "32-bit EL0 Support",
|
|
.capability = ARM64_HAS_32BIT_EL0,
|
|
.capability = ARM64_HAS_32BIT_EL0,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cpuid_feature,
|
|
.matches = has_cpuid_feature,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.sign = FTR_UNSIGNED,
|
|
.sign = FTR_UNSIGNED,
|
|
@@ -1055,14 +1055,14 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "Reduced HYP mapping offset",
|
|
.desc = "Reduced HYP mapping offset",
|
|
.capability = ARM64_HYP_OFFSET_LOW,
|
|
.capability = ARM64_HYP_OFFSET_LOW,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = hyp_offset_low,
|
|
.matches = hyp_offset_low,
|
|
},
|
|
},
|
|
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
|
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
|
{
|
|
{
|
|
.desc = "Kernel page table isolation (KPTI)",
|
|
.desc = "Kernel page table isolation (KPTI)",
|
|
.capability = ARM64_UNMAP_KERNEL_AT_EL0,
|
|
.capability = ARM64_UNMAP_KERNEL_AT_EL0,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = unmap_kernel_at_el0,
|
|
.matches = unmap_kernel_at_el0,
|
|
.cpu_enable = kpti_install_ng_mappings,
|
|
.cpu_enable = kpti_install_ng_mappings,
|
|
},
|
|
},
|
|
@@ -1070,7 +1070,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
/* FP/SIMD is not implemented */
|
|
/* FP/SIMD is not implemented */
|
|
.capability = ARM64_HAS_NO_FPSIMD,
|
|
.capability = ARM64_HAS_NO_FPSIMD,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.min_field_value = 0,
|
|
.min_field_value = 0,
|
|
.matches = has_no_fpsimd,
|
|
.matches = has_no_fpsimd,
|
|
},
|
|
},
|
|
@@ -1078,7 +1078,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "Data cache clean to Point of Persistence",
|
|
.desc = "Data cache clean to Point of Persistence",
|
|
.capability = ARM64_HAS_DCPOP,
|
|
.capability = ARM64_HAS_DCPOP,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cpuid_feature,
|
|
.matches = has_cpuid_feature,
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
.sys_reg = SYS_ID_AA64ISAR1_EL1,
|
|
.field_pos = ID_AA64ISAR1_DPB_SHIFT,
|
|
.field_pos = ID_AA64ISAR1_DPB_SHIFT,
|
|
@@ -1088,7 +1088,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
#ifdef CONFIG_ARM64_SVE
|
|
#ifdef CONFIG_ARM64_SVE
|
|
{
|
|
{
|
|
.desc = "Scalable Vector Extension",
|
|
.desc = "Scalable Vector Extension",
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.capability = ARM64_SVE,
|
|
.capability = ARM64_SVE,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.sign = FTR_UNSIGNED,
|
|
.sign = FTR_UNSIGNED,
|
|
@@ -1102,7 +1102,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "RAS Extension Support",
|
|
.desc = "RAS Extension Support",
|
|
.capability = ARM64_HAS_RAS_EXTN,
|
|
.capability = ARM64_HAS_RAS_EXTN,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cpuid_feature,
|
|
.matches = has_cpuid_feature,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.sys_reg = SYS_ID_AA64PFR0_EL1,
|
|
.sign = FTR_UNSIGNED,
|
|
.sign = FTR_UNSIGNED,
|
|
@@ -1114,13 +1114,13 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "Data cache clean to the PoU not required for I/D coherence",
|
|
.desc = "Data cache clean to the PoU not required for I/D coherence",
|
|
.capability = ARM64_HAS_CACHE_IDC,
|
|
.capability = ARM64_HAS_CACHE_IDC,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cache_idc,
|
|
.matches = has_cache_idc,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
.desc = "Instruction cache invalidation not required for I/D coherence",
|
|
.desc = "Instruction cache invalidation not required for I/D coherence",
|
|
.capability = ARM64_HAS_CACHE_DIC,
|
|
.capability = ARM64_HAS_CACHE_DIC,
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM,
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
|
.matches = has_cache_dic,
|
|
.matches = has_cache_dic,
|
|
},
|
|
},
|
|
{},
|
|
{},
|
|
@@ -1129,7 +1129,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
#define HWCAP_CAP(reg, field, s, min_value, cap_type, cap) \
|
|
#define HWCAP_CAP(reg, field, s, min_value, cap_type, cap) \
|
|
{ \
|
|
{ \
|
|
.desc = #cap, \
|
|
.desc = #cap, \
|
|
- .type = ARM64_CPUCAP_SCOPE_SYSTEM, \
|
|
|
|
|
|
+ .type = ARM64_CPUCAP_SYSTEM_FEATURE, \
|
|
.matches = has_cpuid_feature, \
|
|
.matches = has_cpuid_feature, \
|
|
.sys_reg = reg, \
|
|
.sys_reg = reg, \
|
|
.field_pos = field, \
|
|
.field_pos = field, \
|