[PATCH v1 1/2] drm/i915/gvt: move vGPU type related code into gvt file
Zhang, Xiong Y
xiong.y.zhang at intel.com
Tue Sep 26 07:14:00 UTC 2017
> In this patch, all the vGPU type related code will be merged into same gvt file
> and the common interface will be exposed to both XenGT and KvmGT.
>
> Signed-off-by: fred gao <fred.gao at intel.com>
> ---
> drivers/gpu/drm/i915/gvt/gvt.c | 120
> +++++++++++++++++++++++++++++++++++++++++
> drivers/gpu/drm/i915/gvt/gvt.h | 12 +++++
> 2 files changed, 132 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/gvt/gvt.c b/drivers/gpu/drm/i915/gvt/gvt.c
> index aaa347f..241402f 100644
> --- a/drivers/gpu/drm/i915/gvt/gvt.c
> +++ b/drivers/gpu/drm/i915/gvt/gvt.c
> @@ -36,6 +36,8 @@
>
> #include "i915_drv.h"
> #include "gvt.h"
> +#include <linux/vfio.h>
> +#include <linux/mdev.h>
>
> struct intel_gvt_host intel_gvt_host;
>
> @@ -44,6 +46,118 @@ static const char * const supported_hypervisors[] = {
> [INTEL_GVT_HYPERVISOR_KVM] = "KVM",
> };
>
> +static struct intel_vgpu_type *intel_gvt_find_vgpu_type(struct intel_gvt
> *gvt,
> + const char *name)
> +{
> + int i;
> + struct intel_vgpu_type *t;
> + const char *driver_name = dev_driver_string(
> + &gvt->dev_priv->drm.pdev->dev);
> +
> + for (i = 0; i < gvt->num_types; i++) {
> + t = &gvt->types[i];
> + if (!strncmp(t->name, name + strlen(driver_name) + 1,
> + sizeof(t->name)))
> + return t;
> + }
> +
> + return NULL;
> +}
> +
> +static ssize_t available_instances_show(struct kobject *kobj,
> + struct device *dev, char *buf)
> +{
> + struct intel_vgpu_type *type;
> + unsigned int num = 0;
> + void *gvt = kdev_to_i915(dev)->gvt;
> +
> + type = intel_gvt_find_vgpu_type(gvt, kobject_name(kobj));
> + if (!type)
> + num = 0;
> + else
> + num = type->avail_instance;
> +
> + return sprintf(buf, "%u\n", num);
> +}
> +
> +static ssize_t device_api_show(struct kobject *kobj, struct device *dev,
> + char *buf)
> +{
> + return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING); }
> +
[Zhang, Xiong Y] move } to a new line.
> +static ssize_t description_show(struct kobject *kobj, struct device *dev,
> + char *buf)
> +{
> + struct intel_vgpu_type *type;
> + void *gvt = kdev_to_i915(dev)->gvt;
> +
> + type = intel_gvt_find_vgpu_type(gvt, kobject_name(kobj));
> + if (!type)
> + return 0;
> +
> + return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
> + "fence: %d\nresolution: %s\n"
> + "weight: %d\n",
> + BYTES_TO_MB(type->low_gm_size),
> + BYTES_TO_MB(type->high_gm_size),
> + type->fence, vgpu_edid_str(type->resolution),
> + type->weight);
> +}
> +
> +static MDEV_TYPE_ATTR_RO(available_instances);
> +static MDEV_TYPE_ATTR_RO(device_api);
> +static MDEV_TYPE_ATTR_RO(description);
> +
> +static struct attribute *type_attrs[] = {
> + &mdev_type_attr_available_instances.attr,
> + &mdev_type_attr_device_api.attr,
> + &mdev_type_attr_description.attr,
> + NULL,
> +};
> +
> +static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt,
> + struct attribute_group *intel_vgpu_type_groups[]) {
> + int i, j;
> + struct intel_vgpu_type *type;
> + struct attribute_group *group;
> +
> + for (i = 0; i < gvt->num_types; i++) {
> + type = &gvt->types[i];
> +
> + group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL);
> + if (WARN_ON(!group))
> + goto unwind;
> +
> + group->name = type->name;
> + group->attrs = type_attrs;
> + intel_vgpu_type_groups[i] = group;
> + }
> +
> + return true;
> +
> +unwind:
> + for (j = 0; j < i; j++) {
> + group = intel_vgpu_type_groups[j];
> + kfree(group);
> + }
> +
> + return false;
> +}
> +
> +static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt,
> + struct attribute_group *intel_vgpu_type_groups[]) {
> + int i;
> + struct attribute_group *group;
> +
> + for (i = 0; i < gvt->num_types; i++) {
> + group = intel_vgpu_type_groups[i];
[Zhang, Xiong Y] Better add intel_vgpu_type_groups[i]=NULL to avoid random access it again in future.
> + kfree(group);
> + }
> +}
> +
> 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, @@ -54,6 +168,12
> @@ static const struct intel_gvt_ops intel_gvt_ops = {
> .vgpu_reset = intel_gvt_reset_vgpu,
> .vgpu_activate = intel_gvt_activate_vgpu,
> .vgpu_deactivate = intel_gvt_deactivate_vgpu,
> + .gvt_find_vgpu_type = intel_gvt_find_vgpu_type,
> + .gvt_init_vgpu_type_groups = intel_gvt_init_vgpu_type_groups,
> + .gvt_cleanup_vgpu_type_groups =
> intel_gvt_cleanup_vgpu_type_groups,
> + .mdev_available_instances_show = available_instances_show,
> + .mdev_device_api_show = device_api_show,
> + .mdev_description_show = description_show,
> };
>
> /**
> diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
> index be1bb6d..9b920e6 100644
> --- a/drivers/gpu/drm/i915/gvt/gvt.h
> +++ b/drivers/gpu/drm/i915/gvt/gvt.h
> @@ -518,6 +518,18 @@ struct intel_gvt_ops {
> void (*vgpu_reset)(struct intel_vgpu *);
> void (*vgpu_activate)(struct intel_vgpu *);
> void (*vgpu_deactivate)(struct intel_vgpu *);
> + struct intel_vgpu_type *(*gvt_find_vgpu_type)(struct intel_gvt *gvt,
> + const char *name);
> + bool (*gvt_init_vgpu_type_groups)(struct intel_gvt *gvt,
> + struct attribute_group *intel_vgpu_type_groups[]);
> + void (*gvt_cleanup_vgpu_type_groups)(struct intel_gvt *gvt,
> + struct attribute_group *intel_vgpu_type_groups[]);
> + ssize_t (*mdev_available_instances_show)(struct kobject *kobj,
> + struct device *dev, char *buf);
> + ssize_t (*mdev_device_api_show)(struct kobject *kobj,
> + struct device *dev, char *buf);
> + ssize_t (*mdev_description_show)(struct kobject *kobj,
> + struct device *dev, char *buf);
> };
>
>
> --
> 2.7.4
>
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
More information about the intel-gvt-dev
mailing list