drm/i915/gvt: introduce host_init/host_exit to MPT
authorJike Song <jike.song@intel.com>
Thu, 3 Nov 2016 10:38:33 +0000 (18:38 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Thu, 10 Nov 2016 07:45:13 +0000 (15:45 +0800)
GVT host needs init/exit hooks to do some initialization/cleanup
work, e.g.: vfio mdev host device register/unregister.

Signed-off-by: Jike Song <jike.song@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/gvt.c
drivers/gpu/drm/i915/gvt/hypercall.h
drivers/gpu/drm/i915/gvt/mpt.h

index 48a67d1e1893171bd347207b2bf279f798eb7d0e..13db29d045a46329ca848769a271fe39c05a75cb 100644 (file)
@@ -193,6 +193,7 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
        intel_gvt_clean_mmio_info(gvt);
        intel_gvt_free_firmware(gvt);
 
+       intel_gvt_hypervisor_host_exit(&dev_priv->drm.pdev->dev, gvt);
        intel_gvt_clean_vgpu_types(gvt);
 
        kfree(dev_priv->gvt);
@@ -276,11 +277,19 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
        if (ret)
                goto out_clean_thread;
 
+       ret = intel_gvt_hypervisor_host_init(&dev_priv->drm.pdev->dev, gvt,
+                               &intel_gvt_io_emulation_ops);
+       if (ret) {
+               gvt_err("failed to register gvt-g host device: %d\n", ret);
+               goto out_clean_types;
+       }
 
        gvt_dbg_core("gvt device initialization is done\n");
        dev_priv->gvt = gvt;
        return 0;
 
+out_clean_types:
+       intel_gvt_clean_vgpu_types(gvt);
 out_clean_thread:
        clean_service_thread(gvt);
 out_clean_cmd_parser:
index 193fd38a96af756065a75c1934f23445a3ad29a6..f3e926340983906a9a76a94ece698d2f6671a586 100644 (file)
@@ -48,6 +48,8 @@ extern struct intel_gvt_io_emulation_ops intel_gvt_io_emulation_ops;
  */
 struct intel_gvt_mpt {
        int (*detect_host)(void);
+       int (*host_init)(struct device *dev, void *gvt, const void *ops);
+       void (*host_exit)(struct device *dev, void *gvt);
        int (*attach_vgpu)(void *vgpu, unsigned long *handle);
        void (*detach_vgpu)(unsigned long handle);
        int (*inject_msi)(unsigned long handle, u32 addr, u16 data);
index 15e08dcb3199a6b96262e0cfb39202872444e74a..93649b34798bb7a011859275a0e02a38515ea529 100644 (file)
@@ -55,6 +55,27 @@ static inline int intel_gvt_hypervisor_detect_host(void)
        return intel_gvt_host.mpt->detect_host();
 }
 
+/**
+ * intel_gvt_hypervisor_host_init - init GVT-g host side
+ *
+ * Returns:
+ * Zero on success, negative error code if failed
+ */
+static inline int intel_gvt_hypervisor_host_init(struct device *dev,
+                       void *gvt, const void *ops)
+{
+       return intel_gvt_host.mpt->host_init(dev, gvt, ops);
+}
+
+/**
+ * intel_gvt_hypervisor_host_exit - exit GVT-g host side
+ */
+static inline void intel_gvt_hypervisor_host_exit(struct device *dev,
+                       void *gvt)
+{
+       intel_gvt_host.mpt->host_exit(dev, gvt);
+}
+
 /**
  * intel_gvt_hypervisor_attach_vgpu - call hypervisor to initialize vGPU
  * related stuffs inside hypervisor.