• Ryan Roberts's avatar
    arm64/mm: Update tlb invalidation routines for FEAT_LPA2 · c910f2b6
    Ryan Roberts authored
    FEAT_LPA2 impacts tlb invalidation in 2 ways; Firstly, the TTL field in
    the non-range tlbi instructions can now validly take a 0 value as a
    level hint for the 4KB granule (this is due to the extra level of
    translation) - previously TTL=0b0100 meant no hint and was treated as
    0b0000. Secondly, The BADDR field of the range-based tlbi instructions
    is specified in 64KB units when LPA2 is in use (TCR.DS=1), whereas it is
    in page units otherwise. Changes are required for tlbi to continue to
    operate correctly when LPA2 is in use.
    
    Solve the first problem by always adding the level hint if the level is
    between [0, 3] (previously anything other than 0 was hinted, which
    breaks in the new level -1 case from kvm). When running on non-LPA2 HW,
    0 is still safe to hint as the HW will fall back to non-hinted. While we
    are at it, we replace the notion of 0 being the non-hinted sentinel with
    a macro, TLBI_TTL_UNKNOWN. This means callers won't need updating
    if/when translation depth increases in future.
    
    The second issue is more complex: When LPA2 is in use, use the non-range
    tlbi instructions to forward align to a 64KB boundary first, then use
    range-based tlbi from there on, until we have either invalidated all
    pages or we have a single page remaining. If the latter, that is done
    with non-range tlbi. We determine whether LPA2 is in use based on
    lpa2_is_enabled() (for kernel calls) or kvm_lpa2_is_enabled() (for kvm
    calls).
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Reviewed-by: default avatarOliver Upton <oliver.upton@linux.dev>
    Signed-off-by: default avatarRyan Roberts <ryan.roberts@arm.com>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20231127111737.1897081-4-ryan.roberts@arm.com
    c910f2b6
tlbflush.h 15.8 KB