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 Bonzinivoid 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 Bonzinivoid 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