All of lore.kernel.org
 help / color / mirror / Atom feed
From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 11/12] ARM/ARM64: KVM: Emulate PSCI v0.2 CPU_SUSPEND
Date: Mon, 31 Mar 2014 10:40:18 -0700	[thread overview]
Message-ID: <20140331174018.GC4756@lvm> (raw)
In-Reply-To: <1396262773-7723-12-git-send-email-anup.patel@linaro.org>

On Mon, Mar 31, 2014 at 04:16:12PM +0530, Anup Patel wrote:
> This patch adds emulation of PSCI v0.2 CPU_SUSPEND function call for
> KVM ARM/ARM64. This is a CPU-level function call which can suspend
> current CPU or current CPU cluster. We don't have VCPU clusters in
> KVM so for KVM we simply suspend the current VCPU.
> 
> The CPU_SUSPEND emulation is not tested much because currently there
> is no CPUIDLE driver in Linux kernel that uses PSCI CPU_SUSPEND. The
> PSCI CPU_SUSPEND implementation in ARM64 kernel was tested using a
> Simple CPUIDLE driver which is not published due to unstable DT-bindings
> for PSCI.
> (For more info, http://lwn.net/Articles/574950/)
> 
> Even if we had stable DT-bindings for PSCI and CPUIDLE driver that
> uses PSCI CPU_SUSPEND then still we need to define SUSPEND states
> and WAKEUP events for KVM ARM/ARM64.
> 
> Due to this, we implement CPU_SUSPEND emulation similar to WFI
> (Wait-for-interrupt) emulation.
> 
> Signed-off-by: Anup Patel <anup.patel@linaro.org>
> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
> ---
>  arch/arm/kvm/psci.c |   29 +++++++++++++++++++++++++----
>  1 file changed, 25 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c
> index 85bf896..f414fd3 100644
> --- a/arch/arm/kvm/psci.c
> +++ b/arch/arm/kvm/psci.c
> @@ -52,6 +52,27 @@ static unsigned long psci_affinity_mask(unsigned long affinity_level)
>  	return affinity_mask;
>  }
>  
> +static unsigned long kvm_psci_vcpu_suspend(struct kvm_vcpu *vcpu)
> +{
> +	/*
> +	 * NOTE: Currently, we don't have any wakeup events for KVM
> +	 * so for simplicity we make VCPU suspend emulation same-as
> +	 * WFI (Wait-for-interrupt) emulation.

If you implement it like WFI, we do have wake-up events: Namely
interrupts.

> +	 *
> +	 * To do this we simply update VCPU registers as-per state
> +	 * info provided via r1 - r3 (or x1 - x3) and block the
> +	 * VCPU for irqs.
> +	 */
> +	if (*vcpu_reg(vcpu, 1) & (0x1UL << 16)) {
> +		/* Update return pc and r0 for power-down state. */
> +		*vcpu_pc(vcpu) = *vcpu_reg(vcpu, 2);
> +		*vcpu_reg(vcpu, 0) = *vcpu_reg(vcpu, 3);
> +	}


Hmm, this looks wrong.  This looks like you're respecting the power-down
state request but not resetting the CPU.  What I was saying before was
that if you implement this as kvm_vcpu_block(), just like WFI, then you
need to preserve all state, ignore power-down state requests and treat
them as suspend states, implement them as WFI, and put a big fat comment
here explaining why this is architecturally valid (by referring to the
PSCI 0.2 spec) and what the semantics of doing that is.

-Christoffer


> +	kvm_vcpu_block(vcpu);
> +
> +	return PSCI_RET_SUCCESS;
> +}
> +
>  static void kvm_psci_vcpu_off(struct kvm_vcpu *vcpu)
>  {
>  	vcpu->arch.pause = true;
> @@ -195,6 +216,10 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
>  		 */
>  		val = 2;
>  		break;
> +	case PSCI_0_2_FN_CPU_SUSPEND:
> +	case PSCI_0_2_FN64_CPU_SUSPEND:
> +		val = kvm_psci_vcpu_suspend(vcpu);
> +		break;
>  	case PSCI_0_2_FN_CPU_OFF:
>  		kvm_psci_vcpu_off(vcpu);
>  		val = PSCI_RET_SUCCESS;
> @@ -232,10 +257,6 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
>  		val = PSCI_RET_SUCCESS;
>  		ret = 0;
>  		break;
> -	case PSCI_0_2_FN_CPU_SUSPEND:
> -	case PSCI_0_2_FN64_CPU_SUSPEND:
> -		val = PSCI_RET_NOT_SUPPORTED;
> -		break;
>  	default:
>  		return -EINVAL;
>  	}
> -- 
> 1.7.9.5
> 

  reply	other threads:[~2014-03-31 17:40 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-31 10:46 [PATCH v6 00/12] In-kernel PSCI v0.2 emulation for KVM ARM/ARM64 Anup Patel
2014-03-31 10:46 ` [PATCH v6 01/12] KVM: Add capability to advertise PSCI v0.2 support Anup Patel
2014-03-31 10:46 ` [PATCH v6 02/12] ARM/ARM64: KVM: Add common header for PSCI related defines Anup Patel
2014-03-31 18:07   ` Christoffer Dall
2014-03-31 18:18     ` Ashwin Chaugule
2014-03-31 18:36       ` Christoffer Dall
2014-03-31 19:26         ` Ashwin Chaugule
2014-03-31 19:43           ` Ashwin Chaugule
2014-04-01  4:11             ` Anup Patel
2014-04-02  4:22   ` Rob Herring
2014-04-02  4:31     ` Anup Patel
2014-04-02  5:00       ` Anup Patel
2014-03-31 10:46 ` [PATCH v6 03/12] ARM/ARM64: KVM: Add base for PSCI v0.2 emulation Anup Patel
2014-03-31 18:14   ` Christoffer Dall
2014-03-31 10:46 ` [PATCH v6 04/12] KVM: Documentation: Add info regarding KVM_ARM_VCPU_PSCI_0_2 feature Anup Patel
2014-03-31 10:46 ` [PATCH v6 05/12] ARM/ARM64: KVM: Make kvm_psci_call() return convention more flexible Anup Patel
2014-03-31 10:46 ` [PATCH v6 06/12] KVM: Add KVM_EXIT_SYSTEM_EVENT to user space API header Anup Patel
2014-03-31 10:46 ` [PATCH v6 07/12] ARM/ARM64: KVM: Emulate PSCI v0.2 SYSTEM_OFF and SYSTEM_RESET Anup Patel
2014-03-31 10:46 ` [PATCH v6 08/12] ARM/ARM64: KVM: Emulate PSCI v0.2 AFFINITY_INFO Anup Patel
2014-03-31 10:46 ` [PATCH v6 09/12] ARM/ARM64: KVM: Emulate PSCI v0.2 MIGRATE_INFO_TYPE and related functions Anup Patel
2014-03-31 10:46 ` [PATCH v6 10/12] ARM/ARM64: KVM: Fix CPU_ON emulation for PSCI v0.2 Anup Patel
2014-03-31 10:46 ` [PATCH v6 11/12] ARM/ARM64: KVM: Emulate PSCI v0.2 CPU_SUSPEND Anup Patel
2014-03-31 17:40   ` Christoffer Dall [this message]
2014-04-01  5:14     ` Anup Patel
2014-03-31 10:46 ` [PATCH v6 12/12] ARM/ARM64: KVM: Advertise KVM_CAP_ARM_PSCI_0_2 to user space Anup Patel

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=20140331174018.GC4756@lvm \
    --to=christoffer.dall@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.