1*aa8794b1SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */ 2*aa8794b1SJanosch Frank /* 3*aa8794b1SJanosch Frank * Ultravisor related functionality 4*aa8794b1SJanosch Frank * 5*aa8794b1SJanosch Frank * Copyright 2020 IBM Corp. 6*aa8794b1SJanosch Frank * 7*aa8794b1SJanosch Frank * Authors: 8*aa8794b1SJanosch Frank * Janosch Frank <frankja@linux.ibm.com> 9*aa8794b1SJanosch Frank */ 1007ac63dcSJanosch Frank #include <libcflat.h> 1107ac63dcSJanosch Frank #include <bitops.h> 1207ac63dcSJanosch Frank #include <alloc.h> 1307ac63dcSJanosch Frank #include <alloc_page.h> 1407ac63dcSJanosch Frank #include <asm/page.h> 1507ac63dcSJanosch Frank #include <asm/arch_def.h> 1607ac63dcSJanosch Frank 1707ac63dcSJanosch Frank #include <asm/facility.h> 1807ac63dcSJanosch Frank #include <asm/uv.h> 1907ac63dcSJanosch Frank #include <uv.h> 2007ac63dcSJanosch Frank 2107ac63dcSJanosch Frank static struct uv_cb_qui uvcb_qui = { 2207ac63dcSJanosch Frank .header.cmd = UVC_CMD_QUI, 2307ac63dcSJanosch Frank .header.len = sizeof(uvcb_qui), 2407ac63dcSJanosch Frank }; 2507ac63dcSJanosch Frank 2607ac63dcSJanosch Frank bool uv_os_is_guest(void) 2707ac63dcSJanosch Frank { 2807ac63dcSJanosch Frank return test_facility(158) && 2907ac63dcSJanosch Frank uv_query_test_call(BIT_UVC_CMD_SET_SHARED_ACCESS) && 3007ac63dcSJanosch Frank uv_query_test_call(BIT_UVC_CMD_REMOVE_SHARED_ACCESS); 3107ac63dcSJanosch Frank } 3207ac63dcSJanosch Frank 3307ac63dcSJanosch Frank bool uv_os_is_host(void) 3407ac63dcSJanosch Frank { 3507ac63dcSJanosch Frank return test_facility(158) && uv_query_test_call(BIT_UVC_CMD_INIT_UV); 3607ac63dcSJanosch Frank } 3707ac63dcSJanosch Frank 3807ac63dcSJanosch Frank bool uv_query_test_call(unsigned int nr) 3907ac63dcSJanosch Frank { 4007ac63dcSJanosch Frank /* Query needs to be called first */ 4107ac63dcSJanosch Frank assert(uvcb_qui.header.rc); 4207ac63dcSJanosch Frank assert(nr < BITS_PER_LONG * ARRAY_SIZE(uvcb_qui.inst_calls_list)); 4307ac63dcSJanosch Frank 4407ac63dcSJanosch Frank return test_bit_inv(nr, uvcb_qui.inst_calls_list); 4507ac63dcSJanosch Frank } 4607ac63dcSJanosch Frank 4707ac63dcSJanosch Frank int uv_setup(void) 4807ac63dcSJanosch Frank { 4907ac63dcSJanosch Frank if (!test_facility(158)) 5007ac63dcSJanosch Frank return 0; 5107ac63dcSJanosch Frank 5207ac63dcSJanosch Frank assert(!uv_call(0, (u64)&uvcb_qui)); 5307ac63dcSJanosch Frank return 1; 5407ac63dcSJanosch Frank } 55