[PATCH v1 3/4] drm/i915/gvt: Refactor vGPU type code in xengt part

fred gao fred.gao at intel.com
Wed Sep 13 08:43:04 UTC 2017


A mdev_device with faked intel_vgpu_ops is registered, then
the initialized vGPU type group can be exposed to user.

Signed-off-by: fred gao <fred.gao at intel.com>
---
 drivers/gpu/drm/i915/gvt/xengt.c | 107 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 107 insertions(+)

diff --git a/drivers/gpu/drm/i915/gvt/xengt.c b/drivers/gpu/drm/i915/gvt/xengt.c
index 7265115..4cab2d8 100644
--- a/drivers/gpu/drm/i915/gvt/xengt.c
+++ b/drivers/gpu/drm/i915/gvt/xengt.c
@@ -51,6 +51,8 @@
 #include <i915_pvinfo.h>
 #include <gvt/gvt.h>
 #include "xengt.h"
+#include <linux/vfio.h>
+#include <linux/mdev.h>
 
 MODULE_AUTHOR("Intel Corporation");
 MODULE_DESCRIPTION("XenGT mediated passthrough driver");
@@ -1438,6 +1440,99 @@ static void *xengt_gpa_to_va(unsigned long handle, unsigned long gpa)
 		(gpa & (VMEM_BUCK_SIZE - 1));
 }
 
+static int intel_vgpu_create(struct kobject *kobj, struct mdev_device *mdev)
+{
+	return 0;
+}
+
+static int intel_vgpu_remove(struct mdev_device *mdev)
+{
+	return 0;
+}
+
+static int intel_vgpu_open(struct mdev_device *mdev)
+{
+	return 0;
+}
+
+static void intel_vgpu_release(struct mdev_device *mdev)
+{
+}
+
+static ssize_t intel_vgpu_read(struct mdev_device *mdev, char __user *buf,
+			size_t count, loff_t *ppos)
+{
+	return 0;
+}
+
+static ssize_t intel_vgpu_write(struct mdev_device *mdev,
+				const char __user *buf,
+				size_t count, loff_t *ppos)
+{
+	return  0;
+}
+
+static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
+{
+	return 0;
+}
+
+static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,
+			     unsigned long arg)
+{
+	return 0;
+}
+
+static ssize_t
+vgpu_id_show(struct device *dev, struct device_attribute *attr,
+	     char *buf)
+{
+	struct mdev_device *mdev = mdev_from_dev(dev);
+
+	if (mdev) {
+		struct intel_vgpu *vgpu = (struct intel_vgpu *)
+			mdev_get_drvdata(mdev);
+		return sprintf(buf, "%d\n", vgpu->id);
+	}
+	return sprintf(buf, "\n");
+}
+
+static DEVICE_ATTR_RO(vgpu_id);
+
+static struct attribute *intel_vgpu_attrs[] = {
+	&dev_attr_vgpu_id.attr,
+	NULL
+};
+
+static const struct attribute_group intel_vgpu_group = {
+	.name = "intel_vgpu",
+	.attrs = intel_vgpu_attrs,
+};
+
+static const struct attribute_group *intel_vgpu_groups[] = {
+	&intel_vgpu_group,
+	NULL,
+};
+
+static struct attribute_group *intel_vgpu_type_groups[] = {
+	[0 ... NR_MAX_INTEL_VGPU_TYPES - 1] = NULL,
+};
+
+static const struct mdev_parent_ops intel_vgpu_ops = {
+	.supported_type_groups	= intel_vgpu_type_groups,
+	.mdev_attr_groups       = intel_vgpu_groups,
+	.create			= intel_vgpu_create,
+	.remove			= intel_vgpu_remove,
+
+	.open			= intel_vgpu_open,
+	.release		= intel_vgpu_release,
+
+	.read			= intel_vgpu_read,
+	.write			= intel_vgpu_write,
+	.mmap			= intel_vgpu_mmap,
+	.ioctl			= intel_vgpu_ioctl,
+};
+
 static int xengt_host_init(struct device *dev, void *gvt, const void *ops)
 {
 	int ret = -EFAULT;
@@ -1448,6 +1543,14 @@ static int xengt_host_init(struct device *dev, void *gvt, const void *ops)
 	xengt_priv.gvt = (struct intel_gvt *)gvt;
 	intel_gvt_ops = (const struct intel_gvt_ops *)ops;
 
+	if (!intel_gvt_ops->gvt_init_vgpu_type_groups(gvt,
+			intel_vgpu_type_groups))
+		return -EFAULT;
+
+	ret = mdev_register_device(dev, &intel_vgpu_ops);
+	if (ret)
+		gvt_err("mdev_ register_device failed ret= %d!\n", ret);
+
 	ret = xengt_sysfs_init(xengt_priv.gvt);
 	if (ret) {
 		xengt_priv.gvt = NULL;
@@ -1459,6 +1562,10 @@ static int xengt_host_init(struct device *dev, void *gvt, const void *ops)
 
 static void xengt_host_exit(struct device *dev, void *gvt)
 {
+	intel_gvt_ops->gvt_cleanup_vgpu_type_groups(gvt,
+			intel_vgpu_type_groups);
+	mdev_unregister_device(dev);
+
 	xengt_sysfs_del();
 	xengt_priv.gvt = NULL;
 	intel_gvt_ops = NULL;
-- 
2.7.4



More information about the intel-gvt-dev mailing list