Message ID | 1615355590-21102-1-git-send-email-anshuman.khandual@arm.com |
---|---|
State | New |
Headers | show |
Series | [V2] arm64/mm: Fix __enable_mmu() for new TGRAN range values | expand |
On Wed, 10 Mar 2021 11:23:10 +0530, Anshuman Khandual wrote: > As per ARM ARM DDI 0487G.a, when FEAT_LPA2 is implemented, ID_AA64MMFR0_EL1 > might contain a range of values to describe supported translation granules > (4K and 16K pages sizes in particular) instead of just enabled or disabled > values. This changes __enable_mmu() function to handle complete acceptable > range of values (depending on whether the field is signed or unsigned) now > represented with ID_AA64MMFR0_TGRAN_SUPPORTED_[MIN..MAX] pair. While here, > also fix similar situations in EFI stub and KVM as well. Applied to arm64 (for-next/fixes), thanks! [1/1] arm64/mm: Fix __enable_mmu() for new TGRAN range values https://git.kernel.org/arm64/c/26f55386f964 Cheers, -- Will https://fixes.arm64.dev https://next.arm64.dev https://will.arm64.dev
On 2021-03-10 11:23, Anshuman Khandual wrote: > From: James Morse <james.morse@arm.com> > > As per ARM ARM DDI 0487G.a, when FEAT_LPA2 is implemented, ID_AA64MMFR0_EL1 > might contain a range of values to describe supported translation granules > (4K and 16K pages sizes in particular) instead of just enabled or disabled > values. This changes __enable_mmu() function to handle complete acceptable > range of values (depending on whether the field is signed or unsigned) now > represented with ID_AA64MMFR0_TGRAN_SUPPORTED_[MIN..MAX] pair. While here, > also fix similar situations in EFI stub and KVM as well. > > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will@kernel.org> > Cc: Marc Zyngier <maz@kernel.org> > Cc: James Morse <james.morse@arm.com> > Cc: Suzuki K Poulose <suzuki.poulose@arm.com> > Cc: Ard Biesheuvel <ardb@kernel.org> > Cc: Mark Rutland <mark.rutland@arm.com> > Cc: linux-arm-kernel@lists.infradead.org > Cc: kvmarm@lists.cs.columbia.edu > Cc: linux-efi@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Acked-by: Marc Zyngier <maz@kernel.org> > Signed-off-by: James Morse <james.morse@arm.com> > Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> Hi, When building an arm64 defconfig kernel from stable/linux-5.10.y and booting that in QEMU (version: 1:7.0+dfsg-2~bpo11+2) with '-cpu max' the kernel doesn't boot. I don't get any output. The kernel boots fine if I change to '-cpu cortex-a72'. If I cherry-pick this patch to stable/linux-5.10.y I'm able too boot the kernel with '-cpu max'. However, I'm not comfortable to backport this patch to older kernels since there are a lot of conflicts. Can someone help out to do the packport? Cheers, Anders
On 2022/8/26 20:00, Anders Roxell wrote: > On 2021-03-10 11:23, Anshuman Khandual wrote: >> From: James Morse <james.morse@arm.com> >> >> As per ARM ARM DDI 0487G.a, when FEAT_LPA2 is implemented, ID_AA64MMFR0_EL1 >> might contain a range of values to describe supported translation granules >> (4K and 16K pages sizes in particular) instead of just enabled or disabled >> values. This changes __enable_mmu() function to handle complete acceptable >> range of values (depending on whether the field is signed or unsigned) now >> represented with ID_AA64MMFR0_TGRAN_SUPPORTED_[MIN..MAX] pair. While here, >> also fix similar situations in EFI stub and KVM as well. >> >> Cc: Catalin Marinas <catalin.marinas@arm.com> >> Cc: Will Deacon <will@kernel.org> >> Cc: Marc Zyngier <maz@kernel.org> >> Cc: James Morse <james.morse@arm.com> >> Cc: Suzuki K Poulose <suzuki.poulose@arm.com> >> Cc: Ard Biesheuvel <ardb@kernel.org> >> Cc: Mark Rutland <mark.rutland@arm.com> >> Cc: linux-arm-kernel@lists.infradead.org >> Cc: kvmarm@lists.cs.columbia.edu >> Cc: linux-efi@vger.kernel.org >> Cc: linux-kernel@vger.kernel.org >> Acked-by: Marc Zyngier <maz@kernel.org> >> Signed-off-by: James Morse <james.morse@arm.com> >> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> > > Hi, > > When building an arm64 defconfig kernel from stable/linux-5.10.y and > booting that in QEMU (version: 1:7.0+dfsg-2~bpo11+2) with '-cpu max' the > kernel doesn't boot. I don't get any output. The kernel boots fine if I > change to '-cpu cortex-a72'. > > If I cherry-pick this patch to stable/linux-5.10.y I'm able too boot the > kernel with '-cpu max'. You can workaround the kernel boot failure by specifying '-cpu max,lpa2=off' [*] in the QEMU command line. > However, I'm not comfortable to backport this patch to older kernels > since there are a lot of conflicts. > Can someone help out to do the packport? Upstream commit 26f55386f964 ("arm64/mm: Fix __enable_mmu() for new TGRAN range values") can still be applied cleanly on top of linux-5.10.y. I can send it to <stable@vger.kernel.org> if maintainers are okay with the stable-5.10 backport. [*] https://gitlab.com/qemu-project/qemu/-/commit/69b2265d5fe8 Zenghui
On Fri, Oct 28, 2022 at 10:18:41AM +0800, Zenghui Yu wrote: > On 2022/8/26 20:00, Anders Roxell wrote: > > On 2021-03-10 11:23, Anshuman Khandual wrote: > > > From: James Morse <james.morse@arm.com> > > > > > > As per ARM ARM DDI 0487G.a, when FEAT_LPA2 is implemented, ID_AA64MMFR0_EL1 > > > might contain a range of values to describe supported translation granules > > > (4K and 16K pages sizes in particular) instead of just enabled or disabled > > > values. This changes __enable_mmu() function to handle complete acceptable > > > range of values (depending on whether the field is signed or unsigned) now > > > represented with ID_AA64MMFR0_TGRAN_SUPPORTED_[MIN..MAX] pair. While here, > > > also fix similar situations in EFI stub and KVM as well. > > > > > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > > Cc: Will Deacon <will@kernel.org> > > > Cc: Marc Zyngier <maz@kernel.org> > > > Cc: James Morse <james.morse@arm.com> > > > Cc: Suzuki K Poulose <suzuki.poulose@arm.com> > > > Cc: Ard Biesheuvel <ardb@kernel.org> > > > Cc: Mark Rutland <mark.rutland@arm.com> > > > Cc: linux-arm-kernel@lists.infradead.org > > > Cc: kvmarm@lists.cs.columbia.edu > > > Cc: linux-efi@vger.kernel.org > > > Cc: linux-kernel@vger.kernel.org > > > Acked-by: Marc Zyngier <maz@kernel.org> > > > Signed-off-by: James Morse <james.morse@arm.com> > > > Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> > > > > When building an arm64 defconfig kernel from stable/linux-5.10.y and > > booting that in QEMU (version: 1:7.0+dfsg-2~bpo11+2) with '-cpu max' the > > kernel doesn't boot. I don't get any output. The kernel boots fine if I > > change to '-cpu cortex-a72'. > > > > If I cherry-pick this patch to stable/linux-5.10.y I'm able too boot the > > kernel with '-cpu max'. > > You can workaround the kernel boot failure by specifying > '-cpu max,lpa2=off' [*] in the QEMU command line. > > > However, I'm not comfortable to backport this patch to older kernels > > since there are a lot of conflicts. > > Can someone help out to do the packport? > > Upstream commit 26f55386f964 ("arm64/mm: Fix __enable_mmu() for new > TGRAN range values") can still be applied cleanly on top of > linux-5.10.y. I can send it to <stable@vger.kernel.org> if maintainers > are okay with the stable-5.10 backport. If you have a backport, please send it (and cc the original author/reviewers just to double-check that the backport is correct). Thanks.
diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h index dfd4edb..d4a5fca9 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -796,6 +796,11 @@ #define ID_AA64MMFR0_PARANGE_48 0x5 #define ID_AA64MMFR0_PARANGE_52 0x6 +#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_DEFAULT 0x0 +#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_NONE 0x1 +#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_MIN 0x2 +#define ID_AA64MMFR0_TGRAN_2_SUPPORTED_MAX 0x7 + #ifdef CONFIG_ARM64_PA_BITS_52 #define ID_AA64MMFR0_PARANGE_MAX ID_AA64MMFR0_PARANGE_52 #else @@ -961,14 +966,17 @@ #define ID_PFR1_PROGMOD_SHIFT 0 #if defined(CONFIG_ARM64_4K_PAGES) -#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN4_SHIFT -#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN4_SUPPORTED +#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN4_SHIFT +#define ID_AA64MMFR0_TGRAN_SUPPORTED_MIN ID_AA64MMFR0_TGRAN4_SUPPORTED +#define ID_AA64MMFR0_TGRAN_SUPPORTED_MAX 0x7 #elif defined(CONFIG_ARM64_16K_PAGES) -#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN16_SHIFT -#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN16_SUPPORTED +#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN16_SHIFT +#define ID_AA64MMFR0_TGRAN_SUPPORTED_MIN ID_AA64MMFR0_TGRAN16_SUPPORTED +#define ID_AA64MMFR0_TGRAN_SUPPORTED_MAX 0xF #elif defined(CONFIG_ARM64_64K_PAGES) -#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN64_SHIFT -#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN64_SUPPORTED +#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN64_SHIFT +#define ID_AA64MMFR0_TGRAN_SUPPORTED_MIN ID_AA64MMFR0_TGRAN64_SUPPORTED +#define ID_AA64MMFR0_TGRAN_SUPPORTED_MAX 0x7 #endif #define MVFR2_FPMISC_SHIFT 4 diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 66b0e0b..8b469f1 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -655,8 +655,10 @@ SYM_FUNC_END(__secondary_too_slow) SYM_FUNC_START(__enable_mmu) mrs x2, ID_AA64MMFR0_EL1 ubfx x2, x2, #ID_AA64MMFR0_TGRAN_SHIFT, 4 - cmp x2, #ID_AA64MMFR0_TGRAN_SUPPORTED - b.ne __no_granule_support + cmp x2, #ID_AA64MMFR0_TGRAN_SUPPORTED_MIN + b.lt __no_granule_support + cmp x2, #ID_AA64MMFR0_TGRAN_SUPPORTED_MAX + b.gt __no_granule_support update_early_cpu_boot_status 0, x2, x3 adrp x2, idmap_pg_dir phys_to_ttbr x1, x1 diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index 47f3f03..e81c7ec 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -311,16 +311,18 @@ int kvm_set_ipa_limit(void) } switch (cpuid_feature_extract_unsigned_field(mmfr0, tgran_2)) { - default: - case 1: + case ID_AA64MMFR0_TGRAN_2_SUPPORTED_NONE: kvm_err("PAGE_SIZE not supported at Stage-2, giving up\n"); return -EINVAL; - case 0: + case ID_AA64MMFR0_TGRAN_2_SUPPORTED_DEFAULT: kvm_debug("PAGE_SIZE supported at Stage-2 (default)\n"); break; - case 2: + case ID_AA64MMFR0_TGRAN_2_SUPPORTED_MIN ... ID_AA64MMFR0_TGRAN_2_SUPPORTED_MAX: kvm_debug("PAGE_SIZE supported at Stage-2 (advertised)\n"); break; + default: + kvm_err("Unsupported value for TGRAN_2, giving up\n"); + return -EINVAL; } kvm_ipa_limit = id_aa64mmfr0_parange_to_phys_shift(parange); diff --git a/drivers/firmware/efi/libstub/arm64-stub.c b/drivers/firmware/efi/libstub/arm64-stub.c index b69d631..7bf0a7a 100644 --- a/drivers/firmware/efi/libstub/arm64-stub.c +++ b/drivers/firmware/efi/libstub/arm64-stub.c @@ -24,7 +24,7 @@ efi_status_t check_platform_features(void) return EFI_SUCCESS; tg = (read_cpuid(ID_AA64MMFR0_EL1) >> ID_AA64MMFR0_TGRAN_SHIFT) & 0xf; - if (tg != ID_AA64MMFR0_TGRAN_SUPPORTED) { + if (tg < ID_AA64MMFR0_TGRAN_SUPPORTED_MIN || tg > ID_AA64MMFR0_TGRAN_SUPPORTED_MAX) { if (IS_ENABLED(CONFIG_ARM64_64K_PAGES)) efi_err("This 64 KB granular kernel is not supported by your CPU\n"); else