243 lines
8.3 KiB
ReStructuredText
243 lines
8.3 KiB
ReStructuredText
.. _GVT-g_api:
|
|
|
|
ACRN GVT-g APIs
|
|
###############
|
|
|
|
GVT-g is Intel's open source GPU virtualization solution and is up-streamed to
|
|
the Linux kernel. Its implementation over KVM is named KVMGT, over Xen it is
|
|
named XenGT, and over ACRN it is named AcrnGT. GVT-g can exports multiple
|
|
virtual GPU (vGPU) instances for virtual machine system (VM). A VM could be
|
|
assigned one vGPU instance. The guest OS graphic driver needs minor
|
|
modification to drive the vGPU adapter in a VM. Every vGPU instance will adopt
|
|
the full HW GPU's accelerate capability for 3D render and display.
|
|
|
|
In the following document, AcrnGT refers to the glue layer between ACRN
|
|
hypervisor and GVT-g core device model. It works as the agent of
|
|
hypervisor-related services. It is the only layer that needs to get rewritten
|
|
when porting GVT-g to another hypervisor. For simplicity, in the rest of this
|
|
document, GVT is used to refer to the core device model component of GVT-g,
|
|
specifically corresponding to ``gvt.ko`` when built as a module.
|
|
|
|
Core Driver Infrastructure
|
|
**************************
|
|
|
|
This section covers core driver infrastructure API used by both the display
|
|
and the `Graphics Execution Manager(GEM)`_ parts of `i915 driver`_.
|
|
|
|
.. _Graphics Execution Manager(GEM): https://lwn.net/Articles/283798/
|
|
|
|
.. _i915 driver: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html
|
|
|
|
Intel GVT-g Guest Support(vGPU)
|
|
===============================
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/i915_vgpu.c
|
|
:doc: Intel GVT-g guest support
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/i915_vgpu.c
|
|
:internal:
|
|
|
|
Intel GVT-g Host Support(vGPU device model)
|
|
===========================================
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/intel_gvt.c
|
|
:doc: Intel GVT-g host support
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/intel_gvt.c
|
|
:internal:
|
|
|
|
|
|
VHM APIs called from AcrnGT
|
|
****************************
|
|
|
|
The Virtio and Hypervisor Service Module (VHM) is a kernel module in the
|
|
Service OS acting as a middle layer to support the device model. (See the
|
|
:ref:`ACRN-io-mediator` introduction for details.)
|
|
|
|
VHM requires an interrupt (vIRQ) number, and exposes some APIs to external
|
|
kernel modules such as GVT-g and the Virtio back-end (BE) service running in
|
|
kernel space. VHM exposes a ``char`` device node in user space, and only
|
|
interacts with DM. The DM routes I/O request and response from and to other
|
|
modules via the ``char`` device to and from VHM. DM may use VHM for hypervisor
|
|
service (including remote memory map). VHM may directly service the request
|
|
such as for the remote memory map, or invoke hypercall. VHM also sends I/O
|
|
responses to user space modules, notified by vIRQ injections.
|
|
|
|
|
|
.. kernel-doc:: include/linux/vhm/vhm_vm_mngt.h
|
|
:functions: put_vm
|
|
vhm_get_vm_info
|
|
vhm_inject_msi
|
|
vhm_vm_gpa2hpa
|
|
|
|
.. kernel-doc:: include/linux/vhm/acrn_vhm_ioreq.h
|
|
:internal:
|
|
|
|
.. kernel-doc:: include/linux/vhm/acrn_vhm_mm.h
|
|
:functions: acrn_hpa2gpa
|
|
map_guest_phys
|
|
unmap_guest_phys
|
|
add_memory_region
|
|
del_memory_region
|
|
write_protect_page
|
|
|
|
.. _MPT_interface:
|
|
|
|
AcrnGT mediated pass-through (MPT) interface
|
|
**************************************************
|
|
|
|
AcrnGT receives request from GVT module through MPT interface. Refer to the
|
|
:ref:`Graphic_mediation` page.
|
|
|
|
A collection of function callbacks in the MPT module will be attached to GVT
|
|
host at the driver loading stage. AcrnGT MPT function callbacks are described
|
|
as below:
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
struct intel_gvt_mpt acrn_gvt_mpt = {
|
|
.host_init = acrngt_host_init,
|
|
.host_exit = acrngt_host_exit,
|
|
.attach_vgpu = acrngt_attach_vgpu,
|
|
.detach_vgpu = acrngt_detach_vgpu,
|
|
.inject_msi = acrngt_inject_msi,
|
|
.from_virt_to_mfn = acrngt_virt_to_mfn,
|
|
.enable_page_track = acrngt_page_track_add,
|
|
.disable_page_track = acrngt_page_track_remove,
|
|
.read_gpa = acrngt_read_gpa,
|
|
.write_gpa = acrngt_write_gpa,
|
|
.gfn_to_mfn = acrngt_gfn_to_pfn,
|
|
.map_gfn_to_mfn = acrngt_map_gfn_to_mfn,
|
|
.dma_map_guest_page = acrngt_dma_map_guest_page,
|
|
.dma_unmap_guest_page = acrngt_dma_unmap_guest_page,
|
|
.set_trap_area = acrngt_set_trap_area,
|
|
.set_pvmmio = acrngt_set_pvmmio,
|
|
.dom0_ready = acrngt_dom0_ready,
|
|
|
|
};
|
|
EXPORT_SYMBOL_GPL(acrn_gvt_mpt);
|
|
|
|
GVT-g core logic will call these APIs through wrap functions with prefix
|
|
``intel_gvt_hypervisor_`` to request specific services from hypervisor through
|
|
VHM.
|
|
|
|
This section describes the wrap functions:
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/gvt/mpt.h
|
|
:functions: intel_gvt_hypervisor_host_init
|
|
intel_gvt_hypervisor_host_exit
|
|
intel_gvt_hypervisor_attach_vgpu
|
|
intel_gvt_hypervisor_detach_vgpu
|
|
intel_gvt_hypervisor_inject_msi
|
|
intel_gvt_hypervisor_virt_to_mfn
|
|
intel_gvt_hypervisor_enable_page_track
|
|
intel_gvt_hypervisor_disable_page_track
|
|
intel_gvt_hypervisor_read_gpa
|
|
intel_gvt_hypervisor_write_gpa
|
|
intel_gvt_hypervisor_gfn_to_mfn
|
|
intel_gvt_hypervisor_map_gfn_to_mfn
|
|
intel_gvt_hypervisor_dma_map_guest_page
|
|
intel_gvt_hypervisor_dma_unmap_guest_page
|
|
intel_gvt_hypervisor_set_trap_area
|
|
intel_gvt_hypervisor_set_pvmmio
|
|
intel_gvt_hypervisor_dom0_ready
|
|
|
|
.. _intel_gvt_ops_interface:
|
|
|
|
GVT-g intel_gvt_ops interface
|
|
*****************************
|
|
|
|
This section contains APIs for GVT-g intel_gvt_ops interface. Sources are found
|
|
in the `ACRN kernel GitHub repo`_
|
|
|
|
|
|
.. _ACRN kernel GitHub repo: https://github.com/projectacrn/acrn-kernel/
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
static const struct intel_gvt_ops intel_gvt_ops = {
|
|
.emulate_cfg_read = intel_vgpu_emulate_cfg_read,
|
|
.emulate_cfg_write = intel_vgpu_emulate_cfg_write,
|
|
.emulate_mmio_read = intel_vgpu_emulate_mmio_read,
|
|
.emulate_mmio_write = intel_vgpu_emulate_mmio_write,
|
|
.vgpu_create = intel_gvt_create_vgpu,
|
|
.vgpu_destroy = intel_gvt_destroy_vgpu,
|
|
.vgpu_reset = intel_gvt_reset_vgpu,
|
|
.vgpu_activate = intel_gvt_activate_vgpu,
|
|
.vgpu_deactivate = intel_gvt_deactivate_vgpu,
|
|
};
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/gvt/cfg_space.c
|
|
:functions: intel_vgpu_emulate_cfg_read
|
|
intel_vgpu_emulate_cfg_write
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/gvt/mmio.c
|
|
:functions: intel_vgpu_emulate_mmio_read
|
|
intel_vgpu_emulate_mmio_write
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/gvt/vgpu.c
|
|
:functions: intel_gvt_create_vgpn
|
|
intel_gvt_destroy_vgpu
|
|
intel_gvt_reset_vgpu
|
|
intel_gvt_activate_vgpu
|
|
intel_gvt_deactivate_vgpu
|
|
|
|
.. _sysfs_interface:
|
|
|
|
AcrnGT sysfs interface
|
|
***********************
|
|
|
|
This section contains APIs for the AcrnGT sysfs interface. Sources are found
|
|
in the `ACRN kernel GitHub repo`_
|
|
|
|
|
|
sysfs nodes
|
|
===========
|
|
|
|
In below examples all accesses to these interfaces are via bash command
|
|
``echo`` or ``cat``. This is a quick and easy way to get/control things. But
|
|
when these operations fails, it is impossible to get respective error code by
|
|
this way.
|
|
|
|
When accessing sysfs entries, people should use library functions such as
|
|
``read()`` or ``write()``.
|
|
|
|
On **success**, the returned value of ``read()`` or ``write()`` indicates how
|
|
many bytes have been transferred. On **error**, the returned value is ``-1``
|
|
and the global ``errno`` will be set appropriately. This is the only way to
|
|
figure out what kind of error occurs.
|
|
|
|
|
|
/sys/kernel/gvt/
|
|
----------------
|
|
|
|
The ``/sys/kernel/gvt/`` class sub-directory belongs to AcrnGT and provides a
|
|
centralized sysfs interface for configuring vGPU properties.
|
|
|
|
|
|
/sys/kernel/gvt/control/
|
|
------------------------
|
|
|
|
The ``/sys/kernel/gvt/control/`` sub-directory contains all the necessary
|
|
switches for different purposes.
|
|
|
|
/sys/kernel/gvt/control/create_gvt_instance
|
|
-------------------------------------------
|
|
|
|
The ``/sys/kernel/gvt/control/create_gvt_instance`` node is used by ACRN-DM to
|
|
create/destroy a vGPU instance.
|
|
|
|
/sys/kernel/gvt/vmN/
|
|
--------------------
|
|
|
|
After a VM is created, a new sub-directory ``vmN`` ("N" is the VM id) will be
|
|
created.
|
|
|
|
/sys/kernel/gvt/vmN/vgpu_id
|
|
---------------------------
|
|
|
|
The ``/sys/kernel/gvt/vmN/vgpu_id`` node is to get vGPU id from VM which id is
|
|
N.
|