From: David Brazdil <dbrazdil@google.com>
To: kvmarm@lists.cs.columbia.edu
Cc: Mark Rutland <mark.rutland@arm.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
kernel-team@android.com,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Marc Zyngier <maz@kernel.org>,
Quentin Perret <qperret@google.com>,
linux-kernel@vger.kernel.org, James Morse <james.morse@arm.com>,
linux-arm-kernel@lists.infradead.org,
Catalin Marinas <catalin.marinas@arm.com>,
Tejun Heo <tj@kernel.org>, Dennis Zhou <dennis@kernel.org>,
Christoph Lameter <cl@linux.com>,
David Brazdil <dbrazdil@google.com>,
Will Deacon <will@kernel.org>,
Julien Thierry <julien.thierry.kdev@gmail.com>,
Andrew Scull <ascull@google.com>
Subject: [RFC PATCH 17/26] kvm: arm64: Bootstrap PSCI power state of host CPUs
Date: Wed, 4 Nov 2020 18:36:21 +0000 [thread overview]
Message-ID: <20201104183630.27513-18-dbrazdil@google.com> (raw)
In-Reply-To: <20201104183630.27513-1-dbrazdil@google.com>
Proxying host's PSCI SMCs will require synchronizing CPU_ON/OFF/SUSPEND
calls based on the observed state of individual cores. Add a per-CPU enum
that tracks the power state of each core and initialize all CPUs online
at the point of KVM init to ON.
Signed-off-by: David Brazdil <dbrazdil@google.com>
---
arch/arm64/include/asm/kvm_asm.h | 6 ++++++
arch/arm64/include/asm/kvm_hyp.h | 1 +
arch/arm64/kvm/arm.c | 5 +++++
arch/arm64/kvm/hyp/nvhe/psci.c | 2 ++
4 files changed, 14 insertions(+)
diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h
index 893327d1e449..9eecb37db6df 100644
--- a/arch/arm64/include/asm/kvm_asm.h
+++ b/arch/arm64/include/asm/kvm_asm.h
@@ -157,6 +157,12 @@ struct kvm_nvhe_init_params {
unsigned long vector_ptr;
};
+enum kvm_nvhe_psci_state {
+ KVM_NVHE_PSCI_CPU_OFF = 0,
+ KVM_NVHE_PSCI_CPU_PENDING_ON,
+ KVM_NVHE_PSCI_CPU_ON,
+};
+
/* Translate a kernel address @ptr into its equivalent linear mapping */
#define kvm_ksym_ref(ptr) \
({ \
diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h
index 95a2bbbcc7e1..cf4c1d16c3e0 100644
--- a/arch/arm64/include/asm/kvm_hyp.h
+++ b/arch/arm64/include/asm/kvm_hyp.h
@@ -97,6 +97,7 @@ void deactivate_traps_vhe_put(void);
u64 __guest_enter(struct kvm_vcpu *vcpu);
#ifdef __KVM_NVHE_HYPERVISOR__
+void kvm_host_psci_cpu_init(void);
bool kvm_host_psci_handler(struct kvm_cpu_context *host_ctxt);
#endif
diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index 580d4a656a7b..5b073806463e 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -52,6 +52,7 @@ DECLARE_KVM_HYP_PER_CPU(unsigned long, kvm_hyp_vector);
static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page);
unsigned long kvm_arm_hyp_percpu_base[NR_CPUS];
DECLARE_KVM_NVHE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params);
+DECLARE_KVM_NVHE_PER_CPU(enum kvm_nvhe_psci_state, psci_cpu_state);
/* The VMID used in the VTTBR */
static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1);
@@ -1517,10 +1518,14 @@ static void init_psci(void)
{
extern u32 kvm_nvhe_sym(kvm_host_psci_version);
extern u32 kvm_nvhe_sym(kvm_host_psci_function_id)[PSCI_FN_MAX];
+ int cpu;
kvm_nvhe_sym(kvm_host_psci_version) = psci_driver_version;
memcpy(kvm_nvhe_sym(kvm_host_psci_function_id),
psci_function_id, sizeof(psci_function_id));
+
+ for_each_online_cpu(cpu)
+ *per_cpu_ptr_nvhe_sym(psci_cpu_state, cpu) = KVM_NVHE_PSCI_CPU_ON;
}
static int init_common_resources(void)
diff --git a/arch/arm64/kvm/hyp/nvhe/psci.c b/arch/arm64/kvm/hyp/nvhe/psci.c
index 3eafcf48a29b..c3d0a6246c66 100644
--- a/arch/arm64/kvm/hyp/nvhe/psci.c
+++ b/arch/arm64/kvm/hyp/nvhe/psci.c
@@ -20,6 +20,8 @@ s64 hyp_physvirt_offset;
#define __hyp_pa(x) ((phys_addr_t)(x) + hyp_physvirt_offset)
+DEFINE_PER_CPU(enum kvm_nvhe_psci_state, psci_cpu_state);
+
static u64 get_psci_func_id(struct kvm_cpu_context *host_ctxt)
{
return host_ctxt->regs.regs[0];
--
2.29.1.341.ge80a0c044ae-goog
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-11-04 18:41 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-04 18:36 [RFC PATCH 00/26] kvm: arm64: Always-on nVHE hypervisor David Brazdil
2020-11-04 18:36 ` [RFC PATCH 01/26] psci: Export configured PSCI version David Brazdil
2020-11-05 9:47 ` Marc Zyngier
2020-11-04 18:36 ` [RFC PATCH 02/26] psci: Export configured PSCI function IDs David Brazdil
2020-11-05 9:53 ` Marc Zyngier
2020-11-04 18:36 ` [RFC PATCH 03/26] psci: Export psci_cpu_suspend_feature David Brazdil
2020-11-04 18:36 ` [RFC PATCH 04/26] arm64: Move MAIR_EL1_SET to asm/memory.h David Brazdil
2020-11-04 18:36 ` [RFC PATCH 05/26] kvm: arm64: Initialize MAIR_EL2 using a constant David Brazdil
2020-11-04 18:36 ` [RFC PATCH 06/26] kvm: arm64: Add .hyp.data ELF section David Brazdil
2020-11-04 18:36 ` [RFC PATCH 07/26] kvm: arm64: Support per_cpu_ptr in nVHE hyp code David Brazdil
2020-11-04 18:36 ` [RFC PATCH 08/26] kvm: arm64: Create nVHE copy of cpu_logical_map David Brazdil
2020-11-04 18:36 ` [RFC PATCH 09/26] kvm: arm64: Move hyp-init params to a per-CPU struct David Brazdil
2020-11-04 18:36 ` [RFC PATCH 10/26] kvm: arm64: Refactor handle_trap to use a switch David Brazdil
2020-11-04 18:36 ` [RFC PATCH 11/26] kvm: arm64: Extract parts of el2_setup into a macro David Brazdil
2020-11-04 18:36 ` [RFC PATCH 12/26] kvm: arm64: Add SMC handler in nVHE EL2 David Brazdil
2020-11-05 11:08 ` Marc Zyngier
2020-11-04 18:36 ` [RFC PATCH 13/26] kvm: arm64: Bootstrap PSCI " David Brazdil
2020-11-04 18:36 ` [RFC PATCH 14/26] kvm: arm64: Forward safe PSCI SMCs coming from host David Brazdil
2020-11-04 18:36 ` [RFC PATCH 15/26] arm64: kvm: Add standalone ticket spinlock implementation for use at hyp David Brazdil
2020-11-04 18:36 ` [RFC PATCH 16/26] kvm: arm64: Add offset for hyp VA <-> PA conversion David Brazdil
2020-11-04 18:36 ` David Brazdil [this message]
2020-11-04 18:36 ` [RFC PATCH 18/26] kvm: arm64: Intercept PSCI_CPU_OFF host SMC calls David Brazdil
2020-11-05 11:30 ` Marc Zyngier
2020-11-05 11:42 ` David Brazdil
2020-11-04 18:36 ` [RFC PATCH 19/26] kvm: arm64: Extract __do_hyp_init into a helper function David Brazdil
2020-11-04 18:36 ` [RFC PATCH 20/26] kvm: arm64: Add CPU entry point in nVHE hyp David Brazdil
2020-11-04 18:36 ` [RFC PATCH 21/26] kvm: arm64: Add function to enter host from KVM nVHE hyp code David Brazdil
2020-11-04 18:36 ` [RFC PATCH 22/26] kvm: arm64: Intercept PSCI_CPU_ON host SMC calls David Brazdil
2020-11-04 18:36 ` [RFC PATCH 23/26] kvm: arm64: Intercept host's CPU_SUSPEND PSCI SMCs David Brazdil
2020-11-05 10:34 ` Andrew Walbran
2020-11-05 11:04 ` David Brazdil
2020-11-04 18:36 ` [RFC PATCH 24/26] kvm: arm64: Keep nVHE EL2 vector installed David Brazdil
2020-11-04 18:36 ` [RFC PATCH 25/26] kvm: arm64: Trap host SMCs David Brazdil
2020-11-04 18:36 ` [RFC PATCH 26/26] kvm: arm64: Fix EL2 mode availability checks David Brazdil
2020-11-06 12:25 ` [RFC PATCH 00/26] kvm: arm64: Always-on nVHE hypervisor Marc Zyngier
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=20201104183630.27513-18-dbrazdil@google.com \
--to=dbrazdil@google.com \
--cc=ascull@google.com \
--cc=catalin.marinas@arm.com \
--cc=cl@linux.com \
--cc=dennis@kernel.org \
--cc=james.morse@arm.com \
--cc=julien.thierry.kdev@gmail.com \
--cc=kernel-team@android.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=qperret@google.com \
--cc=suzuki.poulose@arm.com \
--cc=tj@kernel.org \
--cc=will@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).