• Stephen Boyd's avatar
    ARM: 8197/1: vfp: Fix VFPv3 hwcap detection on CPUID based cpus · 6c96a4a6
    Stephen Boyd authored
    The subarchitecture field in the fpsid register is 7 bits wide on
    ARM CPUs using the CPUID identification scheme, spanning bits 22
    to 16. The topmost bit is used to designate that the
    subarchitecture designer is not ARM when it is set to 1. On
    non-CPUID scheme CPUs the subarchitecture field is only 4 bits
    wide and the higher bits are used to indicate no double precision
    support (bit 20) and the FTSMX/FLDMX format (bits 21-22).
    
    The VFP support code only looks at bits 19-16 to determine the
    VFP version. On Qualcomm's processors (Krait and Scorpion) we
    should see that we have HWCAP_VFPv3 but we don't because bit 22
    is set to 1 to indicate that the subarchitecture is not
    implemented by ARM and the rest of the bits are left as 0 because
    this is the first subarchitecture that Qualcomm has designed.
    Unfortunately we can't just widen the FPSID subarchitecture
    bitmask to consider all the bits on a CPUID scheme because there
    may be CPUs without the CPUID scheme that have VFP without double
    precision support and then the version would be a very wrong and
    large number. Instead, update the version detection logic to
    consider if the CPU is using the CPUID scheme.
    
    If the CPU is using CPUID scheme, use the MVFR registers to
    determine what version of VFP is supported. We already do this
    for VFPv4, so do something similar for VFPv3 and look for single
    or double precision support in MVFR0. Otherwise fall back to
    using FPSID to detect VFP support on non-CPUID scheme CPUs. We
    know that VFPv3 is only present in CPUs that have support for the
    CPUID scheme so this should be equivalent.
    Tested-by: default avatarRob Clark <robdclark@gmail.com>
    Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    6c96a4a6
vfpmodule.c 20.6 KB