linux/drivers/gpu/drm/i915/intel_gvt.c
<<
>>
Prefs
   1/*
   2 * Copyright(c) 2011-2016 Intel Corporation. All rights reserved.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice (including the next
  12 * paragraph) shall be included in all copies or substantial portions of the
  13 * Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21 * SOFTWARE.
  22 */
  23
  24#include "i915_drv.h"
  25#include "i915_vgpu.h"
  26#include "intel_gvt.h"
  27#include "gvt/gvt.h"
  28
  29/**
  30 * DOC: Intel GVT-g host support
  31 *
  32 * Intel GVT-g is a graphics virtualization technology which shares the
  33 * GPU among multiple virtual machines on a time-sharing basis. Each
  34 * virtual machine is presented a virtual GPU (vGPU), which has equivalent
  35 * features as the underlying physical GPU (pGPU), so i915 driver can run
  36 * seamlessly in a virtual machine.
  37 *
  38 * To virtualize GPU resources GVT-g driver depends on hypervisor technology
  39 * e.g KVM/VFIO/mdev, Xen, etc. to provide resource access trapping capability
  40 * and be virtualized within GVT-g device module. More architectural design
  41 * doc is available on https://01.org/group/2230/documentation-list.
  42 */
  43
  44static bool is_supported_device(struct drm_i915_private *dev_priv)
  45{
  46        if (IS_BROADWELL(dev_priv))
  47                return true;
  48        if (IS_SKYLAKE(dev_priv))
  49                return true;
  50        if (IS_KABYLAKE(dev_priv))
  51                return true;
  52        if (IS_BROXTON(dev_priv))
  53                return true;
  54        if (IS_COFFEELAKE(dev_priv))
  55                return true;
  56        if (IS_COMETLAKE(dev_priv))
  57                return true;
  58
  59        return false;
  60}
  61
  62/**
  63 * intel_gvt_sanitize_options - sanitize GVT related options
  64 * @dev_priv: drm i915 private data
  65 *
  66 * This function is called at the i915 options sanitize stage.
  67 */
  68void intel_gvt_sanitize_options(struct drm_i915_private *dev_priv)
  69{
  70        if (!dev_priv->params.enable_gvt)
  71                return;
  72
  73        if (intel_vgpu_active(dev_priv)) {
  74                drm_info(&dev_priv->drm, "GVT-g is disabled for guest\n");
  75                goto bail;
  76        }
  77
  78        if (!is_supported_device(dev_priv)) {
  79                drm_info(&dev_priv->drm,
  80                         "Unsupported device. GVT-g is disabled\n");
  81                goto bail;
  82        }
  83
  84        return;
  85bail:
  86        dev_priv->params.enable_gvt = 0;
  87}
  88
  89/**
  90 * intel_gvt_init - initialize GVT components
  91 * @dev_priv: drm i915 private data
  92 *
  93 * This function is called at the initialization stage to create a GVT device.
  94 *
  95 * Returns:
  96 * Zero on success, negative error code if failed.
  97 *
  98 */
  99int intel_gvt_init(struct drm_i915_private *dev_priv)
 100{
 101        int ret;
 102
 103        if (i915_inject_probe_failure(dev_priv))
 104                return -ENODEV;
 105
 106        if (!dev_priv->params.enable_gvt) {
 107                drm_dbg(&dev_priv->drm,
 108                        "GVT-g is disabled by kernel params\n");
 109                return 0;
 110        }
 111
 112        if (intel_uc_wants_guc_submission(&dev_priv->gt.uc)) {
 113                drm_err(&dev_priv->drm,
 114                        "i915 GVT-g loading failed due to Graphics virtualization is not yet supported with GuC submission\n");
 115                return -EIO;
 116        }
 117
 118        ret = intel_gvt_init_device(dev_priv);
 119        if (ret) {
 120                drm_dbg(&dev_priv->drm, "Fail to init GVT device\n");
 121                goto bail;
 122        }
 123
 124        return 0;
 125
 126bail:
 127        dev_priv->params.enable_gvt = 0;
 128        return 0;
 129}
 130
 131static inline bool intel_gvt_active(struct drm_i915_private *dev_priv)
 132{
 133        return dev_priv->gvt;
 134}
 135
 136/**
 137 * intel_gvt_driver_remove - cleanup GVT components when i915 driver is
 138 *                           unbinding
 139 * @dev_priv: drm i915 private *
 140 *
 141 * This function is called at the i915 driver unloading stage, to shutdown
 142 * GVT components and release the related resources.
 143 */
 144void intel_gvt_driver_remove(struct drm_i915_private *dev_priv)
 145{
 146        if (!intel_gvt_active(dev_priv))
 147                return;
 148
 149        intel_gvt_clean_device(dev_priv);
 150}
 151
 152/**
 153 * intel_gvt_resume - GVT resume routine wapper
 154 *
 155 * @dev_priv: drm i915 private *
 156 *
 157 * This function is called at the i915 driver resume stage to restore required
 158 * HW status for GVT so that vGPU can continue running after resumed.
 159 */
 160void intel_gvt_resume(struct drm_i915_private *dev_priv)
 161{
 162        if (intel_gvt_active(dev_priv))
 163                intel_gvt_pm_resume(dev_priv->gvt);
 164}
 165