devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yunhong Jiang <yunhong.jiang@linux.intel.com>
To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
	dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
	robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org,
	kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org,
	decui@microsoft.com, rafael@kernel.org, lenb@kernel.org,
	kirill.shutemov@linux.intel.com, yunhong.jiang@linux.intel.com
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	linux-hyperv@vger.kernel.org, linux-acpi@vger.kernel.org
Subject: [PATCH v2 6/9] x86/realmode: Add memory range support to reserve_real_mode
Date: Fri, 23 Aug 2024 16:23:24 -0700	[thread overview]
Message-ID: <20240823232327.2408869-7-yunhong.jiang@linux.intel.com> (raw)
In-Reply-To: <20240823232327.2408869-1-yunhong.jiang@linux.intel.com>

Currently the reserve_real_mode() always allocates memory from below 1M
range, although some real mode blob code can execute above 1M.

The VTL2 TDX hyperv guest may have no memory available below 1M, but it
needs to invoke some real mode blob code that can execute above 1M memory.

Instead of providing a platform specific realmode_reserve callback, the
reserve_real_mode() is updated to support flexible memory range to meet
this requirement.

Originally-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/lkml/87a5ho2q6x.ffs@tglx/

Signed-off-by: Yunhong Jiang <yunhong.jiang@linux.intel.com>
---
 arch/x86/include/asm/x86_init.h |  6 ++++++
 arch/x86/kernel/x86_init.c      |  3 +++
 arch/x86/realmode/init.c        | 14 ++++++--------
 3 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index 213cf5379a5a..9e3198bfe56e 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -31,12 +31,18 @@ struct x86_init_mpparse {
  *				platform
  * @memory_setup:		platform specific memory setup
  * @dmi_setup:			platform specific DMI setup
+ * @realmode_limit:		platform specific address limit for the realmode trampoline
+ *				(default 1M)
+ * @reserve_bios:		platform specific address limit for reserving the BIOS area
+ *				(default 1M)
  */
 struct x86_init_resources {
 	void (*probe_roms)(void);
 	void (*reserve_resources)(void);
 	char *(*memory_setup)(void);
 	void (*dmi_setup)(void);
+	unsigned long realmode_limit;
+	unsigned long reserve_bios;
 };
 
 /**
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index 82b128d3f309..f3226aa77bfb 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -8,6 +8,7 @@
 #include <linux/ioport.h>
 #include <linux/export.h>
 #include <linux/pci.h>
+#include <linux/sizes.h>
 
 #include <asm/acpi.h>
 #include <asm/bios_ebda.h>
@@ -68,6 +69,8 @@ struct x86_init_ops x86_init __initdata = {
 		.reserve_resources	= reserve_standard_io_resources,
 		.memory_setup		= e820__memory_setup_default,
 		.dmi_setup		= dmi_setup,
+		.realmode_limit		= SZ_1M,
+		.reserve_bios		= SZ_1M,
 	},
 
 	.mpparse = {
diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c
index f9bc444a3064..6d658ad8c0f4 100644
--- a/arch/x86/realmode/init.c
+++ b/arch/x86/realmode/init.c
@@ -45,7 +45,7 @@ void load_trampoline_pgtable(void)
 
 void __init reserve_real_mode(void)
 {
-	phys_addr_t mem;
+	phys_addr_t mem, limit = x86_init.resources.realmode_limit;
 	size_t size = real_mode_size_needed();
 
 	if (!size)
@@ -54,17 +54,15 @@ void __init reserve_real_mode(void)
 	WARN_ON(slab_is_available());
 
 	/* Has to be under 1M so we can execute real-mode AP code. */
-	mem = memblock_phys_alloc_range(size, PAGE_SIZE, 0, 1<<20);
+	mem = memblock_phys_alloc_range(size, PAGE_SIZE, 0, limit);
 	if (!mem)
-		pr_info("No sub-1M memory is available for the trampoline\n");
+		pr_info("No memory below %lluM for the real-mode trampoline\n", limit >> 20);
 	else
 		set_real_mode_mem(mem);
 
-	/*
-	 * Unconditionally reserve the entire first 1M, see comment in
-	 * setup_arch().
-	 */
-	memblock_reserve(0, SZ_1M);
+	/* Reserve the entire first 1M, if enabled. See comment in setup_arch(). */
+	if (x86_init.resources.reserve_bios)
+		memblock_reserve(0, x86_init.resources.reserve_bios);
 }
 
 static void __init sme_sev_setup_real_mode(struct trampoline_header *th)
-- 
2.25.1


  parent reply	other threads:[~2024-08-23 23:23 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-23 23:23 [PATCH v2 0/9] x86/hyperv: Support wakeup mailbox for VTL2 TDX guest Yunhong Jiang
2024-08-23 23:23 ` [PATCH v2 1/9] x86/acpi: Move ACPI MADT wakeup to generic code Yunhong Jiang
2024-08-23 23:23 ` [PATCH v2 2/9] dt-bindings: x86: Add a binding for x86 wakeup mailbox Yunhong Jiang
2024-08-25  7:10   ` Krzysztof Kozlowski
2024-08-27 20:45     ` Yunhong Jiang
2024-09-10  6:13       ` Yunhong Jiang
2024-09-16  8:56         ` Krzysztof Kozlowski
2024-09-19 19:19           ` Yunhong Jiang
2024-09-19 22:15             ` Yunhong Jiang
2024-09-20 11:19               ` Krzysztof Kozlowski
2024-09-20 11:15             ` Krzysztof Kozlowski
2025-03-03 22:21               ` Ricardo Neri
2025-03-11 10:01                 ` Krzysztof Kozlowski
2025-03-12  5:51                   ` Ricardo Neri
2025-03-19  7:52                     ` Krzysztof Kozlowski
2025-03-20 20:34                       ` Ricardo Neri
2024-08-23 23:23 ` [PATCH v2 3/9] x86/dt: Support the ACPI multiprocessor wakeup for device tree Yunhong Jiang
2024-09-02  3:35   ` Michael Kelley
2024-09-03 18:35     ` Yunhong Jiang
2024-08-23 23:23 ` [PATCH v2 4/9] x86/hyperv: Parse the ACPI wakeup mailbox Yunhong Jiang
2024-09-02  3:35   ` Michael Kelley
2024-09-03 20:19     ` Yunhong Jiang
2024-09-04 14:56       ` Michael Kelley
2024-09-04 17:31         ` Yunhong Jiang
2024-08-23 23:23 ` [PATCH v2 5/9] x86/hyperv: Mark ACPI wakeup mailbox page as private Yunhong Jiang
2024-09-02  3:35   ` Michael Kelley
2024-09-02 18:38     ` Saurabh Singh Sengar
2024-09-02 20:24       ` Michael Kelley
2024-08-23 23:23 ` Yunhong Jiang [this message]
2024-08-23 23:23 ` [PATCH v2 7/9] x86/hyperv: Move setting the real_mode_header to hv_vtl_init_platform Yunhong Jiang
2024-08-23 23:23 ` [PATCH v2 8/9] x86/hyperv: Set realmode_limit to 4G for VTL2 TDX guest Yunhong Jiang
2024-09-02  3:35   ` Michael Kelley
2024-08-23 23:23 ` [PATCH v2 9/9] x86/hyperv: Use wakeup mailbox for VTL2 guests if available Yunhong Jiang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240823232327.2408869-7-yunhong.jiang@linux.intel.com \
    --to=yunhong.jiang@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=conor+dt@kernel.org \
    --cc=dave.hansen@linux.intel.com \
    --cc=decui@microsoft.com \
    --cc=devicetree@vger.kernel.org \
    --cc=haiyangz@microsoft.com \
    --cc=hpa@zytor.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=krzk+dt@kernel.org \
    --cc=kys@microsoft.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=rafael@kernel.org \
    --cc=robh@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=wei.liu@kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).