• Ard Biesheuvel's avatar
    arm64: Enable LPA2 at boot if supported by the system · 9684ec18
    Ard Biesheuvel authored
    Update the early kernel mapping code to take 52-bit virtual addressing
    into account based on the LPA2 feature. This is a bit more involved than
    LVA (which is supported with 64k pages only), given that some page table
    descriptor bits change meaning in this case.
    
    To keep the handling in asm to a minimum, the initial ID map is still
    created with 48-bit virtual addressing, which implies that the kernel
    image must be loaded into 48-bit addressable physical memory. This is
    currently required by the boot protocol, even though we happen to
    support placement outside of that for LVA/64k based configurations.
    
    Enabling LPA2 involves more than setting TCR.T1SZ to a lower value,
    there is also a DS bit in TCR that needs to be set, and which changes
    the meaning of bits [9:8] in all page table descriptors. Since we cannot
    enable DS and every live page table descriptor at the same time, let's
    pivot through another temporary mapping. This avoids the need to
    reintroduce manipulations of the page tables with the MMU and caches
    disabled.
    
    To permit the LPA2 feature to be overridden on the kernel command line,
    which may be necessary to work around silicon errata, or to deal with
    mismatched features on heterogeneous SoC designs, test for CPU feature
    overrides first, and only then enable LPA2.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Link: https://lore.kernel.org/r/20240214122845.2033971-78-ardb+git@google.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    9684ec18
memory.h 14.2 KB