arm64: Move FP/ASIMD hwcap handling to common code
The FP/ASIMD is detected in fpsimd_init(), which is built-in unconditionally. Lets move the hwcap handling to the central place. Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> Tested-by: Dave Martin <Dave.Martin@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
Родитель
37b01d53ce
Коммит
fe80f9f2da
|
@ -646,6 +646,8 @@ static const struct arm64_cpu_capabilities arm64_hwcaps[] = {
|
||||||
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA2_SHIFT, 1, CAP_HWCAP, HWCAP_SHA2),
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_SHA2_SHIFT, 1, CAP_HWCAP, HWCAP_SHA2),
|
||||||
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_CRC32_SHIFT, 1, CAP_HWCAP, HWCAP_CRC32),
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_CRC32_SHIFT, 1, CAP_HWCAP, HWCAP_CRC32),
|
||||||
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_ATOMICS_SHIFT, 2, CAP_HWCAP, HWCAP_ATOMICS),
|
HWCAP_CAP(SYS_ID_AA64ISAR0_EL1, ID_AA64ISAR0_ATOMICS_SHIFT, 2, CAP_HWCAP, HWCAP_ATOMICS),
|
||||||
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, 0, CAP_HWCAP, HWCAP_FP),
|
||||||
|
HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, 0, CAP_HWCAP, HWCAP_ASIMD),
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL),
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL),
|
||||||
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES),
|
HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES),
|
||||||
|
|
|
@ -332,21 +332,15 @@ static inline void fpsimd_hotplug_init(void) { }
|
||||||
*/
|
*/
|
||||||
static int __init fpsimd_init(void)
|
static int __init fpsimd_init(void)
|
||||||
{
|
{
|
||||||
u64 pfr = read_cpuid(ID_AA64PFR0_EL1);
|
if (elf_hwcap & HWCAP_FP) {
|
||||||
|
|
||||||
if (pfr & (0xf << 16)) {
|
|
||||||
pr_notice("Floating-point is not implemented\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
elf_hwcap |= HWCAP_FP;
|
|
||||||
|
|
||||||
if (pfr & (0xf << 20))
|
|
||||||
pr_notice("Advanced SIMD is not implemented\n");
|
|
||||||
else
|
|
||||||
elf_hwcap |= HWCAP_ASIMD;
|
|
||||||
|
|
||||||
fpsimd_pm_init();
|
fpsimd_pm_init();
|
||||||
fpsimd_hotplug_init();
|
fpsimd_hotplug_init();
|
||||||
|
} else {
|
||||||
|
pr_notice("Floating-point is not implemented\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(elf_hwcap & HWCAP_ASIMD))
|
||||||
|
pr_notice("Advanced SIMD is not implemented\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче