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