Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 40df6ea0 authored by Jike Song's avatar Jike Song Committed by Zhenyu Wang
Browse files

drm/i915/gvt: introduce host_init/host_exit to MPT



GVT host needs init/exit hooks to do some initialization/cleanup
work, e.g.: vfio mdev host device register/unregister.

Signed-off-by: default avatarJike Song <jike.song@intel.com>
Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
parent 8f89743b
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -193,6 +193,7 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
	intel_gvt_clean_mmio_info(gvt);
	intel_gvt_clean_mmio_info(gvt);
	intel_gvt_free_firmware(gvt);
	intel_gvt_free_firmware(gvt);


	intel_gvt_hypervisor_host_exit(&dev_priv->drm.pdev->dev, gvt);
	intel_gvt_clean_vgpu_types(gvt);
	intel_gvt_clean_vgpu_types(gvt);


	kfree(dev_priv->gvt);
	kfree(dev_priv->gvt);
@@ -276,11 +277,19 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
	if (ret)
	if (ret)
		goto out_clean_thread;
		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");
	gvt_dbg_core("gvt device initialization is done\n");
	dev_priv->gvt = gvt;
	dev_priv->gvt = gvt;
	return 0;
	return 0;


out_clean_types:
	intel_gvt_clean_vgpu_types(gvt);
out_clean_thread:
out_clean_thread:
	clean_service_thread(gvt);
	clean_service_thread(gvt);
out_clean_cmd_parser:
out_clean_cmd_parser:
+2 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,8 @@ extern struct intel_gvt_io_emulation_ops intel_gvt_io_emulation_ops;
 */
 */
struct intel_gvt_mpt {
struct intel_gvt_mpt {
	int (*detect_host)(void);
	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);
	int (*attach_vgpu)(void *vgpu, unsigned long *handle);
	void (*detach_vgpu)(unsigned long handle);
	void (*detach_vgpu)(unsigned long handle);
	int (*inject_msi)(unsigned long handle, u32 addr, u16 data);
	int (*inject_msi)(unsigned long handle, u32 addr, u16 data);
+21 −0
Original line number Original line Diff line number Diff line
@@ -55,6 +55,27 @@ static inline int intel_gvt_hypervisor_detect_host(void)
	return intel_gvt_host.mpt->detect_host();
	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
 * intel_gvt_hypervisor_attach_vgpu - call hypervisor to initialize vGPU
 * related stuffs inside hypervisor.
 * related stuffs inside hypervisor.