1aa8794b1SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */ 2aa8794b1SJanosch Frank /* 3aa8794b1SJanosch Frank * Ultravisor related functionality 4aa8794b1SJanosch Frank * 5aa8794b1SJanosch Frank * Copyright 2020 IBM Corp. 6aa8794b1SJanosch Frank * 7aa8794b1SJanosch Frank * Authors: 8aa8794b1SJanosch Frank * Janosch Frank <frankja@linux.ibm.com> 9aa8794b1SJanosch 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 52*78168306SJanosch Frank uv_call(0, (u64)&uvcb_qui); 53*78168306SJanosch Frank 54*78168306SJanosch Frank assert(uvcb_qui.header.rc == 1 || uvcb_qui.header.rc == 0x100); 5507ac63dcSJanosch Frank return 1; 5607ac63dcSJanosch Frank } 57