xref: /openbmc/linux/arch/powerpc/kvm/book3s_hv_hmi.c (revision 9c5a432a)
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 
wait_for_subcore_guest_exit(void)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
23*9c5a432aSNicholas Piggin 	 * been loaded yet and hence no guests are running, or running
24*9c5a432aSNicholas Piggin 	 * on POWER9 or newer CPU.
25*9c5a432aSNicholas Piggin 	 *
267c379526SPaolo Bonzini 	 * If no KVM is in use, no need to co-ordinate among threads
277c379526SPaolo Bonzini 	 * as all of them will always be in host and no one is going
287c379526SPaolo Bonzini 	 * to modify TB other than the opal hmi handler.
29*9c5a432aSNicholas Piggin 	 *
30*9c5a432aSNicholas Piggin 	 * POWER9 and newer don't need this synchronisation.
31*9c5a432aSNicholas Piggin 	 *
327c379526SPaolo Bonzini 	 * Hence, just return from here.
337c379526SPaolo Bonzini 	 */
347c379526SPaolo Bonzini 	if (!local_paca->sibling_subcore_state)
357c379526SPaolo Bonzini 		return;
367c379526SPaolo Bonzini 
377c379526SPaolo Bonzini 	for (i = 0; i < MAX_SUBCORE_PER_CORE; i++)
387c379526SPaolo Bonzini 		while (local_paca->sibling_subcore_state->in_guest[i])
397c379526SPaolo Bonzini 			cpu_relax();
407c379526SPaolo Bonzini }
417c379526SPaolo Bonzini 
wait_for_tb_resync(void)427c379526SPaolo Bonzini void wait_for_tb_resync(void)
437c379526SPaolo Bonzini {
447c379526SPaolo Bonzini 	if (!local_paca->sibling_subcore_state)
457c379526SPaolo Bonzini 		return;
467c379526SPaolo Bonzini 
477c379526SPaolo Bonzini 	while (test_bit(CORE_TB_RESYNC_REQ_BIT,
487c379526SPaolo Bonzini 				&local_paca->sibling_subcore_state->flags))
497c379526SPaolo Bonzini 		cpu_relax();
507c379526SPaolo Bonzini }
51