forked from mirrors/linux
		
	vfio/mdev: consolidate all the device_api sysfs into the core code
Every driver just emits a static string, simply feed it through the ops and provide a standard sysfs show function. Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Tony Krowiak <akrowiak@linux.ibm.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com> Reviewed-by: Eric Farman <farman@linux.ibm.com> Link: https://lore.kernel.org/r/20220923092652.100656-11-hch@lst.de Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
		
							parent
							
								
									c7c1f38f6c
								
							
						
					
					
						commit
						290aac5df8
					
				
					 10 changed files with 37 additions and 67 deletions
				
			
		| 
						 | 
					@ -202,7 +202,7 @@ Directories and files under the sysfs for Each Physical Device
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* device_api
 | 
					* device_api
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  This attribute should show which device API is being created, for example,
 | 
					  This attribute shows which device API is being created, for example,
 | 
				
			||||||
  "vfio-pci" for a PCI device.
 | 
					  "vfio-pci" for a PCI device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* available_instances
 | 
					* available_instances
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,12 +123,6 @@ static ssize_t available_instances_show(struct mdev_type *mtype,
 | 
				
			||||||
	return sprintf(buf, "%u\n", type->avail_instance);
 | 
						return sprintf(buf, "%u\n", type->avail_instance);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t device_api_show(struct mdev_type *mtype,
 | 
					 | 
				
			||||||
			       struct mdev_type_attribute *attr, char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static ssize_t description_show(struct mdev_type *mtype,
 | 
					static ssize_t description_show(struct mdev_type *mtype,
 | 
				
			||||||
				struct mdev_type_attribute *attr, char *buf)
 | 
									struct mdev_type_attribute *attr, char *buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -151,13 +145,11 @@ static ssize_t name_show(struct mdev_type *mtype,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(available_instances);
 | 
					static MDEV_TYPE_ATTR_RO(available_instances);
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(device_api);
 | 
					 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(description);
 | 
					static MDEV_TYPE_ATTR_RO(description);
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(name);
 | 
					static MDEV_TYPE_ATTR_RO(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct attribute *gvt_type_attrs[] = {
 | 
					static const struct attribute *gvt_type_attrs[] = {
 | 
				
			||||||
	&mdev_type_attr_available_instances.attr,
 | 
						&mdev_type_attr_available_instances.attr,
 | 
				
			||||||
	&mdev_type_attr_device_api.attr,
 | 
					 | 
				
			||||||
	&mdev_type_attr_description.attr,
 | 
						&mdev_type_attr_description.attr,
 | 
				
			||||||
	&mdev_type_attr_name.attr,
 | 
						&mdev_type_attr_name.attr,
 | 
				
			||||||
	NULL,
 | 
						NULL,
 | 
				
			||||||
| 
						 | 
					@ -1550,6 +1542,7 @@ static void intel_vgpu_remove(struct mdev_device *mdev)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct mdev_driver intel_vgpu_mdev_driver = {
 | 
					static struct mdev_driver intel_vgpu_mdev_driver = {
 | 
				
			||||||
 | 
						.device_api	= VFIO_DEVICE_API_PCI_STRING,
 | 
				
			||||||
	.driver = {
 | 
						.driver = {
 | 
				
			||||||
		.name		= "intel_vgpu_mdev",
 | 
							.name		= "intel_vgpu_mdev",
 | 
				
			||||||
		.owner		= THIS_MODULE,
 | 
							.owner		= THIS_MODULE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,13 +51,6 @@ static ssize_t name_show(struct mdev_type *mtype,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(name);
 | 
					static MDEV_TYPE_ATTR_RO(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t device_api_show(struct mdev_type *mtype,
 | 
					 | 
				
			||||||
			       struct mdev_type_attribute *attr, char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return sprintf(buf, "%s\n", VFIO_DEVICE_API_CCW_STRING);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(device_api);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static ssize_t available_instances_show(struct mdev_type *mtype,
 | 
					static ssize_t available_instances_show(struct mdev_type *mtype,
 | 
				
			||||||
					struct mdev_type_attribute *attr,
 | 
										struct mdev_type_attribute *attr,
 | 
				
			||||||
					char *buf)
 | 
										char *buf)
 | 
				
			||||||
| 
						 | 
					@ -70,7 +63,6 @@ static MDEV_TYPE_ATTR_RO(available_instances);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct attribute *mdev_types_attrs[] = {
 | 
					static const struct attribute *mdev_types_attrs[] = {
 | 
				
			||||||
	&mdev_type_attr_name.attr,
 | 
						&mdev_type_attr_name.attr,
 | 
				
			||||||
	&mdev_type_attr_device_api.attr,
 | 
					 | 
				
			||||||
	&mdev_type_attr_available_instances.attr,
 | 
						&mdev_type_attr_available_instances.attr,
 | 
				
			||||||
	NULL,
 | 
						NULL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -628,6 +620,7 @@ static const struct vfio_device_ops vfio_ccw_dev_ops = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct mdev_driver vfio_ccw_mdev_driver = {
 | 
					struct mdev_driver vfio_ccw_mdev_driver = {
 | 
				
			||||||
 | 
						.device_api = VFIO_DEVICE_API_CCW_STRING,
 | 
				
			||||||
	.driver = {
 | 
						.driver = {
 | 
				
			||||||
		.name = "vfio_ccw_mdev",
 | 
							.name = "vfio_ccw_mdev",
 | 
				
			||||||
		.owner = THIS_MODULE,
 | 
							.owner = THIS_MODULE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -808,17 +808,8 @@ static ssize_t available_instances_show(struct mdev_type *mtype,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(available_instances);
 | 
					static MDEV_TYPE_ATTR_RO(available_instances);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t device_api_show(struct mdev_type *mtype,
 | 
					 | 
				
			||||||
			       struct mdev_type_attribute *attr, char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return sprintf(buf, "%s\n", VFIO_DEVICE_API_AP_STRING);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(device_api);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const struct attribute *vfio_ap_mdev_type_attrs[] = {
 | 
					static const struct attribute *vfio_ap_mdev_type_attrs[] = {
 | 
				
			||||||
	&mdev_type_attr_name.attr,
 | 
						&mdev_type_attr_name.attr,
 | 
				
			||||||
	&mdev_type_attr_device_api.attr,
 | 
					 | 
				
			||||||
	&mdev_type_attr_available_instances.attr,
 | 
						&mdev_type_attr_available_instances.attr,
 | 
				
			||||||
	NULL,
 | 
						NULL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1799,6 +1790,7 @@ static const struct vfio_device_ops vfio_ap_matrix_dev_ops = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct mdev_driver vfio_ap_matrix_driver = {
 | 
					static struct mdev_driver vfio_ap_matrix_driver = {
 | 
				
			||||||
 | 
						.device_api = VFIO_DEVICE_API_AP_STRING,
 | 
				
			||||||
	.driver = {
 | 
						.driver = {
 | 
				
			||||||
		.name = "vfio_ap_mdev",
 | 
							.name = "vfio_ap_mdev",
 | 
				
			||||||
		.owner = THIS_MODULE,
 | 
							.owner = THIS_MODULE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,8 +55,10 @@ struct bus_type mdev_bus_type = {
 | 
				
			||||||
 **/
 | 
					 **/
 | 
				
			||||||
int mdev_register_driver(struct mdev_driver *drv)
 | 
					int mdev_register_driver(struct mdev_driver *drv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!drv->types_attrs)
 | 
						if (!drv->types_attrs || !drv->device_api)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* initialize common driver fields */
 | 
				
			||||||
	drv->driver.bus = &mdev_bus_type;
 | 
						drv->driver.bus = &mdev_bus_type;
 | 
				
			||||||
	return driver_register(&drv->driver);
 | 
						return driver_register(&drv->driver);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,9 +72,30 @@ static ssize_t create_store(struct mdev_type *mtype,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return count;
 | 
						return count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
static MDEV_TYPE_ATTR_WO(create);
 | 
					static MDEV_TYPE_ATTR_WO(create);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static ssize_t device_api_show(struct mdev_type *mtype,
 | 
				
			||||||
 | 
								       struct mdev_type_attribute *attr, char *buf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return sysfs_emit(buf, "%s\n", mtype->parent->mdev_driver->device_api);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static MDEV_TYPE_ATTR_RO(device_api);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct attribute *mdev_types_core_attrs[] = {
 | 
				
			||||||
 | 
						&mdev_type_attr_create.attr,
 | 
				
			||||||
 | 
						&mdev_type_attr_device_api.attr,
 | 
				
			||||||
 | 
						NULL,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct attribute_group mdev_type_core_group = {
 | 
				
			||||||
 | 
						.attrs = mdev_types_core_attrs,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct attribute_group *mdev_type_groups[] = {
 | 
				
			||||||
 | 
						&mdev_type_core_group,
 | 
				
			||||||
 | 
						NULL,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void mdev_type_release(struct kobject *kobj)
 | 
					static void mdev_type_release(struct kobject *kobj)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mdev_type *type = to_mdev_type(kobj);
 | 
						struct mdev_type *type = to_mdev_type(kobj);
 | 
				
			||||||
| 
						 | 
					@ -87,6 +108,7 @@ static void mdev_type_release(struct kobject *kobj)
 | 
				
			||||||
static struct kobj_type mdev_type_ktype = {
 | 
					static struct kobj_type mdev_type_ktype = {
 | 
				
			||||||
	.sysfs_ops	= &mdev_type_sysfs_ops,
 | 
						.sysfs_ops	= &mdev_type_sysfs_ops,
 | 
				
			||||||
	.release	= mdev_type_release,
 | 
						.release	= mdev_type_release,
 | 
				
			||||||
 | 
						.default_groups	= mdev_type_groups,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int mdev_type_add(struct mdev_parent *parent, struct mdev_type *type)
 | 
					static int mdev_type_add(struct mdev_parent *parent, struct mdev_type *type)
 | 
				
			||||||
| 
						 | 
					@ -106,10 +128,6 @@ static int mdev_type_add(struct mdev_parent *parent, struct mdev_type *type)
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = sysfs_create_file(&type->kobj, &mdev_type_attr_create.attr);
 | 
					 | 
				
			||||||
	if (ret)
 | 
					 | 
				
			||||||
		goto attr_create_failed;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	type->devices_kobj = kobject_create_and_add("devices", &type->kobj);
 | 
						type->devices_kobj = kobject_create_and_add("devices", &type->kobj);
 | 
				
			||||||
	if (!type->devices_kobj) {
 | 
						if (!type->devices_kobj) {
 | 
				
			||||||
		ret = -ENOMEM;
 | 
							ret = -ENOMEM;
 | 
				
			||||||
| 
						 | 
					@ -124,8 +142,6 @@ static int mdev_type_add(struct mdev_parent *parent, struct mdev_type *type)
 | 
				
			||||||
attrs_failed:
 | 
					attrs_failed:
 | 
				
			||||||
	kobject_put(type->devices_kobj);
 | 
						kobject_put(type->devices_kobj);
 | 
				
			||||||
attr_devices_failed:
 | 
					attr_devices_failed:
 | 
				
			||||||
	sysfs_remove_file(&type->kobj, &mdev_type_attr_create.attr);
 | 
					 | 
				
			||||||
attr_create_failed:
 | 
					 | 
				
			||||||
	kobject_del(&type->kobj);
 | 
						kobject_del(&type->kobj);
 | 
				
			||||||
	kobject_put(&type->kobj);
 | 
						kobject_put(&type->kobj);
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
| 
						 | 
					@ -136,7 +152,6 @@ static void mdev_type_remove(struct mdev_type *type)
 | 
				
			||||||
	sysfs_remove_files(&type->kobj, type->parent->mdev_driver->types_attrs);
 | 
						sysfs_remove_files(&type->kobj, type->parent->mdev_driver->types_attrs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kobject_put(type->devices_kobj);
 | 
						kobject_put(type->devices_kobj);
 | 
				
			||||||
	sysfs_remove_file(&type->kobj, &mdev_type_attr_create.attr);
 | 
					 | 
				
			||||||
	kobject_del(&type->kobj);
 | 
						kobject_del(&type->kobj);
 | 
				
			||||||
	kobject_put(&type->kobj);
 | 
						kobject_put(&type->kobj);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,11 +61,6 @@ struct mdev_type_attribute {
 | 
				
			||||||
			 size_t count);
 | 
								 size_t count);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MDEV_TYPE_ATTR(_name, _mode, _show, _store)		\
 | 
					 | 
				
			||||||
struct mdev_type_attribute mdev_type_attr_##_name =		\
 | 
					 | 
				
			||||||
	__ATTR(_name, _mode, _show, _store)
 | 
					 | 
				
			||||||
#define MDEV_TYPE_ATTR_RW(_name) \
 | 
					 | 
				
			||||||
	struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RW(_name)
 | 
					 | 
				
			||||||
#define MDEV_TYPE_ATTR_RO(_name) \
 | 
					#define MDEV_TYPE_ATTR_RO(_name) \
 | 
				
			||||||
	struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RO(_name)
 | 
						struct mdev_type_attribute mdev_type_attr_##_name = __ATTR_RO(_name)
 | 
				
			||||||
#define MDEV_TYPE_ATTR_WO(_name) \
 | 
					#define MDEV_TYPE_ATTR_WO(_name) \
 | 
				
			||||||
| 
						 | 
					@ -73,12 +68,14 @@ struct mdev_type_attribute mdev_type_attr_##_name =		\
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * struct mdev_driver - Mediated device driver
 | 
					 * struct mdev_driver - Mediated device driver
 | 
				
			||||||
 | 
					 * @device_api: string to return for the device_api sysfs
 | 
				
			||||||
 * @probe: called when new device created
 | 
					 * @probe: called when new device created
 | 
				
			||||||
 * @remove: called when device removed
 | 
					 * @remove: called when device removed
 | 
				
			||||||
 * @types_attrs: attributes to the type kobjects.
 | 
					 * @types_attrs: attributes to the type kobjects.
 | 
				
			||||||
 * @driver: device driver structure
 | 
					 * @driver: device driver structure
 | 
				
			||||||
 **/
 | 
					 **/
 | 
				
			||||||
struct mdev_driver {
 | 
					struct mdev_driver {
 | 
				
			||||||
 | 
						const char *device_api;
 | 
				
			||||||
	int (*probe)(struct mdev_device *dev);
 | 
						int (*probe)(struct mdev_device *dev);
 | 
				
			||||||
	void (*remove)(struct mdev_device *dev);
 | 
						void (*remove)(struct mdev_device *dev);
 | 
				
			||||||
	const struct attribute * const *types_attrs;
 | 
						const struct attribute * const *types_attrs;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1384,17 +1384,9 @@ static ssize_t available_instances_show(struct mdev_type *mtype,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(available_instances);
 | 
					static MDEV_TYPE_ATTR_RO(available_instances);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t device_api_show(struct mdev_type *mtype,
 | 
					 | 
				
			||||||
			       struct mdev_type_attribute *attr, char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(device_api);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const struct attribute *mdev_types_attrs[] = {
 | 
					static const struct attribute *mdev_types_attrs[] = {
 | 
				
			||||||
	&mdev_type_attr_name.attr,
 | 
						&mdev_type_attr_name.attr,
 | 
				
			||||||
	&mdev_type_attr_description.attr,
 | 
						&mdev_type_attr_description.attr,
 | 
				
			||||||
	&mdev_type_attr_device_api.attr,
 | 
					 | 
				
			||||||
	&mdev_type_attr_available_instances.attr,
 | 
						&mdev_type_attr_available_instances.attr,
 | 
				
			||||||
	NULL,
 | 
						NULL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1410,6 +1402,7 @@ static const struct vfio_device_ops mbochs_dev_ops = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct mdev_driver mbochs_driver = {
 | 
					static struct mdev_driver mbochs_driver = {
 | 
				
			||||||
 | 
						.device_api = VFIO_DEVICE_API_PCI_STRING,
 | 
				
			||||||
	.driver = {
 | 
						.driver = {
 | 
				
			||||||
		.name = "mbochs",
 | 
							.name = "mbochs",
 | 
				
			||||||
		.owner = THIS_MODULE,
 | 
							.owner = THIS_MODULE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -689,17 +689,9 @@ static ssize_t available_instances_show(struct mdev_type *mtype,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(available_instances);
 | 
					static MDEV_TYPE_ATTR_RO(available_instances);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t device_api_show(struct mdev_type *mtype,
 | 
					 | 
				
			||||||
			       struct mdev_type_attribute *attr, char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(device_api);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const struct attribute *mdev_types_attrs[] = {
 | 
					static const struct attribute *mdev_types_attrs[] = {
 | 
				
			||||||
	&mdev_type_attr_name.attr,
 | 
						&mdev_type_attr_name.attr,
 | 
				
			||||||
	&mdev_type_attr_description.attr,
 | 
						&mdev_type_attr_description.attr,
 | 
				
			||||||
	&mdev_type_attr_device_api.attr,
 | 
					 | 
				
			||||||
	&mdev_type_attr_available_instances.attr,
 | 
						&mdev_type_attr_available_instances.attr,
 | 
				
			||||||
	NULL,
 | 
						NULL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -714,6 +706,7 @@ static const struct vfio_device_ops mdpy_dev_ops = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct mdev_driver mdpy_driver = {
 | 
					static struct mdev_driver mdpy_driver = {
 | 
				
			||||||
 | 
						.device_api = VFIO_DEVICE_API_PCI_STRING,
 | 
				
			||||||
	.driver = {
 | 
						.driver = {
 | 
				
			||||||
		.name = "mdpy",
 | 
							.name = "mdpy",
 | 
				
			||||||
		.owner = THIS_MODULE,
 | 
							.owner = THIS_MODULE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1277,17 +1277,8 @@ static ssize_t available_instances_show(struct mdev_type *mtype,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(available_instances);
 | 
					static MDEV_TYPE_ATTR_RO(available_instances);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t device_api_show(struct mdev_type *mtype,
 | 
					 | 
				
			||||||
			       struct mdev_type_attribute *attr, char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static MDEV_TYPE_ATTR_RO(device_api);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const struct attribute *mdev_types_attrs[] = {
 | 
					static const struct attribute *mdev_types_attrs[] = {
 | 
				
			||||||
	&mdev_type_attr_name.attr,
 | 
						&mdev_type_attr_name.attr,
 | 
				
			||||||
	&mdev_type_attr_device_api.attr,
 | 
					 | 
				
			||||||
	&mdev_type_attr_available_instances.attr,
 | 
						&mdev_type_attr_available_instances.attr,
 | 
				
			||||||
	NULL,
 | 
						NULL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1302,6 +1293,7 @@ static const struct vfio_device_ops mtty_dev_ops = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct mdev_driver mtty_driver = {
 | 
					static struct mdev_driver mtty_driver = {
 | 
				
			||||||
 | 
						.device_api = VFIO_DEVICE_API_PCI_STRING,
 | 
				
			||||||
	.driver = {
 | 
						.driver = {
 | 
				
			||||||
		.name = "mtty",
 | 
							.name = "mtty",
 | 
				
			||||||
		.owner = THIS_MODULE,
 | 
							.owner = THIS_MODULE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue