Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1fcf7ce0 authored by Lorenzo Pieralisi's avatar Lorenzo Pieralisi
Browse files

arm: kvm: implement CPU PM notifier



Upon CPU shutdown and consequent warm-reboot, the hypervisor CPU state
must be re-initialized. This patch implements a CPU PM notifier that
upon warm-boot calls a KVM hook to reinitialize properly the hypervisor
state so that the CPU can be safely resumed.

Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Acked-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
parent fb1ab1ab
Loading
Loading
Loading
Loading
+30 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
 */
 */


#include <linux/cpu.h>
#include <linux/cpu.h>
#include <linux/cpu_pm.h>
#include <linux/errno.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <linux/err.h>
#include <linux/kvm_host.h>
#include <linux/kvm_host.h>
@@ -853,6 +854,33 @@ static struct notifier_block hyp_init_cpu_nb = {
	.notifier_call = hyp_init_cpu_notify,
	.notifier_call = hyp_init_cpu_notify,
};
};


#ifdef CONFIG_CPU_PM
static int hyp_init_cpu_pm_notifier(struct notifier_block *self,
				    unsigned long cmd,
				    void *v)
{
	if (cmd == CPU_PM_EXIT) {
		cpu_init_hyp_mode(NULL);
		return NOTIFY_OK;
	}

	return NOTIFY_DONE;
}

static struct notifier_block hyp_init_cpu_pm_nb = {
	.notifier_call = hyp_init_cpu_pm_notifier,
};

static void __init hyp_cpu_pm_init(void)
{
	cpu_pm_register_notifier(&hyp_init_cpu_pm_nb);
}
#else
static inline void hyp_cpu_pm_init(void)
{
}
#endif

/**
/**
 * Inits Hyp-mode on all online CPUs
 * Inits Hyp-mode on all online CPUs
 */
 */
@@ -1013,6 +1041,8 @@ int kvm_arch_init(void *opaque)
		goto out_err;
		goto out_err;
	}
	}


	hyp_cpu_pm_init();

	kvm_coproc_table_init();
	kvm_coproc_table_init();
	return 0;
	return 0;
out_err:
out_err: