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 3/9] x86/dt: Support the ACPI multiprocessor wakeup for device tree
Date: Fri, 23 Aug 2024 16:23:21 -0700 [thread overview]
Message-ID: <20240823232327.2408869-4-yunhong.jiang@linux.intel.com> (raw)
In-Reply-To: <20240823232327.2408869-1-yunhong.jiang@linux.intel.com>
When a TDX guest boots with the device tree instead of ACPI, it can
reuse the ACPI multiprocessor wakeup mechanism to wake up application
processors(AP), without introducing a new mechanism from scrach.
In the ACPI spec, two structures are defined to wake up the APs: the
multiprocessor wakeup structure and the multiprocessor wakeup mailbox
structure. The multiprocessor wakeup structure is passed to OS through a
Multiple APIC Description Table(MADT), one field specifying the physical
address of the multiprocessor wakeup mailbox structure. The OS sends
a message to firmware through the multiprocessor wakeup mailbox
structure, to bring up the APs.
In device tree environment, the multiprocessor wakeup structure is not
used, to reduce the dependency on the generic ACPI table. The
information defined in this structure is defined in the properties of
cpus node in the device tree. The "wakeup-mailbox-addr" property
specifies the physical address of the multiprocessor wakeup mailbox
structure. The OS will follow the ACPI spec to send the message to the
firmware to bring up the APs.
Signed-off-by: Yunhong Jiang <yunhong.jiang@linux.intel.com>
---
MAINTAINERS | 1 +
arch/x86/Kconfig | 2 +-
arch/x86/include/asm/acpi.h | 1 -
arch/x86/include/asm/madt_wakeup.h | 16 +++++++++++++
arch/x86/kernel/madt_wakeup.c | 38 ++++++++++++++++++++++++++++++
5 files changed, 56 insertions(+), 2 deletions(-)
create mode 100644 arch/x86/include/asm/madt_wakeup.h
diff --git a/MAINTAINERS b/MAINTAINERS
index 5555a3bbac5f..900de6501eba 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -288,6 +288,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
F: Documentation/ABI/testing/configfs-acpi
F: Documentation/ABI/testing/sysfs-bus-acpi
F: Documentation/firmware-guide/acpi/
+F: arch/x86/include/asm/madt_wakeup.h
F: arch/x86/kernel/acpi/
F: arch/x86/kernel/madt_playdead.S
F: arch/x86/kernel/madt_wakeup.c
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index d422247b2882..dba46dd30049 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1123,7 +1123,7 @@ config X86_LOCAL_APIC
config ACPI_MADT_WAKEUP
def_bool y
depends on X86_64
- depends on ACPI
+ depends on ACPI || OF
depends on SMP
depends on X86_LOCAL_APIC
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
index 21bc53f5ed0c..0e082303ca26 100644
--- a/arch/x86/include/asm/acpi.h
+++ b/arch/x86/include/asm/acpi.h
@@ -83,7 +83,6 @@ union acpi_subtable_headers;
int __init acpi_parse_mp_wake(union acpi_subtable_headers *header,
const unsigned long end);
-void asm_acpi_mp_play_dead(u64 reset_vector, u64 pgd_pa);
/*
* Check if the CPU can handle C2 and deeper
diff --git a/arch/x86/include/asm/madt_wakeup.h b/arch/x86/include/asm/madt_wakeup.h
new file mode 100644
index 000000000000..a8cd50af581a
--- /dev/null
+++ b/arch/x86/include/asm/madt_wakeup.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __ASM_X86_MADT_WAKEUP_H
+#define __ASM_X86_MADT_WAKEUP_H
+
+void asm_acpi_mp_play_dead(u64 reset_vector, u64 pgd_pa);
+
+#if defined(CONFIG_OF) && defined(CONFIG_ACPI_MADT_WAKEUP)
+u64 dtb_parse_mp_wake(void);
+#else
+static inline u64 dtb_parse_mp_wake(void)
+{
+ return 0;
+}
+#endif
+
+#endif /* __ASM_X86_MADT_WAKEUP_H */
diff --git a/arch/x86/kernel/madt_wakeup.c b/arch/x86/kernel/madt_wakeup.c
index d5ef6215583b..7257e7484569 100644
--- a/arch/x86/kernel/madt_wakeup.c
+++ b/arch/x86/kernel/madt_wakeup.c
@@ -14,6 +14,8 @@
#include <asm/nmi.h>
#include <asm/processor.h>
#include <asm/reboot.h>
+#include <asm/madt_wakeup.h>
+#include <asm/prom.h>
/* Physical address of the Multiprocessor Wakeup Structure mailbox */
static u64 acpi_mp_wake_mailbox_paddr __ro_after_init;
@@ -122,6 +124,7 @@ static int __init init_transition_pgtable(pgd_t *pgd)
return 0;
}
+#ifdef CONFIG_ACPI
static int __init acpi_mp_setup_reset(u64 reset_vector)
{
struct x86_mapping_info info = {
@@ -168,6 +171,7 @@ static int __init acpi_mp_setup_reset(u64 reset_vector)
return 0;
}
+#endif
static int acpi_wakeup_cpu(u32 apicid, unsigned long start_ip)
{
@@ -226,6 +230,7 @@ static int acpi_wakeup_cpu(u32 apicid, unsigned long start_ip)
return 0;
}
+#ifdef CONFIG_ACPI
static void acpi_mp_disable_offlining(struct acpi_madt_multiproc_wakeup *mp_wake)
{
cpu_hotplug_disable_offlining();
@@ -290,3 +295,36 @@ int __init acpi_parse_mp_wake(union acpi_subtable_headers *header,
return 0;
}
+#endif /* CONFIG_ACPI */
+
+#ifdef CONFIG_OF
+u64 __init dtb_parse_mp_wake(void)
+{
+ struct device_node *node;
+ u64 mailaddr = 0;
+
+ node = of_find_node_by_path("/cpus");
+ if (!node)
+ return 0;
+
+ if (of_property_match_string(node, "enable-method", "acpi-wakeup-mailbox") < 0) {
+ pr_err("No acpi wakeup mailbox enable-method\n");
+ goto done;
+ }
+
+ if (of_property_read_u64(node, "wakeup-mailbox-addr", &mailaddr)) {
+ pr_err("Invalid wakeup mailbox addr\n");
+ goto done;
+ }
+ acpi_mp_wake_mailbox_paddr = mailaddr;
+ pr_info("dt wakeup-mailbox: addr 0x%llx\n", mailaddr);
+
+ /* No support for the MADT reset vector yet */
+ cpu_hotplug_disable_offlining();
+ apic_update_callback(wakeup_secondary_cpu_64, acpi_wakeup_cpu);
+
+done:
+ of_node_put(node);
+ return mailaddr;
+}
+#endif /* CONFIG_OF */
--
2.25.1
next prev 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 ` Yunhong Jiang [this message]
2024-09-02 3:35 ` [PATCH v2 3/9] x86/dt: Support the ACPI multiprocessor wakeup for device tree 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 ` [PATCH v2 6/9] x86/realmode: Add memory range support to reserve_real_mode Yunhong Jiang
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-4-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).