18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice (including the next 128c2ecf20Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the 138c2ecf20Sopenharmony_ci * Software. 148c2ecf20Sopenharmony_ci * 158c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 168c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 178c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 188c2ecf20Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 198c2ecf20Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 208c2ecf20Sopenharmony_ci * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 218c2ecf20Sopenharmony_ci * SOFTWARE. 228c2ecf20Sopenharmony_ci * 238c2ecf20Sopenharmony_ci * Authors: 248c2ecf20Sopenharmony_ci * Eddie Dong <eddie.dong@intel.com> 258c2ecf20Sopenharmony_ci * Dexuan Cui 268c2ecf20Sopenharmony_ci * Jike Song <jike.song@intel.com> 278c2ecf20Sopenharmony_ci * 288c2ecf20Sopenharmony_ci * Contributors: 298c2ecf20Sopenharmony_ci * Zhi Wang <zhi.a.wang@intel.com> 308c2ecf20Sopenharmony_ci * 318c2ecf20Sopenharmony_ci */ 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#ifndef _GVT_MPT_H_ 348c2ecf20Sopenharmony_ci#define _GVT_MPT_H_ 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/** 378c2ecf20Sopenharmony_ci * DOC: Hypervisor Service APIs for GVT-g Core Logic 388c2ecf20Sopenharmony_ci * 398c2ecf20Sopenharmony_ci * This is the glue layer between specific hypervisor MPT modules and GVT-g core 408c2ecf20Sopenharmony_ci * logic. Each kind of hypervisor MPT module provides a collection of function 418c2ecf20Sopenharmony_ci * callbacks and will be attached to GVT host when the driver is loading. 428c2ecf20Sopenharmony_ci * GVT-g core logic will call these APIs to request specific services from 438c2ecf20Sopenharmony_ci * hypervisor. 448c2ecf20Sopenharmony_ci */ 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci/** 478c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_host_init - init GVT-g host side 488c2ecf20Sopenharmony_ci * 498c2ecf20Sopenharmony_ci * Returns: 508c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed 518c2ecf20Sopenharmony_ci */ 528c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_host_init(struct device *dev, 538c2ecf20Sopenharmony_ci void *gvt, const void *ops) 548c2ecf20Sopenharmony_ci{ 558c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->host_init) 568c2ecf20Sopenharmony_ci return -ENODEV; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->host_init(dev, gvt, ops); 598c2ecf20Sopenharmony_ci} 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/** 628c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_host_exit - exit GVT-g host side 638c2ecf20Sopenharmony_ci */ 648c2ecf20Sopenharmony_cistatic inline void intel_gvt_hypervisor_host_exit(struct device *dev) 658c2ecf20Sopenharmony_ci{ 668c2ecf20Sopenharmony_ci /* optional to provide */ 678c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->host_exit) 688c2ecf20Sopenharmony_ci return; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci intel_gvt_host.mpt->host_exit(dev); 718c2ecf20Sopenharmony_ci} 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci/** 748c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_attach_vgpu - call hypervisor to initialize vGPU 758c2ecf20Sopenharmony_ci * related stuffs inside hypervisor. 768c2ecf20Sopenharmony_ci * 778c2ecf20Sopenharmony_ci * Returns: 788c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 798c2ecf20Sopenharmony_ci */ 808c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_attach_vgpu(struct intel_vgpu *vgpu) 818c2ecf20Sopenharmony_ci{ 828c2ecf20Sopenharmony_ci /* optional to provide */ 838c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->attach_vgpu) 848c2ecf20Sopenharmony_ci return 0; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->attach_vgpu(vgpu, &vgpu->handle); 878c2ecf20Sopenharmony_ci} 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci/** 908c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_detach_vgpu - call hypervisor to release vGPU 918c2ecf20Sopenharmony_ci * related stuffs inside hypervisor. 928c2ecf20Sopenharmony_ci * 938c2ecf20Sopenharmony_ci * Returns: 948c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 958c2ecf20Sopenharmony_ci */ 968c2ecf20Sopenharmony_cistatic inline void intel_gvt_hypervisor_detach_vgpu(struct intel_vgpu *vgpu) 978c2ecf20Sopenharmony_ci{ 988c2ecf20Sopenharmony_ci /* optional to provide */ 998c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->detach_vgpu) 1008c2ecf20Sopenharmony_ci return; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci intel_gvt_host.mpt->detach_vgpu(vgpu); 1038c2ecf20Sopenharmony_ci} 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#define MSI_CAP_CONTROL(offset) (offset + 2) 1068c2ecf20Sopenharmony_ci#define MSI_CAP_ADDRESS(offset) (offset + 4) 1078c2ecf20Sopenharmony_ci#define MSI_CAP_DATA(offset) (offset + 8) 1088c2ecf20Sopenharmony_ci#define MSI_CAP_EN 0x1 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/** 1118c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_inject_msi - inject a MSI interrupt into vGPU 1128c2ecf20Sopenharmony_ci * 1138c2ecf20Sopenharmony_ci * Returns: 1148c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 1158c2ecf20Sopenharmony_ci */ 1168c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_inject_msi(struct intel_vgpu *vgpu) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci unsigned long offset = vgpu->gvt->device_info.msi_cap_offset; 1198c2ecf20Sopenharmony_ci u16 control, data; 1208c2ecf20Sopenharmony_ci u32 addr; 1218c2ecf20Sopenharmony_ci int ret; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci control = *(u16 *)(vgpu_cfg_space(vgpu) + MSI_CAP_CONTROL(offset)); 1248c2ecf20Sopenharmony_ci addr = *(u32 *)(vgpu_cfg_space(vgpu) + MSI_CAP_ADDRESS(offset)); 1258c2ecf20Sopenharmony_ci data = *(u16 *)(vgpu_cfg_space(vgpu) + MSI_CAP_DATA(offset)); 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci /* Do not generate MSI if MSIEN is disable */ 1288c2ecf20Sopenharmony_ci if (!(control & MSI_CAP_EN)) 1298c2ecf20Sopenharmony_ci return 0; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci if (WARN(control & GENMASK(15, 1), "only support one MSI format\n")) 1328c2ecf20Sopenharmony_ci return -EINVAL; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci trace_inject_msi(vgpu->id, addr, data); 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci ret = intel_gvt_host.mpt->inject_msi(vgpu->handle, addr, data); 1378c2ecf20Sopenharmony_ci if (ret) 1388c2ecf20Sopenharmony_ci return ret; 1398c2ecf20Sopenharmony_ci return 0; 1408c2ecf20Sopenharmony_ci} 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci/** 1438c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_set_wp_page - translate a host VA into MFN 1448c2ecf20Sopenharmony_ci * @p: host kernel virtual address 1458c2ecf20Sopenharmony_ci * 1468c2ecf20Sopenharmony_ci * Returns: 1478c2ecf20Sopenharmony_ci * MFN on success, INTEL_GVT_INVALID_ADDR if failed. 1488c2ecf20Sopenharmony_ci */ 1498c2ecf20Sopenharmony_cistatic inline unsigned long intel_gvt_hypervisor_virt_to_mfn(void *p) 1508c2ecf20Sopenharmony_ci{ 1518c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->from_virt_to_mfn(p); 1528c2ecf20Sopenharmony_ci} 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci/** 1558c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_enable_page_track - track a guest page 1568c2ecf20Sopenharmony_ci * @vgpu: a vGPU 1578c2ecf20Sopenharmony_ci * @gfn: the gfn of guest 1588c2ecf20Sopenharmony_ci * 1598c2ecf20Sopenharmony_ci * Returns: 1608c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 1618c2ecf20Sopenharmony_ci */ 1628c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_enable_page_track( 1638c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, unsigned long gfn) 1648c2ecf20Sopenharmony_ci{ 1658c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->enable_page_track(vgpu->handle, gfn); 1668c2ecf20Sopenharmony_ci} 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci/** 1698c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_disable_page_track - untrack a guest page 1708c2ecf20Sopenharmony_ci * @vgpu: a vGPU 1718c2ecf20Sopenharmony_ci * @gfn: the gfn of guest 1728c2ecf20Sopenharmony_ci * 1738c2ecf20Sopenharmony_ci * Returns: 1748c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 1758c2ecf20Sopenharmony_ci */ 1768c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_disable_page_track( 1778c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, unsigned long gfn) 1788c2ecf20Sopenharmony_ci{ 1798c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->disable_page_track(vgpu->handle, gfn); 1808c2ecf20Sopenharmony_ci} 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci/** 1838c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_read_gpa - copy data from GPA to host data buffer 1848c2ecf20Sopenharmony_ci * @vgpu: a vGPU 1858c2ecf20Sopenharmony_ci * @gpa: guest physical address 1868c2ecf20Sopenharmony_ci * @buf: host data buffer 1878c2ecf20Sopenharmony_ci * @len: data length 1888c2ecf20Sopenharmony_ci * 1898c2ecf20Sopenharmony_ci * Returns: 1908c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 1918c2ecf20Sopenharmony_ci */ 1928c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_read_gpa(struct intel_vgpu *vgpu, 1938c2ecf20Sopenharmony_ci unsigned long gpa, void *buf, unsigned long len) 1948c2ecf20Sopenharmony_ci{ 1958c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->read_gpa(vgpu->handle, gpa, buf, len); 1968c2ecf20Sopenharmony_ci} 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci/** 1998c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_write_gpa - copy data from host data buffer to GPA 2008c2ecf20Sopenharmony_ci * @vgpu: a vGPU 2018c2ecf20Sopenharmony_ci * @gpa: guest physical address 2028c2ecf20Sopenharmony_ci * @buf: host data buffer 2038c2ecf20Sopenharmony_ci * @len: data length 2048c2ecf20Sopenharmony_ci * 2058c2ecf20Sopenharmony_ci * Returns: 2068c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 2078c2ecf20Sopenharmony_ci */ 2088c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_write_gpa(struct intel_vgpu *vgpu, 2098c2ecf20Sopenharmony_ci unsigned long gpa, void *buf, unsigned long len) 2108c2ecf20Sopenharmony_ci{ 2118c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->write_gpa(vgpu->handle, gpa, buf, len); 2128c2ecf20Sopenharmony_ci} 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci/** 2158c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_gfn_to_mfn - translate a GFN to MFN 2168c2ecf20Sopenharmony_ci * @vgpu: a vGPU 2178c2ecf20Sopenharmony_ci * @gpfn: guest pfn 2188c2ecf20Sopenharmony_ci * 2198c2ecf20Sopenharmony_ci * Returns: 2208c2ecf20Sopenharmony_ci * MFN on success, INTEL_GVT_INVALID_ADDR if failed. 2218c2ecf20Sopenharmony_ci */ 2228c2ecf20Sopenharmony_cistatic inline unsigned long intel_gvt_hypervisor_gfn_to_mfn( 2238c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, unsigned long gfn) 2248c2ecf20Sopenharmony_ci{ 2258c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->gfn_to_mfn(vgpu->handle, gfn); 2268c2ecf20Sopenharmony_ci} 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci/** 2298c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_dma_map_guest_page - setup dma map for guest page 2308c2ecf20Sopenharmony_ci * @vgpu: a vGPU 2318c2ecf20Sopenharmony_ci * @gfn: guest pfn 2328c2ecf20Sopenharmony_ci * @size: page size 2338c2ecf20Sopenharmony_ci * @dma_addr: retrieve allocated dma addr 2348c2ecf20Sopenharmony_ci * 2358c2ecf20Sopenharmony_ci * Returns: 2368c2ecf20Sopenharmony_ci * 0 on success, negative error code if failed. 2378c2ecf20Sopenharmony_ci */ 2388c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_dma_map_guest_page( 2398c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, unsigned long gfn, unsigned long size, 2408c2ecf20Sopenharmony_ci dma_addr_t *dma_addr) 2418c2ecf20Sopenharmony_ci{ 2428c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->dma_map_guest_page(vgpu->handle, gfn, size, 2438c2ecf20Sopenharmony_ci dma_addr); 2448c2ecf20Sopenharmony_ci} 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci/** 2478c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_dma_unmap_guest_page - cancel dma map for guest page 2488c2ecf20Sopenharmony_ci * @vgpu: a vGPU 2498c2ecf20Sopenharmony_ci * @dma_addr: the mapped dma addr 2508c2ecf20Sopenharmony_ci */ 2518c2ecf20Sopenharmony_cistatic inline void intel_gvt_hypervisor_dma_unmap_guest_page( 2528c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, dma_addr_t dma_addr) 2538c2ecf20Sopenharmony_ci{ 2548c2ecf20Sopenharmony_ci intel_gvt_host.mpt->dma_unmap_guest_page(vgpu->handle, dma_addr); 2558c2ecf20Sopenharmony_ci} 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci/** 2588c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_dma_pin_guest_page - pin guest dma buf 2598c2ecf20Sopenharmony_ci * @vgpu: a vGPU 2608c2ecf20Sopenharmony_ci * @dma_addr: guest dma addr 2618c2ecf20Sopenharmony_ci * 2628c2ecf20Sopenharmony_ci * Returns: 2638c2ecf20Sopenharmony_ci * 0 on success, negative error code if failed. 2648c2ecf20Sopenharmony_ci */ 2658c2ecf20Sopenharmony_cistatic inline int 2668c2ecf20Sopenharmony_ciintel_gvt_hypervisor_dma_pin_guest_page(struct intel_vgpu *vgpu, 2678c2ecf20Sopenharmony_ci dma_addr_t dma_addr) 2688c2ecf20Sopenharmony_ci{ 2698c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->dma_pin_guest_page(vgpu->handle, dma_addr); 2708c2ecf20Sopenharmony_ci} 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci/** 2738c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_map_gfn_to_mfn - map a GFN region to MFN 2748c2ecf20Sopenharmony_ci * @vgpu: a vGPU 2758c2ecf20Sopenharmony_ci * @gfn: guest PFN 2768c2ecf20Sopenharmony_ci * @mfn: host PFN 2778c2ecf20Sopenharmony_ci * @nr: amount of PFNs 2788c2ecf20Sopenharmony_ci * @map: map or unmap 2798c2ecf20Sopenharmony_ci * 2808c2ecf20Sopenharmony_ci * Returns: 2818c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 2828c2ecf20Sopenharmony_ci */ 2838c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_map_gfn_to_mfn( 2848c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, unsigned long gfn, 2858c2ecf20Sopenharmony_ci unsigned long mfn, unsigned int nr, 2868c2ecf20Sopenharmony_ci bool map) 2878c2ecf20Sopenharmony_ci{ 2888c2ecf20Sopenharmony_ci /* a MPT implementation could have MMIO mapped elsewhere */ 2898c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->map_gfn_to_mfn) 2908c2ecf20Sopenharmony_ci return 0; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->map_gfn_to_mfn(vgpu->handle, gfn, mfn, nr, 2938c2ecf20Sopenharmony_ci map); 2948c2ecf20Sopenharmony_ci} 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci/** 2978c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_set_trap_area - Trap a guest PA region 2988c2ecf20Sopenharmony_ci * @vgpu: a vGPU 2998c2ecf20Sopenharmony_ci * @start: the beginning of the guest physical address region 3008c2ecf20Sopenharmony_ci * @end: the end of the guest physical address region 3018c2ecf20Sopenharmony_ci * @map: map or unmap 3028c2ecf20Sopenharmony_ci * 3038c2ecf20Sopenharmony_ci * Returns: 3048c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 3058c2ecf20Sopenharmony_ci */ 3068c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_set_trap_area( 3078c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, u64 start, u64 end, bool map) 3088c2ecf20Sopenharmony_ci{ 3098c2ecf20Sopenharmony_ci /* a MPT implementation could have MMIO trapped elsewhere */ 3108c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->set_trap_area) 3118c2ecf20Sopenharmony_ci return 0; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->set_trap_area(vgpu->handle, start, end, map); 3148c2ecf20Sopenharmony_ci} 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci/** 3178c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_set_opregion - Set opregion for guest 3188c2ecf20Sopenharmony_ci * @vgpu: a vGPU 3198c2ecf20Sopenharmony_ci * 3208c2ecf20Sopenharmony_ci * Returns: 3218c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 3228c2ecf20Sopenharmony_ci */ 3238c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_set_opregion(struct intel_vgpu *vgpu) 3248c2ecf20Sopenharmony_ci{ 3258c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->set_opregion) 3268c2ecf20Sopenharmony_ci return 0; 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->set_opregion(vgpu); 3298c2ecf20Sopenharmony_ci} 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci/** 3328c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_set_edid - Set EDID region for guest 3338c2ecf20Sopenharmony_ci * @vgpu: a vGPU 3348c2ecf20Sopenharmony_ci * @port_num: display port number 3358c2ecf20Sopenharmony_ci * 3368c2ecf20Sopenharmony_ci * Returns: 3378c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 3388c2ecf20Sopenharmony_ci */ 3398c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_set_edid(struct intel_vgpu *vgpu, 3408c2ecf20Sopenharmony_ci int port_num) 3418c2ecf20Sopenharmony_ci{ 3428c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->set_edid) 3438c2ecf20Sopenharmony_ci return 0; 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->set_edid(vgpu, port_num); 3468c2ecf20Sopenharmony_ci} 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci/** 3498c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_get_vfio_device - increase vfio device ref count 3508c2ecf20Sopenharmony_ci * @vgpu: a vGPU 3518c2ecf20Sopenharmony_ci * 3528c2ecf20Sopenharmony_ci * Returns: 3538c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 3548c2ecf20Sopenharmony_ci */ 3558c2ecf20Sopenharmony_cistatic inline int intel_gvt_hypervisor_get_vfio_device(struct intel_vgpu *vgpu) 3568c2ecf20Sopenharmony_ci{ 3578c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->get_vfio_device) 3588c2ecf20Sopenharmony_ci return 0; 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->get_vfio_device(vgpu); 3618c2ecf20Sopenharmony_ci} 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci/** 3648c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_put_vfio_device - decrease vfio device ref count 3658c2ecf20Sopenharmony_ci * @vgpu: a vGPU 3668c2ecf20Sopenharmony_ci * 3678c2ecf20Sopenharmony_ci * Returns: 3688c2ecf20Sopenharmony_ci * Zero on success, negative error code if failed. 3698c2ecf20Sopenharmony_ci */ 3708c2ecf20Sopenharmony_cistatic inline void intel_gvt_hypervisor_put_vfio_device(struct intel_vgpu *vgpu) 3718c2ecf20Sopenharmony_ci{ 3728c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->put_vfio_device) 3738c2ecf20Sopenharmony_ci return; 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci intel_gvt_host.mpt->put_vfio_device(vgpu); 3768c2ecf20Sopenharmony_ci} 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci/** 3798c2ecf20Sopenharmony_ci * intel_gvt_hypervisor_is_valid_gfn - check if a visible gfn 3808c2ecf20Sopenharmony_ci * @vgpu: a vGPU 3818c2ecf20Sopenharmony_ci * @gfn: guest PFN 3828c2ecf20Sopenharmony_ci * 3838c2ecf20Sopenharmony_ci * Returns: 3848c2ecf20Sopenharmony_ci * true on valid gfn, false on not. 3858c2ecf20Sopenharmony_ci */ 3868c2ecf20Sopenharmony_cistatic inline bool intel_gvt_hypervisor_is_valid_gfn( 3878c2ecf20Sopenharmony_ci struct intel_vgpu *vgpu, unsigned long gfn) 3888c2ecf20Sopenharmony_ci{ 3898c2ecf20Sopenharmony_ci if (!intel_gvt_host.mpt->is_valid_gfn) 3908c2ecf20Sopenharmony_ci return true; 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci return intel_gvt_host.mpt->is_valid_gfn(vgpu->handle, gfn); 3938c2ecf20Sopenharmony_ci} 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ciint intel_gvt_register_hypervisor(struct intel_gvt_mpt *); 3968c2ecf20Sopenharmony_civoid intel_gvt_unregister_hypervisor(void); 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ci#endif /* _GVT_MPT_H_ */ 399