From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A2B8AC433DB for ; Fri, 5 Mar 2021 14:54:42 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2C0B26508D for ; Fri, 5 Mar 2021 14:54:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2C0B26508D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=JajERIFNshMe8cForLTBrAF+dOq45YrAHU0md27UOVo=; b=bY4S//LvAlVNHgaHGHjDulxDf lsDWeRrbPpOvyaCbuk5ZDAhYRneawt7zSM9/TqxF7pShZetl4Uh78ZAqqqAhJeEHJN05Em5/AB3qU LS8LV8cjE3pIRMpFtSqi7ciO2kG9j112K9aHqhxncSmYCqQTjQfAuwfeQMJawmVDIOgVfpUGkVAub E2CAf9lv1k2W0fMoqhAiMB7yUfZ0vyHWYkNPMwdL1vg0lxg2iaqw8fHYNtfezQ9eaQzpaSG2QFTHc ehky50sJHMdRV7kMTSNtCmntgv0exM6HVWcab25qoFnENO6j+VhD/WZuiY9e7f1+jfDfI6r0N4N92 H3FmMNUbA==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lIBoF-00FMIm-Md; Fri, 05 Mar 2021 14:52:08 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lIBnz-00FMHT-Ao for linux-arm-kernel@desiato.infradead.org; Fri, 05 Mar 2021 14:51:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=pm1BTb2p4cN0CGQHRdlony3FHMZE9QNiKgpa8jrUu8A=; b=l8fDJVt649b9CihyNI69ifs3tX 9WQr+EkM1m4BmRrcIrQ3xUVf6egXw70lV5Y1tJnEtGilgthSvlcr4P5+OEIX/apomw0CiMVVwl6Ad FoNs7GU829qlTsbiH1yc9wY/5dt18Le1+Imo37zADPc3lK/SNb81/D1dMHuLCZE+f/liDXqnIDzEM 6KHF2nRfXd4tEJxHVHEvdGDzh74NZghAUQol1xCP/IjOyQ8R9rwz3HMiHcCVU6s6jIKKwiAjYiinn JAz83ZBPd3urO3niEqz9RKA41joiA7gFyYH8W8IZxz6aVBM2xPMp46eAljj3g6XV1pgEGNNClcJ2e 0sGZA91g==; Received: from foss.arm.com ([217.140.110.172]) by casper.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lIBnc-00Br1D-Ei for linux-arm-kernel@lists.infradead.org; Fri, 05 Mar 2021 14:51:44 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C8B2B11FB; Fri, 5 Mar 2021 06:51:20 -0800 (PST) Received: from C02TD0UTHF1T.local (unknown [10.57.47.91]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 0BE703F73B; Fri, 5 Mar 2021 06:51:17 -0800 (PST) Date: Fri, 5 Mar 2021 14:51:11 +0000 From: Mark Rutland To: Anshuman Khandual Cc: linux-arm-kernel@lists.infradead.org, James Morse , Catalin Marinas , Will Deacon , Marc Zyngier , Suzuki K Poulose , Ard Biesheuvel , kvmarm@lists.cs.columbia.edu, linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] arm64/mm: Fix __enable_mmu() for new TGRAN range values Message-ID: <20210305145111.GA78884@C02TD0UTHF1T.local> References: <1614954969-14338-1-git-send-email-anshuman.khandual@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1614954969-14338-1-git-send-email-anshuman.khandual@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210305_145131_441419_C557EE6E X-CRM114-Status: GOOD ( 24.65 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, Mar 05, 2021 at 08:06:09PM +0530, Anshuman Khandual wrote: > From: James Morse > > 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 > Cc: Will Deacon > Cc: Marc Zyngier > Cc: James Morse > Cc: Suzuki K Poulose > Cc: Ard Biesheuvel > Cc: Mark Rutland > 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 > Signed-off-by: James Morse > Signed-off-by: Anshuman Khandual > --- > arch/arm64/include/asm/sysreg.h | 20 ++++++++++++++------ > arch/arm64/kernel/head.S | 6 ++++-- > arch/arm64/kvm/reset.c | 23 ++++++++++++----------- > drivers/firmware/efi/libstub/arm64-stub.c | 2 +- > 4 files changed, 31 insertions(+), 20 deletions(-) > > 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 The TGRAN2 fields doesn't quite follow the usual ID scheme rules, so how do we deteremine the max value? Does the ARM ARM say anything in particular about them, like we do for some of the PMU ID fields? Otherwise, this patch looks correct to me. Thanks, Mark. > + > #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..fe72bfb 100644 > --- a/arch/arm64/kvm/reset.c > +++ b/arch/arm64/kvm/reset.c > @@ -286,7 +286,7 @@ u32 get_kvm_ipa_limit(void) > > int kvm_set_ipa_limit(void) > { > - unsigned int parange, tgran_2; > + unsigned int parange, tgran_2_shift, tgran_2; > u64 mmfr0; > > mmfr0 = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1); > @@ -300,27 +300,28 @@ int kvm_set_ipa_limit(void) > switch (PAGE_SIZE) { > default: > case SZ_4K: > - tgran_2 = ID_AA64MMFR0_TGRAN4_2_SHIFT; > + tgran_2_shift = ID_AA64MMFR0_TGRAN4_2_SHIFT; > break; > case SZ_16K: > - tgran_2 = ID_AA64MMFR0_TGRAN16_2_SHIFT; > + tgran_2_shift = ID_AA64MMFR0_TGRAN16_2_SHIFT; > break; > case SZ_64K: > - tgran_2 = ID_AA64MMFR0_TGRAN64_2_SHIFT; > + tgran_2_shift = ID_AA64MMFR0_TGRAN64_2_SHIFT; > break; > } > > - switch (cpuid_feature_extract_unsigned_field(mmfr0, tgran_2)) { > - default: > - case 1: > + tgran_2 = cpuid_feature_extract_unsigned_field(mmfr0, tgran_2_shift); > + if (tgran_2 == ID_AA64MMFR0_TGRAN_2_SUPPORTED_NONE) { > kvm_err("PAGE_SIZE not supported at Stage-2, giving up\n"); > return -EINVAL; > - case 0: > + } else if (tgran_2 == ID_AA64MMFR0_TGRAN_2_SUPPORTED_DEFAULT) { > kvm_debug("PAGE_SIZE supported at Stage-2 (default)\n"); > - break; > - case 2: > + } else if (tgran_2 >= ID_AA64MMFR0_TGRAN_2_SUPPORTED_MIN && > + tgran_2 <= ID_AA64MMFR0_TGRAN_2_SUPPORTED_MAX) { > kvm_debug("PAGE_SIZE supported at Stage-2 (advertised)\n"); > - break; > + } else { > + kvm_err("Unsupported value, 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 > -- > 2.7.4 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel