From patchwork Mon Oct 14 10:58:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ryan Roberts X-Patchwork-Id: 13834707 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2A4C5D1A45F for ; Mon, 14 Oct 2024 11:01:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 81B376B00C5; Mon, 14 Oct 2024 07:01:31 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7CD6C6B00C6; Mon, 14 Oct 2024 07:01:31 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 669C66B00C7; Mon, 14 Oct 2024 07:01:31 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 45B756B00C5 for ; Mon, 14 Oct 2024 07:01:31 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 4520940D91 for ; Mon, 14 Oct 2024 11:01:26 +0000 (UTC) X-FDA: 82671916614.10.40A320D Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf19.hostedemail.com (Postfix) with ESMTP id E4E5B1A000B for ; Mon, 14 Oct 2024 11:01:21 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf19.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1728903658; a=rsa-sha256; cv=none; b=YFgHSFDjb9UXki342PdvWxkMMhYgj0Lx33u/0MzNvrZpURSYcEIjdyH+0yP1asWK0UJJeX pZ5gyzlWA2mZvblkSWJHT4Z2nqTD2J4zaZBFZdx9A9NY6AYyrQ06Zarqke5mYA3v2x0Fwx iJ/47CKFyArPJ3VLVn+LKQypp4avJo8= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf19.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1728903658; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=11sxvXvLRPO0HsHmpSNAXFOkl+67WniK18hQuyFjNNA=; b=Tw2lOlhO87kh26kZibdqbAB3hDaTci6a5cUmoDlO8WY2CahaRqsE+Y9/54gL97KF1gG+/m mNELjpoVrZbiMStv0mMgK0vq7n9vDDdhRzpbO/6RzzlLEwAo2n4WRmJ2FdwBsmV1isFX4E Jxt+G5cTZ7T9wdvsTUoCFvwD4Epx5Iw= 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 6F1811756; Mon, 14 Oct 2024 04:01:58 -0700 (PDT) Received: from e125769.cambridge.arm.com (e125769.cambridge.arm.com [10.1.196.27]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 6E88C3F51B; Mon, 14 Oct 2024 04:01:26 -0700 (PDT) From: Ryan Roberts To: Andrew Morton , Anshuman Khandual , Ard Biesheuvel , Catalin Marinas , David Hildenbrand , Greg Marsden , Ivan Ivanov , Kalesh Singh , Marc Zyngier , Mark Rutland , Matthias Brugger , Miroslav Benes , Will Deacon Cc: Ryan Roberts , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v1 39/57] arm64: Introduce macros required for boot-time page selection Date: Mon, 14 Oct 2024 11:58:46 +0100 Message-ID: <20241014105912.3207374-39-ryan.roberts@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241014105912.3207374-1-ryan.roberts@arm.com> References: <20241014105514.3206191-1-ryan.roberts@arm.com> <20241014105912.3207374-1-ryan.roberts@arm.com> MIME-Version: 1.0 X-Rspam-User: X-Stat-Signature: c5h7bndbqh1jjnwmkp9i7iyijyxu6fiw X-Rspamd-Queue-Id: E4E5B1A000B X-Rspamd-Server: rspam02 X-HE-Tag: 1728903681-920246 X-HE-Meta: U2FsdGVkX19FXE+P51zp0dY0kJwH0gMJyfmgpZYS+wCHG2FCzpTCu/qZkte+iT1i+KmiXUNYXv6jyVgq3E8hRe9q2g2lKOM/h8is562lG/T368JyQs0KTflmX6NtnvbOhsBdMNOPlBc3HgNKRCZl+PpJxB/h5NisQHRh7EXCaq0datnnbkIg4oP85F6ZiRPzaecPFdKv1SaPK7y/foG9joNN8dLiLAz5QtIDO2B3shmip4IbbDaJn5rWJtKwK6zQGtzPuk8riLmqOpUC1RQRjONvL+N46v4tmgYcmA5VkrEdCup7/5TJex4oFb/UcN3R0mEYY2eKYKlspBy30ikrKpQX+VYFRrqYHHzF7V5Ff3wigLbuP52fndYIxt1R9CLCqR2T9xNmfqshhCcAOnn3UPd0u6SnftuC9dmoGypQQ9tnN5VpInyo8VSpiMTv4fq3dw9P8qb/XMhE3ux79lzm7TpjVLq35jmK6ukpc3vrYuBeBHDaUYHRcztfbZYfZQzEjJe0MXcAo29FHj1QNPsyoRUciMPZ0ebQKVuBAMEgunvYFTh3e5pIkjBfUUfczft+T4RbD7RA0F9ob3wuZ4gXZ3gZBY5yZn2/Qf9Nikk8eXEoSIloLZidNuvuQ78dwiCat/Lwab6AiF7lIViRGy9cgVAXD70TPIMYPtTI+j7rUTuUH1DuPteROMxIUjge+OeNbG2un7ymlr8f8hXHflDvhyWR8PuRS7QhIoRvkbZ92agC/eM4Ek46dUJxYqXiq9HowRx3KgE6zR9fJcLhx8dPcQ28kZnMRSycg2XD4IzyMIZz8+GsAXSvXALlJIyC84YlEXCbV0xmjTEAjBqFNr9x5jKk3BeDzznoUb0Id6Km9PwszdLb39AXeUl1z/8sxNr1fxO4o4D7rS/erVhELZmaQ5E7QLt2spU9ZPMnzDk+Ia8GqqbndsaLaiaTzwA3zxwXWLD4cxZuhJmlP8FC8HW SSrZFoyP hThE0ms2HIM0q4+zp5MyQRtzg9mwZZm/sjVgBe02z31ul0Z26hrBgfY0bNNoslf+yER38xzFnYh3Pv1tv7JAmfb2eeWLCoKltJbmRTO3MtwQHG4q3o996eUgnuQdXS1b+dh8xZX6VVVInJ/49ul/Bz0+McnCdklzj2k2TsoQJaz2jYQI3W1TjfJyNEw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: This minmal set of macros will allow boot-time page selection support to be added to the arm64 arch code incrementally over the following set of patches. The definitions in pgtable-geometry.h are for compile-time page size currently, but they will be modified in future to support boot-time page size. Signed-off-by: Ryan Roberts --- ***NOTE*** Any confused maintainers may want to read the cover note here for context: https://lore.kernel.org/all/20241014105514.3206191-1-ryan.roberts@arm.com/ arch/arm64/include/asm/page-def.h | 5 ++-- arch/arm64/include/asm/pgtable-geometry.h | 28 +++++++++++++++++++++++ arch/arm64/include/asm/pgtable-hwdef.h | 16 ++++++++----- 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 arch/arm64/include/asm/pgtable-geometry.h diff --git a/arch/arm64/include/asm/page-def.h b/arch/arm64/include/asm/page-def.h index d69971cf49cd2..b99dee0112463 100644 --- a/arch/arm64/include/asm/page-def.h +++ b/arch/arm64/include/asm/page-def.h @@ -9,12 +9,11 @@ #define __ASM_PAGE_DEF_H #include +#include /* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT +#define PAGE_SHIFT ptg_page_shift #define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) -#include - #endif /* __ASM_PAGE_DEF_H */ diff --git a/arch/arm64/include/asm/pgtable-geometry.h b/arch/arm64/include/asm/pgtable-geometry.h new file mode 100644 index 0000000000000..62fe125909c08 --- /dev/null +++ b/arch/arm64/include/asm/pgtable-geometry.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef ASM_PGTABLE_GEOMETRY_H +#define ASM_PGTABLE_GEOMETRY_H + +#define ARM64_PAGE_SHIFT_4K 12 +#define ARM64_PAGE_SHIFT_16K 14 +#define ARM64_PAGE_SHIFT_64K 16 + +#define PAGE_SHIFT_MIN CONFIG_PAGE_SHIFT +#define PAGE_SIZE_MIN (_AC(1, UL) << PAGE_SHIFT_MIN) +#define PAGE_MASK_MIN (~(PAGE_SIZE_MIN-1)) + +#define PAGE_SHIFT_MAX CONFIG_PAGE_SHIFT +#define PAGE_SIZE_MAX (_AC(1, UL) << PAGE_SHIFT_MAX) +#define PAGE_MASK_MAX (~(PAGE_SIZE_MAX-1)) + +#include + +#define ptg_page_shift CONFIG_PAGE_SHIFT +#define ptg_pmd_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(2) +#define ptg_pud_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(1) +#define ptg_p4d_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(0) +#define ptg_pgdir_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(4 - CONFIG_PGTABLE_LEVELS) +#define ptg_cont_pte_shift (CONFIG_ARM64_CONT_PTE_SHIFT + PAGE_SHIFT) +#define ptg_cont_pmd_shift (CONFIG_ARM64_CONT_PMD_SHIFT + PMD_SHIFT) +#define ptg_pgtable_levels CONFIG_PGTABLE_LEVELS + +#endif /* ASM_PGTABLE_GEOMETRY_H */ diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index 1f60aa1bc750c..54a9153f56bc5 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h @@ -41,39 +41,43 @@ #define ARM64_HW_PGTABLE_LEVEL_SHIFT(n) ((PAGE_SHIFT - 3) * (4 - (n)) + 3) #define PTRS_PER_PTE (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_PTE (1 << (PAGE_SHIFT_MAX - 3)) /* * PMD_SHIFT determines the size a level 2 page table entry can map. */ #if CONFIG_PGTABLE_LEVELS > 2 -#define PMD_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(2) +#define PMD_SHIFT ptg_pmd_shift #define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) #define PMD_MASK (~(PMD_SIZE-1)) #define PTRS_PER_PMD (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_PMD (1 << (PAGE_SHIFT_MAX - 3)) #endif /* * PUD_SHIFT determines the size a level 1 page table entry can map. */ #if CONFIG_PGTABLE_LEVELS > 3 -#define PUD_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(1) +#define PUD_SHIFT ptg_pud_shift #define PUD_SIZE (_AC(1, UL) << PUD_SHIFT) #define PUD_MASK (~(PUD_SIZE-1)) #define PTRS_PER_PUD (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_PUD (1 << (PAGE_SHIFT_MAX - 3)) #endif #if CONFIG_PGTABLE_LEVELS > 4 -#define P4D_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(0) +#define P4D_SHIFT ptg_p4d_shift #define P4D_SIZE (_AC(1, UL) << P4D_SHIFT) #define P4D_MASK (~(P4D_SIZE-1)) #define PTRS_PER_P4D (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_P4D (1 << (PAGE_SHIFT_MAX - 3)) #endif /* * PGDIR_SHIFT determines the size a top-level page table entry can map * (depending on the configuration, this level can be -1, 0, 1 or 2). */ -#define PGDIR_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(4 - CONFIG_PGTABLE_LEVELS) +#define PGDIR_SHIFT ptg_pgdir_shift #define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT) #define PGDIR_MASK (~(PGDIR_SIZE-1)) #define PTRS_PER_PGD (1 << (VA_BITS - PGDIR_SHIFT)) @@ -81,12 +85,12 @@ /* * Contiguous page definitions. */ -#define CONT_PTE_SHIFT (CONFIG_ARM64_CONT_PTE_SHIFT + PAGE_SHIFT) +#define CONT_PTE_SHIFT ptg_cont_pte_shift #define CONT_PTES (1 << (CONT_PTE_SHIFT - PAGE_SHIFT)) #define CONT_PTE_SIZE (CONT_PTES * PAGE_SIZE) #define CONT_PTE_MASK (~(CONT_PTE_SIZE - 1)) -#define CONT_PMD_SHIFT (CONFIG_ARM64_CONT_PMD_SHIFT + PMD_SHIFT) +#define CONT_PMD_SHIFT ptg_cont_pmd_shift #define CONT_PMDS (1 << (CONT_PMD_SHIFT - PMD_SHIFT)) #define CONT_PMD_SIZE (CONT_PMDS * PMD_SIZE) #define CONT_PMD_MASK (~(CONT_PMD_SIZE - 1))