xref: /openbmc/linux/arch/powerpc/kvm/book3s_hv_hmi.c (revision d5bb994b)
1d5bb994bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
27c379526SPaolo Bonzini /*
37c379526SPaolo Bonzini  * Hypervisor Maintenance Interrupt (HMI) handling.
47c379526SPaolo Bonzini  *
57c379526SPaolo Bonzini  * Copyright 2015 IBM Corporation
67c379526SPaolo Bonzini  * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
77c379526SPaolo Bonzini  */
87c379526SPaolo Bonzini 
97c379526SPaolo Bonzini #undef DEBUG
107c379526SPaolo Bonzini 
117c379526SPaolo Bonzini #include <linux/types.h>
127c379526SPaolo Bonzini #include <linux/compiler.h>
137c379526SPaolo Bonzini #include <asm/paca.h>
147c379526SPaolo Bonzini #include <asm/hmi.h>
1592ab45c5SChristophe Leroy #include <asm/processor.h>
167c379526SPaolo Bonzini 
177c379526SPaolo Bonzini void wait_for_subcore_guest_exit(void)
187c379526SPaolo Bonzini {
197c379526SPaolo Bonzini 	int i;
207c379526SPaolo Bonzini 
217c379526SPaolo Bonzini 	/*
227c379526SPaolo Bonzini 	 * NULL bitmap pointer indicates that KVM module hasn't
237c379526SPaolo Bonzini 	 * been loaded yet and hence no guests are running.
247c379526SPaolo Bonzini 	 * If no KVM is in use, no need to co-ordinate among threads
257c379526SPaolo Bonzini 	 * as all of them will always be in host and no one is going
267c379526SPaolo Bonzini 	 * to modify TB other than the opal hmi handler.
277c379526SPaolo Bonzini 	 * Hence, just return from here.
287c379526SPaolo Bonzini 	 */
297c379526SPaolo Bonzini 	if (!local_paca->sibling_subcore_state)
307c379526SPaolo Bonzini 		return;
317c379526SPaolo Bonzini 
327c379526SPaolo Bonzini 	for (i = 0; i < MAX_SUBCORE_PER_CORE; i++)
337c379526SPaolo Bonzini 		while (local_paca->sibling_subcore_state->in_guest[i])
347c379526SPaolo Bonzini 			cpu_relax();
357c379526SPaolo Bonzini }
367c379526SPaolo Bonzini 
377c379526SPaolo Bonzini void wait_for_tb_resync(void)
387c379526SPaolo Bonzini {
397c379526SPaolo Bonzini 	if (!local_paca->sibling_subcore_state)
407c379526SPaolo Bonzini 		return;
417c379526SPaolo Bonzini 
427c379526SPaolo Bonzini 	while (test_bit(CORE_TB_RESYNC_REQ_BIT,
437c379526SPaolo Bonzini 				&local_paca->sibling_subcore_state->flags))
447c379526SPaolo Bonzini 		cpu_relax();
457c379526SPaolo Bonzini }
46